On 07/09/2010 06:39 PM, Bo Thorsen wrote: > Den 09-07-2010 16:48, Michael Hertling skrev: >> On 07/09/2010 03:48 PM, Bo Thorsen wrote: >>> Hi all, >>> >>> Is there an elegant way of copying two files into one? >>> >>> Right now, I have this: >>> >>> ADD_CUSTOM_COMMAND(OUTPUT privilege_tables.sql >>> COMMAND copy /b >>> ${CMAKE_CURRENT_SOURCE_DIR}/system_tables.sql >>> + ${CMAKE_CURRENT_SOURCE_DIR}/tables_fix.sql >>> fix_privilege_tables.sql >>> DEPENDS >>> ${CMAKE_CURRENT_SOURCE_DIR}/system_tables.sql >>> ${CMAKE_CURRENT_SOURCE_DIR}/tables_fix.sql) >>> >>> That's hardly elegant and it doesn't work :( >>> >>> The problem with this is that the Windows copy command wants \ instead of /. >>> >>> So, one of two fixes are possible for me: Either there is a much cleaner >>> way to do this, or I have to replace / with \ in the path. >>> >>> If I have to do the replacement, is there a better way to do this than >>> to use the STRING command with a char replace? >> >> Look at the following CMakeLists.txt: >> >> CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) >> PROJECT(CONCAT C) >> FILE(WRITE ${CMAKE_BINARY_DIR}/f1.c.in "void f1(void){}\n") >> FILE(WRITE ${CMAKE_BINARY_DIR}/f2.c.in "void f2(void){}\n") >> FILE(WRITE ${CMAKE_BINARY_DIR}/main.c >> "int main(void){f1(); f2(); return 0;}\n" >> ) >> FILE(WRITE ${CMAKE_BINARY_DIR}/concat.cmake " >> FILE(READ \${SRC1} S1) >> FILE(READ \${SRC2} S2) >> FILE(WRITE \${DST} \${S1}\${S2}) >> ") >> ADD_CUSTOM_COMMAND( >> OUTPUT f.c >> COMMAND ${CMAKE_COMMAND} -D SRC1=${CMAKE_BINARY_DIR}/f1.c.in >> -D SRC2=${CMAKE_BINARY_DIR}/f2.c.in >> -D DST=${CMAKE_BINARY_DIR}/f.c >> -P ${CMAKE_BINARY_DIR}/concat.cmake >> DEPENDS ${CMAKE_BINARY_DIR}/f1.c.in ${CMAKE_BINARY_DIR}/f2.c.in >> ) >> ADD_EXECUTABLE(main main.c f.c) > > Does this also work with binary files? From the documentation on FILE, > this isn't really clear to me.
Regrettably, it doesn't. Binary files aren't read completely and without changes to a string by FILE(READ ...). FILE(READ ... HEX), in contrast, reads binary files correctly and stores them as a sequence of two-digit hex numbers, but even if one manages to convert them to decimal numbers - quite an effort in CMake - they cannot be written to a file since the friend for this purpose, STRING(ASCII ...), fails at the zero character. Thus, if you want to be plattform-independent the best thing you can do is, IMO, to write a simple C/C++ program or the like which concats two or more files, and deliver it for usage with ADD_CUSTOM_COMMAND() as a part of your project. Perhaps, this issue would even be worth a feature request, e.g. for a command "cmake -E concat" or FILE(WRITE ... HEX) or FILE(READ ... BINARY). Regards, 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