Strange commit to FindKDE4Internal.cmake
Pau Garcia i Quiles
pgquiles at elpauer.org
Sun Feb 19 21:45:00 UTC 2012
On Sun, Feb 19, 2012 at 5:20 PM, Alexander Neundorf <neundorf at kde.org> wrote:
> 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 make 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):
> Could not find module FindQt5.cmake.
>
> Adjust CMAKE_MODULE_PATH to find FindQt5.cmake.
>
> FindQt5.cmake must either be part of this project itself, in this case
> adjust CMAKE_MODULE_PATH so that it points to the correct location inside
> your source tree.
>
> Or it must be installed by a package which has already been found via
> find_package(). In this case make sure that this package has indeed been
> found and adjust CMAKE_MODULE_PATH to contain the location where that
> package has installed FindQt5.cmake. This must be a variable provided by
> that package or something similar, i.e. for instance not your current
> CMAKE_INSTALL_PREFIX. This error in general means that you are relying on
> a 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 mode,
> and thus make is possible for cmake to generate better error messages, and so
> for the user to know better what went wrong:
>
> -----------------------------------------------
> "CMake Error at CMakeLists.txt:7 (find_package):
> Could not find a configuration file for package Qt5 with one of the
> following names:
>
> Qt5Config.cmake
> qt5-config.cmake
>
> To find the configuration file, set CMAKE_PREFIX_PATH to the installation
> prefix of Qt5, or set Qt5_DIR to the directory containing a CMake
> configuration 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)
More information about the Kde-buildsystem
mailing list