Fwd: Reminder: use KF5::foo instead of ${foo_LIBRARIES} in CMakeLists
Aurélien Gâteau
agateau at kde.org
Wed Sep 25 15:42:35 UTC 2013
On Wednesday 25 September 2013 12:04:11 Aurélien Gâteau wrote:
> On Wednesday 25 September 2013 11:22:57 Sebastian Kügler wrote:
> > CMake-gods, can you confirm the below? (It's inconsistent with my
> > understanding, and how we've done it in the past months, I'd like to have
> > a
> > specialist opinion before going around and changing every single
> > CMakeLists.txt in Plasma.)
>
> My cmake-fu is far from god-level, but my experience is that for frameworks
> to build standalone, they must link to other frameworks using
> ${foo_LIBRARIES} rather than KF5::Foo.
>
> I take it this is the reason kdelibs/CMakeLists.txt defines many
> ${foo_LIBRARIES} variables.
Replying to myself: this topic was discussed on IRC with Stephen Kelly, the
result is the following:
# Short version
1. To use the "Foo" framework within another framework whose code is in
kdelibs, use "Foo":
target_link_libraries(bar Foo...)
2. To use the "Foo" framework outside of kdelibs, use "KF5::Foo":
target_link_libraries(external_project KF5::Foo)
3. Standalone builds of tier2 and tier3 are not possible for now.
# Long version
When building all of kdelibs, a framework can refer to other frameworks by
their target name since they are all part of the "kdelibs" cmake project. For
example, KCompletion can link to KConfigCore like this:
target_link_libraries(KCompletion LINK_PRIVATE KConfigCore)
When building KCompletion standalone, it is no longer part of the "kdelibs"
cmake project and cannot find KConfigCore, one would thus need to change the
target_link_libraries call to this:
target_link_libraries(KCompletion LINK_PRIVATE KF5::KConfigCore)
But that would break the all-in-one build of kdelibs, since in this context
KF5::KConfigCore is not defined.
The solution to this is ALIAS targets, as explained by Stephen here:
http://thread.gmane.org/gmane.comp.kde.devel.core/80233/focus=80247
With ALIAS targets, one would define an alias like this when building kdelibs:
add_library(KF5::KCoreAddons ALIAS KCoreAddons)
This would make it possible for the kdelibs all-in-one build to find
KCoreAddons.
Unfortunately, ALIAS is a new feature of the add_library command, which is
only available in cmake git for now and will be in 2.8.12. Therefore we cannot
use this solution right now. This means we can't have standalone builds of
tier2 and tier3 frameworks. tier1 frameworks are OK since by definition they
do not depend on other frameworks.
The alternative syntax: ${KConfigCore_LIBRARIES} would work in both cases, but
it is more error prone: any typo in the variable name causes the variable to
be expanded to an empty string, making it more difficult to debug, whereas
using target names provide more explicit error messages.
Aurélien
More information about the Kde-frameworks-devel
mailing list