Re: [CMake] How to use add_custom_command correctly

2011-09-30 Thread Martin Kupke

On 29.09.11 01:46, Michael Hertling wrote:

On 09/28/2011 01:45 PM, Martin Kupke wrote:

Now it seems to be solved, the generator is called and the generated
sources / headers are then compiled and linked into a library.

My changes are in the

D:/project/Discovery/Generated/Driver/CMakeLists.txt

just adding a add_custom_target( MyGeneratedSources ALL DEPENDS
${all_generated_srcs} ${all_generated_hdrs} )

Additionally I added in the root CMakeLists.txt
add_dependencies( ${MY_PROJECT} MyGeneratedSources )

This works fine.

Just two additional remarks:

- For ADD_CUSTOM_COMMAND(OUTPUT ...), it's documented explicitly
that relative paths after the OUTPUT clause will be interpreted
with respect to the current binary directory, so you may leave
out the leading ${CMAKE_CURRENT_BINARY_DIRECTORY} and specify
relative paths here. However, for the DEPENDS clause, there
is no such documentation.

That wasn't my problem, because I didn't work with relative paths.
But still good to know from where the relative path has to be seen, 
thanks for the info!

- A custom command's OUTPUTs must be mentioned as other targets'
prerequisites, i.e. as source files in ADD_EXECUTABLE/LIBRARY()
or after the DEPENDS clause of ADD_CUSTOM_TARGET() in the same
CMakeLists.txt file. Otherwise, the rule for the then unused
OUTPUT is dropped, and it will never be generated. Thus, for
generated sources/headers, there should be no need for an
additional custom target as a custom command's anchor.

This info with the ADD_CUSTOM_TARGET is the most important thing.
Thanks for your answers.

Regards,
Martin

Regards,

Michael


On 28.09.11 13:34, Rolf Eike Beer wrote:

On 27.09.11 18:24, Michael Wild wrote:

On 09/27/2011 05:59 PM, Martin Kupke wrote:

Hi,

in my project there is a subfolder which SHALL contain sources to
generate a library. The problem is that at startup of the project there
are no source files existing, because they will be generated by a code
generator. This means within the build process the code generator needs
to be called first, then generates the output files in the subfolder
and
then a library shall be generated from that source files (this are
standard .c and .h files). If I start the code generator by hand to
generate the source files and remove the custom command, then the
compilation is successful, but I want the code generator to be started
every time the configuration file for the code generator has changed.

In my sample below
* the driver.c would be one of the files which the code generator would
generate
* the variable CodeGen is the executable tool (the code generator
himself)
* the variable CodeGenParam contains the parameters which are passed to
be able to generate without any user interaction
* the variable CodeGenConfig is the input file for the code generator

This subfolder contains its own CMakeLists.txt with the following
settings:
# snip #
project(CANstack C)

add_custom_command( OUTPUT driver.c
  COMMAND ${CodeGen}
${CodeGenParam}
  DEPENDS ${CodeGenConfig} )
)

file(GLOB CANstack_srcs "*.c")
file(GLOB CANstack_hdrs "*.h")

set(lib_name "CANstack")
add_library(${lib_name} STATIC ${CANstack_srcs} ${CANstack_hdrs})

# snap #

I don't get it work that the custom command is called and the source
files from the code generator are produced.


A few issues here:

- Never generate output in the source tree, only in the binary tree.
- Always use absolute paths with add_custom_command().

I use the absolute paths

- Always list *all* outputs after the OUTPUT argument, otherwise CMake
won't know that they are generated sources.

I added the list of *all* files which shall be generated

- Never use file(GLOB ...). It is evil. And breaks in your case. Just
don't.

I don't use the file(GLOB ...) anymore in this CMakeLists.txt

Michael


In case the generated output files already exist and the dependency file
${CodeGenConfig} has been touched, then the output will be generated.

Typically there is from beginning of the project no source file
existing, because the generator needs to be run first. If the output
files are not existing, then I get an error message from CMake:

# snip #

CMake Error at Generated/CarIF_Appl/CANstack/CMakeLists.txt:31
(add_library):
 Cannot find source file:

   D:/project/Discovery/Generated/Driver/uart.c

 Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm
.hpp
 .hxx .in .txx

# snap #

How do I have to instruct CMake to run the code generator first, so that
the library can be build of that sources?

Can you paste the relevant snippet from your new CMakeLists.txt?

You can try this first and see if it helps:

add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/driver.c
 COMMAND ${CodeGen} {C

Re: [CMake] How to use add_custom_command correctly

2011-09-28 Thread Michael Hertling
On 09/28/2011 01:45 PM, Martin Kupke wrote:
> Now it seems to be solved, the generator is called and the generated 
> sources / headers are then compiled and linked into a library.
> 
> My changes are in the
> 
> D:/project/Discovery/Generated/Driver/CMakeLists.txt
> 
> just adding a add_custom_target( MyGeneratedSources ALL DEPENDS 
> ${all_generated_srcs} ${all_generated_hdrs} )
> 
> Additionally I added in the root CMakeLists.txt
> add_dependencies( ${MY_PROJECT} MyGeneratedSources )
> 
> This works fine.

Just two additional remarks:

- For ADD_CUSTOM_COMMAND(OUTPUT ...), it's documented explicitly
that relative paths after the OUTPUT clause will be interpreted
with respect to the current binary directory, so you may leave
out the leading ${CMAKE_CURRENT_BINARY_DIRECTORY} and specify
relative paths here. However, for the DEPENDS clause, there
is no such documentation.

- A custom command's OUTPUTs must be mentioned as other targets'
prerequisites, i.e. as source files in ADD_EXECUTABLE/LIBRARY()
or after the DEPENDS clause of ADD_CUSTOM_TARGET() in the same
CMakeLists.txt file. Otherwise, the rule for the then unused
OUTPUT is dropped, and it will never be generated. Thus, for
generated sources/headers, there should be no need for an
additional custom target as a custom command's anchor.

Regards,

Michael

> On 28.09.11 13:34, Rolf Eike Beer wrote:
>>>
>>> On 27.09.11 18:24, Michael Wild wrote:
 On 09/27/2011 05:59 PM, Martin Kupke wrote:
> Hi,
>
> in my project there is a subfolder which SHALL contain sources to
> generate a library. The problem is that at startup of the project there
> are no source files existing, because they will be generated by a code
> generator. This means within the build process the code generator needs
> to be called first, then generates the output files in the subfolder
> and
> then a library shall be generated from that source files (this are
> standard .c and .h files). If I start the code generator by hand to
> generate the source files and remove the custom command, then the
> compilation is successful, but I want the code generator to be started
> every time the configuration file for the code generator has changed.
>
> In my sample below
> * the driver.c would be one of the files which the code generator would
> generate
> * the variable CodeGen is the executable tool (the code generator
> himself)
> * the variable CodeGenParam contains the parameters which are passed to
> be able to generate without any user interaction
> * the variable CodeGenConfig is the input file for the code generator
>
> This subfolder contains its own CMakeLists.txt with the following
> settings:
> # snip #
> project(CANstack C)
>
> add_custom_command( OUTPUT driver.c
>  COMMAND ${CodeGen}
> ${CodeGenParam}
>  DEPENDS ${CodeGenConfig} )
> )
>
> file(GLOB CANstack_srcs "*.c")
> file(GLOB CANstack_hdrs "*.h")
>
> set(lib_name "CANstack")
> add_library(${lib_name} STATIC ${CANstack_srcs} ${CANstack_hdrs})
>
> # snap #
>
> I don't get it work that the custom command is called and the source
> files from the code generator are produced.
>
 A few issues here:

 - Never generate output in the source tree, only in the binary tree.
 - Always use absolute paths with add_custom_command().
>>> I use the absolute paths
 - Always list *all* outputs after the OUTPUT argument, otherwise CMake
 won't know that they are generated sources.
>>> I added the list of *all* files which shall be generated
 - Never use file(GLOB ...). It is evil. And breaks in your case. Just
 don't.
>>> I don't use the file(GLOB ...) anymore in this CMakeLists.txt
 Michael

>>> In case the generated output files already exist and the dependency file
>>> ${CodeGenConfig} has been touched, then the output will be generated.
>>>
>>> Typically there is from beginning of the project no source file
>>> existing, because the generator needs to be run first. If the output
>>> files are not existing, then I get an error message from CMake:
>>>
>>> # snip #
>>>
>>> CMake Error at Generated/CarIF_Appl/CANstack/CMakeLists.txt:31
>>> (add_library):
>>> Cannot find source file:
>>>
>>>   D:/project/Discovery/Generated/Driver/uart.c
>>>
>>> Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm
>>> .hpp
>>> .hxx .in .txx
>>>
>>> # snap #
>>>
>>> How do I have to instruct CMake to run the code generator first, so that
>>> the library can be build of that sources?
>> Can you paste the relevant snippet from your new CMakeLists.txt?
>>
>> You can try this fir

Re: [CMake] How to use add_custom_command correctly

2011-09-28 Thread Martin Kupke
Now it seems to be solved, the generator is called and the generated 
sources / headers are then compiled and linked into a library.


My changes are in the

D:/project/Discovery/Generated/Driver/CMakeLists.txt

just adding a add_custom_target( MyGeneratedSources ALL DEPENDS 
${all_generated_srcs} ${all_generated_hdrs} )


Additionally I added in the root CMakeLists.txt
add_dependencies( ${MY_PROJECT} MyGeneratedSources )

This works fine.

On 28.09.11 13:34, Rolf Eike Beer wrote:


On 27.09.11 18:24, Michael Wild wrote:

On 09/27/2011 05:59 PM, Martin Kupke wrote:

Hi,

in my project there is a subfolder which SHALL contain sources to
generate a library. The problem is that at startup of the project there
are no source files existing, because they will be generated by a code
generator. This means within the build process the code generator needs
to be called first, then generates the output files in the subfolder
and
then a library shall be generated from that source files (this are
standard .c and .h files). If I start the code generator by hand to
generate the source files and remove the custom command, then the
compilation is successful, but I want the code generator to be started
every time the configuration file for the code generator has changed.

In my sample below
* the driver.c would be one of the files which the code generator would
generate
* the variable CodeGen is the executable tool (the code generator
himself)
* the variable CodeGenParam contains the parameters which are passed to
be able to generate without any user interaction
* the variable CodeGenConfig is the input file for the code generator

This subfolder contains its own CMakeLists.txt with the following
settings:
# snip #
project(CANstack C)

add_custom_command( OUTPUT driver.c
 COMMAND ${CodeGen}
${CodeGenParam}
 DEPENDS ${CodeGenConfig} )
)

file(GLOB CANstack_srcs "*.c")
file(GLOB CANstack_hdrs "*.h")

set(lib_name "CANstack")
add_library(${lib_name} STATIC ${CANstack_srcs} ${CANstack_hdrs})

# snap #

I don't get it work that the custom command is called and the source
files from the code generator are produced.


A few issues here:

- Never generate output in the source tree, only in the binary tree.
- Always use absolute paths with add_custom_command().

I use the absolute paths

- Always list *all* outputs after the OUTPUT argument, otherwise CMake
won't know that they are generated sources.

I added the list of *all* files which shall be generated

- Never use file(GLOB ...). It is evil. And breaks in your case. Just
don't.

I don't use the file(GLOB ...) anymore in this CMakeLists.txt

Michael


In case the generated output files already exist and the dependency file
${CodeGenConfig} has been touched, then the output will be generated.

Typically there is from beginning of the project no source file
existing, because the generator needs to be run first. If the output
files are not existing, then I get an error message from CMake:

# snip #

CMake Error at Generated/CarIF_Appl/CANstack/CMakeLists.txt:31
(add_library):
Cannot find source file:

  D:/project/Discovery/Generated/Driver/uart.c

Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm
.hpp
.hxx .in .txx

# snap #

How do I have to instruct CMake to run the code generator first, so that
the library can be build of that sources?

Can you paste the relevant snippet from your new CMakeLists.txt?

You can try this first and see if it helps:

add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/driver.c
COMMAND ${CodeGen} {CodeGenParam}
DEPENDS ${CodeGenConfig} )

add_executable(myexe ${CMAKE_CURRENT_BINARY_DIR}/driver.c)

Of course you must tell the CodeGen where to put the result, preferably by
passing "${CMAKE_CURRENT_BINARY_DIR}/driver.c" as argument (with the
quotes, to make paths with spaces work right). If the generator can't
handle this you can try to set WORKING_DIRECTORY to
${CMAKE_CURRENT_BINARY_DIR}, passing all other file arguments with
absolute paths then.

Eike
--

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


--

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


Re: [CMake] How to use add_custom_command correctly

2011-09-28 Thread Rolf Eike Beer
>
>
> On 27.09.11 18:24, Michael Wild wrote:
>> On 09/27/2011 05:59 PM, Martin Kupke wrote:
>>> Hi,
>>>
>>> in my project there is a subfolder which SHALL contain sources to
>>> generate a library. The problem is that at startup of the project there
>>> are no source files existing, because they will be generated by a code
>>> generator. This means within the build process the code generator needs
>>> to be called first, then generates the output files in the subfolder
>>> and
>>> then a library shall be generated from that source files (this are
>>> standard .c and .h files). If I start the code generator by hand to
>>> generate the source files and remove the custom command, then the
>>> compilation is successful, but I want the code generator to be started
>>> every time the configuration file for the code generator has changed.
>>>
>>> In my sample below
>>> * the driver.c would be one of the files which the code generator would
>>> generate
>>> * the variable CodeGen is the executable tool (the code generator
>>> himself)
>>> * the variable CodeGenParam contains the parameters which are passed to
>>> be able to generate without any user interaction
>>> * the variable CodeGenConfig is the input file for the code generator
>>>
>>> This subfolder contains its own CMakeLists.txt with the following
>>> settings:
>>> # snip #
>>> project(CANstack C)
>>>
>>> add_custom_command( OUTPUT driver.c
>>> COMMAND ${CodeGen}
>>> ${CodeGenParam}
>>> DEPENDS ${CodeGenConfig} )
>>> )
>>>
>>> file(GLOB CANstack_srcs "*.c")
>>> file(GLOB CANstack_hdrs "*.h")
>>>
>>> set(lib_name "CANstack")
>>> add_library(${lib_name} STATIC ${CANstack_srcs} ${CANstack_hdrs})
>>>
>>> # snap #
>>>
>>> I don't get it work that the custom command is called and the source
>>> files from the code generator are produced.
>>>
>> A few issues here:
>>
>> - Never generate output in the source tree, only in the binary tree.
>> - Always use absolute paths with add_custom_command().
> I use the absolute paths
>> - Always list *all* outputs after the OUTPUT argument, otherwise CMake
>> won't know that they are generated sources.
> I added the list of *all* files which shall be generated
>> - Never use file(GLOB ...). It is evil. And breaks in your case. Just
>> don't.
> I don't use the file(GLOB ...) anymore in this CMakeLists.txt
>> Michael
>>
> In case the generated output files already exist and the dependency file
> ${CodeGenConfig} has been touched, then the output will be generated.
>
> Typically there is from beginning of the project no source file
> existing, because the generator needs to be run first. If the output
> files are not existing, then I get an error message from CMake:
>
> # snip #
>
> CMake Error at Generated/CarIF_Appl/CANstack/CMakeLists.txt:31
> (add_library):
>Cannot find source file:
>
>  D:/project/Discovery/Generated/Driver/uart.c
>
>Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm
> .hpp
>.hxx .in .txx
>
> # snap #
>
> How do I have to instruct CMake to run the code generator first, so that
> the library can be build of that sources?

Can you paste the relevant snippet from your new CMakeLists.txt?

You can try this first and see if it helps:

add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/driver.c
   COMMAND ${CodeGen} {CodeGenParam}
   DEPENDS ${CodeGenConfig} )

add_executable(myexe ${CMAKE_CURRENT_BINARY_DIR}/driver.c)

Of course you must tell the CodeGen where to put the result, preferably by
passing "${CMAKE_CURRENT_BINARY_DIR}/driver.c" as argument (with the
quotes, to make paths with spaces work right). If the generator can't
handle this you can try to set WORKING_DIRECTORY to
${CMAKE_CURRENT_BINARY_DIR}, passing all other file arguments with
absolute paths then.

Eike
--

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


Re: [CMake] How to use add_custom_command correctly

2011-09-28 Thread Martin Kupke



On 27.09.11 18:24, Michael Wild wrote:

On 09/27/2011 05:59 PM, Martin Kupke wrote:

Hi,

in my project there is a subfolder which SHALL contain sources to
generate a library. The problem is that at startup of the project there
are no source files existing, because they will be generated by a code
generator. This means within the build process the code generator needs
to be called first, then generates the output files in the subfolder and
then a library shall be generated from that source files (this are
standard .c and .h files). If I start the code generator by hand to
generate the source files and remove the custom command, then the
compilation is successful, but I want the code generator to be started
every time the configuration file for the code generator has changed.

In my sample below
* the driver.c would be one of the files which the code generator would
generate
* the variable CodeGen is the executable tool (the code generator himself)
* the variable CodeGenParam contains the parameters which are passed to
be able to generate without any user interaction
* the variable CodeGenConfig is the input file for the code generator

This subfolder contains its own CMakeLists.txt with the following settings:
# snip #
project(CANstack C)

add_custom_command( OUTPUT driver.c
COMMAND ${CodeGen}
${CodeGenParam}
DEPENDS ${CodeGenConfig} )
)

file(GLOB CANstack_srcs "*.c")
file(GLOB CANstack_hdrs "*.h")

set(lib_name "CANstack")
add_library(${lib_name} STATIC ${CANstack_srcs} ${CANstack_hdrs})

# snap #

I don't get it work that the custom command is called and the source
files from the code generator are produced.


A few issues here:

- Never generate output in the source tree, only in the binary tree.
- Always use absolute paths with add_custom_command().

I use the absolute paths

- Always list *all* outputs after the OUTPUT argument, otherwise CMake
won't know that they are generated sources.

I added the list of *all* files which shall be generated

- Never use file(GLOB ...). It is evil. And breaks in your case. Just don't.

I don't use the file(GLOB ...) anymore in this CMakeLists.txt

Michael

In case the generated output files already exist and the dependency file 
${CodeGenConfig} has been touched, then the output will be generated.


Typically there is from beginning of the project no source file 
existing, because the generator needs to be run first. If the output 
files are not existing, then I get an error message from CMake:


# snip #

CMake Error at Generated/CarIF_Appl/CANstack/CMakeLists.txt:31 
(add_library):

  Cannot find source file:

D:/project/Discovery/Generated/Driver/uart.c

  Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
  .hxx .in .txx

# snap #

How do I have to instruct CMake to run the code generator first, so that 
the library can be build of that sources?


Br,
Martin

--

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


Re: [CMake] How to use add_custom_command correctly

2011-09-27 Thread Michael Wild
On 09/27/2011 05:59 PM, Martin Kupke wrote:
> Hi,
> 
> in my project there is a subfolder which SHALL contain sources to
> generate a library. The problem is that at startup of the project there
> are no source files existing, because they will be generated by a code
> generator. This means within the build process the code generator needs
> to be called first, then generates the output files in the subfolder and
> then a library shall be generated from that source files (this are
> standard .c and .h files). If I start the code generator by hand to
> generate the source files and remove the custom command, then the
> compilation is successful, but I want the code generator to be started
> every time the configuration file for the code generator has changed.
> 
> In my sample below
> * the driver.c would be one of the files which the code generator would
> generate
> * the variable CodeGen is the executable tool (the code generator himself)
> * the variable CodeGenParam contains the parameters which are passed to
> be able to generate without any user interaction
> * the variable CodeGenConfig is the input file for the code generator
> 
> This subfolder contains its own CMakeLists.txt with the following settings:
> # snip #
> project(CANstack C)
> 
> add_custom_command( OUTPUT driver.c
>COMMAND ${CodeGen}
> ${CodeGenParam}
>DEPENDS ${CodeGenConfig} )
> )
> 
> file(GLOB CANstack_srcs "*.c")
> file(GLOB CANstack_hdrs "*.h")
> 
> set(lib_name "CANstack")
> add_library(${lib_name} STATIC ${CANstack_srcs} ${CANstack_hdrs})
> 
> # snap #
> 
> I don't get it work that the custom command is called and the source
> files from the code generator are produced.
> 

A few issues here:

- Never generate output in the source tree, only in the binary tree.
- Always use absolute paths with add_custom_command().
- Always list *all* outputs after the OUTPUT argument, otherwise CMake
won't know that they are generated sources.
- Never use file(GLOB ...). It is evil. And breaks in your case. Just don't.

Michael

--

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


[CMake] How to use add_custom_command correctly

2011-09-27 Thread Martin Kupke

Hi,

in my project there is a subfolder which SHALL contain sources to 
generate a library. The problem is that at startup of the project there 
are no source files existing, because they will be generated by a code 
generator. This means within the build process the code generator needs 
to be called first, then generates the output files in the subfolder and 
then a library shall be generated from that source files (this are 
standard .c and .h files). If I start the code generator by hand to 
generate the source files and remove the custom command, then the 
compilation is successful, but I want the code generator to be started 
every time the configuration file for the code generator has changed.


In my sample below
* the driver.c would be one of the files which the code generator would 
generate

* the variable CodeGen is the executable tool (the code generator himself)
* the variable CodeGenParam contains the parameters which are passed to 
be able to generate without any user interaction

* the variable CodeGenConfig is the input file for the code generator

This subfolder contains its own CMakeLists.txt with the following settings:
# snip #
project(CANstack C)

add_custom_command( OUTPUT driver.c
   COMMAND ${CodeGen} 
${CodeGenParam}

   DEPENDS ${CodeGenConfig} )
)

file(GLOB CANstack_srcs "*.c")
file(GLOB CANstack_hdrs "*.h")

set(lib_name "CANstack")
add_library(${lib_name} STATIC ${CANstack_srcs} ${CANstack_hdrs})

# snap #

I don't get it work that the custom command is called and the source 
files from the code generator are produced.


--

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