Выходной каталог Meson custom_target для сгенерированных источников

У меня есть структура каталогов (проекта), как это:

main_project_dir (main meson.build file)
    project_A (meson.build)
    project_B (meson.build)

В каталоге project_A В файле meson.build используется генератор исходного файла, например:

gen_empty_soap_src = custom_target('empty_soap_src',
    input : 'empty.gsoap',
    output : ['soapC.cpp', 'soapH.h', 'soapStub.h', 'soap.nsmap'],
    depend_files : soap_gen_depend_files,
    command : [soap_compiler, '-n', '-I', '.', '@INPUT@'])

gen_base_soap_src = custom_target('base_soap_src',
    input : 'AbstractAgentAPI.gsoap',
    output : [
        ... a list of output files ...
    ],
    depend_files : soap_gen_depend_files,
    command : [soap_compiler, '-n', '-I', '.',
                '-I' + join_paths(meson.current_source_dir(), soap_src_dir, 'import'),
                '-I' + join_paths(meson.current_source_dir(), soap_src_dir),
                '@INPUT@'])

Предполагается, что созданные файлы находятся под project_A каталог, когда генерируется. Это означает, что структура каталогов должна быть сохранена во время сборки, файлы должны идти под build/project_A каталог. Но они генерируются в build каталог.

Я изучал документацию и уже где-то обнаружил, что для генераторов выходной каталог по умолчанию является каталогом сборки meson.

Как я могу сделать сгенерированные файлы, чтобы перейти в определенный каталог, build/project_A в этом случае?

1 ответ

Похоже, что лучше всего указывать выходной каталог для сгенерированных файлов. В моем случае я использую -d параметр.

Чтобы указать этот каталог в качестве выходного каталога в Мезон, @OUTDIR@ должен быть использован. Теперь мой код выглядит так:

gen_empty_soap_src = custom_target('empty_soap_src',
    input : 'empty.gsoap',
    output : ['soapC.cpp', 'soapH.h', 'soapStub.h', 'soap.nsmap'],
    depend_files : soap_gen_depend_files,
    command : [soap_compiler, '-n', '-d', '@OUTDIR@', '-I', '.', '@INPUT@'])

gen_base_soap_src = custom_target('base_soap_src',
    input : 'AbstractAgentAPI.gsoap',
    output : [
        ... a list of output files ...
    ],
    depend_files : soap_gen_depend_files,
    command : [soap_compiler, '-n',
                '-d', '@OUTDIR@',
                '-I', '.',
                '-I' + join_paths(meson.current_source_dir(), soap_src_dir, 'import'),
                '-I' + join_paths(meson.current_source_dir(), soap_src_dir),
                '@INPUT@'])

Примечание от автора Мезона:

Не используйте current_build_dir(). Вместо этого используйте @OUTDIR@. В общем, если вы обнаружите, что вы вручную строите пути, которые указывают внутри деревьев сборки или исходных кодов, вы, вероятно, делаете что-то не так.

Потому что @OUTDIR@ гарантированно работает. Разные бэкэнды работают по-разному и могут размещать файлы в разных местах. Он также короче и самодокументируется.

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