[CMake] find_package with COMPONENTS never honors REQUIRED

Eric Noulard eric.noulard at gmail.com
Thu Aug 30 12:16:23 EDT 2018


Le jeu. 30 août 2018 à 18:01, George PF <george.p.f at mail.com> a écrit :

> Hi,
>
> once COMPONENTS is added to a find_package statement, any REQUIRED
> statement ceases to have an effect:
>
>     cmake_minimum_required(VERSION 3.12)
>
>     # find_package(FailsCorrectly REQUIRED)
>
>     find_package(Qt REQUIRED COMPONENTS REQUIRED Qt5XYZ REQUIRED)
>     find_package(Qt REQUIRED COMPONENTS          Qt5XYZ         )
>     find_package(Qt          COMPONENTS REQUIRED Qt5XYZ         )
>     find_package(Qt          COMPONENTS          Qt5XYZ REQUIRED)
>     find_package(Qt          COMPONENTS REQUIRED Qt5XYZ REQUIRED)
>     find_package(Qt REQUIRED COMPONENTS          Qt5XYZ REQUIRED)
>     find_package(Qt REQUIRED COMPONENTS REQUIRED Qt5XYZ         )
>
>
> This CMakeLists.txt runs, despite Qt5XYZ not existing. How can this be
> made to fail as it should, why
> else would there be OPTIONAL_COMPONENTS as well?
>

The documentation is intriguing about REQUIRED COMPONENTS interaction....

"A package-specific list of required components may be listed after the
``COMPONENTS`` option (or after the ``REQUIRED`` option if present).
Additional optional components may be listed after
``OPTIONAL_COMPONENTS``."

and....

"Available components and their influence on
whether a package is considered to be found are defined by the target
package."

and later on:

"In Config mode ``find_package`` handles ``REQUIRED``, ``QUIET``, and
``[version]`` options automatically but leaves it to the package
configuration file to handle components in a way that makes sense
for the package.  The package configuration file may set
``<package>_FOUND`` to false to tell ``find_package`` that component
requirements are not satisfied."

So it is possible that the failure behavior when specifying COMPONENTS is
up to the module...

Do you see this only with Qt or do other packages with components (may be
Boost) behave like this?
I guess that Qt5 should be running in config mode, whereas boost must be in
module mode though.

By the way for Qt5 the doc says you shouldn't be using find_package(Qt):
https://cmake.org/cmake/help/latest/module/FindQt.html

But probably directly:
find_package(Qt5)

see example here: https://blog.kitware.com/cmake-finding-qt5-the-right-way/
-- 
Eric
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180830/c3f1cf4a/attachment.html>


More information about the CMake mailing list