[CMake] Compiled file cannot be executed

Michael Wild themiwi at gmail.com
Fri Aug 28 03:26:50 EDT 2009


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



More information about the CMake mailing list