From aae13f4c8ea652f437b096b9017bd76ed62fd44d Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Sun, 17 Jul 2011 15:57:50 +0200 Subject: Extend FeatureSummary: add PURPOSE of package and TYPE With the PURPOSE a project can state what the package in question is used for in the project (as opposed to describing what the package does in general). TYPE can be one of OPTIONAL (default) RUNTIME - not needed for building, only at runtime RECOMMENDED - as OPTIONAL, but you should really have it REQUIRED - cmake will fail if one of these is not found This can be set using the new function set_package_properties() Alex --- Modules/FeatureSummary.cmake | 196 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 167 insertions(+), 29 deletions(-) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index f7bfe27..91f4ecb 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -72,6 +72,12 @@ # find_package(LibXml2) # set_package_info(LibXml2 "XML processing library." "http://xmlsoft.org/") # +# SET_PACKAGE_PROPERTIES( PROPERTIES [ [ [] ] ] ) +# +# URL: homepage of the package +# DESCRIPTION: short description of the package itself +# PURPOSE: what is the purpopse of using the package in the current project, always appended +# TYPE: OPTIONAL (default), RECOMMENDED, REQUIRED, RUNTIME # # ADD_FEATURE_INFO( ) # Use this macro to add information about a feature with the given . @@ -141,27 +147,123 @@ FUNCTION(SET_PACKAGE_INFO _name _desc) ENDFUNCTION(SET_PACKAGE_INFO) + +FUNCTION(SET_PACKAGE_PROPERTIES _name _props) + IF(NOT "${_props}" STREQUAL "PROPERTIES") + MESSAGE(FATAL_ERROR "PROPERTIES keyword is missing in SET_PACKAGE_PROPERTIES() call.") + ENDIF() + + SET(options ) # none + SET(oneValueArgs DESCRIPTION URL TYPE PURPOSE ) + SET(multiValueArgs ) # none + + CMAKE_PARSE_ARGUMENTS(_SPP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + IF(_SPP_UNPARSED_ARGUMENTS) + MESSAGE(FATAL_ERROR "Unknown keywords given to SET_PACKAGE_PROPERTIES(): \"${_SPP_UNPARSED_ARGUMENTS}\"") + ENDIF() + + IF(_SPP_DESCRIPTION) + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION) + IF(_info) + MESSAGE(STATUS "Warning: Property DESCRIPTION for package ${_name} already set to \"${_info}\", overriding it with \"${_SPP_DESCRIPTION}\"") + ENDIF() + + SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION "${_SPP_DESCRIPTION}" ) + ENDIF() + + + IF(_SPP_URL) + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_name}_URL) + IF(_info) + MESSAGE(STATUS "Warning: Property URL already set to \"${_info}\", overriding it with \"${_SPP_URL}\"") + ENDIF() + + SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_URL "${_SPP_URL}" ) + ENDIF() + + + # handle the PURPOSE: use APPEND, since there can be multiple purposes for one package inside a project + IF(_SPP_PURPOSE) + SET_PROPERTY(GLOBAL APPEND PROPERTY _CMAKE_${_name}_PURPOSE "${_SPP_PURPOSE}" ) + ENDIF() + + # handle the TYPE + IF(NOT _SPP_TYPE) + SET(_SPP_TYPE OPTIONAL) + ENDIF() + + SET(validTypes OPTIONAL RECOMMENDED REQUIRED RUNTIME ) + 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() + + SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_TYPE "${_SPP_TYPE}" ) + +ENDFUNCTION(SET_PACKAGE_PROPERTIES) + + + FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var) + + 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() + + IF("${_property}" MATCHES "PACKAGES_FOUND") + SET(_property "PACKAGES_FOUND") + ELSEIF("${_property}" MATCHES "PACKAGES_NOT_FOUND") + SET(_property "PACKAGES_NOT_FOUND") + ENDIF() + + SET(_currentFeatureText "") GET_PROPERTY(_EnabledFeatures GLOBAL PROPERTY ${_property}) + FOREACH(_currentFeature ${_EnabledFeatures}) - SET(_currentFeatureText "${_currentFeatureText}\n${_currentFeature}") - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_REQUIRED_VERSION) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} (required version ${_info})") - ENDIF(_info) - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_DESCRIPTION) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} , ${_info}") - ENDIF(_info) - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} , <${_info}>") - ENDIF(_info) - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_COMMENT) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} , ${_info}") - ENDIF(_info) + + # 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) + ENDIF() + + IF("${_type}" STREQUAL ANY OR "${_type}" STREQUAL "${_currentType}") + + SET(_currentFeatureText "${_currentFeatureText}\n${_currentFeature}") + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_REQUIRED_VERSION) + IF(_info) + SET(_currentFeatureText "${_currentFeatureText} (required version ${_info})") + ENDIF(_info) + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_DESCRIPTION) + IF(_info) + SET(_currentFeatureText "${_currentFeatureText} , ${_info}") + ENDIF(_info) + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL) + IF(_info) + SET(_currentFeatureText "${_currentFeatureText} , <${_info}>") + ENDIF(_info) + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_COMMENT) + IF(_info) + SET(_currentFeatureText "${_currentFeatureText} , ${_info}") + ENDIF(_info) + + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE) + FOREACH(_purpose ${_info}) + SET(_currentFeatureText "${_currentFeatureText}\n * ${_purpose}") + ENDFOREACH() + + ENDIF("${_type}" STREQUAL ANY OR "${_type}" STREQUAL "${_currentType}") + ENDFOREACH(_currentFeature) SET(${_var} "${_currentFeatureText}" PARENT_SCOPE) ENDFUNCTION(_FS_GET_FEATURE_SUMMARY) @@ -194,21 +296,57 @@ FUNCTION(FEATURE_SUMMARY) MESSAGE(FATAL_ERROR "The call to FEATURE_SUMMAY() doesn't set the required WHAT argument.") ENDIF(NOT _FS_WHAT) - IF( "${_FS_WHAT}" STREQUAL "ENABLED_FEATURES" - OR "${_FS_WHAT}" STREQUAL "DISABLED_FEATURES" - OR "${_FS_WHAT}" STREQUAL "PACKAGES_FOUND" - OR "${_FS_WHAT}" STREQUAL "PACKAGES_NOT_FOUND") + 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") + + LIST(FIND validWhatParts "${_FS_WHAT}" indexInList) + IF(NOT "${indexInList}" STREQUAL "-1") _FS_GET_FEATURE_SUMMARY( ${_FS_WHAT} _featureSummary) SET(_fullText "${_FS_DESCRIPTION}${_featureSummary}\n") ELSEIF("${_FS_WHAT}" STREQUAL "ALL") - _FS_GET_FEATURE_SUMMARY( PACKAGES_FOUND _tmp1) - _FS_GET_FEATURE_SUMMARY( PACKAGES_NOT_FOUND _tmp2) - SET(_featureSummary "${_tmp1}${_tmp2}") - IF(_FS_DESCRIPTION) - SET(_fullText "${_FS_DESCRIPTION}${_tmp1}${_tmp2}\n") - ELSE(_FS_DESCRIPTION) - SET(_fullText "-- Found the following packages:${_tmp1}\n-- Did not find the following packages:${_tmp2}\n") - ENDIF(_FS_DESCRIPTION) + + 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(title_ENABLED_FEATURES "The following features have been enabled:") + SET(title_DISABLED_FEATURES "The following features have been disabled:") + 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:") + + SET(_fullText "${_FS_DESCRIPTION}\n") + FOREACH(part ${allWhatParts}) + SET(_tmp) + _FS_GET_FEATURE_SUMMARY( ${part} _tmp) + IF(_tmp) + SET(_fullText "${_fullText}\n${title_${part}}\n${_tmp}") + ENDIF() + ENDFOREACH() ELSE() MESSAGE(FATAL_ERROR "The WHAT argument of FEATURE_SUMMARY() is set to ${_FS_WHAT}, which is not a valid value.") ENDIF() -- cgit v0.12 From 0671a029205763845e5fd21ce5f69fbe8b0b2c45 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Sun, 17 Jul 2011 16:03:38 +0200 Subject: FeatureSummary.cmake: remove "comment" field What was given as comment to set_package_info(), now goes into the PURPOSE field. It was not clear what the comment should contain, with the PURPOSE this is much clearer now. Alex --- Modules/FeatureSummary.cmake | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index 91f4ecb..a461012 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -60,7 +60,7 @@ # message(STATUS "${enabledFeaturesText}") # # -# SET_PACKAGE_INFO( [ [] ] ) +# SET_PACKAGE_INFO( [ [] ] ) # Use this macro to set up information about the named package, which can # then be displayed via FEATURE_SUMMARY(). # This can be done either directly in the Find-module or in the project @@ -99,8 +99,8 @@ # PRINT_DISABLED_FEATURES() # Does the same as FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:") # -# SET_FEATURE_INFO( [ [] ] ) -# Does the same as SET_PACKAGE_INFO( ) +# SET_FEATURE_INFO( [] ) +# Does the same as SET_PACKAGE_INFO( ) #============================================================================= # Copyright 2007-2009 Kitware, Inc. @@ -136,14 +136,14 @@ ENDFUNCTION(SET_FEATURE_INFO) FUNCTION(SET_PACKAGE_INFO _name _desc) SET(_url "${ARGV2}") - SET(_comment "${ARGV3}") + SET(_purpose "${ARGV3}") SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION "${_desc}" ) IF(_url MATCHES ".+") SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_URL "${_url}" ) - ENDIF(_url MATCHES ".+") - IF(_comment MATCHES ".+") - SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_COMMENT "${_comment}" ) - ENDIF(_comment MATCHES ".+") + ENDIF() + IF(_purpose MATCHES ".+") + SET_PROPERTY(GLOBAL APPEND PROPERTY _CMAKE_${_name}_PURPOSE "${_purpose}" ) + ENDIF() ENDFUNCTION(SET_PACKAGE_INFO) @@ -252,10 +252,6 @@ FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var) IF(_info) SET(_currentFeatureText "${_currentFeatureText} , <${_info}>") ENDIF(_info) - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_COMMENT) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} , ${_info}") - ENDIF(_info) GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE) FOREACH(_purpose ${_info}) -- cgit v0.12 From 91a1527735c8d4f598a1836b1cc8ba128936712e Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Sun, 17 Jul 2011 17:48:00 +0200 Subject: FeatureSummary.cmake: add INCLUDE_QUIET_PACKAGES keyword Now found packages are not stored in ENABLED/DISABLED_FEATURES anymore, but always in PACKAGES_FOUND/NOT_FOUND. ENABLED/DISABLED_FEATURES is now only used via ADD_FEATURE_INFO(), e.g. for stuff set via option(). Alex --- Modules/FeatureSummary.cmake | 64 ++++++++++++++++++++++++----------------- Source/cmFindPackageCommand.cxx | 16 +++++------ 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index a461012..1c74eb6 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -19,6 +19,7 @@ # FEATURE_SUMMARY( [FILENAME ] # [APPEND] # [VAR ] +# [INCLUDE_QUIET_PACKAGES] # [DESCRIPTION "Found packages:"] # WHAT (ALL | PACKAGES_FOUND | PACKAGES_NOT_FOUND # | ENABLED_FEATURES | DISABLED_FEATURES] @@ -32,10 +33,8 @@ # # The WHAT option is the only mandatory option. Here you specify what information # will be printed: -# ENABLED_FEATURES: the list of all features and packages which are enabled, -# excluding the QUIET packages -# DISABLED_FEATURES: the list of all features and packages which are disabled, -# excluding the QUIET packages +# ENABLED_FEATURES: the list of all features which are enabled +# DISABLED_FEATURES: the list of all features which are disabled # PACKAGES_FOUND: the list of all packages which have been found # PACKAGES_NOT_FOUND: the list of all packages which have not been found # ALL: this will give all packages which have or have not been found @@ -206,7 +205,7 @@ ENDFUNCTION(SET_PACKAGE_PROPERTIES) -FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var) +FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet) SET(_type "ANY") IF("${_property}" MATCHES "REQUIRED_") @@ -239,24 +238,37 @@ FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var) IF("${_type}" STREQUAL ANY OR "${_type}" STREQUAL "${_currentType}") - SET(_currentFeatureText "${_currentFeatureText}\n${_currentFeature}") - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_REQUIRED_VERSION) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} (required version ${_info})") - ENDIF(_info) - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_DESCRIPTION) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} , ${_info}") - ENDIF(_info) - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL) - IF(_info) - SET(_currentFeatureText "${_currentFeatureText} , <${_info}>") - ENDIF(_info) - - GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE) - FOREACH(_purpose ${_info}) - SET(_currentFeatureText "${_currentFeatureText}\n * ${_purpose}") - ENDFOREACH() + # check whether the current feature/package should be in the output depending on whether it was QUIET or not + SET(includeThisOne TRUE) + IF(NOT _includeQuiet) + GET_PROPERTY(_isQuiet GLOBAL PROPERTY _CMAKE_${_currentFeature}_QUIET) + IF(_isQuiet) + SET(includeThisOne FALSE) + ENDIF() + ENDIF() + + IF(includeThisOne) + + SET(_currentFeatureText "${_currentFeatureText}\n${_currentFeature}") + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_REQUIRED_VERSION) + IF(_info) + SET(_currentFeatureText "${_currentFeatureText} (required version ${_info})") + ENDIF(_info) + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_DESCRIPTION) + IF(_info) + SET(_currentFeatureText "${_currentFeatureText} , ${_info}") + ENDIF(_info) + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL) + IF(_info) + SET(_currentFeatureText "${_currentFeatureText} , <${_info}>") + ENDIF(_info) + + GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE) + FOREACH(_purpose ${_info}) + SET(_currentFeatureText "${_currentFeatureText}\n * ${_purpose}") + ENDFOREACH() + + ENDIF(includeThisOne) ENDIF("${_type}" STREQUAL ANY OR "${_type}" STREQUAL "${_currentType}") @@ -278,7 +290,7 @@ ENDFUNCTION(PRINT_DISABLED_FEATURES) FUNCTION(FEATURE_SUMMARY) # CMAKE_PARSE_ARGUMENTS( args...) - SET(options APPEND) + SET(options APPEND INCLUDE_QUIET_PACKAGES ) SET(oneValueArgs FILENAME VAR DESCRIPTION WHAT) SET(multiValueArgs ) # none @@ -307,7 +319,7 @@ FUNCTION(FEATURE_SUMMARY) LIST(FIND validWhatParts "${_FS_WHAT}" indexInList) IF(NOT "${indexInList}" STREQUAL "-1") - _FS_GET_FEATURE_SUMMARY( ${_FS_WHAT} _featureSummary) + _FS_GET_FEATURE_SUMMARY( ${_FS_WHAT} _featureSummary ${_FS_INCLUDE_QUIET_PACKAGES} ) SET(_fullText "${_FS_DESCRIPTION}${_featureSummary}\n") ELSEIF("${_FS_WHAT}" STREQUAL "ALL") @@ -338,7 +350,7 @@ FUNCTION(FEATURE_SUMMARY) SET(_fullText "${_FS_DESCRIPTION}\n") FOREACH(part ${allWhatParts}) SET(_tmp) - _FS_GET_FEATURE_SUMMARY( ${part} _tmp) + _FS_GET_FEATURE_SUMMARY( ${part} _tmp ${_FS_INCLUDE_QUIET_PACKAGES}) IF(_tmp) SET(_fullText "${_fullText}\n${title_${part}}\n${_tmp}") ENDIF() diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index 5f106bc..5641abc 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -1174,20 +1174,20 @@ void cmFindPackageCommand::AppendSuccessInformation() if ((cmSystemTools::IsOn(result)) || (cmSystemTools::IsOn(upperResult))) { this->AppendToProperty("PACKAGES_FOUND"); - if (!this->Quiet) - { - this->AppendToProperty("ENABLED_FEATURES"); - } } else { this->AppendToProperty("PACKAGES_NOT_FOUND"); - if (!this->Quiet) - { - this->AppendToProperty("DISABLED_FEATURES"); - } } + // Record whether the find was quiet or not, so this can be used + // e.g. in FeatureSummary.cmake + std::string quietInfoPropName = "_CMAKE_"; + quietInfoPropName += this->Name; + quietInfoPropName += "_QUIET"; + this->Makefile->GetCMakeInstance()->SetProperty(quietInfoPropName.c_str(), + this->Quiet ? "TRUE" : "FALSE"); + // set a global property to record the required version of this package std::string versionInfoPropName = "_CMAKE_"; versionInfoPropName += this->Name; -- cgit v0.12 From 02d47abe58b4fa99f34b24cb799084e0f57215bd Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Sun, 17 Jul 2011 20:26:49 +0200 Subject: FeatureSummary.cmake: error out when a REQUIRED package is missing Alex --- Modules/FeatureSummary.cmake | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index 1c74eb6..ff14571 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -240,7 +240,8 @@ FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet) # check whether the current feature/package should be in the output depending on whether it was QUIET or not SET(includeThisOne TRUE) - IF(NOT _includeQuiet) + # 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(_isQuiet GLOBAL PROPERTY _CMAKE_${_currentFeature}_QUIET) IF(_isQuiet) SET(includeThisOne FALSE) @@ -290,7 +291,7 @@ ENDFUNCTION(PRINT_DISABLED_FEATURES) FUNCTION(FEATURE_SUMMARY) # CMAKE_PARSE_ARGUMENTS( args...) - SET(options APPEND INCLUDE_QUIET_PACKAGES ) + SET(options APPEND INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) SET(oneValueArgs FILENAME VAR DESCRIPTION WHAT) SET(multiValueArgs ) # none @@ -321,6 +322,10 @@ FUNCTION(FEATURE_SUMMARY) 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) + ENDIF() + ELSEIF("${_FS_WHAT}" STREQUAL "ALL") SET(allWhatParts "ENABLED_FEATURES" @@ -347,12 +352,15 @@ FUNCTION(FEATURE_SUMMARY) 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:") - SET(_fullText "${_FS_DESCRIPTION}\n") + SET(_fullText "${_FS_DESCRIPTION}") FOREACH(part ${allWhatParts}) SET(_tmp) _FS_GET_FEATURE_SUMMARY( ${part} _tmp ${_FS_INCLUDE_QUIET_PACKAGES}) IF(_tmp) - SET(_fullText "${_fullText}\n${title_${part}}\n${_tmp}") + SET(_fullText "${_fullText}\n\n${title_${part}}\n${_tmp}") + IF("${part}" STREQUAL "REQUIRED_PACKAGES_NOT_FOUND") + SET(requiredPackagesNotFound TRUE) + ENDIF() ENDIF() ENDFOREACH() ELSE() @@ -376,4 +384,8 @@ FUNCTION(FEATURE_SUMMARY) SET(${_FS_VAR} "${_fullText}" PARENT_SCOPE) ENDIF(_FS_VAR) + IF(requiredPackagesNotFound AND _FS_FATAL_ON_MISSING_REQUIRED_PACKAGES) + MESSAGE(FATAL_ERROR "feature_summary() Error: REQUIRED package(s) are missing, aborting CMake run.") + ENDIF() + ENDFUNCTION(FEATURE_SUMMARY) -- cgit v0.12 From f407bb5da29b36ca4edee93ff21ae2a5b8fda960 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Sun, 17 Jul 2011 20:41:09 +0200 Subject: FeatureSummary.cmake: only higher TYPEs can override previous TYPEs This way e.g. a REQUIRED cannot become OPTIONAL, only the other way round Alex --- Modules/FeatureSummary.cmake | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index ff14571..866b300 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -192,14 +192,21 @@ FUNCTION(SET_PACKAGE_PROPERTIES _name _props) SET(_SPP_TYPE OPTIONAL) ENDIF() - SET(validTypes OPTIONAL RECOMMENDED REQUIRED RUNTIME ) + # 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() - SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_TYPE "${_SPP_TYPE}" ) + 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}" ) + ENDIF() ENDFUNCTION(SET_PACKAGE_PROPERTIES) -- cgit v0.12 From f366cf8a86a1e403b5922bb5bfa2488460f49201 Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Sun, 17 Jul 2011 20:47:11 +0200 Subject: FeatureSummary.cmake: cosmetics -move the compat function to the bottom of the file -make all except one endif() empty Alex --- Modules/FeatureSummary.cmake | 73 +++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index 866b300..2419633 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -128,24 +128,6 @@ FUNCTION(ADD_FEATURE_INFO _name _enabled _desc) ENDFUNCTION(ADD_FEATURE_INFO) -FUNCTION(SET_FEATURE_INFO) - SET_PACKAGE_INFO(${ARGN}) -ENDFUNCTION(SET_FEATURE_INFO) - - -FUNCTION(SET_PACKAGE_INFO _name _desc) - SET(_url "${ARGV2}") - SET(_purpose "${ARGV3}") - SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION "${_desc}" ) - IF(_url MATCHES ".+") - SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_URL "${_url}" ) - ENDIF() - IF(_purpose MATCHES ".+") - SET_PROPERTY(GLOBAL APPEND PROPERTY _CMAKE_${_name}_PURPOSE "${_purpose}" ) - ENDIF() -ENDFUNCTION(SET_PACKAGE_INFO) - - FUNCTION(SET_PACKAGE_PROPERTIES _name _props) IF(NOT "${_props}" STREQUAL "PROPERTIES") @@ -285,16 +267,6 @@ FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet) ENDFUNCTION(_FS_GET_FEATURE_SUMMARY) -FUNCTION(PRINT_ENABLED_FEATURES) - FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:") -ENDFUNCTION(PRINT_ENABLED_FEATURES) - - -FUNCTION(PRINT_DISABLED_FEATURES) - FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:") -ENDFUNCTION(PRINT_DISABLED_FEATURES) - - FUNCTION(FEATURE_SUMMARY) # CMAKE_PARSE_ARGUMENTS( args...) @@ -306,11 +278,11 @@ FUNCTION(FEATURE_SUMMARY) IF(_FS_UNPARSED_ARGUMENTS) MESSAGE(FATAL_ERROR "Unknown keywords given to FEATURE_SUMMARY(): \"${_FS_UNPARSED_ARGUMENTS}\"") - ENDIF(_FS_UNPARSED_ARGUMENTS) + ENDIF() IF(NOT _FS_WHAT) MESSAGE(FATAL_ERROR "The call to FEATURE_SUMMAY() doesn't set the required WHAT argument.") - ENDIF(NOT _FS_WHAT) + ENDIF() SET(validWhatParts "ENABLED_FEATURES" "DISABLED_FEATURES" @@ -379,20 +351,53 @@ FUNCTION(FEATURE_SUMMARY) FILE(APPEND "${_FS_FILENAME}" "${_fullText}") ELSE(_FS_APPEND) FILE(WRITE "${_FS_FILENAME}" "${_fullText}") - ENDIF(_FS_APPEND) + ENDIF() ELSE(_FS_FILENAME) IF(NOT _FS_VAR) MESSAGE(STATUS "${_fullText}") - ENDIF(NOT _FS_VAR) - ENDIF(_FS_FILENAME) + ENDIF() + ENDIF() IF(_FS_VAR) SET(${_FS_VAR} "${_fullText}" PARENT_SCOPE) - ENDIF(_FS_VAR) + 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() ENDFUNCTION(FEATURE_SUMMARY) + + +# The stuff below is only kept for compatibility + +FUNCTION(SET_PACKAGE_INFO _name _desc) + SET(_url "${ARGV2}") + SET(_purpose "${ARGV3}") + SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION "${_desc}" ) + IF(_url MATCHES ".+") + SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_URL "${_url}" ) + ENDIF() + IF(_purpose MATCHES ".+") + SET_PROPERTY(GLOBAL APPEND PROPERTY _CMAKE_${_name}_PURPOSE "${_purpose}" ) + ENDIF() +ENDFUNCTION(SET_PACKAGE_INFO) + + + +FUNCTION(SET_FEATURE_INFO) + SET_PACKAGE_INFO(${ARGN}) +ENDFUNCTION(SET_FEATURE_INFO) + + + +FUNCTION(PRINT_ENABLED_FEATURES) + FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:") +ENDFUNCTION(PRINT_ENABLED_FEATURES) + + + +FUNCTION(PRINT_DISABLED_FEATURES) + FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:") +ENDFUNCTION(PRINT_DISABLED_FEATURES) -- cgit v0.12 From b62349cc60d71eb2af5648eb6867678d5b05273b Mon Sep 17 00:00:00 2001 From: Alex Neundorf Date: Sun, 17 Jul 2011 21:23:13 +0200 Subject: FeatureSummary.cmake: update documentation Alex --- Modules/FeatureSummary.cmake | 99 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 81 insertions(+), 18 deletions(-) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index 2419633..570fb7b 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -1,18 +1,22 @@ # - Macros for generating a summary of enabled/disabled features # -# This module provides the macros feature_summary(), set_package_info() and +# This module provides the macros feature_summary(), set_package_properties() and # add_feature_info(). -# For compatiblity it also still provides set_feature_info(), -# print_enabled_features() and print_disabled_features. +# For compatiblity it also still provides set_package_info(), set_feature_info(), +# print_enabled_features() and print_disabled_features(). # # These macros can be used to generate a summary of enabled and disabled # packages and/or feature for a build tree: # -# -- Enabled features: +# -- The following OPTIONAL packages have been found: # LibXml2 (required version >= 2.4) , XML processing library. , +# * Enables HTML-import in MyWordProcessor +# * Enables odt-export in MyWordProcessor # PNG , A PNG image library. , -# -- Disabled features: +# * Enables saving screenshots +# -- The following OPTIONAL packages have not been found: # Lua51 , The Lua scripting language. , +# * Enables macros in MyWordProcessor # Foo , Foo provides cool stuff. # # @@ -20,24 +24,34 @@ # [APPEND] # [VAR ] # [INCLUDE_QUIET_PACKAGES] +# [FATAL_ON_MISSING_REQUIRED_PACKAGES] # [DESCRIPTION "Found packages:"] # WHAT (ALL | PACKAGES_FOUND | PACKAGES_NOT_FOUND # | ENABLED_FEATURES | DISABLED_FEATURES] # ) # # The FEATURE_SUMMARY() macro can be used to print information about enabled -# or disabled features or packages of a project. +# or disabled packages or features of a project. # By default, only the names of the features/packages will be printed and their -# required version when one was specified. Use SET_FEATURE_INFO() to add more -# useful information, like e.g. a download URL for the respective package. +# required version when one was specified. Use SET_PACKAGE_PROPERTIES() to add more +# useful information, like e.g. a download URL for the respective package or their +# purpose in the project. # # The WHAT option is the only mandatory option. Here you specify what information # will be printed: +# ALL: print everything # ENABLED_FEATURES: the list of all features which are enabled # DISABLED_FEATURES: the list of all features which are disabled # PACKAGES_FOUND: the list of all packages which have been found # PACKAGES_NOT_FOUND: the list of all packages which have not been found -# ALL: this will give all packages which have or 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 # # If a FILENAME is given, the information is printed into this file. If APPEND # is used, it is appended to this file, otherwise the file is overwritten if @@ -47,19 +61,29 @@ # If FILENAME is not used, the information is printed to the terminal. # Using the DESCRIPTION option a description or headline can be set which will # be printed above the actual content. +# If INCLUDE_QUIET_PACKAGES is given, 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. # # Example 1, append everything to a file: # feature_summary(WHAT ALL # FILENAME ${CMAKE_BINARY_DIR}/all.log APPEND) # -# Example 2, print the enabled features into the variable enabledFeaturesText: +# Example 2, print the enabled features into the variable enabledFeaturesText, including QUIET packages: # feature_summary(WHAT ENABLED_FEATURES +# INCLUDE_QUIET_PACKAGES # DESCRIPTION "Enabled Features:" # VAR enabledFeaturesText) # message(STATUS "${enabledFeaturesText}") # # -# SET_PACKAGE_INFO( [ [] ] ) +# SET_PACKAGE_PROPERTIES( PROPERTIES [ URL ] +# [ DESCRIPTION ] +# [ TYPE (RUNTIME|OPTIONAL|RECOMMENDED|REQUIRED) ] +# [ PURPOSE ] +# ) +# # Use this macro to set up information about the named package, which can # then be displayed via FEATURE_SUMMARY(). # This can be done either directly in the Find-module or in the project @@ -67,16 +91,47 @@ # The features for which information can be set are added automatically by the # find_package() command. # +# URL: this should be the homepage of the package, or something similar. Ideally this is set +# already directly in the Find-module. +# +# DESCRIPTION: A short description what that package is, at most one sentence. +# Ideally this is set already directly in the Find-module. +# +# TYPE: What type of dependency has the using project on that package. Default is OPTIONAL. +# In this case it is a package which can be used by the project when available at buildtime, +# but it also work without. RECOMMENDED is similar to OPTIONAL, i.e. the project will build +# if the package is not present, but the functionality of the resulting binaries will be severly +# limited. If a REQUIRED package is not available at buildtime, the project may not even build. This +# can be combined with the FATAL_ON_MISSING_REQUIRED_PACKAGES argument for feature_summary(). +# Last, a RUNTIME package is a package which is actually not used at all during the build, but +# which is required for actually running the resulting binaries. So if such a package is missing, +# the project can still be built, but it may not work later on. If set_package_properties() is called +# multiple times for the same package with different TYPEs, the TYPE is only changed to higher +# 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. +# +# PURPOSE: This describes which features this package enables in the project, i.e. it tells the user +# what functionality he gets in the resulting binaries. +# If set_package_properties() is called multiple times for a package, all PURPOSE properties are appended +# to a list of purposes of the package in the project. +# As the TYPE property, also the PURPOSE property +# is project-specific, so it cannot be set by the Find-module, but must be set in the project. +# +# # Example for setting the info for a package: # find_package(LibXml2) -# set_package_info(LibXml2 "XML processing library." "http://xmlsoft.org/") +# set_package_properties(LibXml2 PROPERTIES DESCRIPTION "A XML processing library." +# URL "http://xmlsoft.org/") # -# SET_PACKAGE_PROPERTIES( PROPERTIES [ [ [] ] ] ) +# set_package_properties(LibXml2 PROPERTIES TYPE RECOMMENDED +# PURPOSE "Enables HTML-import in MyWordProcessor") +# ... +# set_package_properties(LibXml2 PROPERTIES TYPE OPTIONAL +# PURPOSE "Enables odt-export in MyWordProcessor") # -# URL: homepage of the package -# DESCRIPTION: short description of the package itself -# PURPOSE: what is the purpopse of using the package in the current project, always appended -# TYPE: OPTIONAL (default), RECOMMENDED, REQUIRED, RUNTIME +# find_package(DBUS) +# set_package_properties(LibXml2 PROPERTIES TYPE RUNTIME +# PURPOSE "Necessary to disable the screensaver during a presentation" ) # # ADD_FEATURE_INFO( ) # Use this macro to add information about a feature with the given . @@ -92,6 +147,14 @@ # # The following macros are provided for compatibility with previous CMake versions: # +# SET_PACKAGE_INFO( [ [] ] ) +# Use this macro to set up information about the named package, which can +# then be displayed via FEATURE_SUMMARY(). +# This can be done either directly in the Find-module or in the project +# which uses the module after the FIND_PACKAGE() call. +# The features for which information can be set are added automatically by the +# find_package() command. +# # PRINT_ENABLED_FEATURES() # Does the same as FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:") # @@ -336,7 +399,7 @@ FUNCTION(FEATURE_SUMMARY) SET(_tmp) _FS_GET_FEATURE_SUMMARY( ${part} _tmp ${_FS_INCLUDE_QUIET_PACKAGES}) IF(_tmp) - SET(_fullText "${_fullText}\n\n${title_${part}}\n${_tmp}") + SET(_fullText "${_fullText}\n\n-- ${title_${part}}\n${_tmp}") IF("${part}" STREQUAL "REQUIRED_PACKAGES_NOT_FOUND") SET(requiredPackagesNotFound TRUE) ENDIF() -- cgit v0.12