Мезонные цели, которые зависят от братьев и сестер - PullRequest
0 голосов
/ 11 марта 2019

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

.
├── 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 файлах, чтобы связать эти цели вместе?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

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

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

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

Недостатки:

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

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

# 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')
0 голосов
/ 11 марта 2019

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

...