Strange commit to FindKDE4Internal.cmake
Alexander Neundorf
neundorf at kde.org
Mon Feb 20 17:24:19 UTC 2012
On Sunday 19 February 2012, Pau Garcia i Quiles wrote:
> On Sun, Feb 19, 2012 at 11:41 PM, Ralf Habacker
>
> <ralf.habacker at googlemail.com> wrote:
> > There is a linux rpm package installing about 150 Find... scripts into
> > /usr/share/cmake-2.8/modules (the package is named cmake) and a 3rdparty
> > library rpm package installing a dedicated Find... script into the same
> > location (or a well known 3rdparty location) because the related Find.
> > script is not in the cmake binary package ? Is this forbidden ?
>
> On Debian, this is considered a bug. Really.
>
> > Is the library package maintainer be forced to add his Find<lib>...
> > script to the official cmake release or to a dedicated
> > extra-cmake-find-script-repository and tell the user to install an
> > additional dependency ?
>
> The library package maintainer must only add this Find<lib>... to the
> library package. He needs not write anything new or look for
> Find<lib>... anywhere else. If the original source tarball (i. e.
> upstream) includes Find<lib>..., then it will be installed in
> /usr/share/doc/libfoo-dev/cmake.
>
> > And when his Find... script is not accepted by the
> > cmake maintainers for whatever reasons,
>
> I never mentioned this Find... script would ever be submitted to CMake
> maintainers. It should not.
Well, that's what we are doing since kdelibs 4.0 and it works very well for
us.
CMake ships a very small FindKDE4.cmake, which searches for our lengthy
FindKDE4Internal.cmake, which when found, does the rest.
The FindKDE4Internal.cmake is quite similar to a KDE4Config.cmake file, but
this mechanism didn't exist yet back then, I think it was added in 2.6.0.
So, in general, yes, upstreaming a Find-module to cmake is a good thing.
The whole idea of the Config.cmake files is more or less to get rid of Find-
modules, to get rid of the need to have a lot of information about Foo outside
Foo (because Foo provides all the information in its config file).
While I understand the idea behind your suggestion to first search for
Config.cmake files, and if not found, fall back to Find-module, this doesn't
improve the situation in the error case, and also it shouldn't be necessary.
If a package installs a config file, you should (IMO) call find_package with
the NO_MODULE parameter:
find_package(Foo NO_MODULE).
If you think this is not good enough for finding it, you can add additional
paths where to look:
find_package(Foo NO_MODULE PATHS /opt/kde4 c:/mystuff )
If you think this shouldn't be in a users CMakeLists.txt, but in a Find-
module, I agree.
Then the CMakeLists.txt would be:
find_package(Foo)
and FindFoo.cmake would be:
find_package(Foo NO_MODULE PATHS /opt/kde4 c:/mystuff )
find_package_handle_standard_args(Foo CONFIG_MODE)
which is basically trivial and additional gives a nice and brief error/success
message thanks to fphsa()
From the two error messages I posted earlier, the one which talks about the
missing Find-module, is directed at the developers of the package. It could be
reworded less lengthy and less friendly:
"Could not find FindFoo.cmake
Your buildsystem is broken, fix it !"
No user should ever see this.
Users should only see:
"Could not find FooConfig.cmake file.
Adjust CMAKE_PREFIX_PATH to find it".
or the brief summary from find_package_handle_standard_args():
"Found Foo (/usr/lib/cmake/FooConfig.cmake)"
OR
"Did not find Foo (neither FooConfig.cmake nor foo-config.cmake)"
OR the normal messages:
"Found Foo (/usr/lib/libfoo.so)"
Alex
More information about the Kde-buildsystem
mailing list