Log the required package version and major improvement to FeatureSummary

find_package() now also stores the required version automatically, so it
can be used by FeatureSummary.cmake.
This was one of the requested features for setting up nightly builds
for KDE, since with this functionality it will be possible to write
a file at the end of each project which lists all required packages
and their versions. This file could then be compared for equality
with an older one and if something has changed the build maintainer
can be emailed.

In FeatureSummary.cmake there is now a new function feature_summary(),
which also allows to print the log to a file or into a variable.
It also allows to specify whether to append to a file or to write a new
one, and what information to log.

Docs are still missing.

Alex
This commit is contained in:
Alex Neundorf 2010-08-24 21:24:54 +02:00
parent d5e3e04a23
commit 33338781db
2 changed files with 91 additions and 14 deletions

View File

@ -9,13 +9,13 @@
#
# PRINT_DISABLED_FEATURES()
# Same as PRINT_ENABLED_FEATURES(), but for disabled features. It can
# be extended the same way by adding to the global property
# be extended the same way by adding to the global property
# DISABLED_FEATURES.
#
# SET_FEATURE_INFO(NAME DESCRIPTION [URL [COMMENT] ] )
# Use this macro to set up information about the named feature, which will
# then be displayed by PRINT_ENABLED/DISABLED_FEATURES().
# Example: SET_FEATURE_INFO(LibXml2 "XML processing library."
# Example: SET_FEATURE_INFO(LibXml2 "XML processing library."
# "http://xmlsoft.org/")
#
@ -32,47 +32,110 @@
# (To distribute this file outside of CMake, substitute the full
# License text for the above reference.)
INCLUDE(CMakeParseArguments)
FUNCTION(SET_FEATURE_INFO _name _desc)
SET(_url "${ARGV2}")
SET(_comment "${ARGV3}")
SET_PROPERTY(GLOBAL PROPERTY ${_name}_DESCRIPTION "${_desc}" )
SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_DESCRIPTION "${_desc}" )
IF(_url MATCHES ".+")
SET_PROPERTY(GLOBAL PROPERTY ${_name}_URL "${_url}" )
SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_URL "${_url}" )
ENDIF(_url MATCHES ".+")
IF(_comment MATCHES ".+")
SET_PROPERTY(GLOBAL PROPERTY ${_name}_COMMENT "${_comment}" )
SET_PROPERTY(GLOBAL PROPERTY _CMAKE_${_name}_COMMENT "${_comment}" )
ENDIF(_comment MATCHES ".+")
ENDFUNCTION(SET_FEATURE_INFO)
FUNCTION(_PRINT_FEATURES _property _text)
SET(_currentFeatureText "${_text}")
FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var)
SET(_currentFeatureText "")
GET_PROPERTY(_EnabledFeatures GLOBAL PROPERTY ${_property})
FOREACH(_currentFeature ${_EnabledFeatures})
SET(_currentFeatureText "${_currentFeatureText}\n${_currentFeature}")
GET_PROPERTY(_info GLOBAL PROPERTY ${_currentFeature}_DESCRIPTION)
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 ${_currentFeature}_URL)
GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_URL)
IF(_info)
SET(_currentFeatureText "${_currentFeatureText} , <${_info}>")
ENDIF(_info)
GET_PROPERTY(_info GLOBAL PROPERTY ${_currentFeature}_COMMENT)
GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_COMMENT)
IF(_info)
SET(_currentFeatureText "${_currentFeatureText} , ${_info}")
ENDIF(_info)
ENDFOREACH(_currentFeature)
MESSAGE(STATUS "${_currentFeatureText}\n")
ENDFUNCTION(_PRINT_FEATURES)
SET(${_var} "${_currentFeatureText}" PARENT_SCOPE)
ENDFUNCTION(_FS_GET_FEATURE_SUMMARY)
FUNCTION(PRINT_ENABLED_FEATURES)
_PRINT_FEATURES( ENABLED_FEATURES "Enabled features:")
FEATURE_SUMMARY(WHAT ENABLED_FEATURES DESCRIPTION "Enabled features:")
ENDFUNCTION(PRINT_ENABLED_FEATURES)
FUNCTION(PRINT_DISABLED_FEATURES)
_PRINT_FEATURES( DISABLED_FEATURES "Disabled features:")
FEATURE_SUMMARY(WHAT DISABLED_FEATURES DESCRIPTION "Disabled features:")
ENDFUNCTION(PRINT_DISABLED_FEATURES)
# feature_summary(FILENAME foo.log
# APPEND TRUE
# VAR <variable_name>
# DESCRIPTION "Found packages:"
# WHAT [ALL PACKAGES_FOUND PACKAGES_NOT_FOUND ENABLED_FEATURES DISABLED_FEATURES]
# )
FUNCTION(FEATURE_SUMMARY)
# CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords> <multi_value_keywords> args...)
SET(options APPEND)
SET(oneValueArgs FILENAME VAR DESCRIPTION WHAT)
SET(multiValueArgs ) # none
CMAKE_PARSE_ARGUMENTS(_FS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN})
IF(_FS_UNPARSED_ARGUMENTS)
MESSAGE(FATAL_ERROR "Unknown keywords given to FEATURE_SUMMARY(): \"${_FS_UNPARSED_ARGUMENTS}\"")
ENDIF(_FS_UNPARSED_ARGUMENTS)
IF(NOT _FS_WHAT)
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")
_FS_GET_FEATURE_SUMMARY( ${_FS_WHAT} _featureSummary)
ELSEIF("${_FS_WHAT}" STREQUAL "ALL")
_FS_GET_FEATURE_SUMMARY( PACKAGES_FOUND _tmp1)
_FS_GET_FEATURE_SUMMARY( PACKAGES_NOT_FOUND _tmp2)
SET(_featureSummary "${_tmp1}${_tmp2}")
ELSE()
MESSAGE(FATAL_ERROR "The WHAT argument of FEATURE_SUMMARY() is set to ${_FS_WHAT}, which is not a valid value.")
ENDIF()
SET(_fullText "${_FS_DESCRIPTION}${_featureSummary}\n")
IF(_FS_FILENAME)
IF(_FS_APPEND)
FILE(WRITE "${_FS_FILENAME}" "${_fullText}")
ELSE(_FS_APPEND)
FILE(APPEND "${_FS_FILENAME}" "${_fullText}")
ENDIF(_FS_APPEND)
ELSE(_FS_FILENAME)
IF(NOT _FS_VAR)
MESSAGE(STATUS "${_fullText}")
ENDIF(NOT _FS_VAR)
ENDIF(_FS_FILENAME)
IF(_FS_VAR)
SET(${_FS_VAR} "${_fullText}" PARENT_SCOPE)
ENDIF(_FS_VAR)
ENDFUNCTION(FEATURE_SUMMARY)

View File

@ -1083,6 +1083,20 @@ void cmFindPackageCommand::AppendSuccessInformation()
}
}
// set a global property to record the required version of this package
std::string versionInfoPropName = "_CMAKE_";
versionInfoPropName += this->Name;
versionInfoPropName += "_REQUIRED_VERSION";
std::string versionInfo;
if(!this->Version.empty())
{
versionInfo = this->VersionExact ? "==" : ">=";
versionInfo += " ";
versionInfo += this->Version;
}
this->Makefile->GetCMakeInstance()->SetProperty(versionInfoPropName.c_str(),
versionInfo.c_str());
// Restore original state of "_FIND_" variables we set.
this->RestoreFindDefinitions();
}