2017-03-01 51 views
0

執行子我有一個外部的項目,需要幾個命令來構建:在cmake的

ExternalProject_Add(
    xmlrpc_build 
    PREFIX ${XMLRPC_ROOT} 
    SOURCE_DIR ${XMLRPC_ROOT} 
    BUILD_IN_SOURCE 1 
    CONFIGURE_COMMAND "" 
    BUILD_COMMAND ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} COMMAND export CFLAGS=`${CURL_CONFIG} --cflags` COMMAND make -j8 
    INSTALL_COMMAND "" 
) 

不幸的是,cmake的逃逸',因此命令是非法的構造:

export "CFLAGS=\`/xxx/curl-config" "--cflags\`" 

我累了把它放在 「」,但沒有運氣:

BUILD_COMMAND ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} COMMAND "export CFLAGS=`${CURL_CONFIG} --cflags`" COMMAND make -j8 

export "CFLAGS=\`/xxx/curl-config" "--cflags\`" 

組合使用$(),而不是``不幫之一:

BUILD_COMMAND ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} COMMAND "export CFLAGS=$(${CURL_CONFIG} --cflags)" COMMAND make -j8 
"export CFLAGS=\$(/xxx/curl-config --cflags)" 

BUILD_COMMAND ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} COMMAND export CFLAGS=$(${CURL_CONFIG} --cflags) COMMAND make -j8 
export "CFLAGS=\$" "(" /xxx/curl-config --cflags ")" 

有沒有辦法從子進程獲取結果並將其分配給變量?

編輯:從另一個問題,仍然沒有運氣嘗試的解決方案:

set(blah "`${CURL_CONFIG} --cflags`") 
BUILD_COMMAND ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} COMMAND export CFLAGS=${blah} COMMAND make -j8 

export "CFLAGS=\`/xxx/curl-config --cflags\`" 

或:

BUILD_COMMAND ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} COMMAND [=[export CFLAGS=`${CURL_CONFIG} --cflags`]=] COMMAND make -j8 

"export CFLAGS=\`\${CURL_CONFIG} --cflags\`" 
+0

的可能的複製[cmake的:如何以包括自定義命令字面雙引號?](http://stackoverflow.com/questions/39368525/cmake-how-to-include-literal-double-quote-in-custom-command)或者[CMake quote escape conumdrum](https://stackoverflow.com /問題/ 40626275/cmake的引號轉義-conumdrum)。你也可以使用'$ {CMAKE_COMMAND} -E env [--unset = NAME] ... [NAME = VALUE] ... COMMAND [ARG] ...'爲你的'make'調用設置環境。 – Florian

回答

0

明白了一個可怕的解決方法的工作(這是一個恥辱,這麼小的事情不能沒有黑客做):

add_custom_target(
    xmlrpc_build_curl_config 
    COMMAND echo -n CFLAGS= > curl_cflags COMMAND ${CURL_CONFIG} --cflags >> curl_cflags 
    DEPENDS curl 
    WORKING_DIRECTORY "${XMLRPC_ROOT}" 
    VERBATIM 
) 

ExternalProject_Add(
    xmlrpc_build 
    PREFIX ${XMLRPC_ROOT} 
    SOURCE_DIR ${XMLRPC_ROOT} 
    BUILD_IN_SOURCE 1 
    CONFIGURE_COMMAND "" 
    BUILD_COMMAND ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} COMMAND cat curl_cflags | xargs env COMMAND make -j8 
    INSTALL_COMMAND "" 
) 

add_dependencies(xmlrpc_build xmlrpc_build_curl_config) 
0

與其說${CURL_CONFIG} --cflags內嵌到External_Project_Add()命令,爲什麼不把它事先的?

find_program(CURL_CONFIG curl-config) 
execute_process(COMMAND ${CURL_CONFIG} --cflags 
       OUTPUT_VARIABLE CURL_CONFIG_CFLAGS) 
ExternalProject_Add(
    xmlrpc_build 
    PREFIX ${XMLRPC_ROOT} 
    SOURCE_DIR ${XMLRPC_ROOT} 
    BUILD_IN_SOURCE 1 
    CONFIGURE_COMMAND CFLAGS="${CURL_CONFIG_CFLAGS}" ./configure --enable-curl-client CURL_CONFIG=${CURL_CONFIG} 
    BUILD_COMMAND CFLAGS="${CURL_CONFIG_CFLAGS}" make -j8 
    INSTALL_COMMAND "" 
) 
+0

這個文件不存在。外部項目取決於另一個創建它的項目。 – krojew

+0

什麼文件不存在? – nega

+0

你放在execute_process中的那個。 – krojew