[CMake] Compiled file cannot be executed

Swaroop Ramachandra swaroopgr at gmail.com
Fri Aug 28 00:05:25 EDT 2009


I did. The same problem persists. Is there a work-around - maybe some other
command that I can use?

2009/8/27 Michael Wild <themiwi at gmail.com>

> David is probably right, that you need to add the dependency on "generate".
> However, only add it's target name to both the COMMAND and DEPENDS
> arguments, CMake should figure this out.
>
> Michael
>
>
> On 27. Aug, 2009, at 21:31, Swaroop Ramachandra wrote:
>
>  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."
>>
>
>


-- 

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."
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20090828/816310e2/attachment-0001.htm>


More information about the CMake mailing list