Merge topic 'FeatureSummary_enhancement'

560574b0 FeatureSummary: Update release notes
3cfde818 FeatureSummary: Refactor to use global properties for package types
f0165eb6 FeatureSummary: Allow lists of dependencies in ADD_FEATURE_INFO
9da7bf08 FeatureSummary: Add QUIET_ON_EMPTY option to feature_summary
4cf4aceb FeatureSummary: Add unit tests
614a97a5 FeatureSummary: Do not force OPTIONAL type in SET_PACKAGE_PROPERTIES
65a0bfd8 FeatureSummary: Add deprecation warnings to deprecated commands
4da3cae9 FeatureSummary: Clean printed output
This commit is contained in:
Brad King 2017-01-30 08:43:23 -05:00 committed by CMake Topic Stage
commit 8df12fc9d4
44 changed files with 769 additions and 109 deletions

View File

@ -0,0 +1,22 @@
FeatureSummary_enhancement
--------------------------
* The :command:`set_package_info`, :command:`set_feature_info`,
:command:`print_enabled_features` and :command:`print_disabled_features`
commands from the the :module:`FeatureSummary` module are now deprecated.
* The :command:`set_package_properties` command no longer forces the package
type to ``OPTIONAL`` when the type is not explicitly set.
* The :command:`feature_summary` command in the :module:`FeatureSummary` module
accepts the new ``QUIET_ON_EMPTY`` option that will suppresses the output when
the list of packages that belong to the selected category is empty.
* The :command:`add_feature_info` in the :module:`FeatureSummary` module learned
to accept lists of dependencies for deciding whether a feature is enabled or
not.
* The package types accepted by the the :module:`FeatureSummary` module can now
be tweaked by changing the :variable:`FeatureSummary_PKG_TYPES`,
:variable:`FeatureSummary_REQUIRED_PKG_TYPES` and
:variable:`FeatureSummary_DEFAULT_PKG_TYPE` global properties.

View File

@ -14,30 +14,93 @@ packages and/or feature for a build tree such as::
LibXml2 (required version >= 2.4), XML processing lib, <http://xmlsoft.org>
* Enables HTML-import in MyWordProcessor
* Enables odt-export in MyWordProcessor
PNG , A PNG image library. , <http://www.libpng.org/pub/png/>
PNG, A PNG image library., <http://www.libpng.org/pub/png/>
* Enables saving screenshots
-- The following OPTIONAL packages have not been found:
Lua51 , The Lua scripting language. , <http://www.lua.org>
Lua51, The Lua scripting language., <http://www.lua.org>
* Enables macros in MyWordProcessor
Foo , Foo provides cool stuff.
Foo, Foo provides cool stuff.
Global Properties
^^^^^^^^^^^^^^^^^
.. variable:: FeatureSummary_PKG_TYPES
The global property :variable:`FeatureSummary_PKG_TYPES` defines the type of
packages used by `FeatureSummary`.
The order in this list is important, the first package type in the list is the
least important, the last is the most important. the of a package can only be
changed to higher types.
The default package types are , ``RUNTIME``, ``OPTIONAL``, ``RECOMMENDED`` and
``REQUIRED``, and their importance is
``RUNTIME < OPTIONAL < RECOMMENDED < REQUIRED``.
.. variable:: FeatureSummary_REQUIRED_PKG_TYPES
The global property :variable:`FeatureSummary_REQUIRED_PKG_TYPES` defines which
package types are required.
If one or more package in this categories has not been found, CMake will abort
when calling :cmd;`feature_summary` with the
'FATAL_ON_MISSING_REQUIRED_PACKAGES' option enabled.
The default value for this global property is ``REQUIRED``.
.. variable:: FeatureSummary_DEFAULT_PKG_TYPE
The global property :variable:`FeatureSummary_DEFAULT_PKG_TYPE` defines which
package type is the default one.
When calling :cmd;`feature_summary`, if the user did not set the package type
explicitly, the package will be assigned to this category.
This value must be one of the types defined in the
:variable:`FeatureSummary_PKG_TYPES` global property unless the package type
is set for all the packages.
The default value for this global property is ``OPTIONAL``.
#]=======================================================================]
get_property(_fsPkgTypeIsSet GLOBAL PROPERTY FeatureSummary_PKG_TYPES SET)
if(NOT _fsPkgTypeIsSet)
set_property(GLOBAL PROPERTY FeatureSummary_PKG_TYPES RUNTIME OPTIONAL RECOMMENDED REQUIRED)
endif()
get_property(_fsReqPkgTypesIsSet GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES SET)
if(NOT _fsReqPkgTypesIsSet)
set_property(GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES REQUIRED)
endif()
get_property(_fsDefaultPkgTypeIsSet GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE SET)
if(NOT _fsDefaultPkgTypeIsSet)
set_property(GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE OPTIONAL)
endif()
#[=======================================================================[.rst:
Functions
^^^^^^^^^
#]=======================================================================]
include(CMakeParseArguments)
function(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet)
get_property(_fsPkgTypes GLOBAL PROPERTY FeatureSummary_PKG_TYPES)
get_property(_fsDefaultPkgType GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE)
set(_type "ANY")
if("${_property}" MATCHES "REQUIRED_")
set(_type "REQUIRED")
elseif("${_property}" MATCHES "RECOMMENDED_")
set(_type "RECOMMENDED")
elseif("${_property}" MATCHES "RUNTIME_")
set(_type "RUNTIME")
elseif("${_property}" MATCHES "OPTIONAL_")
set(_type "OPTIONAL")
endif()
foreach(_fsPkgType ${_fsPkgTypes})
if("${_property}" MATCHES "${_fsPkgType}_PACKAGES_(NOT_)?FOUND")
set(_type "${_fsPkgType}")
break()
endif()
endforeach()
if("${_property}" MATCHES "PACKAGES_FOUND")
set(_property "PACKAGES_FOUND")
@ -57,15 +120,30 @@ function(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet)
# does this package belong to the type we currently want to list ?
get_property(_currentType GLOBAL PROPERTY _CMAKE_${_currentFeature}_TYPE)
if(NOT _currentType)
set(_currentType OPTIONAL)
list(FIND _fsPkgTypes "${_fsDefaultPkgType}" _defaultInPkgTypes)
if("${_defaultInPkgTypes}" STREQUAL "-1")
string(REGEX REPLACE ";([^;]+)$" " and \\1" _fsPkgTypes_msg "${_fsPkgTypes}")
string(REPLACE ";" ", " _fsPkgTypes_msg "${_fsPkgTypes_msg}")
message(FATAL_ERROR "Bad package property type ${_fsDefaultPkgType} used in global property FeatureSummary_DEFAULT_PKG_TYPE. "
"Valid types are ${_fsPkgTypes_msg}. "
"Either update FeatureSummary_DEFAULT_PKG_TYPE or add ${_fsDefaultPkgType} to the FeatureSummary_PKG_TYPES global property.")
endif()
set(_currentType ${_fsDefaultPkgType})
endif()
if("${_type}" STREQUAL ANY OR "${_type}" STREQUAL "${_currentType}")
# check whether the current feature/package should be in the output depending on whether it was QUIET or not
set(includeThisOne TRUE)
set(_required FALSE)
# skip QUIET packages, except if they are REQUIRED or INCLUDE_QUIET_PACKAGES has been set
if((NOT "${_currentType}" STREQUAL "REQUIRED") AND NOT _includeQuiet)
get_property(_fsReqPkgTypes GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES)
foreach(_fsReqPkgType ${_fsReqPkgTypes})
if("${_currentType}" STREQUAL "${_fsReqPkgType}")
set(_required TRUE)
break()
endif()
endforeach()
if(NOT _required AND NOT _includeQuiet)
get_property(_isQuiet GLOBAL PROPERTY _CMAKE_${_currentFeature}_QUIET)
if(_isQuiet)
set(includeThisOne FALSE)
@ -87,11 +165,11 @@ function(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet)
endif()
get_property(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_DESCRIPTION)
if(_info)
string(APPEND _currentFeatureText " , ${_info}")
string(APPEND _currentFeatureText ", ${_info}")
endif()
get_property(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL)
if(_info)
string(APPEND _currentFeatureText " , <${_info}>")
string(APPEND _currentFeatureText ", <${_info}>")
endif()
get_property(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE)
@ -119,6 +197,7 @@ endfunction()
[INCLUDE_QUIET_PACKAGES]
[FATAL_ON_MISSING_REQUIRED_PACKAGES]
[DESCRIPTION "Found packages:"]
[QUIET_ON_EMPTY]
WHAT (ALL | PACKAGES_FOUND | PACKAGES_NOT_FOUND
| ENABLED_FEATURES | DISABLED_FEATURES)
)
@ -143,22 +222,15 @@ endfunction()
the list of all packages which have been found
``PACKAGES_NOT_FOUND``
the list of all packages which have not been found
``OPTIONAL_PACKAGES_FOUND``
only those packages which have been found which have the type OPTIONAL
``OPTIONAL_PACKAGES_NOT_FOUND``
only those packages which have not been found which have the type OPTIONAL
``RECOMMENDED_PACKAGES_FOUND``
only those packages which have been found which have the type RECOMMENDED
``RECOMMENDED_PACKAGES_NOT_FOUND``
only those packages which have not been found which have the type RECOMMENDED
``REQUIRED_PACKAGES_FOUND``
only those packages which have been found which have the type REQUIRED
``REQUIRED_PACKAGES_NOT_FOUND``
only those packages which have not been found which have the type REQUIRED
``RUNTIME_PACKAGES_FOUND``
only those packages which have been found which have the type RUNTIME
``RUNTIME_PACKAGES_NOT_FOUND``
only those packages which have not been found which have the type RUNTIME
For each package type ``<TYPE>`` defined by the
:variable:`FeatureSummary_PKG_TYPES` global property, the following
information can also be used:
``<TYPE>_PACKAGES_FOUND``
only those packages which have been found which have the type <TYPE>
``<TYPE>_PACKAGES_NOT_FOUND``
only those packages which have not been found which have the type <TYPE>
With the exception of the ``ALL`` value, these values can be combined
in order to customize the output. For example:
@ -177,7 +249,20 @@ endfunction()
packages which have been searched with ``find_package(... QUIET)`` will
also be listed. By default they are skipped. If
``FATAL_ON_MISSING_REQUIRED_PACKAGES`` is given, CMake will abort if a
package which is marked as ``REQUIRED`` has not been found.
package which is marked as one of the package types listed in the
:variable:`FeatureSummary_REQUIRED_PKG_TYPES` global property has not been
found.
The default value for the :variable:`FeatureSummary_REQUIRED_PKG_TYPES` global
property is ``REQUIRED``.
The :variable:`FeatureSummary_DEFAULT_PKG_TYPE` global property can be
modified to change the default package type assigned when not explicitly
assigned by the user.
If the ``QUIET_ON_EMPTY`` option is used, if only one type of package was
requested, and no packages belonging to that category were found, then no
output (including the ``DESCRIPTION``) is printed or added to the ``VAR``
variable.
Example 1, append everything to a file:
@ -198,11 +283,28 @@ endfunction()
DESCRIPTION "Enabled Features:"
VAR enabledFeaturesText)
message(STATUS "${enabledFeaturesText}")
Example 3, change default package types and print only the categories that
are not empty:
.. code-block:: cmake
include(FeatureSummary)
set_property(GLOBAL APPEND PROPERTY FeatureSummary_PKG_TYPES BUILD)
find_package(FOO)
set_package_properties(FOO PROPERTIES TYPE BUILD)
feature_summary(WHAT BUILD_PACKAGES_FOUND
Description "Build tools found:"
QUIET_ON_EMPTY)
feature_summary(WHAT BUILD_PACKAGES_NOT_FOUND
Description "Build tools not found:"
QUIET_ON_EMPTY)
#]=======================================================================]
function(FEATURE_SUMMARY)
# CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords> <multi_value_keywords> args...)
set(options APPEND INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
set(options APPEND INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES QUIET_ON_EMPTY)
set(oneValueArgs FILENAME VAR DESCRIPTION)
set(multiValueArgs WHAT)
@ -219,40 +321,42 @@ function(FEATURE_SUMMARY)
set(validWhatParts "ENABLED_FEATURES"
"DISABLED_FEATURES"
"PACKAGES_FOUND"
"PACKAGES_NOT_FOUND"
"OPTIONAL_PACKAGES_FOUND"
"OPTIONAL_PACKAGES_NOT_FOUND"
"RECOMMENDED_PACKAGES_FOUND"
"RECOMMENDED_PACKAGES_NOT_FOUND"
"REQUIRED_PACKAGES_FOUND"
"REQUIRED_PACKAGES_NOT_FOUND"
"RUNTIME_PACKAGES_FOUND"
"RUNTIME_PACKAGES_NOT_FOUND")
"PACKAGES_NOT_FOUND")
get_property(_fsPkgTypes GLOBAL PROPERTY FeatureSummary_PKG_TYPES)
get_property(_fsReqPkgTypes GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES)
foreach(_fsPkgType ${_fsPkgTypes})
list(APPEND validWhatParts "${_fsPkgType}_PACKAGES_FOUND"
"${_fsPkgType}_PACKAGES_NOT_FOUND")
endforeach()
list(FIND validWhatParts "${_FS_WHAT}" indexInList)
if(NOT "${indexInList}" STREQUAL "-1")
_FS_GET_FEATURE_SUMMARY( ${_FS_WHAT} _featureSummary ${_FS_INCLUDE_QUIET_PACKAGES} )
set(_fullText "${_FS_DESCRIPTION}${_featureSummary}\n")
if (("${_FS_WHAT}" STREQUAL "REQUIRED_PACKAGES_NOT_FOUND") AND _featureSummary)
set(requiredPackagesNotFound TRUE)
if(_featureSummary OR NOT _FS_QUIET_ON_EMPTY)
set(_fullText "${_FS_DESCRIPTION}${_featureSummary}\n")
endif()
if(_featureSummary)
foreach(_fsReqPkgType ${_fsReqPkgTypes})
if("${_FS_WHAT}" STREQUAL "${_fsReqPkgType}_PACKAGES_NOT_FOUND")
set(requiredPackagesNotFound TRUE)
break()
endif()
endforeach()
endif()
else()
if("${_FS_WHAT}" STREQUAL "ALL")
set(allWhatParts "ENABLED_FEATURES"
"RUNTIME_PACKAGES_FOUND"
"OPTIONAL_PACKAGES_FOUND"
"RECOMMENDED_PACKAGES_FOUND"
"REQUIRED_PACKAGES_FOUND"
"DISABLED_FEATURES"
"RUNTIME_PACKAGES_NOT_FOUND"
"OPTIONAL_PACKAGES_NOT_FOUND"
"RECOMMENDED_PACKAGES_NOT_FOUND"
"REQUIRED_PACKAGES_NOT_FOUND"
)
set(allWhatParts "ENABLED_FEATURES")
foreach(_fsPkgType ${_fsPkgTypes})
list(APPEND allWhatParts "${_fsPkgType}_PACKAGES_FOUND")
endforeach()
list(APPEND allWhatParts "DISABLED_FEATURES")
foreach(_fsPkgType ${_fsPkgTypes})
list(APPEND allWhatParts "${_fsPkgType}_PACKAGES_NOT_FOUND")
endforeach()
else()
set(allWhatParts)
foreach(part ${_FS_WHAT})
@ -273,45 +377,49 @@ function(FEATURE_SUMMARY)
set(title_DISABLED_FEATURES "The following features have been disabled:")
set(title_PACKAGES_FOUND "The following packages have been found:")
set(title_PACKAGES_NOT_FOUND "The following packages have not been found:")
set(title_OPTIONAL_PACKAGES_FOUND "The following OPTIONAL packages have been found:")
set(title_OPTIONAL_PACKAGES_NOT_FOUND "The following OPTIONAL packages have not been found:")
set(title_RECOMMENDED_PACKAGES_FOUND "The following RECOMMENDED packages have been found:")
set(title_RECOMMENDED_PACKAGES_NOT_FOUND "The following RECOMMENDED packages have not been found:")
set(title_REQUIRED_PACKAGES_FOUND "The following REQUIRED packages have been found:")
set(title_REQUIRED_PACKAGES_NOT_FOUND "The following REQUIRED packages have not been found:")
set(title_RUNTIME_PACKAGES_FOUND "The following RUNTIME packages have been found:")
set(title_RUNTIME_PACKAGES_NOT_FOUND "The following RUNTIME packages have not been found:")
foreach(_fsPkgType ${_fsPkgTypes})
set(title_${_fsPkgType}_PACKAGES_FOUND "The following ${_fsPkgType} packages have been found:")
set(title_${_fsPkgType}_PACKAGES_NOT_FOUND "The following ${_fsPkgType} packages have not been found:")
endforeach()
set(_fullText "${_FS_DESCRIPTION}")
foreach(part ${allWhatParts})
set(_tmp)
_FS_GET_FEATURE_SUMMARY( ${part} _tmp ${_FS_INCLUDE_QUIET_PACKAGES})
if(_tmp)
string(APPEND _fullText "\n-- ${title_${part}}\n${_tmp}\n")
if("${part}" STREQUAL "REQUIRED_PACKAGES_NOT_FOUND")
set(requiredPackagesNotFound TRUE)
if(_fullText)
string(APPEND _fullText "\n-- ")
endif()
string(APPEND _fullText "${title_${part}}\n${_tmp}\n")
foreach(_fsReqPkgType ${_fsReqPkgTypes})
if("${part}" STREQUAL "${_fsReqPkgType}_PACKAGES_NOT_FOUND")
set(requiredPackagesNotFound TRUE)
break()
endif()
endforeach()
endif()
endforeach()
endif()
if(_FS_FILENAME)
if(_FS_APPEND)
file(APPEND "${_FS_FILENAME}" "${_fullText}")
if(_fullText OR NOT _FS_QUIET_ON_EMPTY)
if(_FS_FILENAME)
if(_FS_APPEND)
file(APPEND "${_FS_FILENAME}" "${_fullText}")
else()
file(WRITE "${_FS_FILENAME}" "${_fullText}")
endif()
else()
file(WRITE "${_FS_FILENAME}" "${_fullText}")
if(NOT _FS_VAR)
message(STATUS "${_fullText}")
endif()
endif()
else()
if(NOT _FS_VAR)
message(STATUS "${_fullText}")
if(_FS_VAR)
set(${_FS_VAR} "${_fullText}" PARENT_SCOPE)
endif()
endif()
if(_FS_VAR)
set(${_FS_VAR} "${_fullText}" PARENT_SCOPE)
endif()
if(requiredPackagesNotFound AND _FS_FATAL_ON_MISSING_REQUIRED_PACKAGES)
message(FATAL_ERROR "feature_summary() Error: REQUIRED package(s) are missing, aborting CMake run.")
endif()
@ -362,7 +470,8 @@ endfunction()
TYPEs (``RUNTIME < OPTIONAL < RECOMMENDED < REQUIRED``), lower TYPEs are
ignored. The ``TYPE`` property is project-specific, so it cannot be set
by the Find-module, but must be set in the project.
Type accepted can be changed by setting the
:variable:`FeatureSummary_PKG_TYPES` global property.
``PURPOSE <purpose>``
This describes which features this package enables in the
@ -435,25 +544,28 @@ function(SET_PACKAGE_PROPERTIES _name _props)
set_property(GLOBAL APPEND PROPERTY _CMAKE_${_name}_PURPOSE "${_SPP_PURPOSE}" )
endif()
get_property(_fsPkgTypes GLOBAL PROPERTY FeatureSummary_PKG_TYPES)
get_property(_fsDefaultPkgType GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE)
# handle the TYPE
if(NOT _SPP_TYPE)
set(_SPP_TYPE OPTIONAL)
endif()
if(DEFINED _SPP_TYPE)
# Supported types are listed in FeatureSummary_PKG_TYPES according to their priority
get_property(_fsPkgTypes GLOBAL PROPERTY FeatureSummary_PKG_TYPES)
list(FIND _fsPkgTypes ${_SPP_TYPE} _typeIndexInList)
if("${_typeIndexInList}" STREQUAL "-1" )
string(REGEX REPLACE ";([^;]+)$" " and \\1" _fsPkgTypes_msg "${_fsPkgTypes}")
string(REPLACE ";" ", " _fsPkgTypes_msg "${_fsPkgTypes_msg}")
message(FATAL_ERROR "Bad package property type ${_SPP_TYPE} used in SET_PACKAGE_PROPERTIES(). "
"Valid types are ${_fsPkgTypes_msg}." )
endif()
# List the supported types, according to their priority
set(validTypes "RUNTIME" "OPTIONAL" "RECOMMENDED" "REQUIRED" )
list(FIND validTypes ${_SPP_TYPE} _typeIndexInList)
if("${_typeIndexInList}" STREQUAL "-1" )
message(FATAL_ERROR "Bad package property type ${_SPP_TYPE} used in SET_PACKAGE_PROPERTIES(). "
"Valid types are OPTIONAL, RECOMMENDED, REQUIRED and RUNTIME." )
endif()
get_property(_previousType GLOBAL PROPERTY _CMAKE_${_name}_TYPE)
list(FIND _fsPkgTypes "${_previousType}" _prevTypeIndexInList)
get_property(_previousType GLOBAL PROPERTY _CMAKE_${_name}_TYPE)
list(FIND validTypes "${_previousType}" _prevTypeIndexInList)
# make sure a previously set TYPE is not overridden with a lower new TYPE:
if("${_typeIndexInList}" GREATER "${_prevTypeIndexInList}")
set_property(GLOBAL PROPERTY _CMAKE_${_name}_TYPE "${_SPP_TYPE}" )
# make sure a previously set TYPE is not overridden with a lower new TYPE:
if("${_typeIndexInList}" GREATER "${_prevTypeIndexInList}")
set_property(GLOBAL PROPERTY _CMAKE_${_name}_TYPE "${_SPP_TYPE}" )
endif()
endif()
endfunction()
@ -466,7 +578,8 @@ endfunction()
add_feature_info(<name> <enabled> <description>)
Use this macro to add information about a feature with the given ``<name>``.
``<enabled>`` contains whether this feature is enabled or not.
``<enabled>`` contains whether this feature is enabled or not. It can be a
variable or a list of conditions.
``<description>`` is a text describing the feature. The information can
be displayed using ``feature_summary()`` for ``ENABLED_FEATURES`` and
``DISABLED_FEATURES`` respectively.
@ -478,7 +591,16 @@ endfunction()
option(WITH_FOO "Help for foo" ON)
add_feature_info(Foo WITH_FOO "The Foo feature provides very cool stuff.")
#]=======================================================================]
function(ADD_FEATURE_INFO _name _enabled _desc)
function(ADD_FEATURE_INFO _name _depends _desc)
set(_enabled 1)
foreach(_d ${_depends})
string(REGEX REPLACE " +" ";" _d "${_d}")
if(${_d})
else()
set(_enabled 0)
break()
endif()
endforeach()
if (${_enabled})
set_property(GLOBAL APPEND PROPERTY ENABLED_FEATURES "${_name}")
else ()
@ -511,6 +633,7 @@ CMake versions:
can be set are added automatically by the ``find_package()`` command.
#]=======================================================================]
function(SET_PACKAGE_INFO _name _desc)
message(DEPRECATION "SET_PACKAGE_INFO is deprecated. Use SET_PACKAGE_PROPERTIES instead.")
unset(_url)
unset(_purpose)
if(ARGC GREATER 2)
@ -540,6 +663,7 @@ endfunction()
set_package_info(<name> <description> <url>)
#]=======================================================================]
function(SET_FEATURE_INFO)
message(DEPRECATION "SET_FEATURE_INFO is deprecated. Use ADD_FEATURE_INFO instead.")
SET_PACKAGE_INFO(${ARGN})
endfunction()
@ -557,6 +681,8 @@ endfunction()
feature_summary(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:")
#]=======================================================================]
function(PRINT_ENABLED_FEATURES)
message(DEPRECATION "PRINT_ENABLED_FEATURES is deprecated. Use
feature_summary(WHAT ENABLED_FEATURES DESCRIPTION \"Enabled features:\")")
FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:")
endfunction()
@ -574,5 +700,7 @@ endfunction()
feature_summary(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:")
#]=======================================================================]
function(PRINT_DISABLED_FEATURES)
message(DEPRECATION "PRINT_DISABLED_FEATURES is deprecated. Use
feature_summary(WHAT DISABLED_FEATURES DESCRIPTION \"Disabled features:\")")
FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:")
endfunction()

View File

@ -0,0 +1,9 @@
CMake Error at .*/Modules/FeatureSummary\.cmake:[0-9]+. \(message\):
Bad package property type OPTIONAL used in global property
FeatureSummary_DEFAULT_PKG_TYPE. Valid types are TYPE1, TYPE2 and TYPE3.
Either update FeatureSummary_DEFAULT_PKG_TYPE or add OPTIONAL to the
FeatureSummary_PKG_TYPES global property.
Call Stack \(most recent call first\):
.*/Modules/FeatureSummary\.cmake:[0-9]+. \(_FS_GET_FEATURE_SUMMARY\)
FeatureSummaryCustomBadDefault.cmake:[0-9]+ \(feature_summary\)
CMakeLists.txt:[0-9]+ \(include\)

View File

@ -0,0 +1,8 @@
include(FeatureSummary)
set_property(GLOBAL PROPERTY FeatureSummary_PKG_TYPES TYPE1 TYPE2 TYPE3)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
find_package(Foo)
feature_summary(WHAT ALL)

View File

@ -0,0 +1,6 @@
CMake Error at .*/Modules/FeatureSummary\.cmake:[0-9]+. \(message\):
feature_summary\(\) Error: REQUIRED package\(s\) are missing, aborting CMake
run.
Call Stack \(most recent call first\):
FeatureSummaryCustomRequired.cmake:[0-9]+ \(feature_summary\)
CMakeLists.txt:[0-9]+ \(include\)

View File

@ -0,0 +1,17 @@
-- The following TYPE3 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE2 packages have not been found:
\* Bar
-- The following TYPE3 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE3 packages have not been found:
\* Bar
-- Configuring incomplete, errors occurred!

View File

@ -0,0 +1,16 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
set_property(GLOBAL PROPERTY FeatureSummary_PKG_TYPES TYPE1 TYPE2 TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE TYPE2)
find_package(Foo)
find_package(Bar)
set_package_properties(Foo PROPERTIES TYPE TYPE3)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
set_package_properties(Bar PROPERTIES TYPE TYPE3)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)

View File

@ -0,0 +1,6 @@
CMake Error at .*/Modules/FeatureSummary\.cmake:[0-9]+. \(message\):
feature_summary\(\) Error: REQUIRED package\(s\) are missing, aborting CMake
run.
Call Stack \(most recent call first\):
FeatureSummaryCustomRequiredListA.cmake:[0-9]+ \(feature_summary\)
CMakeLists.txt:[0-9]+ \(include\)

View File

@ -0,0 +1,17 @@
-- The following TYPE2 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE1 packages have not been found:
\* Bar
-- The following TYPE2 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE2 packages have not been found:
\* Bar
-- Configuring incomplete, errors occurred!

View File

@ -0,0 +1,16 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
set_property(GLOBAL PROPERTY FeatureSummary_PKG_TYPES TYPE1 TYPE2 TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES TYPE2 TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE TYPE1)
find_package(Foo)
find_package(Bar)
set_package_properties(Foo PROPERTIES TYPE TYPE2)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
set_package_properties(Bar PROPERTIES TYPE TYPE2)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)

View File

@ -0,0 +1,6 @@
CMake Error at .*/Modules/FeatureSummary\.cmake:[0-9]+. \(message\):
feature_summary\(\) Error: REQUIRED package\(s\) are missing, aborting CMake
run.
Call Stack \(most recent call first\):
FeatureSummaryCustomRequiredListB.cmake:[0-9]+ \(feature_summary\)
CMakeLists.txt:[0-9]+ \(include\)

View File

@ -0,0 +1,17 @@
-- The following TYPE3 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE1 packages have not been found:
\* Bar
-- The following TYPE3 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE3 packages have not been found:
\* Bar
-- Configuring incomplete, errors occurred!

View File

@ -0,0 +1,16 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
set_property(GLOBAL PROPERTY FeatureSummary_PKG_TYPES TYPE1 TYPE2 TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES TYPE2 TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE TYPE1)
find_package(Foo)
find_package(Bar)
set_package_properties(Foo PROPERTIES TYPE TYPE3)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
set_package_properties(Bar PROPERTIES TYPE TYPE3)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)

View File

@ -0,0 +1,29 @@
-- The following TYPE2 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE1 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE2 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE2 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE3 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE3 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following TYPE3 packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- Configuring done

View File

@ -0,0 +1,36 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
set_property(GLOBAL PROPERTY FeatureSummary_PKG_TYPES TYPE1 TYPE2 TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_REQUIRED_PKG_TYPES TYPE3)
set_property(GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE TYPE2)
find_package(Foo)
# Type not set => TYPE2
feature_summary(WHAT ALL)
# TYPE1 > not set => TYPE1
set_package_properties(Foo PROPERTIES TYPE TYPE1)
feature_summary(WHAT ALL)
# TYPE2 > TYPE1 => TYPE2
set_package_properties(Foo PROPERTIES TYPE TYPE2)
feature_summary(WHAT ALL)
# TYPE1 < TYPE2 => TYPE2
set_package_properties(Foo PROPERTIES TYPE TYPE2)
feature_summary(WHAT ALL)
# TYPE3 > TYPE2 => TYPE3
set_package_properties(Foo PROPERTIES TYPE TYPE3)
feature_summary(WHAT ALL)
# TYPE2 < TYPE3 => TYPE3
set_package_properties(Foo PROPERTIES TYPE TYPE2)
feature_summary(WHAT ALL)
# TYPE1 < TYPE3 => TYPE3
set_package_properties(Foo PROPERTIES TYPE TYPE1)
feature_summary(WHAT ALL)

View File

@ -0,0 +1,6 @@
CMake Error at .*/Modules/FeatureSummary\.cmake:[0-9]+. \(message\):
feature_summary\(\) Error: REQUIRED package\(s\) are missing, aborting CMake
run.
Call Stack \(most recent call first\):
FeatureSummaryFatalOnMissingRequiredPackages.cmake:[0-9]+ \(feature_summary\)
CMakeLists.txt:[0-9]+ \(include\)

View File

@ -0,0 +1,17 @@
-- The following REQUIRED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following OPTIONAL packages have not been found:
\* Bar
-- The following REQUIRED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following REQUIRED packages have not been found:
\* Bar
-- Configuring incomplete, errors occurred!

View File

@ -0,0 +1,12 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
find_package(Foo)
find_package(Bar)
set_package_properties(Foo PROPERTIES TYPE REQUIRED)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)
set_package_properties(Bar PROPERTIES TYPE REQUIRED)
feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES)

View File

@ -0,0 +1,14 @@
-- The following OPTIONAL packages have not been found:
\* Baz
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following OPTIONAL packages have not been found:
\* Bar
\* Baz
-- Configuring done

View File

@ -0,0 +1,11 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
find_package(Foo QUIET)
find_package(Bar QUIET)
find_package(Baz)
feature_summary(WHAT ALL)
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES)

View File

@ -0,0 +1,10 @@
-- The following features have been enabled:
\* Bar, Bar\.
\* Baz, Baz\.
\* Goo, Goo\.
-- The following features have been disabled:
\* Foo, Foo\.
\* Fez, Fez\.

View File

@ -0,0 +1,12 @@
include(FeatureSummary)
set(WITH_FOO 1)
set(WITH_BAR 0)
add_feature_info(Foo "WITH_FOO;WITH_BAR" "Foo.")
add_feature_info(Bar "WITH_FOO;NOT WITH_BAR" "Bar.")
add_feature_info(Baz "WITH_FOO AND NOT WITH_BAR" "Baz.")
add_feature_info(Goo "WITH_FOO OR WITH_BAR" "Goo.")
add_feature_info(Fez "NOT WITH_FOO OR WITH_BAR" "Fez.")
feature_summary(WHAT ALL)

View File

@ -0,0 +1,16 @@
The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
Because everyone needs some Foo.
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
Because everyone needs some Foo.
Because Foo is better than Bar.
-- Configuring done

View File

@ -0,0 +1,16 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
find_package(Foo)
# Purpose not set
feature_summary(WHAT ALL)
# Purpose set once
set_package_properties(Foo PROPERTIES PURPOSE "Because everyone needs some Foo.")
feature_summary(WHAT ALL)
# Purpose set twice
set_package_properties(Foo PROPERTIES PURPOSE "Because Foo is better than Bar.")
feature_summary(WHAT ALL)

View File

@ -0,0 +1,5 @@
-- Enabled features:
\* Foo, Foo\.
\* Bar, Bar\.
-- Configuring done

View File

@ -0,0 +1,14 @@
include(FeatureSummary)
set(WITH_FOO 1)
set(WITH_BAR 1)
add_feature_info(Foo WITH_FOO "Foo.")
add_feature_info(Bar WITH_BAR "Bar.")
feature_summary(WHAT ENABLED_FEATURES
DESCRIPTION "Enabled features:"
QUIET_ON_EMPTY)
feature_summary(WHAT DISABLED_FEATURES
DESCRIPTION "Disabled features:"
QUIET_ON_EMPTY)

View File

@ -0,0 +1,45 @@
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following RUNTIME packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following RECOMMENDED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following RECOMMENDED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following RECOMMENDED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following REQUIRED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following REQUIRED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following REQUIRED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following REQUIRED packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- Configuring done

View File

@ -0,0 +1,48 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
find_package(Foo)
# Type not set => OPTIONAL
feature_summary(WHAT ALL)
# RUNTIME > not set => RUNTIME
set_package_properties(Foo PROPERTIES TYPE RUNTIME)
feature_summary(WHAT ALL)
# OPTIONAL > RUNTIME => OPTIONAL
set_package_properties(Foo PROPERTIES TYPE OPTIONAL)
feature_summary(WHAT ALL)
# RUNTIME < OPTIONAL => OPTIONAL
set_package_properties(Foo PROPERTIES TYPE OPTIONAL)
feature_summary(WHAT ALL)
# RECOMMENDED > OPTIONAL => RECOMMENDED
set_package_properties(Foo PROPERTIES TYPE RECOMMENDED)
feature_summary(WHAT ALL)
# OPTIONAL < RECOMMENDED => RECOMMENDED
set_package_properties(Foo PROPERTIES TYPE OPTIONAL)
feature_summary(WHAT ALL)
# RUNTIME < RECOMMENDED => RECOMMENDED
set_package_properties(Foo PROPERTIES TYPE RUNTIME)
feature_summary(WHAT ALL)
# REQUIRED > RECOMMENDED => REQUIRED
set_package_properties(Foo PROPERTIES TYPE REQUIRED)
feature_summary(WHAT ALL)
# RECOMMENDED < REQUIRED => REQUIRED
set_package_properties(Foo PROPERTIES TYPE RECOMMENDED)
feature_summary(WHAT ALL)
# OPTIONAL < REQUIRED => REQUIRED
set_package_properties(Foo PROPERTIES TYPE OPTIONAL)
feature_summary(WHAT ALL)
# RUNTIME < REQUIRED => REQUIRED
set_package_properties(Foo PROPERTIES TYPE RUNTIME)
feature_summary(WHAT ALL)

View File

@ -0,0 +1,32 @@
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following OPTIONAL packages have not been found:
\* Bar
\* Baz
-- The following OPTIONAL packages have been found:
\* Foo, The Foo package, <https://foo.example/>
-- The following OPTIONAL packages have not been found:
\* Bar, <https://bar.net/>
\* Baz, A Baz package
-- Warning: Property DESCRIPTION for package Foo already set to "The Foo package", overriding it with "A Foo package"
-- Warning: Property URL already set to "https://foo.example/", overriding it with "https://foo.net/"
-- Warning: Property URL already set to "https://bar.net/", overriding it with "https://bar.example/"
-- Warning: Property DESCRIPTION for package Baz already set to "A Baz package", overriding it with "The Baz package"
-- The following OPTIONAL packages have been found:
\* Foo, A Foo package, <https://foo.net/>
-- The following OPTIONAL packages have not been found:
\* Bar, The Bar package, <https://bar.example/>
\* Baz, The Baz package, <https://baz.example/>
-- Configuring done

View File

@ -0,0 +1,28 @@
include(FeatureSummary)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
find_package(Foo) # URL and DESCRIPTION are set in the FindFoo.cmake file
find_package(Bar) # URL and DESCRIPTION are not set
find_package(Baz) # URL and DESCRIPTION are not set
feature_summary(WHAT ALL)
set_package_properties(Bar PROPERTIES URL "https://bar.net/") # URL and no DESCRIPTION
set_package_properties(Baz PROPERTIES DESCRIPTION "A Baz package") # DESCRIPTION and no URL
feature_summary(WHAT ALL)
# Overwrite with the same value (no warning)
set_package_properties(Foo PROPERTIES URL "https://foo.example/"
DESCRIPTION "The Foo package")
set_package_properties(Bar PROPERTIES URL "https://bar.net/")
set_package_properties(Baz PROPERTIES DESCRIPTION "A Baz package")
# Overwrite with different values (warnings)
set_package_properties(Foo PROPERTIES URL "https://foo.net/"
DESCRIPTION "A Foo package") # Overwrite URL and DESCRIPTION
set_package_properties(Bar PROPERTIES URL "https://bar.example/"
DESCRIPTION "The Bar package") # Overwrite URL and add DESCRIPTION
set_package_properties(Baz PROPERTIES URL "https://baz.example/"
DESCRIPTION "The Baz package") # Overwrite URL and add DESCRIPTION
feature_summary(WHAT ALL)

View File

@ -1,7 +1,7 @@
-- The following features have been enabled:
\* Foo , Foo\.
\* Foo, Foo\.
-- The following features have been disabled:
\* Bar , Bar\.
\* Bar, Bar\.

View File

@ -1,7 +1,7 @@
-- The following features have been disabled:
\* Bar , Bar\.
\* Bar, Bar\.
-- The following features have been enabled:
\* Foo , Foo\.
\* Foo, Foo\.

View File

@ -1,4 +1,4 @@
--( )
\* Foo , Foo decscription\.
\* Foo, Foo description\.
+
--

View File

@ -2,7 +2,7 @@ include(FeatureSummary)
set(WITH_FOO 1)
add_feature_info(Foo WITH_FOO "Foo decscription.")
add_feature_info(Foo WITH_FOO "Foo decscription.")
add_feature_info(Foo WITH_FOO "Foo description.")
add_feature_info(Foo WITH_FOO "Foo description.")
feature_summary(WHAT ENABLED_FEATURES)

View File

@ -1 +1 @@
\* Foo , Foo\.
\* Foo, Foo\.

View File

@ -0,0 +1,2 @@
include(FeatureSummary)
set(Bar_FOUND 0)

View File

@ -0,0 +1,2 @@
include(FeatureSummary)
set(Baz_FOUND 0)

View File

@ -0,0 +1,4 @@
include(FeatureSummary)
set_package_properties(Foo PROPERTIES URL "https://foo.example/"
DESCRIPTION "The Foo package")
set(Foo_FOUND 1)

View File

@ -7,3 +7,15 @@ run_cmake(FeatureSummaryWhatList)
run_cmake(FeatureSummaryWhatListUnknown)
run_cmake(FeatureSummaryWhatListAll)
run_cmake(FeatureSummaryWhatOnce)
run_cmake(FeatureSummaryPurpose)
run_cmake(FeatureSummaryURLDescription)
run_cmake(FeatureSummaryTypes)
run_cmake(FeatureSummaryFatalOnMissingRequiredPackages)
run_cmake(FeatureSummaryIncludeQuietPackages)
run_cmake(FeatureSummaryQuietOnEmpty)
run_cmake(FeatureSummaryMultipleDepends)
run_cmake(FeatureSummaryCustomTypes)
run_cmake(FeatureSummaryCustomBadDefault)
run_cmake(FeatureSummaryCustomRequired)
run_cmake(FeatureSummaryCustomRequiredListA)
run_cmake(FeatureSummaryCustomRequiredListB)