[CMake] Dependency rule not included

Michael Hertling mhertling at online.de
Wed Dec 8 11:40:30 EST 2010


On 12/08/2010 04:28 PM, Vivien Delmon wrote:
> On 12/08/2010 04:13 PM, Michael Wild wrote:
>> On 12/08/2010 03:54 PM, Micha Renner wrote:
>>> Am Mittwoch, den 08.12.2010, 14:55 +0100 schrieb Vivien Delmon:
>>>> CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
>>>> ADD_CUSTOM_COMMAND(OUTPUT toto.h toto.c
>>>>      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create_totoc_totoh.sh
>>>> )
>>> SET_SOURCE_FILES_PROPERTIES(toto.h toto.c PROPERTIES GENERATETED TRUE)
>>>
>>> See:
>>> http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:set_source_files_properties
>>> and:
>>> http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_sf:GENERATED
>>>
>>>
>>>> INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
>>>> ADD_LIBRARY(titi toto.c)
>>>> ADD_LIBRARY(tata tata.c)
>>>
>>> Greetings
>>> Micha
>>>
>>
>>
>> the GENERATED property is set automatically by ADD_CUSTOM_COMMAND. But I
>> suspect the problem is that you used a relative path in your OUTPUT
>> option. *Always* specify full paths in the OUTPUT and DEPENDS options.
>> Also, make the custom command DEPENDS on the create_totoc_totoh.sh
>> script and it's input (perhaps it reads some configuration file or you
>> pass it another file as an argument, etc.).
> 
> Both solutions does not solve the problem.
> 
> CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
> ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/toto.h 
> ${CMAKE_CURRENT_SOURCE_DIR}/toto.c
>      COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/create_totoc_totoh.sh
> )
> SET_SOURCE_FILES_PROPERTIES(toto.h toto.c PROPERTIES GENERATETED TRUE)
> INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
> ADD_LIBRARY(titi toto.c)
> ADD_LIBRARY(tata tata.c)
> 
> The problem is that tata.c include toto.h. cmake does not know it 
> because C file dependencies are constructed later by make. The result is 
> that CMakeFiles/tata.dir/build.make does not include the rule needed to 
> construct toto.h. I try to find a way to add this rule.
> A workaround consists in putting toto.h in libtata dependencies but it's 
> not a dependency of libtata but a dependency of tata.c.

IMO, this isn't a workaround but the proper solution because the
dependency on toto.h actually doesn't consist for tata.c but for
tata.c.o and, thus, for the tata target, effectively. In other
words: Which action do you intend to perform in order to update
tata.c if toto.h has changed? Compiling updates the object file.
Alternatively, if the object file is newer than the header, and
the header is newer than the source file, is there a need to take
action? So, saying ADD_LIBRARY(tata tata.c toto.h) or setting the
OBJECT_DEPENDS property as Michael has proposed in the meantime is
certainly appropriate.

Regards,

Michael

> The error is :
> [ 33%] Building C object CMakeFiles/tata.dir/tata.c.o
> /home/vivien/tmp/cmake_deps/tata.c:1:18: fatal error: toto.h: No such 
> file or directory
> compilation terminated.


More information about the CMake mailing list