CMake's execute_process and arbitrary shell scripts

You can execute any shell script, using your shell's support for taking in a script within a string argument.

Example:

execute_process(
    COMMAND bash "-c" "echo -n hello | sed 's/hello/world/;'" 
    OUTPUT_VARIABLE FOO
)

will result in FOO containing world.

Of course, you would need to escape quotes and backslashes with care. Also remember that running bash would only work on platforms which have bash - i.e. it won't work on Windows.


  1. execute_process command seems to only let you, well, execute a process - not an arbitrary line you could feed a command shell.

Yes, exactly this is written in documentation for that command:

All arguments are passed VERBATIM to the child process. No intermediate shell is used, so shell operators such as > are treated as normal arguments.

  1. I want to use pipes

Different COMMAND within same execute_process invocation are actually piped:

Runs the given sequence of one or more commands with the standard output of each process piped to the standard input of the next.

  1. file descriptor redirection, etc. - and that does not seem to be possible.

For complex things just prepare separate shell script and run it using execute_process. You can pass variables from CMake to this script using its parameters, or with prelimiary configure_file.