[CMake] Compiled file cannot be executed

Swaroop Ramachandra swaroopgr at gmail.com
Thu Aug 27 15:31:52 EDT 2009


Still no luck :( . I really wonder why it is trying to execute my "generate"
binary even before it is built. Here are my updated lines of code.
#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 ${CMAKE_CURRENT_SOURCE_DIR}/server/someinput.txt
${CMAKE_BINARY_DIR}/bin/generate${CMAKE_EXECUTABLE_SUFFIX}
 # 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
 )


2009/8/27 David Cole <david.cole at kitware.com>

> 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
>>
>
>


-- 

Ted Turner <http://www.brainyquote.com/quotes/authors/t/ted_turner.html>  -
"Sports is like a war without the killing."
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20090827/198a105e/attachment.htm>


More information about the CMake mailing list