CMAKE для модульной структуры C ++ - PullRequest
1 голос
/ 12 марта 2012

Я занимаюсь рефакторингом платформы C ++, независимой от большой платформы, так что ее библиотеки и исполняемые файлы больше не должны находиться в одном и том же каталоге (или даже хранилище), и это оказывается довольно сложным делом.В настоящее время фреймворк использовался только мной, и теперь он должен касаться всей нашей рабочей группы, поэтому я должен поддерживать его как можно более модульным и максимально автоматизированным.

Моя базовая структура выглядит следующим образом

  • apps /
    • app1, app2, ...
  • libs /
    • core, lib1, lib2, ...
  • bin:
    • app1, app2, libcore, liblib1, liblib2, ... (в NIX)
    • app1.exe, app2.exe, core.dll, lib1.dll, lib2.dll, ... (в Windows)

Приложения зависят от libs и всеlibs зависят от core lib.Все это прекрасно работает в том же корневом каталоге и с механизмом add_subdirectory .

Зависимости проекта были распределены в порядке, в котором я вызывал add_subdirectory : first libs (ядро - первое), затем apps .Cmake был достаточно любезен, чтобы установить $ {core_SOURCE_IR} в соответствующий каталог, и все двоичные файлы (библиотеки и приложения) были сгенерированы в одном каталоге.

Мне нужен совет:

  • если я перейду к подходу find_package (напишите для каждого файла lib и FindLib.cmake)
  • как apps и libs найти друг друга
  • куда поместить бинарные файлы
  • как передать включенные каталоги зависимых целей
  • ExternalProject_Add ?

Спасибо

Ответы [ 2 ]

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

Я бы рекомендовал использовать INSTALL(TARGETS... вместе с INSTALL(EXPORT...

Для получения полной информации запустите:

cmake --help-command INSTALL

FIND_PACKAGE обычно используется для поиска внешнего проекта, который уже установлен (и который не был установлен с помощью команды CMake INSTALL(EXPORT...), а ExternalProject_Add используется для загрузки, настройки, сборки и установки внешнего проекта.

Если вы используете INSTALL(EXPORT... с каждым из ваших библиотек и exe, а затем просто INCLUDE установленный <target>.cmake в вашем основном CMakeLists.txt, они станут доступны как правильные цели CMake, с их зависимостями для конфигурации уже установлен.

Относительно того, где установить эти экспортные файлы - решать только вам, но если указанный вами путь совпадает с тем, который вы используете при INCLUDE файле позже, он должен работать нормально.

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

Во-первых, вы можете add_subdirectory() в любом порядке, не заботясь о зависимостях. CMake обрабатывает их, когда все CMakeLists.txt анализируются.

Во-вторых, если вы хотите, чтобы какая-либо ваша библиотека или приложение были доступны для сборки, вы должны использовать что-то вроде find_package(). Это может быть find_library() и find_file(lib.h) для простых случаев.

В этом случае после вызова find_package() будут определены переменные LIB_INCLUDE_DIRS, LIB_LIBRARY_DIRS, LIB_LIBRARIES, которые можно передать в include_directories(), link_directories() и target_link_libraries() соответственно. Вот как приложения найдут библиотеки.

Что касается места размещения двоичных файлов - в * NIX широко практикуется их размещение в ${CMAKE_INSTALL_PREFIX}/bin.

Пожалуйста, прокомментируйте этот ответ, если есть что-то неясное для вас.

...