[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
Fri Feb 17 04:29:58 EST 2012


On Thursday 16 February 2012, Alexander Neundorf wrote:
> 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.

I collected the various error messages which can be produced in the different 
cases:
* package not found
* package found, but version doesn't match

* REQUIRED
* without REQUIRED

* find_package() with no Find-module present
* find_package(NO_MODULE)
* find_package() with a wrapper Find-module which does:
     find_package(ecm QUIET NO_MODULE)
     fphsa(ecm CONFIG_MODE)


Here we go:

package not found, REQUIRED:

--------------------------------------------------------
1.) find_package() with no Find-module present:

CMake Error at CMakeLists.txt:4 (find_package):
  Could not find module Findecm.cmake or a configuration file
  for package ecm.

  Adjust CMAKE_MODULE_PATH to find Findecm.cmake or set
  ecm_DIR to the directory containing a CMake configuration
  file for ecm.  The file will have one of the following
  names:

    ecmConfig.cmake
    ecm-config.cmake
***** processing continues, but with error


--------------------------------------------------------
2.) find_package(NO_MODULE):

CMake Error at CMakeLists.txt:4 (find_package):
  Could not find a configuration file for package ecm.

  Set ecm_DIR to the directory containing a CMake
  configuration file for ecm.  The file will have one of the
  following names:

    ecmConfig.cmake
    ecm-config.cmake
***** processing continues, but with error


--------------------------------------------------------
3.) find_package() with a wrapper Find-module:

CMake Error at /opt/cmakeHEAD/share/cmake-2.8/Modules/
FindPackageHandleStandardArgs.cmake:91 (MESSAGE):
  Could NOT find ecm: found neither ecmConfig.cmake nor ecm-config.cmake
  (Required is at least version "0.0.4")

Call Stack (most recent call first):
  /opt/cmakeHEAD/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:121
  /opt/cmakeHEAD/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:247
  Findecm.cmake:4 (find_package_handle_standard_args)
  CMakeLists.txt:7 (find_package)
***** processing stops

--------------------------------------------------------


Without REQUIRED the messages are the same (with the wrapper Find-module the 
callstack is not printed), but processing continues without error. 

Now the cases where the Config file was found, but the version didn't match:


--------------------------------------------------------
4.) find_package() with no Find-module present, same with NO_MODULE:

CMake Error at CMakeLists.txt:4 (find_package):
  Could not find a configuration file for package "ecm" that
  is compatible with requested version "0.0.4".

  The following configuration files were considered but not accepted:

    /opt/ecm/share/ecm-0.0.2/cmake/ecm-config.cmake, version: 0.0.2
    /opt/ecm/share/ecm-0.0.3/cmake/ecm-config.cmake, version: 0.0.3
***** processing continues, but with error


--------------------------------------------------------
5.) find_package() with a wrapper Find-module:

CMake Error at /opt/cmakeHEAD/share/cmake-2.8/Modules/
FindPackageHandleStandardArgs.cmake:91 (MESSAGE):
  Could NOT find ecm (Required is at least version "0.0.4"),
  checked the following files:

      /opt/ecm/share/ecm-0.0.2/cmake/ecm-config.cmake (version 0.0.2)
      /opt/ecm/share/ecm-0.0.3/cmake/ecm-config.cmake (version 0.0.3)

Call Stack (most recent call first):
  /opt/cmakeHEAD/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:117 
  /opt/cmakeHEAD/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:247 
  Findecm.cmake:4 (find_package_handle_standard_args)
  CMakeLists.txt:7 (find_package)
***** processing stops

--------------------------------------------------------


What should be improved:
1.), 2.), 4.)  processing should stop if REQUIRED was used


2.) CMAKE_PREFIX_PATH should be mentioned

1.), 2.) if a version number was used, this should be printed in the error 
message

1.) CMAKE_PREFIX_PATH should be mentioned at least.
This is the one error message which is IMO problematic. It basically only says 
"it did not work", and I don't know whether the package is missing or whether 
the buildsystem of the project is broken, which are two significantly 
different problems - one requires installing a package, the other requires 
hacking the buildsystem of an unknown project.
This could be avoided by making NO_MODULE required when the intention is to 
search for a Config file (I would have preferred from the beginning if 
find_package() would use only Find-modules, and for searching Config-files 
there would have been a separate command like find_config()).


In general, I would still recommend everybody to use the small wrapper Find-
modules also for packages which install a Config.file, if only for the purpose 
to contain some documentation or to set up information for 
FeatureSummary.cmake.

Alex



More information about the cmake-developers mailing list