2016-06-20 2 views
0

Я пытаюсь загрузить и построить DevIL с помощью команды ExternalProject_Add от cmake, но по какой-то причине git repo имеет файл CMakeLists.txt внутри подпапки проекта.CMake ExternalProject_add с CMakeLists на вложенной папке

Я не могу найти способ заставить ExternalProject_add вызывать cmake в правильной папке. Я попытался использовать префикс и source_dir, но он все еще не работает.

Затем я увидел ответ онлайн, в котором участвовал создание временного CMakeLists.txt, который бы назвал правильный путь cmake. Но так как я не знаю, как обеспечить путь к вызову cmake, это означало, что мне пришлось бы поместить его в загруженное git-репо, которое позже показало, что это боль ... Это текущая команда, которую я с помощью: включают в себя («ExternalProject»)

######### Search for required third-party libraries. If not found, attempt to download and build them ######## 

set (DEVIL_ROOT "${THIRD_PARTY_OUTPUT_PATH}/DevIL") 
option (BUILD_DEVIL "Download and build DevIL" FALSE) 

find_package (Devil) 
if (NOT DEVIL_FOUND) 
    message (STATUS "DevIL not found. Forcing to build own copy...") 
    set (BUILD_DEVIL TRUE) 
endif() 

if (BUILD_DEVIL) 
set (DEVIL_BUILD_PATH "${THIRD_PARTY_BUILD_PATH}/DevIL/") 
set (DEVIL_OUTPUT_PATH "${THIRD_PARTY_OUTPUT_PATH}/DevIL") 

message (STATUS "Downloading DevIL and building...") 
file(WRITE ${DEVIL_BUILD_PATH}/DevilCMakeLists.txt "cmake_minimum_required(VERSION 3.0) \n add_subdirectory (DevIL)") 
ExternalProject_Add (ThirdParty_DevIL 
    PREFIX "${DEVIL_BUILD_PATH}" 
    GIT_REPOSITORY "https://github.com/DentonW/DevIL" 
    PATCH_COMMAND cmake -E copy "${DEVIL_BUILD_PATH}/DevilCMakeLists.txt" "${DEVIL_BUILD_PATH}/src/ThirdParty_DevIL/DevIL/" 
    INSTALL_DIR ${DEVIL_OUTPUT_PATH} 
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>) 

list (APPEND THIRD_PARTY_DEPENDENCIES ThirdParty_DevIL) 
set (DEVIL_INCLUDE_DIR "${DEVIL_OUTPUT_PATH}/include") 
set (DEVIL_LIBRARY devil) 
add_definitions (-DDEVIL) 
endif() 

list (APPEND THIRD_PARTY_INCLUDE_DIRS "${DEVIL_INCLUDE_DIR}") 
list (APPEND THIRD_PARTY_LIBRARIES ${DEVIL_LIBRARY}) 

Я попытался жестко прописывать путь, как это («/ SRC/ThirdParty_DevIL /» часть), но это некрасиво, как ад, и если CMake решает изменить его в будущее, оно сломается. Кроме того, так как это фактически копирует файл внутри дерева мерзавца, CMake позже жалуется

Failed to unstash changes in: 
'<yadda yadda>/ThirdParty/build//DevIL//src/ThirdParty_DevIL/'. 


You will have to resolve the conflicts manually 

Есть ли способ сделать это решение (о создании временной CMakeListst.txt) работать? Или еще лучше, есть ли другое решение, просто включающее правильную настройку ExternalProject_add?

У меня нет запросов относительно параметров, путей, что угодно, поэтому не стесняйтесь предлагать что-либо. Как я могу это исправить? Благодаря

ответ

1

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

ExternalProject_Add (ThirdParty_DevIL 
    PREFIX "${DEVIL_BUILD_PATH}" 
    GIT_REPOSITORY "https://github.com/DentonW/DevIL" 
    INSTALL_DIR ${DEVIL_OUTPUT_PATH} 
    CONFIGURE_COMMAND ${CMAKE_COMMAND} -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> 
     <SOURCE_DIR>/DevIL # Tell CMake to use subdirectory as source. 
) 

В этом случае необходимо вручную добавить к этой команде вещей, которые обычно даются с такие как CMAKE_ARGS, CMAKE_CACHE_ARGS и так далее. Но это не должно быть реальной проблемой.


В качестве альтернативы, вы можете разделить ExternalProject_Add на два вызова: один, который только загружает пакет, а второй, который делает все остальное. В этих вызовов можно использовать различные SOURCE_DIR опции:

ExternalProject_Add (ThirdParty_DevIL_download 
    PREFIX "${DEVIL_BUILD_PATH}" 
    SOURCE_DIR "${DEVIL_BUILD_PATH}/src/ThirdParty_DevIL" # Explicitely set 
    GIT_REPOSITORY "https://github.com/DentonW/DevIL" 
    CONFIGURE_COMMAND "" # Disable all other steps 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "" 
) 

ExternalProject_Add (ThirdParty_DevIL 
    PREFIX "${DEVIL_BUILD_PATH}" 
    DOWNLOAD_COMMAND "" # Disable download step 
    SOURCE_DIR "${DEVIL_BUILD_PATH}/src/ThirdParty_DevIL/DevIL" # Source dir for configuration 
    INSTALL_DIR ${DEVIL_OUTPUT_PATH} 
    CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> 
) 

# Add dependency between to calls 
add_dependencies(ThirdParty_DevIL ThirdParty_DevIL_download) 

Поскольку вычисление SOURCE_DIR на основе PREFIX зависит от имени внешнего проекта и имена отличаются в двух вызовов, этот параметр установлен явно.

Недостаток этого подхода заключается в том, что в журнале построения отображаются строки о многих «не выполненных» этапах (конфигурирование, сборка и установка для первого вызова и загрузки ExternalProject_Add(), путь и обновление для второго вызова).

+0

Пошел на первое решение. К сожалению, я отказываюсь от DevIL, так как ему нужны дополнительные шаги настройки и добавляет зависимости, но это по-прежнему самое лучшее решение, и это было сделано ALMOST. Благодарю. –

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