Я пытаюсь создать список целей модульного тестирования в 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
Я знаю, что это возможно сделать, если имена файлов являются простыми строками, но описанный выше подход терпит неудачу с ошибкой «Файловый объект не вызывается».
Есть ли более «мезонический» способ получить имя исполняемого файла/теста из имени исходного файла?
Это должно работать, если вы определяете свою переменную просто как массив, например:
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
@user2059564 user2059564 хорошо, массив также может содержать файловые объекты ... см. Мое обновление
Ваш метод имеет смысл и выглядит как хороший компромисс, тем более что я мог бы выполнять манипуляции со строками в файле subdir для создания внешнего массива. Спасибо!
Это будет работать, хотя причина, по которой я хотел использовать команду «файлы» (а не простые строки), заключается в сохранении путей. Файлы определяются в каждом подкаталоге, а исполняемые/тестовые правила определяются в файле верхнего уровня. Функция, которая мне бы очень понравилась, — это доступ только для чтения к строковым частям объекта File (например, путь, имя, расширение и т. д.).