2017-08-04 105 views
2

我試圖用ExternalProject_Add添加外部項目作爲庫到我的項目:CMake:如何在ExternalProject中使用INTERFACE_INCLUDE_DIRECTORIES?

ExternalProject_Add(
     xgboost 
     GIT_REPOSITORY https://github.com/dmlc/xgboost.git 
     GIT_TAG v0.60 
     PREFIX ${CMAKE_CURRENT_BINARY_DIR} 
     INSTALL_COMMAND "" 
) 

另外,我定義庫的目標和增加外部項目作爲一個依賴:

set(XGBOOST_PREFIX_PATH "${CMAKE_CURRENT_BINARY_DIR}/src") 
set(XGBOOST_BINARY_PATH "${XGBOOST_PREFIX_PATH}/xgboost-build") 
set(XGBOOST_BINARY_INCLUDE "${XGBOOST_PREFIX_PATH}/xgboost/include;${XGBOOST_PREFIX_PATH}/xgboost/dmlc-core/include;${XGBOOST_PREFIX_PATH}/xgboost/rabit/include") 
add_library(libxgboost IMPORTED STATIC GLOBAL) 
add_dependencies(libxgboost xgboost) 

set_target_properties(libxgboost PROPERTIES 
     "IMPORTED_LOCATION" "${XGBOOST_BINARY_PATH}/liblibxgboost.dylib" 
     "IMPORTED_LINK_INTERFACE_LIBRARIES" "${CMAKE_THREAD_LIBS_INIT}" 
     "INTERFACE_INCLUDE_DIRECTORIES" "${XGBOOST_BINARY_INCLUDE}" 
     ) 

在另外的CMakeLists.txt:

add_library(somelib STATIC SomeLib.cpp) 
target_include_directories(somelib PUBLIC libxgboost) 
target_link_libraries(somelib libxgboost) 

的問題是,CMake的INTERFACE_INCLUDE_DIRECTORIES不允許出口include目錄哪些呢 不存在。

是否有任何其他方式可以自動爲所有依賴於的目標自動包含頭文件libxgboost

UPDATE:

錯誤消息:

CMake Error in somelib/CMakeLists.txt: 
    Imported target "libxgboost" includes non-existent path 

    "build/xgboost/src/xgboost/include" 

    in its INTERFACE_INCLUDE_DIRECTORIES. Possible reasons include: 

    * The path was deleted, renamed, or moved to another location. 

    * An install or uninstall procedure did not complete successfully. 

    * The installation package was faulty and references files it does not 
    provide. 
+0

請提供錯誤消息。 – Tsyvarev

+0

「IMPORTED_LINK_INTERFACE_LIBRARIES」已被棄用。使用'INTERFACE_LINK_LIBRARIES'。你有沒有考慮過使用'execute_process()'在ExternalProject CMakeLists.txt中調用'cmake'(兩次),那麼你在配置的時候會有依賴關係?或者,您可以在CMakeLists.txt配置時間期間僞造僅依賴項目錄的創建。 – utopia

+0

這是我的計劃B,但仍然懷疑是否有一個良好的做法,我面臨同樣的確切問題 –

回答

1

我會後最終CMakeLists.txt,包括xgboost到您的項目,它可能是有用的人,解決上面的問題是在cmake配置階段創建目錄(注意:我使用OSX構建它,所以您需要使用liblibxgboost.so代替liblibxgboost.dylib):

include(ExternalProject) 

ExternalProject_Add(
     xgboost 
     GIT_REPOSITORY https://github.com/dmlc/xgboost.git 
     GIT_TAG v0.60 
     PREFIX ${CMAKE_CURRENT_BINARY_DIR} 
     INSTALL_COMMAND "" 
) 

set(XGBOOST_PREFIX_PATH "${CMAKE_CURRENT_BINARY_DIR}/src") 
set(XGBOOST_BINARY_PATH "${XGBOOST_PREFIX_PATH}/xgboost-build") 

set(XGBOOST_LIB_INCLUDE "${XGBOOST_PREFIX_PATH}/xgboost/include") 
set(DMLC_LIB_INCLUDE "${XGBOOST_PREFIX_PATH}/xgboost/dmlc-core/include") 
set(RABIT_LIB_INCLUDE "${XGBOOST_PREFIX_PATH}/xgboost/rabit/include") 
set(XGBOOST_BINARY_INCLUDE "${XGBOOST_LIB_INCLUDE};${DMLC_LIB_INCLUDE};${RABIT_LIB_INCLUDE}") 

# Hack to make it works, otherwise INTERFACE_INCLUDE_DIRECTORIES will not be propagated 
file(MAKE_DIRECTORY ${XGBOOST_LIB_INCLUDE}) 
file(MAKE_DIRECTORY ${DMLC_LIB_INCLUDE}) 
file(MAKE_DIRECTORY ${RABIT_LIB_INCLUDE}) 

add_library(libxgboost IMPORTED STATIC GLOBAL) 
add_dependencies(libxgboost xgboost) 

set_target_properties(libxgboost PROPERTIES 
     "IMPORTED_LOCATION" "${XGBOOST_BINARY_PATH}/liblibxgboost.dylib" 
     "INTERFACE_INCLUDE_DIRECTORIES" "${XGBOOST_BINARY_INCLUDE}" 
) 
+1

我希望CMake能夠更好地支持這個;它似乎有點破解。有沒有辦法以某種方式處理這與依賴關係?例如,您可以設置不存在的庫的IMPORTED_LOCATION。 INTERFACE_INCLUDE_DIRECTORIES不一致似乎不一致。 –

+1

@JeffTrull我希望它能以更好的方式支持它。但這是我發現的唯一方法,但這並不意味着它是唯一存在的方式。我是cmake的新手,所以我可能會在這裏錯過一些東西。 –