[CMake] Unneeded escaping: how to stop it?

Steven Van Ingelgem steven at vaningelgem.be
Wed Jan 30 10:38:48 EST 2008


Thanks for the explanation ;-). In fact that's what I am doing now:
${BASH} -c "..." which works nicely.

I just thought that the "COMMAND" would be executed as is, and that
VERBATIM meant there is no escaping... Hence my confusion



On 30/01/2008, Brad King <brad.king at kitware.com> wrote:
> Steven Van Ingelgem wrote:
> > The problem in fact is in cmcommand.h @ line 67: "InvokeInitialPass"
> >
> > Here there is done the pass through "ExpandArguments", which removes
> > the knowledge of the quoted/unquoted nature of the arguments... Before
> > is known if it's VERBATIM or not...
> >
> > I think this is a deep problem, and rather difficult to solve.
> >
> > Do you want me to submit it to the bug tracker?
>
> No.  This is not a CMake bug.  The VERBATIM option is a feature of
> add_custom_command, not of the CMake language.  In fact the only reason
> it is there is to implement the correct behavior of add_custom_command
> without breaking compatibility with older code that tried to add all the
> shell escapes directly.  The option does not indicate that the text
> following it will be placed in the build system verbatim.
>
> It's the CMakeLists.txt file writer's job to get the text that should
> appear in the command through the CMake language and given to
> add_custom_command as arguments.  Each argument to the COMMAND option of
> add_custom_command becomes one argument in the generated build system.
> The VERBATIM option just tells it to implement proper escaping for the
> arguments.
>
> Placing shell code directly in a custom command is not a good idea.  It
> will not work for non-Unix makes.  Even if you want to run a unix shell
> script and don't care about other platforms, you should just run the
> shell with the script as part of the custom command instead of depending
> on the implementation detail that make tools run the commands in a shell.
>
> add_custom_command(
>    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/test.txt
>    COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/myscript.sh
> ${CMAKE_CURRENT_BINARY_DIR}/test.txt
>    )
> add_custom_target(
>    DriveTest ALL
>    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/test.txt
>    )
>
> Then put your code in myscript.sh and refer to "$1" for the output file.
>
> -Brad
>
>


More information about the CMake mailing list