[CMake] Does the echo command use the system shell?
Andreas Pakulat
apaku at gmx.de
Thu Jul 29 04:49:40 EDT 2010
On 28.07.10 19:19:08, Óscar Fuentes wrote:
> For creating a file at build time with a content like this:
>
> #define foo "bar"
>
> I use this on Linux:
>
> add_custom_command(OUTPUT buildobj.h
> COMMAND ${CMAKE_COMMAND} -E echo "\\#define foo \\\"bar\\\""
> > buildobj.h
> )
>
> but that doesn't work on Windows, because it outpus:
>
> \#define foo "bar"
>
> Removing the backslashes before `#' fixes the problem on Windows, but
> then breaks the Linux build.
Just tried your example here on Linux+Windows and your problem has nothing
to do with the echo command not being cross-platform, its a simple matter
of not escaping/quoting the command call as necessary. The following
custom-command works on all platforms equally:
add_custom_command( OUTPUT build.h
COMMAND cmake -E echo \"\#define FOO 1\" >build.h )
You need to escape the # (with a single \) as its the comment-character in
CMake files. Then you also need to quote the " once to make sure they are
part of the actual command invocation. Now if you want to put a string
literal into the mix it would be
add_custom_command( OUTPUT build.h
COMMAND cmake -E echo \"\#define FOO \\"bar\\"\" >build.h )
You can easily see your mistake by running (n)make VERBOSE=1 to see the
actual cmake -E execution.
Andreas
--
Your analyst has you mixed up with another patient. Don't believe a
thing he tells you.
More information about the CMake
mailing list