[cmake-developers] Making Config.cmake files easier to write
Alexander Neundorf
neundorf at kde.org
Tue Feb 14 14:54:56 EST 2012
On Tuesday 14 February 2012, Brad King wrote:
> On 2/14/2012 1:26 PM, Alexander Neundorf wrote:
> > Well, CMakeConfigHelpers.cmake would be shipped with cmake, so as long as
> > the Config.cmake file says
> > cmake_minimum_required(VERSION 2.8.8)
> > it would be fine.
>
> ...and we have to maintain compatibility in the module no matter what.
> It is much easier if the config files are standalone.
Yes, that's a good point.
Another option would be to install the included file along the Config.cmake
file.
> >> (2) The content of a relocatable BarConfig.cmake should not depend on
> >> where it happened to be installed when the package was built.
> >
> > I don't see a real problem with this.
> > Actually it is a good thing if the Config.cmake file can detect whether
> > it is in the location where it should be according to
> > CMAKE_INSTALL_PREFIX, e.g. to ensure that the libraries are installed in
> > the right location (so the builtin RPATHs point to the right location).
>
> Leaving remnants of the original build/install location is a no-no for
> packagers.
I don't know, we could ask them.
Actually I don't think it would be a problem for a Linux distro packager,
since in this case the original install destination will be also the final
actual install location.
I mean, they build the package for a place where it should be installed, and
if you install the package via the normal package managers, this is where they
will end up.
Also, this wouldn't leave anything of the original build location in the file,
only the intended install location.
And this is what we do anyway since kdelibs 4.0. Right now we have code like
this in KDE's installed files:
...
if (NOT KDE4_INSTALL_DIR)
set(KDE4_INSTALL_DIR "/home/alex/installs/kdelibs")
endif (NOT KDE4_INSTALL_DIR)
set(KDE4_LIB_INSTALL_DIR "/home/alex/installs/kdelibs/lib")
set(KDE4_LIBEXEC_INSTALL_DIR "/home/alex/installs/kdelibs/lib/kde4/libexec")
set(KDE4_INCLUDE_INSTALL_DIR "/home/alex/installs/kdelibs/include")
...
and no packager ever complained that this would be a problem.
> > How would that work if INCLUDE_INSTALL_DIR is an absolute path ?
> > set(BAR_INCLUDE_DIRS "@INCLUDE_INSTALL_DIR@")
> >
> > Would the case that DATA_INSTALL_DIR and LIB_INSTALL_DIR point to
> > completely different locations be handled ?
>
> See my discussion with Yuri in this thread.
I saw and replied, and can't really understand how I should write the
BarConfig.cmake.in to make it work.
Alternatively, Yuri suggested this in a thread on kde-buildsystem, there could
be a macro which completely generates the Config.cmake file.
This would get rid of a bunch of problems, like having to write complicated
code in the Config.cmake file, but OTOH it would have to take quite a lot of
parameters, e.g. how it should set up the LIBRARY variables from the exported
targets, in which namespace they have been exported, etc.
This would be a quite big macro.
Alex
More information about the cmake-developers
mailing list