2015-05-13 82 views
1

是否可以使用任何shell命令來執行cmake的ExternalProject_Add的INSTALL_COMMAND階段?例如使用shell命令作爲INSTALL_COMMAND到ExternalProject_Add

ExternalProject_Add(leveldb GIT_REPOSITORY [email protected]:google/leveldb.git GIT_TAG v1.18 
        CONFIGURE_COMMAND ./build_detect_platform build.settings . 
        BUILD_COMMAND make -j 8 BUILD_IN_SOURCE 1 INSTALL_COMMAND "") 
#     INSTALL_COMMAND "mkdir -p ${CMAKE_BINARY_DIR}/lib/ \ 
#     && find . \(-name \"*${CMAKE_SHARED_LIBRARY_SUFFIX}\" -or -name \"*${CMAKE_STATIC_LIBRARY_SUFFIX}\" \ 
#     -exec cp {} ${CMAKE_BINARY_DIR}/lib/\;\) \ 
#     && cp -r ./include ${CMAKE_BINARY_DIR}") 

我註釋掉我想用,發現和CP似乎並沒有被允許,「沒有這樣的文件或目錄,錯誤127」的INSTALL_COMMAND是使用這個的結果。

回答

2

直接回答:

install(CODE "execute_process(...)") 

腳本和代碼簽名:

install([[SCRIPT <file>] [CODE <code>]] [...])

腳本的形式將安裝過程中調用給CMake的腳本文件。如果腳本文件名是一個相對路徑,它將根據當前源目錄進行解釋。 CODE表單將在安裝期間調用給定的CMake代碼。代碼被指定爲雙引號字符串內的單個參數。例如,代碼

install(CODE "MESSAGE(\"Sample install message.\")")

會在安裝期間打印的消息。深思

食物:

你可能會急於得到的東西很快完成。如果你有時間,可以考慮這個,或者你可以回到它並修復它。

人們喜歡cmake的主要原因之一是因爲它是跨平臺的本質。考慮到這方面的任何項目都可以在Linux或Windows或任何其他操作支持的系統上使用。如果開發人員考慮到這一點,各種發電機將會開心地工作。我的建議是將shell命令以跨平臺的方式轉換爲cmake,並將它們放在單獨的* .cmake文件中並使用cmake -E選項執行。

這是我過去曾參與過的一個工作項目的摘錄。

project_build_steps.cmake

message(VAR1=${VAR1}) # These variables can be passed from the invocation place 
message(VAR2=${VAR2}) # You can use them in the build steps 

if("${BUILD_STEP}" STREQUAL "patch") 
    message("BUILD_STEP: patch") 
    # Put your patch steps using cmake 
endif() 
if("${BUILD_STEP}" STREQUAL "configure") 
    message("BUILD_STEP: configure") 
    # Put your configure steps using cmake 
endif() 

if("${BUILD_STEP}" STREQUAL "build") 
    message("BUILD_STEP: build") 
    # Put your build steps using cmake 
endif() 

if("${BUILD_STEP}" STREQUAL "install") 
    message("BUILD_STEP: install") 
    # Put your install steps using cmake 
endif() 

的CMakeLists.txt(選項1)

set(CMAKE_COMMAND /usr/bin/cmake) 
set(PROJECT_BUILD_STEPS_FILE project_build_steps.cmake) 

ExternalProject_Add(
    project_name 
    SOURCE_DIR /path/to/project/source 
    PATCH_COMMAND ${CMAKE_COMMAND} -DBUILD_STEP=patch -P ${PROJECT_BUILD_STEPS_FILE} 
    CONFIGURE_COMMAND ${CMAKE_COMMAND} -DBUILD_STEP=configure -P ${PROJECT_BUILD_STEPS_FILE} 
    BUILD_COMMAND ${CMAKE_COMMAND} -DBUILD_STEP=build -P ${PROJECT_BUILD_STEPS_FILE} 
    INSTALL_COMMAND ${CMAKE_COMMAND} -DBUILD_STEP=install -P ${PROJECT_BUILD_STEPS_FILE} 
) 

如果你不想使用ExternalProject_Add您可以使用類似以下。這也會給你個別的構建目標,比如make project_patch,make project_configure,make project_build,make project_install。

的CMakeLists.txt(選項2)

set(CMAKE_COMMAND /usr/bin/cmake) 
set(PROJECT_BUILD_STEPS_FILE project_build_steps.cmake) 

set(STAMP_FILE_PROJECT_PATCH .project_patch_done) 
add_custom_command(
    OUTPUT ${STAMP_FILE_PROJECT_PATCH} 
    COMMAND ${CMAKE_COMMAND} -DVAR1=value1 -DSTEP=patch -P ${PROJECT_BUILD_STEPS_FILE} 
    COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE_PROJECT_PATCH} 
) 

add_custom_target(project_patch DEPENDS ${STAMP_FILE_PROJECT_PATCH}) 

set(STAMP_FILE_PROJECT_CONFIGURE .project_configure_done) 
add_custom_command(
    OUTPUT ${STAMP_FILE_PROJECT_CONFIGURE} 
    COMMAND ${CMAKE_COMMAND} -DSTEP=configure -P ${PROJECT_BUILD_STEPS_FILE} 
    COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE_PROJECT_CONFIGURE} 
) 

add_custom_target(project_configure DEPENDS project_patch ${STAMP_FILE_PROJECT_CONFIGURE}) 


set(STAMP_FILE_PROJECT_BUILD .project_build_done) 
add_custom_command(
    OUTPUT ${STAMP_FILE_PROJECT_BUILD} 
    COMMAND ${CMAKE_COMMAND} -DSTEP=build -P ${PROJECT_BUILD_STEPS_FILE} 
    COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE_PROJECT_BUILD} 
    VERBATIM 
) 

add_custom_target(project_build DEPENDS project_configure ${STAMP_FILE_PROJECT_BUILD}) 
set(STAMP_FILE_PROJECT_INSTALL .project_install_done) 
add_custom_command(
    OUTPUT ${STAMP_FILE_PROJECT_INSTALL} 
    COMMAND ${CMAKE_COMMAND} -DSTEP=install -P ${PROJECT_INSTALL_STEPS_FILE} 
    COMMAND ${CMAKE_COMMAND} -E touch ${STAMP_FILE_PROJECT_INSTALL} 
    VERBATIM 
) 

add_custom_target(project_install DEPENDS project_build ${STAMP_FILE_PROJECT_INSTALL}) 
+0

感謝,沒有任何特別的繁忙,只是不知道更好,我想(我現在做的!),反正,我會把它解壓到使其跨平臺,現在沒有必要,但它是可以預見的 – zcourts