2013-09-06 5 views
5

Мне интересно, как управлять зависимостями внешнего проекта. Скажем, у меня есть три проекта, каждый из которых в другом хранилище:CMake: Зависимости внешнего проекта

  1. Ключевых: библиотека экспортирует много полезных вещей.
  2. Lib1: библиотека с некоторыми конкретными классами (зависит от Core).
  3. Исполняемые: использует материал из Ядра, а также от Lib1.

Каждый проект с его CMakeLists.txt. Использование find_package и определение путей на CMake я могу построить каждый проект без проблем и установить его (я последовал this tuto строить .cmake файлы для библиотек)


Теперь я пытаюсь сделать этот процесс как можно проще и Я представляю макрос ExternalProject_Add, таким образом, людям нужно будет только клонировать Executable репозиторий и с помощью файлов CMake Lib1 и Core также загружаются, скомпилированы и связаны.

Проблема заключается в том, что Исполняемые и Lib1 зависит от Ядра, но я хочу, чтобы быть клонирован (и компилируется) только один раз. Вот проблема:

  • В Исполняемые CMake клоны и строит Ядро с особенностями ExternalProject_Add.
  • Затем Cmake клоны Lib1 и ищет Ядра, но он не был уже установлен, так что нет ядра-targets.cmake файла (ядра-config.cmake доступен) ... и здание не может ...

Я не знаю, есть ли документированный способ работы с этим видом дерева проекта или я пишу какое-то обходной путь, когда ядра входят в зависимости внешний профессионал ject, чтобы избежать использования файла core-target.cmake.

Спасибо!


Решение

я понял, что при использовании ExternalProject_Add скачивает, строит и установить проект так, в установочном-папке, у меня уже есть все файлы, необходимые для компиляции его иждивенцам.

Так что я могу справиться с этой проблемой, выполнив следующие действия (также для заказа сборки):

  • * ExternalProject_Add * для Ядро
  • * ExternalProject_Add * для Lib1 прохождение сердечника INSTALL_DIR в качестве аргумента
  • ... и Исполняемый файл.
+0

Две альтернативы, которые я вижу: (1) создают один проект CMake для всех ваших библиотек и исполняемых файлов; (2) make 'Executable' зависит только от' Lib1'. –

+0

(скопировано как решение) Я понял, что при использовании ExternalProject_Add он загружает, строит и УСТАНАВЛИВАЕТ проект, поэтому в папке установки у меня уже есть все файлы, необходимые для компиляции его иждивенцев. Таким образом, я могу управлять этой проблемой, следуя этим шагам (также для порядка построения): * ExternalProject_Add for Core * ExternalProject_Add для Lib1, передающий Core install dir в качестве аргумента. * .. и Исполняемый файл. (скопирован в вопрос) – jgsogo

ответ

1

Я хотел бы добавить два удобных проекты Executable, который будет содержаться в подпапках и использовать ExternalProject_Add.

add_subdirectory(CoreWrapper) # Use ExternalProject_Add here 
add_subdirectory(Lib1Wrapper) # Use ExternalProject_Add here 

Теперь вы можете либо добавить зависимости в Executable, так что все получает установлен перед Исполняемые построен или вы работаете непосредственно с двоичных файлов, содержащихся в папках сборки.

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