0

I have an external project, which needs several commands to build:

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 ""
)

Unfortunately, cmake escapes `, so the command is ill-formed:

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

I tired putting it in "", but no luck:

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\`"

Combinations with using $() instead of `` don't help either:

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 ")"

Is there a way to get a result from a subprocess and assign it to a variable?

EDIT: Tried solutions from another question and still no luck:

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\`"

or:

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

"export CFLAGS=\`\${CURL_CONFIG} --cflags\`"
krojew
  • 1,297
  • 15
  • 38
  • Possible duplicate of [cmake: How to include literal double-quote in custom command?](http://stackoverflow.com/questions/39368525/cmake-how-to-include-literal-double-quote-in-custom-command) or [CMake quote escape conumdrum](https://stackoverflow.com/questions/40626275/cmake-quote-escape-conumdrum). And you could also use `${CMAKE_COMMAND} -E env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...` to set the environment for your `make` call. – Florian Mar 01 '17 at 11:23

2 Answers2

0

Instead of calling ${CURL_CONFIG} --cflags inline to the External_Project_Add() command, why not call it beforehand?

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 ""
)
nega
  • 2,526
  • 20
  • 25
  • This file does not exist yet. The external project depends on another one which creates it. – krojew Mar 02 '17 at 05:11
  • What file doesn't exist? – nega Mar 02 '17 at 18:42
  • The one you put in execute_process. – krojew Mar 03 '17 at 05:12
  • `curl-config` comes with `cURL`, and is on your system if you have cURL properly installed. If your "xmlrpc" package is also trying to build an included copy of cURL, then yeah, you're going to have a problem. Your question doesn't state that though. – nega Mar 03 '17 at 15:59
  • Well, my question never was about curl - it was about executing a subprocess. Note that I never mention curl explicitly, and it's only in my copy-pasted examples. – krojew Mar 03 '17 at 16:01
  • Well, perfect then! I demonstrated exactly how to execute a subprocess with the `execute_process()` CMake command :) – nega Mar 03 '17 at 16:49
0

Got it working by a terrible workaround (it's a shame such trivial things cannot be done without hacks):

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)
krojew
  • 1,297
  • 15
  • 38