[CMake] Compiled file cannot be executed

David Cole david.cole at kitware.com
Thu Aug 27 15:18:19 EDT 2009


Use full path file names as DEPENDS arguments.
Also: depend on the executable file too so that cmake knows not to try to
run the custom command before the executable is built...

i.e. :
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/server/someinput.txt
${CMAKE_BINARY_DIR}/bin/generate${CMAKE_EXECUTABLE_SUFFIX}


HTH,
David


On Thu, Aug 27, 2009 at 2:41 PM, Swaroop Ramachandra <swaroopgr at gmail.com>wrote:

> Hi Michael,
>
> Thanks for your reply.  I still have the same problem.
> *
> *
> gmake-3.81[2]: bin/generate: Command not found
> lin: gmake-3.81[2]: *** [bin/generate] Error 127
> lin: gmake-3.81[1]: *** [CMakeFiles/generate.dir/all] Error 2
>
>
>
> Here's my code as is:
> #Trying to compile and run generate.c. generate.c creates a new file
> someoutput.txt and copies all data from someinput.txt to someoutput.txt
> add_executable(generate server/generate.c)
> add_custom_command(
>  # I want to generate someoutput.txt
>  OUTPUT ${CMAKE_BINARY_DIR}/server/someoutput.txt
>  # using the generate program. cmake knows that "generate" refers to the
> above target
>  COMMAND generate ${CMAKE_CURRENT_SOURCE_DIR}/server/someinput.txt
>  # only run if sominput.txt changed
>  DEPENDS server/someinput.txt
>  # tell to run in current binary dir
>  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/bin
>  # some nice comment in the output
>  COMMENT "Generating ${CMAKE_BINARY_DIR}/someoutput.txt"
>  VERBATIM
>  )
>
>
> Still the same issue. I guess it is trying to execute my "generate" even
> before it is compiled. Does CMake see that in the line "COMMAND" generate
> refers to the compiled one? Again, since generate is created in round one of
> make, the second run sees the "generate" and runs fine.
>
> Any help is greatly appreciated! Thanks for your time!
>
> Regards,
> Swaroop
>
> 2009/8/27 Michael Wild <themiwi at gmail.com>
>
>
>> 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
>>
>>
>
>
> --
>
> Samuel Goldwyn<http://www.brainyquote.com/quotes/authors/s/samuel_goldwyn.html> - "I'm willing to admit that I may not always be right, but I am never
> wrong."
> _______________________________________________
> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20090827/beb59057/attachment-0001.htm>


More information about the CMake mailing list