[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