[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-buildsystem
Subject:    Re: Strange commit to FindKDE4Internal.cmake
From:       Pau Garcia i Quiles <pgquiles () elpauer ! org>
Date:       2012-02-19 21:45:00
Message-ID: CAKcBoktjneiSetewgW-Jmw3oJEa8FO5aZFKrFG8hXKfV9ZMoxg () mail ! gmail ! com
[Download RAW message or body]

On Sun, Feb 19, 2012 at 5:20 PM, Alexander Neundorf <neundorf@kde.org> wrot=
e:

> CMake searches in a set of self-defined standard locations, as documented=
 in
> the find_package() section of the man page.
> I don't have experience with this myself on Windows, but doesn't this mak=
e it
> kind of work ?

No, it does not. On Windows there are absolutely no standards for
anything. Most people will have development libraries and headers
outside path. Several of them. Something like this, for instance:

C:\dev\myproject\3rdparty\include
C:\dev\myproject\3rdparty\lib
C:\kitware\vision\include
C:\kitware\vision\lib
c:\tmp\devellopmentlibraries\msvc2010\libpng\include
c:\tmp\devellopmentlibraries\msvc2010\libpng\lib
...

Now try and find a LibFooConfig.cmake somehow. Absolutely impossible.
Heck, many times headers and libraries will be under some shared
network drive! (something like H:\lib + H:\include). Are you going to
scan every drive connected to the computer looking for config files?



>> If TheGreatApp does a find_package(LibFoo REQUIRED) this is what happens:
>>
>> - If LibFooConfig.cmake and/or FindLibFoo.cmake is available (either
>> from CMake itself or bundled with my *application* in
>> TheGreatApp/cmake), either LibFoo is found and all goes well, or
>> LibFoo is not found and the error the user will see is "LibFoo not
>> found" because either LibFooConfig.cmake or FindLibFoo.cmake would
>> provide what find_package needs (configuration and/or module).
>>
>> - If LibFooConfig.cmake is installed on Windows but it's on a path
>> CMake does not look into (the *norm* on Windows), or if I do not
>> bundle FindLibFoo.cmake with my application, this is the error a user
>> would see on Windows: an incomprehensible error. Same error as if
>> LibFooConfig.cmake is not available.
>>
>> I cannot see the advantage of LibFooConfig.cmake on non-Unix
>> platforms, or even on Unix platforms when libraries (including
>> FooConfig.cmake) is installed on non-standard locations. It will make
>> find_package fail at the very first step (trying to locate
>> FooConfig.cmake or FindLibFoo.cmake) without even delving into the
>> very finding operation.
>
> We are discussing exactly this currently on the cmake-developers list.
>
> My proposal for cmake 2.8.8 is:
>
> find_package(Qt5)
>
> only uses FindQt5.cmake (and doesn't look for a Qt5Config.cmake), and if
> FindQt5.cmake is not found, it says:
> -----------------------------------------------
> "CMake Error at CMakeLists.txt:7 (find_package):
> =A0Could not find module FindQt5.cmake.
>
> =A0Adjust CMAKE_MODULE_PATH to find FindQt5.cmake.
>
> =A0FindQt5.cmake must either be part of this project itself, in this case
> =A0adjust CMAKE_MODULE_PATH so that it points to the correct location ins=
ide
> =A0your source tree.
>
> =A0Or it must be installed by a package which has already been found via
> =A0find_package(). =A0In this case make sure that this package has indeed=
 been
> =A0found and adjust CMAKE_MODULE_PATH to contain the location where that
> =A0package has installed FindQt5.cmake. =A0This must be a variable provid=
ed by
> =A0that package or something similar, i.e. =A0for instance not your curre=
nt
> =A0CMAKE_INSTALL_PREFIX. =A0This error in general means that you are rely=
ing on
> =A0a Find-module without ensuring that this Find-module exists."
>
> -----------------------------------------------
>
> OTOH
> find_package(Qt5 NO_MODULE)
> will look only for a Qt5Config.cmake, i.e. you have to enforce Config mod=
e,
> and thus make is possible for cmake to generate better error messages, an=
d so
> for the user to know better what went wrong:
>
> -----------------------------------------------
> "CMake Error at CMakeLists.txt:7 (find_package):
> =A0Could not find a configuration file for package Qt5 with one of the
> =A0following names:
>
> =A0 =A0Qt5Config.cmake
> =A0 =A0qt5-config.cmake
>
> =A0To find the configuration file, set CMAKE_PREFIX_PATH to the installat=
ion
> =A0prefix of Qt5, or set Qt5_DIR to the directory containing a CMake
> =A0configuration file for Qt5.
> "
> -----------------------------------------------
>
>
> What do you think about this ?

That looks wrong to me.

IMHO:

- find_package must always look for LibFooConfig.cmake before looking
for FindLibFoo.cmake
- Libraries may install a LibFooConfig.cmake. The only advantage in a
LibFooConfig.cmake is it would provide faster discovery for the
"system-wide" libfoo (no need for all the checks, header parsing, etc
that usually takes place in FindLibFoo.cmake)
- Third party applications must always include a FindLibFoo.cmake in
TheGreatApp/cmake and adjust CMAKE_MODULE_PATH conveniently to use it.
- Libraries (libfoo) must always provide a reference FindLibFoo.cmake
in the package and make it available for third party developers in the
tarballs. Packages (libfoo-dev) must install this to a place that is
searched for by CMake: some equivalent to
/usr/share/cmake-2.8/Modules, but for *official* 3rd-party
FindLibFoo.cmake modules (i. e. modules provided by the library
itself, not modules written by a third party)

The search order would be like this:

1. LibFooConfig.cmake
2. FindLibFoo.cmake in CMAKE_MODULE_PATH
3. FindLibFoo.cmake in /usr/share/cmake/official3rdpartymodules
4. FindLibFoo.cmake in /usr/share/cmake-2.8/Modules

On Windows, (3) would probably be something like
%CommonProgramFiles%\CMake\official3rdpartymodules

That's a first write-up and I'm probably missing some case but you get the =
idea.

-- =

Pau Garcia i Quiles
http://www.elpauer.org
(Due to my workload, I may need 10 days to answer)
_______________________________________________
Kde-buildsystem mailing list
Kde-buildsystem@kde.org
https://mail.kde.org/mailman/listinfo/kde-buildsystem
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic