Помимо (правильного) ответа @ 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')