[CMake] Post-Build commands on custom targets are always executed?

Michael Hertling mhertling at online.de
Mon Apr 18 23:22:38 EDT 2011


On 04/19/2011 02:17 AM, Oliver Buchtala wrote:
> Am 18.04.2011 06:58, schrieb Michael Hertling:
>> On 04/16/2011 12:05 AM, Oliver Buchtala wrote:
>>> Am 15.04.2011 23:48, schrieb Michael Hertling:
>>>> On 04/15/2011 11:22 PM, Oliver Buchtala wrote:
>>>>> Hi,
>>>>>
>>>>> I observe that a custom command attached to a custom target as
>>>>> POST-BUILD is launched on every build.
>>>>> Is that true? or is it a misconfiguration on my side?
>>>>>
>>>>> Bye,
>>>>> Oliver
>>>> A custom target is always out of date, i.e. it is always rebuilt when
>>>> it is visited - as a prerequisite of another target or due to the ALL
>>>> clause, e.g., and since the target has been rebuilt, each associated
>>>> POST_BUILD custom command is rerun. Thus, the behaviour you observed
>>>> is correct, expected and reasonable, IMO.
>>>>
>>>> Regards,
>>>>
>>>> Michael
>>> Yep. That's reasonable.
>>>
>>> Do have a suggestion how to get around a rerun of the post-build?
>> Prevent the custom target from being visited, i.e. from being checked
>> if it's up to date since it will be found to be out of date, so the
>> immediately associated commands - if any - are run as well as the
>> associated POST_BUILD custom commands.
>>
>>> Or how would you do a post-build after custom-target without being run
>>> when custom-target actually did nothing,
>> What do you mean with a custom target that "actually did nothing"? Not
>> visited or no own commands? In the former case, the associated custom
>> commands are not run, of course, but in the latter case, it does not
>> matter if there are immediately associated commands or not since the
>> target will be considered as out of date and rebuilt-without-op, and
>> its POST_BUILD custom commands will be run. In other words: A custom
>> target - even without own commands - is not good for preventing its
>> custom commands from being run when the custom target is visited.
>>
>>> i.e., custom target depends on custom command that did nothing?
>> The same holds for this kind of dependency, i.e. the visited custom
>> target will be rebuilt regardless whether the prerequisite custom
>> command did do something or not, or do you still talk about the
>> custom-command-associated-with-custom-target dependency?
>>
> Alright. Then, no way to get what i want with custom targets.
> 
> I am asking, as I try to improve behavior with UseJave.cmake::add_jar
> (on stage::next) which creates a custom target.
> E.g., after building the jar I want to copy the java archive into
> another destination (not install).

OK, I see; in fact, this would be a good job for a POST_BUILD custom
command associated with the custom target. Thus, as you can't prevent
the custom command from being run on behalf of the custom target, you
should set up the command to do nothing if there's actually nothing to
do. E.g., you might use "${CMAKE_COMMAND} -E copy_if_different ..." to
copy the updated-or-not-updated jar file, so the custom command is as
cheap as possible, although it always runs when the custom target is
examined. Moreover, "${CMAKE_COMMAND} -P ..." and the IF() command's
EXISTS and IS_NEWER_THAN clauses possibly provide further approaches
w.r.t. your concern.

Regards,

Michael

> As long as java support is on a weak basis (i.e., not built-in), this
> won't change...
> 
> Thank you for your help!
> 
> Bye,
> Oliver


More information about the CMake mailing list