Strange commit to FindKDE4Internal.cmake
Ralf Habacker
ralf.habacker at googlemail.com
Sun Feb 19 22:21:18 UTC 2012
Am 19.02.2012 22:45, schrieb Pau Garcia i Quiles:
> 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/Module
cmake 2.8.3 on linux installs it Find... scripts in /usr/share/cmake/modules
cmake 2.8.7 on windows installs it Find... scripts in
<install-root>/share/cmake-2.8/Modules
> em On Windows, (3) would probably be something like
> %CommonProgramFiles%\CMake\official3rdpartymodules
following this scheme it would be required to add
${CMAKE_INSTALL_PREFIX}/share/cmake/official3rdpartymodule.
KDElibs on windows installs it Find... scripts in
${CMAKE_INSTALL_PREFIX}/share/apps/cmake/modules, should 3rdparty
packages be installed into that dir too ?
Ralf
More information about the Kde-buildsystem
mailing list