[CMake] Top level target depending on a file

Michael Hertling mhertling at online.de
Wed Dec 14 05:53:52 EST 2011


On 12/14/2011 11:23 AM, Alexander Broekhuis wrote:
> Hi,
> 
>>
>>
>> First of all, you definitely need the library target in order to build
>> the library, and CMake ignores each file in the list of sources which
>> is not necessary for this purpose. IMO, that's quite reasonable; e.g.,
>> you wouldn't want to have the library relinked or even completely re-
>> built because the manifest has been touched. Actually, there's simply
>> no dependency of the library on the manifest.
> 
> 
> This makes sense, the dependency is the other way, from the bundle to the
> library. Until now I tried to see the manifest file as part of the target,
> but I could as well see it a separate step.

Yes, the dependencies in your case are, if I'm not mistaken,

         +--> library
         |
bundle --+
         |
         +--> manifest

with "-->" meaning "depends on". With your original approach, you tried
to express them as "bundle --> library --> manifest", and that's not
appropriate as it does not reflect the actual relationships.

>> Furthermore, a TARGET-
>> style custom command is triggered only when its target is rebuilt, so
>> generating the ZIP file in this way is unsuitable since you will miss
>> its dependency on the manifest. Thus, to express this dependency, you
>> need to have an own target for the ZIP file, so you will end up with
>> two targets if you want to have the dependencies set up correctly,
>> although you'd prefer to have just one. BTW, is this really bad?
>>
> 
> Reading the replies I think this might be the best solution. In this case I
> would like to be able to add dependencies to the top-level target, eg I
> would like to add my "bundle" targets to "ALL" since building the project
> implicitly means the bundles need to be generated.

This sounds perfectly reasonable, IMO.

> Again, previously I tried to see the Manifest file as a part of the
> compilation unit. So a change to the file would trigger a rebuild of the
> library and zip file, instead of only the zip file.

In this regard, the question is: Is the manifest actually necessary to
build the library, i.e. must the latter be recompiled and/or relinked
when the former changes? AFAICS, that's not the case, so the manifest
should not be considered as one of the library's prerequisites.

Regards,

Michael

>>>>> 2011/12/13 Michael Hertling <mhertling at online.de>
>>>>>
>>>>>> On 12/12/2011 11:40 AM, Alexander Broekhuis wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> Can anyone help me with this? I haven't found a proper solution
>> myself
>>>>>> yet..
>>>>>>
>>>>>> Does the following examplary project do what you intend?
>>>>>>
>>>>>> CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
>>>>>> PROJECT(P C)
>>>>>> SET(CMAKE_VERBOSE_MAKEFILE ON)
>>>>>> # The library target:
>>>>>> FILE(WRITE ${CMAKE_BINARY_DIR}/f.c "void f(void){}\n")
>>>>>> ADD_LIBRARY(f SHARED f.c)
>>>>>> # The README file:
>>>>>> FILE(WRITE ${CMAKE_BINARY_DIR}/README "Very important information!\n")
>>>>>> # The ZIP file command:
>>>>>> ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/f.zip
>>>>>>    COMMAND zip -j ${CMAKE_BINARY_DIR}/f.zip
>>>>>>                   ${CMAKE_BINARY_DIR}/README
>>>>>>                   $<TARGET_FILE:f>
>>>>>>    DEPENDS ${CMAKE_BINARY_DIR}/README)
>>>>>> # The ZIP file target:
>>>>>> ADD_CUSTOM_TARGET(zip ALL DEPENDS ${CMAKE_BINARY_DIR}/f.zip)
>>>>>> # Trigger ZIP file target after library target:
>>>>>> ADD_CUSTOM_COMMAND(TARGET f POST_BUILD
>>>>>>    COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/f.zip
>>>>>>    COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}
>>>>>>                             --config $<CONFIGURATION>
>>>>>>                             --target zip)
>>>>>>
>>>>>> The basic idea is the decomposition of the ZIP file's generation into
>> a
>>>>>> custom target, an OUTPUT-style custom command and a TARGET-style
>> custom
>>>>>> command, the latter in conjunction with CMake's --build switch.
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> Michael
>>>>>>
>>>>>>> 2011/12/8 Alexander Broekhuis <a.broekhuis at gmail.com>
>>>>>>>
>>>>>>>> Hi all,
>>>>>>>>
>>>>>>>> In my project, some top level targets depend on simple text files.
>>>> These
>>>>>>>> targets produce a zip file as output, this is done using a custom
>>>>>> command
>>>>>>>> with a post-build to a library target.
>>>>>>>> Part of the zip file are some simple text files, which are included
>>>>>> using
>>>>>>>> some custom CPack handling inside the custom command.
>>>>>>>>
>>>>>>>> How can I let the top level target depend on these text files as
>> well?
>>>>>> In
>>>>>>>> other words, if a text files changes, the zip file has to be
>>>>>> regenerated.
>>>>>>>> These text files are not generated or copied etc. So a simple
>> DEPENDS
>>>>>> would
>>>>>>>> suffice. I know add_custom_command(OUTPUT has support for this, but
>> am
>>>>>>>> wondering how to do this with add_custom_command(TARGET.
>>>>>>>>
>>>>>>>> TiA!
>>>>>>>>
>>>>>>>> --
>>>>>>>> Met vriendelijke groet,
>>>>>>>>
>>>>>>>> Alexander Broekhuis


More information about the CMake mailing list