On 29. Jul, 2010, at 4:19 , Óscar Fuentes wrote:

> Eric Noulard <eric.noul...@gmail.com>
> writes:
> 
>> I think you are wrong.
>> 
>> May be you can try the attach script.
>> 
>> try:
>> cmake -DYOURSTRING="I like # \ it" -DTHE_FILE=toto.txt -P writeany.cmake
>> 
>> You shouldn't have "quite" problem with the previous approach.
> 
> I tried this on Linux:
> 
> add_custom_command(OUTPUT ${EMACS_BUILD_DIR}/src/buildobj.h
>  COMMAND cmake -DYOURSTRING="#define BUILDOBJ" -DTHE_FILE=buildobj.h -P 
> writeany.cmake
>  COMMENT "Creating buildobj.h"
>  )
> 
> It didn't create the file. So tried this:
> 
> add_custom_command(OUTPUT ${EMACS_BUILD_DIR}/src/buildobj.h
>  COMMAND cmake -DYOURSTRING="\#define BUILDOBJ" -DTHE_FILE=buildobj.h -P 
> writeany.cmake
>  COMMENT "Creating buildobj.h"
>  )
> 
> It put this text on the resulting file:
> 
> #define\ BUILDOBJ
> 
> That's not quite what I wanted.
> 
> I would say that having to write and invoke a script for this trivial
> task seems way too much trouble imposed by an otherwise absolute
> time-saver as cmake is.
> 
>>> The task here is to write a literal string containing a "special"
>>> character (#) to a file, at build time. For "cmake -E echo" it requires
>>> platform-dependent escape sequences. My idea about the cmake -E commands
>>> was that they purpose is to abstract platform differences, but seems
>>> that that is not entirely correct, as they inherit some traits from the
>>> underlying platform. Or is it a bug?
>> 
>> I would say a feature :-)
>> 
>> You do not want to have to "escape" some sequences
> 
> I'm happy escaping whatever as much sequences as necessary. What is not
> okay is to change escape rules depending on the plataform (or worse,
> depending on the shell cmake uses for the generator. "Mingw Makefiles"
> -> cmd.exe, "MSYS Makefiles" -> sh.exe)
> 
> [snip]
> 
>> More seriously I think it's complicated to avoid system specific
>> issues with a command like "echo".
> 
> It should be possible to pass an arbitrary string (containing
> backslashes if necessary) to "echo" and send it to the console or
> redirected to a file on a platform independent way. That means avoiding
> any middleman that may reinterpret certain characters as per its own
> rules. If you pass the string through the shell, all hopes of platform
> independence are gone.
> 
>> I think that if you tell me what you would expect I may probably gives
>> you an example of mine were YOUR bug is a feature for ME.
> 
> I doubt that, because on the end we want the same: saying "take this
> string and put it on that file." We can then open the file and test
> that, effectively, the string is there.
> 
> OTOH I can't think of a real application for this sort of behavior of
> the "echo" command. That is, nothing that you could achieve invoking the
> platform's shell.
> 
>> That said, that's my own opinion, I may be wrong.

How much of that file has to be "dynamic"? E.g. if you know the full contents, 
up to some file name, you can use configure_file to create writeany.cmake to 
look like this:

file(WRITE "${THEFILE}" "#define ${THEDEFINE}")

and then invoke it with

add_custom_command(OUTPUT ${EMACS_BUILD_DIR}/src/buildobj.h
 COMMAND cmake -DTHEDEFINE="BUILDOBJ" 
-DTHE_FILE="${EMACS_BUILD_DIR}/src/buildobj.h" -P writeany.cmake
 COMMENT "Creating buildobj.h"
 )

And if the general structure of buildobj.h is also know statically, you can use 
a buildobj.h.in template file and replace the file(WRITE ...) stuff with a 
configure_file in the writeany.cmake.

Perhaps you need to tell us what it is that you are trying to achieve, because 
I suspect that you are over-thinking things and that there is a much simpler 
solution. E.g. what should buildobj.h contain (semantically, not the exact 
strings), and why is it only known at build time? 

HTH

Michael
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to