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:
parent
d5e3e04a23
commit
33338781db
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue