Hey all,
would it be possible to add the ALL
flag from add_custom_target
for add_custom_command
too? Or otherwise get the ability to manually add a dependency for the ALL
pseudo target for a custom command?
The motivation comes from generation of runtime artifacts that are consumed by multiple targets, like tests or libraries or … Having to manually list these dependencies everywhere is cumbersome.
In practice, many projects just opt for using add_custom_target
instead then to get the ALL
dependency chain. But that has the really unfortunate side-effect of always-dirty builds. I.e. from the documentation from add_custom_target
:
The target has no output file and is always considered out of date
Due to this issue, add_custom_target
is even banned at work to ensure we get a ninja: no work to do.
after invoking it once (and not changing anything else).
To give a concrete example for a widely used cmake snippet that causes issues in that regard: the KDE i18n framework (ab)uses add_custom_target
to generate mo/ts translation files, which is a costly operation. And because it’s always dirty, this runs every time we run ninja
See
cmake/KF6I18nMacros.cmake.in · master · Frameworks / Ki18n · GitLab and 460245 – ki18n_install(po) slows down each build, even if nothing has changed
I would love to improve that situation, but the only hack that I could think of is adding a add_custom_command
for each of these add_custom_target
that do the actual generation, and then keeping the add_custom_target
for the ALL
convenience. This would at least prevent us from wasting cycles in re-generating the translations all the time, but it would still keep the ALL
target always-dirty which is still sub-optimal.
As such: Could we just get a add_custom_command(ALL)
instead? Or how do other projects handle situations like this?