2017-03-01 49 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