Config files for frameworks (Was: KArchive for Qt4)

Alexander Neundorf neundorf at kde.org
Tue Dec 4 19:52:39 UTC 2012


On Tuesday 04 December 2012, Stephen Kelly wrote:
> Alexander Neundorf wrote:
> > I still think it is not a good idea that
> > 
> > target_link_libraries(foo KF5::widgetsaddons)
> > 
> > also sets include dirs for the target foo.
> > 
> > Should I discuss that again on cmake-devel ?
> 
> It would seem more appropriate than here, but I think it's already decided.

Will do so anyway :-)

> >> 4) Also on the topic of naming things correctly, kwidgetsaddons_LIBRARY
> >> should be kwidgetsaddons_LIBRARIES,
> > 
> > Yes, I am aware of that, and wanted to change that for all at once.
> 
> You mean after committing it as *_LIBRARY everywhere, you want to change it
> all to *_LIBRARIES later? Why not just start with *_LIBRARIES so it doesn't
> have to be change later, or am I missing something?

I just noticed this when I started to write the test-helper (after a bunch of 
files), and then decided to change them all at once.

> >> but actually it shouldn't exist at all
> >> because users should use the imported target directly instead as I wrote
> >> above, instead of using the variable.
> > 
> > I'm not sold on this.
> > When reading a CMakeLists.txt, I see
> > 
> > find_package(Foo)
> > 
> > and then I expect to be able to use
> > include_directories(${FOO_INCLUDE_DIRS})
> > ...
> > target_link_libraries(hello ${${FOO_LIBRARIES})
> 
> Note that you're not using exact-case in those variables, which I think is
> ill advised anyway.

I can change this to ExactCase, fine with me.
 
> > Retraining all our users that using include_directories() is wrong
> > doesn't sound good to me.
> 
> I think re-training is the cost of simplicity, and it's worth it.
> 
> You only expect to have to use include_directories() because you have
> always had to. Soon you won't have to. In the future, people using KF5
> will never have had to.

Yes, well, in the last 5 years many people got used to cmake as it is now.
 
> >> Additionally, you're setting that
> >> variable to KDE4__kwidgetsaddons, which we'll only have to rename by
> >> hand later.
> > 
> > I am aware of that. This was to keep one of those libs compatible with
> > FindKDE4Internal.cmake, I think threadweaver.
> > This is something which can be easily patched with a script.
> > 
> >> 5) I also see no need for the kwidgetsaddons_INSTALL_PREFIX variable.
> > 
> > In some cases it is necessary, if the user wants/needs to access
> > additional files provided by the package.
> 
> If there are additional files provided by the package then we need to
> provide a variable for each of those files, eg

That's also ok.
But this still means it will be just a normal variable pointing to some path, 
not some target property.
In this way there is no difference to providing a Foo_INSTALL_PREFIX variable.
 
>  set(Foo_ExtraMacros "${CMAKE_CURRENT_LIST_DIR}/FooExtraMacros.cmake")
> 
> and document that variable. We shouldn't expect users to dig into our
> internals like that, nor should we encourage it.
> 
> If a file is not documented and has no associated variable, then it is
> fully internal and likely to be changed in non-backward-compatibile ways
> or removed entirely.
> 
> Besides, cmake already sets Foo_DIR to the location that the Config file
> was found in.
> 
> > It also shouldn't hurt.
> 
> It hurts because it is more for us to maintain in 20+ files which is not
> needed or useful.
> 
> Let's not add a variable like that to all Config files please. For one
> thing you are adding it to places which certainly don't need it (as they
> have no extra files), and for another it is bad API.

I don't see where this is bad API.
 
> >> The tier1 Config files (after CMake 2.8.11) should only contain this:
> >>  set(kwidgetsaddons_VERSION_MAJOR "@KWIDGETSADDONS_VERSION_MAJOR@")
> >>  set(kwidgetsaddons_VERSION_MINOR "@KWIDGETSADDONS_VERSION_MINOR@")
> >>  set(kwidgetsaddons_VERSION_PATCH "@KWIDGETSADDONS_VERSION_PATCH@")
> >>  
> >>  if (NOT TARGET KF5::widgetsaddons) # See item 1.
> >>  
> >>    include("${CMAKE_CURRENT_LIST_DIR}/kwidgetsaddonsTargets.cmake")
> >>  
> >>  endif()
> >>  
> >>  include(FooMacros.cmake) # As required.
> >> 
> >> The tier2 and higher config files need also to find_package their
> >> dependencies.
> >> 
> >> If you think anything else is needed (apart from for compatibility
> >> variables, which we can provide separately - there is no need for
> >> compatibility variables for kwidgetaddons as it has not existed before),
> >> then please let me know and we can make sure that it can be done with
> >> IMPORTED targets instead.
> > 
> > The libraries may have to provide information about supported optional
> > features, but these are typically simple variables, not references to
> > files etc.
> 
> Let's deal with situations like that as they come up. Do you know of any
> specific examples?

karchive has optional support for zx and bzip2, users of that library may want 
to know that,

Alex


More information about the Kde-frameworks-devel mailing list