[CMake] Compiled file cannot be executed

David Cole david.cole at kitware.com
Fri Aug 28 07:14:09 EDT 2009


The extra thing that Michael put at the end is probably the key to
everything here. He did an "add_executable" with the output of the custom
command. You either need to have a library or executable or custom target
use the output of your custom command so that it is properly chained with
dependency rules through the cmake generated make files...

Try adding an "add_custom_target" that depends on the output of your
add_custom_command. (Unless you will be using the output in a library or
executable -- then add it there instead...)

HTH,
David


On Fri, Aug 28, 2009 at 3:26 AM, Michael Wild <themiwi at gmail.com> wrote:

> You must be doing something wrong. Have a look at this example:
>
> generate.cpp:
> ------>8------
> #include <iostream>
> #include <fstream>
>
> int main(int argc, char* argv[]) {
>  if( argc < 2 ) {
>    std::cerr << "Usage: " << argv[0] << " <outputFile>\n";
>  }
>  std::ofstream str(argv[1]);
>  str << "#include <iostream>\nint main() {\n";
>      << "  std::cout << \"Hello World!\\n\";\n";
>      << "  return 0;\n}\n";
>  str.close();
>  return 0;
> }
> ------<8------
>
> CMakeLists.txt:
> ------>8------
> cmake_minimum_required(VERSION 2.6)
> project(test CXX)
>
> add_executable(generate generate.cpp)
>
> set(HELLO_SRCS ${CMAKE_CURRENT_BINARY_DIR}/hello.cpp)
> add_custom_command(
>  OUTPUT ${HELLO_SRCS}
>  COMMAND generate ${HELLO_SRCS}
>  DEPENDS generate
>  COMMENT "Generating ${HELLO_SRCS}"
>  VERBATIM
>  )
> add_executable(hello ${HELLO_SRCS})
> ------<8------
>
> The executable generate takes the name of an output file as its argument
> and then generates the code for a simple "hello world" program. This output
> is then used to generate the program hello.
>
>
> I hope this helps
>
> Michael
>
>
> On 28. Aug, 2009, at 6:05, Swaroop Ramachandra wrote:
>
>  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/082b5a8d/attachment-0001.htm>


More information about the CMake mailing list