2015-06-29 3 views
2

Есть ли способ определить зависимости этапа установки цели в cmake? Вот моя ситуация:В зависимости от мишени INSTALL внешнего проекта CMake

Моя цель - загрузить исходный код этого проекта и построить его без предварительной установки зависимостей. Другими словами, я хотел бы, чтобы зависимости распознавались и устанавливались до того, как они попытались создать основную цель. Например, я работаю в том числе Leptonica в качестве внешнего проекта:

set(leptonica_build "${CMAKE_CURRENT_BINARY_DIR}/leptonica") 

ExternalProject_Add(
    leptonica 
    DOWNLOAD_DIR ${download_dir} 
    BINARY_DIR ${leptonica_build} 
    GIT_REPOSITORY ${OpenCV_git_repository} 
    GIT_TAG ${OpenCV_git_tag} 
    TLS_VERIFY true 
    CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${DOC_READER_INSTALL_PREFIX} 
) 

Запуск в цель leptonica правильно строит и устанавливает библиотеку во временную директорию, делая сам доступными для других целей потреблять:

add_dependencies(myProgram leptonica) 
find_library(LEPT_LIB lept) 
target_link_libraries(myProgram ${LEPT_LIB}) 

проблема заключается в том, что, когда /TMP очищается и CMake сначала выполняется с мишенью MyProgram, liblept.so не найден, потому что он еще не был установлен, и, следовательно, выше по потоку зависимость MyProgram не не было выполнено до послесделать установку была запущена.

Другими словами, я хотел бы, чтобы сценарий сборки сначала загружал и устанавливал зависимости, а затем пытался найти расположение библиотек, необходимых для шагов последующей сборки. Можно ли это сделать с cmake, или я должен достичь этой цели другим способом?

ответ

1

Сборка и установка leptonica от CMakeLists.txt. Кроме того, вы можете использовать один и тот же CMakeLists и выборочно включить либо ExternalProject -сече- или основной раздел вашего CMakeLists с управляющей переменной (-DMYPROJECT_INSTALL_DEPS=1)

Вы можете вызвать Configure/построить шаги leptonica из сценария оболочки или вызова cmake от главного CMakeLists с execute_process:

execute_process(
     COMMAND ${CMAKE_COMMAND} -H... -B... 
     COMMAND ${CMAKE_COMMAND} --build ... --target install ... 
    ) 

Таким образом, вся конфигурация/сборки/установки шаги будут выполнены на этапе конфигурации вашего основного проекта.

+0

Спасибо, это стратегия, с которой я сейчас работаю. – Nate

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