Как мне получить имя исполняемого файла из исходного файла в сборке Meson?

Я пытаюсь создать список целей модульного тестирования в Meson, где каждый тестовый пример построен из одного исходного файла. Исходные файлы определяются с помощью команды files() в подкаталоге:

my_test_files = files(['test_foo.c','test_bar.c','test_baz.c'])

То, что я хотел бы сделать, это что-то вроде этого в сборке верхнего уровня:

foreach t_file : my_test_files
    t_name = t.split('.')[0]
    test(t_name, executable(t_name, t_file, ...))
endforeach

Я знаю, что это возможно сделать, если имена файлов являются простыми строками, но описанный выше подход терпит неудачу с ошибкой «Файловый объект не вызывается».

Есть ли более «мезонический» способ получить имя исполняемого файла/теста из имени исходного файла?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
469
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это должно работать, если вы определяете свою переменную просто как массив, например:

my_test_files = ['test_foo.c','test_bar.c','test_baz.c']

цикл остается прежним, за исключением некоторой опечатки, исправленной с помощью:

foreach t_file : my_test_files
    t_name = t_file.split('.')[0]
    test(t_name, executable(t_name, t_file, ...))
endforeach

вместо создания массива файловых объектов. Это связано с тем, что executable() принимает входные файлы во многих формах: как файловые объекты (которые вы пытались сделать) и как строки либо исходные файлы (которые должны быть скомпилированы), либо объектные файлы (которые должны быть связаны) - определяются по расширению имени файла.

Для большей гибкости и лучшего контроля можно использовать массив массивов (который, конечно, расширяемый и может содержать все, что нужно для генерации тестов):

foo_files = files('test_foo.c')
bar_files = files('test_bar.c')
baz_files = files('test_baz.c')

test_files = [
  ['foo', foo_files, foo_deps],
  ['bar', bar_files, []],
  ['baz', baz_files, baz_deps]]

foreach t : test_files
    test(t[0], executable(t[0], t[1], dependencies=t[2], ...))
endforeach

Это будет работать, хотя причина, по которой я хотел использовать команду «файлы» (а не простые строки), заключается в сохранении путей. Файлы определяются в каждом подкаталоге, а исполняемые/тестовые правила определяются в файле верхнего уровня. Функция, которая мне бы очень понравилась, — это доступ только для чтения к строковым частям объекта File (например, путь, имя, расширение и т. д.).

rellenberg 12.04.2019 19:49

@user2059564 user2059564 хорошо, массив также может содержать файловые объекты ... см. Мое обновление

pmod 12.04.2019 22:30

Ваш метод имеет смысл и выглядит как хороший компромисс, тем более что я мог бы выполнять манипуляции со строками в файле subdir для создания внешнего массива. Спасибо!

rellenberg 15.04.2019 15:53

Другие вопросы по теме