[cmake-developers] Bad error message when a package could not be found - make find_package() not search config files by default
Alexander Neundorf
neundorf at kde.org
Thu Feb 16 08:19:13 EST 2012
Hi,
when I use a Find-module to search for a package, I get a nice error message
if the package could not be found.
If I use
find_package(Foo)
and rely on Config-mode, cmake produces an error message which doesn't help
the user:
~/src/extra-cmake-modules/example/b$ make rebuild_cache
Running CMake to regenerate build system...
CMake Error at CMakeLists.txt:4 (find_package):
Could not find module Findextra-cmake-modules.cmake or a configuration file
for package extra-cmake-modules.
Adjust CMAKE_MODULE_PATH to find Findextra-cmake-modules.cmake or set
extra-cmake-modules_DIR to the directory containing a CMake configuration
file for extra-cmake-modules. The file will have one of the following
names:
extra-cmake-modulesConfig.cmake
extra-cmake-modules-config.cmake
-- modules path: --
CMake Error at CMakeLists.txt:13 (ecm_use_find_modules):
Unknown CMake command "ecm_use_find_modules".
-- Configuring incomplete, errors occurred!
make: *** [rebuild_cache] Error 1
--------------------
I see several issues here, sorted by importance:
1) the user doesn't know whether his build was supposed to use a Find-module
or whether it was supposed to find the Config.cmake file. Especially since
there is no file present which tells him that. With Find-modules he can have a
look at the Find-module and he will see which header or library cmake is
looking for. In the case of a missing Config.cmake file this is not possible.
This is IMO a major problem. The user has no chance to guess which file he
should look for, and where it should come from: FindFoo.cmake, FooConfig.cmake
or Foo-config.cmake.
2) the first thing the error message recommends is to adjust
CMAKE_MODULE_PATH. But probably either Foo is not installed at all, or the
user should adjust CMAKE_PREFIX_PATH so Foo can be found. But
CMAKE_PREFIX_PATH is not mentioned at all.
3) cmake continues processing the CMakeLists.txt even after the REQUIRED
message could not be found. IMO it should fail with FATAL_ERROR.
What to do about it ?
3) should be easy to solve by failing differently. I can do that.
1) and 2): What I usually recommend is to use a tiny FindFoo.cmake file which
basically contains find_package(FOO NO_MODULE). This way the user can find
information what went wrong. But it doesn't seem like everybody is doing this.
So it should be enforced or at least always obvious what cmake is searching.
So here is my proposal: make find_package() search only for Find-modules by
default, and only search for config.cmake files if NO_MODULE was used (maybe
add a positive option CONFIG_MODE).
If then a config.cmake file was not found, the error message can say
definitely whether a Find-module was not found, and CMAKE_MODULE_PATH is
wrong, or whether the Config.cmake file was not found, and CMAKE_PREFIX_PATH
should be adjusted.
Also, by looking at the CMakeLists.txt, the user can see whether a Find-module
or a Config.cmake file should be found.
I am aware that this is quite a change, but thanks to the policy system it
shouldn't be able to break anything.
I consider this necessary, to avoid the feeling of helplessness among users
because they have no idea what went wrong in cmake's configure step.
Comments, objections ?
Alex
More information about the cmake-developers
mailing list