Файлы CMakeLists.txt для нескольких библиотек и исполняемых файлов - PullRequest
11 голосов
/ 12 марта 2012

Я только начинаю играть с CMake. У меня есть что-то вроде:

/DEV
 |-- lib1
        | CMakeLists.txt

 |-- lib2
        | CMakeLists.txt

 |-- exe1
        | CMakeLists.txt

/BUILD
 |-- lib1
 |-- lib2
 |-- exe1

/INSTALL
 |-- include
 |-- lib
 |-- bin

Я бы хотел:

  • Сборка каждой библиотеки и exe независимо, когда это необходимо. (Так что я полагаю, что я должен добавить файл CMakeLists.txt для каждой библиотеки и exe);
  • При сборке, каталоги include и lib должны ссылаться на каталог INSTALL; (это хорошая идея?)
  • При сборке добавьте зависимости в другую библиотеку и перестройте их, если они не обновлены.

Понятия не имею, с чего начать. Пожалуйста, помогите ...

Ответы [ 2 ]

11 голосов
/ 13 марта 2012

Вам не нужен отдельный файл CMakeLists.txt для самостоятельного создания целей. Скажем, у вас есть один верхний уровень CMakeLists.txt с:

ADD_LIBRARY(lib1 ${all_lib1_files})
ADD_LIBRARY(lib2 ${all_lib2_files})
ADD_EXECUTABLE(exe1 ${all_exe1_files})
TARGET_LINK_LIBRARIES(lib2 lib1)  # lib2 now depends on lib1
TARGET_LINK_LIBRARIES(exe1 lib2)  # exe1 now depends on lib2 and lib1

Затем вы можете собрать только lib1, запустив make lib1 или msbuild lib1.vcxproj и т. Д. Вы можете добиться того же, имея отдельные файлы CMakeLists.txt для каждой цели - это ваше дело, если вы считаете, что оно того стоит.

Если ваш проект импортирует эти цели, используя FIND_LIBRARY или FIND_PACKAGE, то они не будут восстановлены, если они не обновлены. В конечном итоге, если вы хотите, чтобы устаревшие зависимости автоматически перестраивались, вам нужно сообщить CMake об источниках и правилах для зависимой цели, то есть в файле CMakeLists.txt необходимо добавить цель, используя ADD_LIBRARY или ADD_EXECUTABLE.

Тогда вам не нужно ссылаться на каталог INSTALL (за исключением команд INSTALL, которые я представляю), поскольку CMake будет неявно использовать местоположения сборки libs / exes, а не места установки при связывании целей.

3 голосов
/ 13 марта 2012

Кому

Создайте каждую библиотеку и независимо независимо от нее.

просто добавьте ключевое слово EXCLUDE_FROM_ALL в вызовы add_executable() или add_library().

При создании, каталоги include и lib должны ссылаться на каталог INSTALL

Если под referencing вы подразумеваете добавление его к include_directories() и link_directories(), тогда это нехорошо.Лучше не утверждать о расположении необходимых файлов в пользовательской системе.Надлежащим способом является поиск необходимых включений и библиотек с использованием find_package(), find_library() или find_file().Если вы хотите использовать первую функцию, вам нужно написать FindYourLib.cmake и установить ее вместе с самой библиотекой.

При сборке добавьте зависимости в другую библиотеку и перестройте их, если они не обновлены

Это делается автоматически CMake.Зависимости могут быть добавлены с помощью функции add_dependencies() или неявно с помощью target_link_libraries().

...