[CMake] Compiled file cannot be executed

Michael Wild themiwi at gmail.com
Thu Aug 27 01:06:03 EDT 2009


On 27. Aug, 2009, at 0:58, Swaroop Ramachandra wrote:

> Hi,
>
> I'm trying to do the following in my CMake file:
>
> 1. Generate a "xyz.txt" file
> 2. Compile a "generate.c" file to give out a  "generate" binary in  
> my bin
> directory.
> 3. Execute the "generate" binary (The binary just reads contents of
> "xyz.txt" and creates a copy of "xyz.txt"using read() and write()  
> functions
> in C)
>
> The problem:
> When I do a fresh build, 1 and 2 succeed. 3 fails with the following  
> error
> *"bin/generate: Command not found"*
>
> However, if I *re-run the build immediately* after, since the  
> "generate"
> binary is already created, all 3 successfully execute. Here's a  
> snippet of
> what I have written.
>
> ------------
> ------------
> /*---- Code to generate xyz.txt -- Successfully generated each  
> time------*/
> ----------
> ---------
> ADD_EXECUTABLE(generate ${CMAKE_CURRENT_SOURCE_DIR}/server/generate.c)
>
> set(GEN ${CMAKE_BINARY_DIR}/bin/generate)
>
> ADD_CUSTOM_COMMAND(
>   TARGET generate POST_BUILD
>   COMMAND ${GEN}
>   DEPENDS ${CMAKE_BINARY_DIR}/server/xyz.txt}
>   )
> In my ADD_CUSTOM_COMMAND, I have specified POST_BUILD, which I  
> understood to
> be that the command will be executed only after creation of the  
> "generate"
> binary.

That's the wrong way to go about it. the TARGET form of the  
add_custom_command is intended to "finish" the actual target. What you  
want is something like this:

# no need for absolute paths...
add_executable(generate server/generate.c)

add_custom_command(
   # tell cmake you want to generate xyz.c
   OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/xyz.c
   # using the generate program. cmake knows that "generate" refers to  
the above target
   COMMAND generate ${CMAKE_CURRENT_SOURCE_DIR}/xyz.txt
   # only run if xyz.txt changed
   DEPENDS xyz.txt
   # tell to run in current binary dir
   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
   # some nice comment in the output
   COMMENT "Generating ${CMAKE_CURRENT_BINARY_DIR}/xyz.c"
   VERBATIM
   )


And then you simply use ${CMAKE_CURRENT_BINARY_DIR}/xyz.c in one of  
your other targets. CMake will then know that it first needs to create  
target "generate", then run the program on xyz.txt to create $ 
{CMAKE_CURRENT_BINARY_DIR}/xyz.c, and finally use that to build the  
actual target.


HTH

Michael



More information about the CMake mailing list