2015-08-10 2 views
1

У меня есть проект, в котором имеется только несколько логических групп для создания статических библиотек. Однако для удобства я хочу, чтобы исходный код библиотеки управлялся с более подробными папками.Управление иерархическим проектом CMake без злоупотребления библиотеками

В настоящее время единственный способ, которым я знаю, чтобы сделать это в CMake, не имея библиотеку для каждой папки, это просто список файлов, как обычно в их относительных путях:

add_library(SystemAbstraction STATIC "Some/Path/File.cpp") 

Однако я могу видеть это становится громоздкий, поскольку проект растет по размеру со всеми разными путями.

Я попытался выяснить, могу ли я иметь CMakeLists.txt в каждой папке и просто использовать переменную в базовом CMakeLists.txt при добавлении зависимостей библиотек. Но похоже, что add_subdirectory не импортирует переменные?

ответ

1

Для расширения области видимости переменной в подкаталоге используйте PARENT_SCOPE вариант set. Например, вы можете проверить, что если у вас есть

# CMakeLists.txt 
set(SRCS main.c) 
add_subdirectory(foo) 
message(${SRCS}) 

в корневом каталоге и

# foo/CMakeLists.txt 
set(SRCS ${SRCS} foo.c PARENT_SCOPE) 

в подкаталоге, то он будет печатать main.c foo.c, т.е. переменная правильно импортирован в базу CMakeLists. текст.

+0

ли й работа для любой глубины? Или мне нужно сделать это для каждой родительской папки. – BlamKiwi

+0

Объем распространяется вверх только на один уровень. В CMakeLists.txt на промежуточном уровне вам, по крайней мере, нужно иметь 'set (SRCS $ {SRCS} PARENT_SCOPE)', которому должны предшествовать любые команды 'add_subdirectory'. –

+0

Работал как шарм. – BlamKiwi

1

Опцией было бы использовать библиотеку объектов Особенность CMake. Вы все еще можете, но не нужно организовать сценарий CMake в подкаталоги:

add_library(lib1 OBJECT <srcs>) 
add_library(lib2 OBJECT <srcs>) 
... 
add_library(mainlib $<TARGET_OBJECTS:lib1> $<TARGET_OBJECTS:lib2>) 

Вы можете установить различные флаги компиляции для каждой библиотеки объектов:

target_include_directories(lib1 PRIVATE incl-dir-for-lib1) 
target_compile_definitions(lib2 PRIVATE def-for-lib2) 

Вы все еще нужно установить библиотеки ссылки на вашем главная библиотека:

target_link_libraries(mainlib PRIVATE deps-of-lib1 deps-of-lib2) 

Связанная документация: Object Libraries

Смежные вопросы