Мы хотели бы представить Meson для создания нашего существующего приложения на C ++. Наша структура выглядит следующим образом:
- У нас есть 8 основных модулей (mod_X)
- Каждый модуль имеет 20-40 подкаталогов, каждый с 5 - 100 файлами cpp;разделены в библиотеках и исполняемых файлах.
mod_INFRA/apps/myparser
имеет цель, которая создает исполняемый файл генератора кода - , который зависит только от
mod_INFRA/libs/A
- генератор кода должен применяться к определенным файлам (* .rules) в многочисленных подкаталогах в всех модулях и подкаталогах, включая сам mod_INFRA.
- Сгенерированный исходный код должен быть скомпилирован и рассмотрен с цельюв
subdir_X
Чего я хотел бы достичь:
- В
root/meson.build
определить общее и повторно используемое custom_target
или generator
, которые я могу вызывать / применять в каждом модуле и подкаталоге по мере необходимости.
Проблема:
- В
root/meson.build
мыопределить общие переменные, такие как флаги компилятора и т. д., и мы делаем subdir(‘mod_INFRA’)
для каждого модуля. В mod_INFRA/meson.build
я делаю subdir(‘apps/xyz’), subdir(‘libs/abc’),
и т. Д. для каждого subdir. Все в порядке - Однако я изо всех сил пытаюсь определить
custom_target or generator
в root/meson.build
. Требуемый исполняемый файл еще не доступен до subdir('mod_INFRA')
. А после subdir(..)
уже слишком поздно, так как мне нужен генератор, чтобы уже создавать файлы в других подкаталогах в mod_INFRA
.
Возможным решением может быть «прокси», который лениво разрешает исполняемый файл по имени цели. Например, если бы я мог сделать (псевдокод): generator(getTargetOutput(‘myparser’), …)
. Но я не мог выяснить, доступно ли это.
Любые другие мысли о том, как решить эту проблему, без полной перестройки структуры каталогов?
- meson.build
- mod_INFRA
- meson.build
- apps
- meson.build
- myparser
- meson.build
- libs
- subdir_INFRA_A (required to build myparser)
- meson.build
- subdir_INFRA_B
- meson.build
- subdir_INFRA_C (requires parser to generate code)
- meson.build
- mod_A
- meson.build
- subdir_A_A (requires parser to generate code)
- meson.build
- subdir_A_B (requires parser to generate code)
- meson.build
- mod_B
...