Несколько целей с разными файлами конфигурации в одном meson.build?

Приложение My C может быть построено с разными режимами, которые ведут себя по-разному в зависимости от содержимого config.h. В моем файле meson.build я генерирую этот заголовок с помощью функции configure_file().

Теперь я хотел бы улучшить свою систему сборки, чтобы компилировать двоичные файлы для нескольких режимов в одной сборке. Это означает, что мне придется управлять разными версиями config.h одновременно.

Я планировал создать разные версии config.h и сохранить их в разных папках. Затем настройте каталоги включения для каждой цели Meson, чтобы выбрать заголовок для режима, который я создаю.

К сожалению, я обнаружил, что вы не можете указать подпапку в параметре output для configure_file(). Файл всегда будет создаваться в том же месте, что и исполняемый в данный момент meson.build.

Это означает, что я всегда должен включать '.' и не могу различать разные режимы. Примечание: изменение директив #include в исходных файлах C не является вариантом.

Есть ли способ обойти это в Meson?


person Muffo    schedule 02.08.2020    source источник
comment
Можно ли сначала изменить каталоги вместо того, чтобы пытаться сохранить config.h в другом каталоге? то есть: mkdir config1 && cd config1 && ‹cmd здесь› && mkdir ../config2 && cd ../config2 && ‹другой cmd здесь› Если нет, то, возможно, запустите цикл: for i in (config1, config2); do ‹cmd здесь› mkdir $ i; mv config.h $ i; сделано   -  person SoronelHaetir    schedule 03.08.2020
comment
Спасибо за комментарий, можно ли переместить заголовок непосредственно из файла Meson вместо использования сценария bash?   -  person Muffo    schedule 03.08.2020
comment
Не знаю, извини. Я не использую этот инструмент, предложения были просто идеями, которые у меня возникли из-за того, что я сталкивался с подобными ситуациями в прошлом.   -  person SoronelHaetir    schedule 03.08.2020


Ответы (1)


Позвольте meson самостоятельно обрабатывать параметры конфигурации вместо того, чтобы обойти это путем синтаксического анализа параметров через config.h.

В файле meson_options.txt вы объявляете настраиваемые параметры конфигурации, такие как:

option('mode', type : 'combo', choices : ['one', 'two'], value : 'one')

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

meson buildOne -Dmode=one
ninja -C buildOne

а также,

meson buildTwo -Dmode=two
ninja -C buildTwo

Однако, возможно, такой подход нежелателен?

Другой возможный метод - объявить несколько subproject(). Если ваш текущий meson.build не слишком конкретен, вы можете попробовать следующее.

Создайте новый главный meson.build, который занимается упаковкой, но также копирует шаблон meson.build в подпроект директории, по одному для каждого режима. Для этого может потребоваться всего несколько дополнительных ../../, чтобы компенсировать различную структуру сборки.

Приятная вещь с объявлением подпроекта заключается в том, что вы можете переопределить параметры сборки для этого подпроекта. Это фактически означало бы, что у вас снова есть отдельные каталоги сборки, но только один основной каталог сборки, и вам нужно вызвать meson только один раз.

При таком подходе вы можете провести рефакторинг своего приложения и построить только части, работающие в различных режимах, в специальных подпроектах / библиотеках.

person blubase    schedule 08.08.2020
comment
Спасибо за комментарий! Я рассмотрю оба предложения и посмотрю, что больше подходит для моего проекта. - person Muffo; 11.08.2020