Цели мезона, зависящие от братьев и сестер subdir

Вот моя структура проекта:

.
├── include
├── src
│   ├── abc
│   │   ├── include
│   │   └── src
│   ├── def
│   │   ├── include
│   │   └── src
│   └── ghi
│       ├── include
│       └── src
└── vendor
    ├── bar
    │   ├── include
    │   └── src
    └── foo

16 directories

Я хочу перенести свою сборку на Meson. Однако я не уверен, как связать цели, определенные в родственных папках.

Мой график зависимостей выглядит так:

  • src/abc/meson.build определяет статическую библиотеку abc
  • src/def/meson.build определяет статическую библиотеку def, которая зависит от abc и foo
  • src/ghi/meson.build определяет статическую библиотеку ghi, которая зависит от bar
  • vendor/bar/meson.build определяет статическую библиотеку bar
  • vendor/foo/meson.build определяет статическую библиотеку foo
  • Верхний уровень meson.build определяет исполняемый файл app, который зависит от abc, def и ghi

В документации вроде бы два механизма:

  • subdir
  • subproject

Мне непонятно, что здесь лучше. У меня нет никаких зависимостей вне моего исходного кода.

Что я должен написать в моих meson.build файлах, чтобы связать эти цели вместе?


person sdgfsdh    schedule 11.03.2019    source источник


Ответы (2)


Вы можете использовать subdir из файла верхнего уровня meson.build вниз. Все переменные, которые вы объявляете в meson.build файлах поддиректории, будут доступны для meson.build файлов позже. Пока вы правильно указали порядок subdir вызовов, он будет работать.

person sdgfsdh    schedule 11.03.2019

Помимо (правильного) ответа @ sdgfsdh, мне нравится еще один подход: определять библиотеки и исполняемые файлы только в мезон-файле верхнего уровня и использовать вызовы subdir для определения наборов исходных файлов и "локальных" включаемых путей. Таким образом файлы подкаталога не зависят друг от друга неявно; все дерево зависимостей живет в мезонном файле верхнего уровня.

Преимущества такого подхода:

  • подкаталогам не нужно знать свой собственный путь (files () и include_directories () будут отслеживать это за вас)
  • Файл верхнего уровня должен знать только пути к подкаталогам, чтобы вызывать файлы мезонов подкаталога. После этого вы можете определить все в терминах переменных, созданных в подкаталогах.
  • файлы subdir не зависят напрямую от других файлов meson

Недостатки:

  • Файл верхнего уровня более загроможден
  • Имена переменных в файлах подкаталога должны быть глобально уникальными, поскольку в конечном итоге все определяется в области верхнего уровня.

Пример для вашего случая:

# Top-level meson.build
subdir('src/abc')
subdir('src/def')
subdir('src/ghi')
subdir('vendor/foo')
subdir('vendor/bar')

libabc = static_library('abc', abc_files, include_directories: abc_includes)

libabc_dep = declare_dependency(include_directories: abc_includes, link_with : libabc)

libfoo = static_library('foo', foo_files, include_directories: foo_includes)

libfoo_dep = declare_dependency(include_directories: foo_includes, link_with : libfoo)

libdef = library('def', def_files, include_directories: def_includes, dependencies : [ libabc_dep, libfoo_dep])
# src/abc/meson.build (others would be similar)
abc_files = files(['1.c','2.c',...])
abc_includes = include_directories('include')
person rellenberg    schedule 15.04.2019