Bash 在cmake中执行子流程
我有一个外部项目,需要几个命令来构建:Bash 在cmake中执行子流程,bash,cmake,Bash,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 exp
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\`"
或:
与其调用
${CURL\u CONFIG}--cflags
内联到External\u Project\u 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 ""
)
通过一个糟糕的变通方法使其工作(很遗憾,没有黑客就无法完成这些琐碎的事情):
或的可能副本。您还可以使用
${CMAKE_COMMAND}-E env[--unset=NAME]。。。[名称=值]。。。命令[ARG]…
为调用设置环境。此文件尚不存在。外部项目依赖于创建它的另一个项目。什么文件不存在?您放在execute_进程中的文件。curl config
随附curl
,如果正确安装了curl,则该文件位于您的系统上。如果您的“xmlrpc”包还试图构建包含的cURL副本,那么是的,您将遇到一个问题。但是你的问题并没有这样说,我的问题从来不是关于curl的,而是关于执行一个子流程。请注意,我从未明确提到curl,它只出现在复制粘贴的示例中。
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 ""
)
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)