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)