CMake's execute_process and arbitrary shell sc

2019-01-25 20:23发布

问题:

CMake's execute_process command seems to only let you, well, execute a process - not an arbitrary line you could feed a command shell. The thing is, I want to use pipes, file descriptor redirection, etc. - and that does not seem to be possible. The alternative would be very painful for me (I think)...

What should I do?

PS - CMake 2.8 and 3.x answer(s) are interesting.

回答1:

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 - e.g. not Windows.



回答2:

  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.