2017-06-12 54 views
3

我的項目取決於mariadb-connector-c,我試圖用cmake自動化下載,構建和鏈接過程。如何從cmake內部運行cmake?

我目前下載項目到一個目錄,然後我試圖執行生成忍者文件,並運行他們,但我不能運行cmake的根本:

execute_process(COMMAND "cmake -GNinja ." WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR}) 

我知道這行不通,因爲下一步運行忍者,失敗:

execute_process(COMMAND "ninja" WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR}) 

cmake的運行在CLI很好,我一直在使用的完整路徑CMake的可執行文件,並替換用的完整目錄變量點(這也是一個有效的變量試過,如果你想知道。)

如何告訴cmake在該外部項目上運行cmake?

+0

看起來您可能會從[ExternalProject]中受益(https://cmake.org/cmake/help/v3.0/module/ExternalProject.html) – riodoro1

+0

ExternalProject的最新文檔是[here](https:// cmake .ORG/cmake的/幫助/最新/模塊/ ExternalProject.html) – Antonio

回答

2

您可以將您的項目組織到頂層CMakeLists.txt將您的子項目構建爲0​​。

這種方法需要更多的CMake模塊的工作和維護,但它有它自己的好處。我下載谷歌測試如下:

# Create download URL derived from version number. 
set(GTEST_HOME https://github.com/google/googletest/archive) 
set(GTEST_DOWNLOAD_URL ${GTEST_HOME}/release-${GTEST_VERSION}.tar.gz) 
unset(GTEST_HOME) 

# Download and build the Google Test library and add its properties to the third party arguments. 
set(GTEST_ROOT ${THIRDPARTY_INSTALL_PATH}/gtest CACHE INTERNAL "") 
ExternalProject_Add(gtest 
    URL ${GTEST_DOWNLOAD_URL} 
    CMAKE_ARGS -DBUILD_GTEST=ON -DBUILD_GMOCK=ON -DCMAKE_INSTALL_PREFIX=${GTEST_ROOT} 
    INSTALL_COMMAND make install 
) 

list(APPEND GLOBAL_THIRDPARTY_LIB_ARGS "-DGTEST_ROOT:PATH=${GTEST_ROOT}") 
unset(GTEST_DOWNLOAD_URL) 
unset(GTEST_ROOT) 

代碼abowe是由第三方庫的CMakeLists.txt包括我ExternalGoogleTest.cmake模塊內部:

set_directory_properties(PROPERTIES EP_BASE ${CMAKE_BINARY_DIR}/ThirdParty) 
get_directory_property(THIRDPARTY_BASE_PATH EP_BASE) 

set(THIRDPARTY_INSTALL_PATH ${THIRDPARTY_BASE_PATH}/Install) 
set(GTEST_VERSION 1.8.0) 

include(ExternalProject) 
include(ExternalGoogleTest) 

自己的項目,這依賴於外部庫將需要一個CMake模塊來將其構建爲ExternalProject。它可以是這樣的:

ExternalProject_Add(my_project 
    DEPENDS gtest whatever 
    SOURCE_DIR ${CMAKE_SOURCE_DIR}/lib 
    CMAKE_ARGS 
     ${GLOBAL_DEFAULT_ARGS} 
     ${GLOBAL_THIRDPARTY_LIB_ARGS} 
     -DCMAKE_INSTALL_PREFIX=${DESIRED_INSTALL_PATH}/my_project 
    BUILD_COMMAND make 
) 

你可以找到關於這種模式的更多提示here