Răsfoiți Sursa

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
Brad King 8 ani în urmă
părinte
comite
8df12fc9d4
44 a modificat fișierele cu 769 adăugiri și 109 ștergeri
  1. 22 0
      Help/release/dev/FeatureSummary_enhancement.rst
  2. 229 101
      Modules/FeatureSummary.cmake
  3. 1 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomBadDefault-result.txt
  4. 9 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomBadDefault-stderr.txt
  5. 8 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomBadDefault.cmake
  6. 1 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired-result.txt
  7. 6 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired-stderr.txt
  8. 17 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired-stdout.txt
  9. 16 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired.cmake
  10. 1 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA-result.txt
  11. 6 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA-stderr.txt
  12. 17 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA-stdout.txt
  13. 16 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA.cmake
  14. 1 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB-result.txt
  15. 6 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB-stderr.txt
  16. 17 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB-stdout.txt
  17. 16 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB.cmake
  18. 29 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomTypes-stdout.txt
  19. 36 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryCustomTypes.cmake
  20. 1 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages-result.txt
  21. 6 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages-stderr.txt
  22. 17 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages-stdout.txt
  23. 12 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages.cmake
  24. 14 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryIncludeQuietPackages-stdout.txt
  25. 11 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryIncludeQuietPackages.cmake
  26. 10 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryMultipleDepends-stdout.txt
  27. 12 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryMultipleDepends.cmake
  28. 16 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryPurpose-stdout.txt
  29. 16 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryPurpose.cmake
  30. 5 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryQuietOnEmpty-stdout.txt
  31. 14 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryQuietOnEmpty.cmake
  32. 45 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryTypes-stdout.txt
  33. 48 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryTypes.cmake
  34. 32 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryURLDescription-stdout.txt
  35. 28 0
      Tests/RunCMake/FeatureSummary/FeatureSummaryURLDescription.cmake
  36. 2 2
      Tests/RunCMake/FeatureSummary/FeatureSummaryWhatAll-stdout.txt
  37. 2 2
      Tests/RunCMake/FeatureSummary/FeatureSummaryWhatList-stdout.txt
  38. 1 1
      Tests/RunCMake/FeatureSummary/FeatureSummaryWhatOnce-stdout.txt
  39. 2 2
      Tests/RunCMake/FeatureSummary/FeatureSummaryWhatOnce.cmake
  40. 1 1
      Tests/RunCMake/FeatureSummary/FeatureSummaryWhatSingle-stdout.txt
  41. 2 0
      Tests/RunCMake/FeatureSummary/FindBar.cmake
  42. 2 0
      Tests/RunCMake/FeatureSummary/FindBaz.cmake
  43. 4 0
      Tests/RunCMake/FeatureSummary/FindFoo.cmake
  44. 12 0
      Tests/RunCMake/FeatureSummary/RunCMakeTest.cmake

+ 22 - 0
Help/release/dev/FeatureSummary_enhancement.rst

@@ -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.

+ 229 - 101
Modules/FeatureSummary.cmake

@@ -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>
     LibXml2 (required version >= 2.4), XML processing lib, <http://xmlsoft.org>
        * Enables HTML-import in MyWordProcessor
        * Enables HTML-import in MyWordProcessor
        * Enables odt-export 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
        * Enables saving screenshots
     -- The following OPTIONAL packages have not been found:
     -- 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
        * 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
 Functions
 ^^^^^^^^^
 ^^^^^^^^^
 
 
 #]=======================================================================]
 #]=======================================================================]
 
 
+include(CMakeParseArguments)
+
 function(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet)
 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")
   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")
   if("${_property}" MATCHES "PACKAGES_FOUND")
     set(_property "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 ?
     # does this package belong to the type we currently want to list ?
     get_property(_currentType  GLOBAL PROPERTY _CMAKE_${_currentFeature}_TYPE)
     get_property(_currentType  GLOBAL PROPERTY _CMAKE_${_currentFeature}_TYPE)
     if(NOT _currentType)
     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()
     endif()
 
 
     if("${_type}" STREQUAL ANY  OR  "${_type}" STREQUAL "${_currentType}")
     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
       # check whether the current feature/package should be in the output depending on whether it was QUIET or not
       set(includeThisOne TRUE)
       set(includeThisOne TRUE)
+      set(_required FALSE)
       # skip QUIET packages, except if they are REQUIRED or INCLUDE_QUIET_PACKAGES has been set
       # 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)
         get_property(_isQuiet  GLOBAL PROPERTY _CMAKE_${_currentFeature}_QUIET)
         if(_isQuiet)
         if(_isQuiet)
           set(includeThisOne FALSE)
           set(includeThisOne FALSE)
@@ -87,11 +165,11 @@ function(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet)
         endif()
         endif()
         get_property(_info  GLOBAL PROPERTY _CMAKE_${_currentFeature}_DESCRIPTION)
         get_property(_info  GLOBAL PROPERTY _CMAKE_${_currentFeature}_DESCRIPTION)
         if(_info)
         if(_info)
-          string(APPEND _currentFeatureText " , ${_info}")
+          string(APPEND _currentFeatureText ", ${_info}")
         endif()
         endif()
         get_property(_info  GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL)
         get_property(_info  GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL)
         if(_info)
         if(_info)
-          string(APPEND _currentFeatureText " , <${_info}>")
+          string(APPEND _currentFeatureText ", <${_info}>")
         endif()
         endif()
 
 
         get_property(_info  GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE)
         get_property(_info  GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE)
@@ -119,6 +197,7 @@ endfunction()
                      [INCLUDE_QUIET_PACKAGES]
                      [INCLUDE_QUIET_PACKAGES]
                      [FATAL_ON_MISSING_REQUIRED_PACKAGES]
                      [FATAL_ON_MISSING_REQUIRED_PACKAGES]
                      [DESCRIPTION "Found packages:"]
                      [DESCRIPTION "Found packages:"]
+                     [QUIET_ON_EMPTY]
                      WHAT (ALL | PACKAGES_FOUND | PACKAGES_NOT_FOUND
                      WHAT (ALL | PACKAGES_FOUND | PACKAGES_NOT_FOUND
                           | ENABLED_FEATURES | DISABLED_FEATURES)
                           | ENABLED_FEATURES | DISABLED_FEATURES)
                    )
                    )
@@ -143,22 +222,15 @@ endfunction()
    the list of all packages which have been found
    the list of all packages which have been found
   ``PACKAGES_NOT_FOUND``
   ``PACKAGES_NOT_FOUND``
    the list of all packages which have not been 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
   With the exception of the ``ALL`` value, these values can be combined
   in order to customize the output. For example:
   in order to customize the output. For example:
@@ -177,7 +249,20 @@ endfunction()
   packages which have been searched with ``find_package(... QUIET)`` will
   packages which have been searched with ``find_package(... QUIET)`` will
   also be listed.  By default they are skipped.  If
   also be listed.  By default they are skipped.  If
   ``FATAL_ON_MISSING_REQUIRED_PACKAGES`` is given, CMake will abort if a
   ``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:
   Example 1, append everything to a file:
 
 
@@ -198,11 +283,28 @@ endfunction()
                    DESCRIPTION "Enabled Features:"
                    DESCRIPTION "Enabled Features:"
                    VAR enabledFeaturesText)
                    VAR enabledFeaturesText)
    message(STATUS "${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)
 function(FEATURE_SUMMARY)
 # CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords> <multi_value_keywords> args...)
 # 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(oneValueArgs FILENAME VAR DESCRIPTION)
   set(multiValueArgs WHAT)
   set(multiValueArgs WHAT)
 
 
@@ -219,40 +321,42 @@ function(FEATURE_SUMMARY)
   set(validWhatParts "ENABLED_FEATURES"
   set(validWhatParts "ENABLED_FEATURES"
                      "DISABLED_FEATURES"
                      "DISABLED_FEATURES"
                      "PACKAGES_FOUND"
                      "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)
   list(FIND validWhatParts "${_FS_WHAT}" indexInList)
   if(NOT "${indexInList}" STREQUAL "-1")
   if(NOT "${indexInList}" STREQUAL "-1")
     _FS_GET_FEATURE_SUMMARY( ${_FS_WHAT} _featureSummary ${_FS_INCLUDE_QUIET_PACKAGES} )
     _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()
     endif()
 
 
   else()
   else()
     if("${_FS_WHAT}" STREQUAL "ALL")
     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()
     else()
       set(allWhatParts)
       set(allWhatParts)
       foreach(part ${_FS_WHAT})
       foreach(part ${_FS_WHAT})
@@ -273,45 +377,49 @@ function(FEATURE_SUMMARY)
     set(title_DISABLED_FEATURES              "The following features have been disabled:")
     set(title_DISABLED_FEATURES              "The following features have been disabled:")
     set(title_PACKAGES_FOUND                 "The following packages have been found:")
     set(title_PACKAGES_FOUND                 "The following packages have been found:")
     set(title_PACKAGES_NOT_FOUND             "The following packages have not 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}")
     set(_fullText "${_FS_DESCRIPTION}")
     foreach(part ${allWhatParts})
     foreach(part ${allWhatParts})
       set(_tmp)
       set(_tmp)
       _FS_GET_FEATURE_SUMMARY( ${part} _tmp ${_FS_INCLUDE_QUIET_PACKAGES})
       _FS_GET_FEATURE_SUMMARY( ${part} _tmp ${_FS_INCLUDE_QUIET_PACKAGES})
       if(_tmp)
       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()
         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()
       endif()
     endforeach()
     endforeach()
   endif()
   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()
     else()
-      file(WRITE  "${_FS_FILENAME}" "${_fullText}")
+      if(NOT _FS_VAR)
+        message(STATUS "${_fullText}")
+      endif()
     endif()
     endif()
 
 
-  else()
-    if(NOT _FS_VAR)
-      message(STATUS "${_fullText}")
+    if(_FS_VAR)
+      set(${_FS_VAR} "${_fullText}" PARENT_SCOPE)
     endif()
     endif()
   endif()
   endif()
 
 
-  if(_FS_VAR)
-    set(${_FS_VAR} "${_fullText}" PARENT_SCOPE)
-  endif()
-
   if(requiredPackagesNotFound  AND  _FS_FATAL_ON_MISSING_REQUIRED_PACKAGES)
   if(requiredPackagesNotFound  AND  _FS_FATAL_ON_MISSING_REQUIRED_PACKAGES)
     message(FATAL_ERROR "feature_summary() Error: REQUIRED package(s) are missing, aborting CMake run.")
     message(FATAL_ERROR "feature_summary() Error: REQUIRED package(s) are missing, aborting CMake run.")
   endif()
   endif()
@@ -362,7 +470,8 @@ endfunction()
     TYPEs (``RUNTIME < OPTIONAL < RECOMMENDED < REQUIRED``), lower TYPEs are
     TYPEs (``RUNTIME < OPTIONAL < RECOMMENDED < REQUIRED``), lower TYPEs are
     ignored.  The ``TYPE`` property is project-specific, so it cannot be set
     ignored.  The ``TYPE`` property is project-specific, so it cannot be set
     by the Find-module, but must be set in the project.
     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>``
   ``PURPOSE <purpose>``
     This describes which features this package enables in the
     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}" )
     set_property(GLOBAL APPEND PROPERTY _CMAKE_${_name}_PURPOSE "${_SPP_PURPOSE}" )
   endif()
   endif()
 
 
-  # handle the TYPE
-  if(NOT _SPP_TYPE)
-    set(_SPP_TYPE OPTIONAL)
-  endif()
+  get_property(_fsPkgTypes GLOBAL PROPERTY FeatureSummary_PKG_TYPES)
+  get_property(_fsDefaultPkgType GLOBAL PROPERTY FeatureSummary_DEFAULT_PKG_TYPE)
 
 
-  # 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()
+  # handle the TYPE
+  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()
 
 
-  get_property(_previousType  GLOBAL PROPERTY _CMAKE_${_name}_TYPE)
-  list(FIND validTypes "${_previousType}" _prevTypeIndexInList)
+    get_property(_previousType  GLOBAL PROPERTY _CMAKE_${_name}_TYPE)
+    list(FIND _fsPkgTypes "${_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()
   endif()
 
 
 endfunction()
 endfunction()
@@ -466,7 +578,8 @@ endfunction()
     add_feature_info(<name> <enabled> <description>)
     add_feature_info(<name> <enabled> <description>)
 
 
   Use this macro to add information about a feature with the given ``<name>``.
   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
   ``<description>`` is a text describing the feature.  The information can
   be displayed using ``feature_summary()`` for ``ENABLED_FEATURES`` and
   be displayed using ``feature_summary()`` for ``ENABLED_FEATURES`` and
   ``DISABLED_FEATURES`` respectively.
   ``DISABLED_FEATURES`` respectively.
@@ -478,7 +591,16 @@ endfunction()
      option(WITH_FOO "Help for foo" ON)
      option(WITH_FOO "Help for foo" ON)
      add_feature_info(Foo WITH_FOO "The Foo feature provides very cool stuff.")
      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})
   if (${_enabled})
     set_property(GLOBAL APPEND PROPERTY ENABLED_FEATURES "${_name}")
     set_property(GLOBAL APPEND PROPERTY ENABLED_FEATURES "${_name}")
   else ()
   else ()
@@ -511,6 +633,7 @@ CMake versions:
   can be set are added automatically by the ``find_package()`` command.
   can be set are added automatically by the ``find_package()`` command.
 #]=======================================================================]
 #]=======================================================================]
 function(SET_PACKAGE_INFO _name _desc)
 function(SET_PACKAGE_INFO _name _desc)
+  message(DEPRECATION "SET_PACKAGE_INFO is deprecated. Use SET_PACKAGE_PROPERTIES instead.")
   unset(_url)
   unset(_url)
   unset(_purpose)
   unset(_purpose)
   if(ARGC GREATER 2)
   if(ARGC GREATER 2)
@@ -540,6 +663,7 @@ endfunction()
     set_package_info(<name> <description> <url>)
     set_package_info(<name> <description> <url>)
 #]=======================================================================]
 #]=======================================================================]
 function(SET_FEATURE_INFO)
 function(SET_FEATURE_INFO)
+  message(DEPRECATION "SET_FEATURE_INFO is deprecated. Use ADD_FEATURE_INFO instead.")
   SET_PACKAGE_INFO(${ARGN})
   SET_PACKAGE_INFO(${ARGN})
 endfunction()
 endfunction()
 
 
@@ -557,6 +681,8 @@ endfunction()
     feature_summary(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:")
     feature_summary(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:")
 #]=======================================================================]
 #]=======================================================================]
 function(PRINT_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:")
   FEATURE_SUMMARY(WHAT ENABLED_FEATURES  DESCRIPTION "Enabled features:")
 endfunction()
 endfunction()
 
 
@@ -574,5 +700,7 @@ endfunction()
     feature_summary(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:")
     feature_summary(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:")
 #]=======================================================================]
 #]=======================================================================]
 function(PRINT_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:")
   FEATURE_SUMMARY(WHAT DISABLED_FEATURES  DESCRIPTION "Disabled features:")
 endfunction()
 endfunction()

+ 1 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomBadDefault-result.txt

@@ -0,0 +1 @@
+1

+ 9 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomBadDefault-stderr.txt

@@ -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\)

+ 8 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomBadDefault.cmake

@@ -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)

+ 1 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired-stderr.txt

@@ -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\)

+ 17 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired-stdout.txt

@@ -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!

+ 16 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequired.cmake

@@ -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)

+ 1 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA-stderr.txt

@@ -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\)

+ 17 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA-stdout.txt

@@ -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!

+ 16 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListA.cmake

@@ -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)

+ 1 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB-stderr.txt

@@ -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\)

+ 17 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB-stdout.txt

@@ -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!

+ 16 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomRequiredListB.cmake

@@ -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)

+ 29 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomTypes-stdout.txt

@@ -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

+ 36 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryCustomTypes.cmake

@@ -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)

+ 1 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages-result.txt

@@ -0,0 +1 @@
+1

+ 6 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages-stderr.txt

@@ -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\)

+ 17 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages-stdout.txt

@@ -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!

+ 12 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryFatalOnMissingRequiredPackages.cmake

@@ -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)

+ 14 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryIncludeQuietPackages-stdout.txt

@@ -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

+ 11 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryIncludeQuietPackages.cmake

@@ -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)

+ 10 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryMultipleDepends-stdout.txt

@@ -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\.

+ 12 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryMultipleDepends.cmake

@@ -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)

+ 16 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryPurpose-stdout.txt

@@ -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

+ 16 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryPurpose.cmake

@@ -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)

+ 5 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryQuietOnEmpty-stdout.txt

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

+ 14 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryQuietOnEmpty.cmake

@@ -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)

+ 45 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryTypes-stdout.txt

@@ -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

+ 48 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryTypes.cmake

@@ -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)

+ 32 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryURLDescription-stdout.txt

@@ -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

+ 28 - 0
Tests/RunCMake/FeatureSummary/FeatureSummaryURLDescription.cmake

@@ -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)

+ 2 - 2
Tests/RunCMake/FeatureSummary/FeatureSummaryWhatAll-stdout.txt

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

+ 2 - 2
Tests/RunCMake/FeatureSummary/FeatureSummaryWhatList-stdout.txt

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

+ 1 - 1
Tests/RunCMake/FeatureSummary/FeatureSummaryWhatOnce-stdout.txt

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

+ 2 - 2
Tests/RunCMake/FeatureSummary/FeatureSummaryWhatOnce.cmake

@@ -2,7 +2,7 @@ include(FeatureSummary)
 
 
 set(WITH_FOO 1)
 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)
 feature_summary(WHAT ENABLED_FEATURES)

+ 1 - 1
Tests/RunCMake/FeatureSummary/FeatureSummaryWhatSingle-stdout.txt

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

+ 2 - 0
Tests/RunCMake/FeatureSummary/FindBar.cmake

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

+ 2 - 0
Tests/RunCMake/FeatureSummary/FindBaz.cmake

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

+ 4 - 0
Tests/RunCMake/FeatureSummary/FindFoo.cmake

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

+ 12 - 0
Tests/RunCMake/FeatureSummary/RunCMakeTest.cmake

@@ -7,3 +7,15 @@ run_cmake(FeatureSummaryWhatList)
 run_cmake(FeatureSummaryWhatListUnknown)
 run_cmake(FeatureSummaryWhatListUnknown)
 run_cmake(FeatureSummaryWhatListAll)
 run_cmake(FeatureSummaryWhatListAll)
 run_cmake(FeatureSummaryWhatOnce)
 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)