summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/FeatureSummary.cmake64
-rw-r--r--Source/cmFindPackageCommand.cxx68
-rw-r--r--Source/cmake.cxx26
3 files changed, 158 insertions, 0 deletions
diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake
new file mode 100644
index 0000000..40d6d7f
--- /dev/null
+++ b/Modules/FeatureSummary.cmake
@@ -0,0 +1,64 @@
+# - Macros for generating a summary of enabled/disabled features
+#
+# PRINT_ENABLED_FEATURES()
+# Print a summary of all enabled features. By default all successfull
+# FIND_PACKAGE() calls will appear here, except the ones which used the QUIET keyword.
+# Additional features can be added by appending an entry to the global ENABLED_FEATURES
+# property. If SET_FEATURE_INFO() is used for that feature, the output will be much
+# more informative.
+#
+# 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 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." "http://xmlsoft.org/")
+#
+
+
+MACRO(SET_FEATURE_INFO _name _desc)
+ SET(_url "${ARGV2}")
+ SET(_comment "${ARGV3}")
+ SET_PROPERTIES(GLOBAL PROPERTIES ${_name}_DESCRIPTION "${_desc}" )
+ IF(_url MATCHES ".+")
+ SET_PROPERTIES(GLOBAL PROPERTIES ${_name}_URL "${_url}" )
+ ENDIF(_url MATCHES ".+")
+ IF(_comment MATCHES ".+")
+ SET_PROPERTIES(GLOBAL PROPERTIES ${_name}_COMMENT "${_comment}" )
+ ENDIF(_comment MATCHES ".+")
+ENDMACRO(SET_FEATURE_INFO)
+
+
+MACRO(_PRINT_FEATURES _property _text)
+ SET(_currentFeatureText "${_text}")
+ GET_PROPERTY(_EnabledFeatures GLOBAL ${_property})
+ FOREACH(_currentFeature ${_EnabledFeatures})
+ SET(_currentFeatureText "${_currentFeatureText}\n${_currentFeature}")
+ GET_PROPERTY(_info GLOBAL ${_currentFeature}_DESCRIPTION)
+ IF(_info)
+ SET(_currentFeatureText "${_currentFeatureText} , ${_info}")
+ ENDIF(_info)
+ GET_PROPERTY(_info GLOBAL ${_currentFeature}_URL)
+ IF(_info)
+ SET(_currentFeatureText "${_currentFeatureText} , <${_info}>")
+ ENDIF(_info)
+ GET_PROPERTY(_info GLOBAL ${_currentFeature}_COMMENT)
+ IF(_info)
+ SET(_currentFeatureText "${_currentFeatureText} , ${_info}")
+ ENDIF(_info)
+ ENDFOREACH(_currentFeature)
+ MESSAGE(STATUS "${_currentFeatureText}\n")
+ENDMACRO(_PRINT_FEATURES)
+
+
+MACRO(PRINT_ENABLED_FEATURES)
+ _PRINT_FEATURES( ENABLED_FEATURES "Enabled features:")
+ENDMACRO(PRINT_ENABLED_FEATURES)
+
+
+MACRO(PRINT_DISABLED_FEATURES)
+ _PRINT_FEATURES( DISABLED_FEATURES "Disabled features:")
+ENDMACRO(PRINT_DISABLED_FEATURES)
+
diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx
index 518d3a9..364b64c 100644
--- a/Source/cmFindPackageCommand.cxx
+++ b/Source/cmFindPackageCommand.cxx
@@ -124,10 +124,12 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
bool foundModule = false;
if(!this->FindModule(foundModule, quiet, required))
{
+ this->AppendSuccessInformation(quiet);
return false;
}
if(foundModule)
{
+ this->AppendSuccessInformation(quiet);
return true;
}
}
@@ -172,6 +174,7 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
{
if(!this->FindConfig())
{
+ this->AppendSuccessInformation(quiet);
return false;
}
}
@@ -272,6 +275,7 @@ bool cmFindPackageCommand::InitialPass(std::vector<std::string> const& args)
}
#endif
+ this->AppendSuccessInformation(quiet);
return result;
}
@@ -435,3 +439,67 @@ bool cmFindPackageCommand::ReadListFile(const char* f)
this->SetError(e.c_str());
return false;
}
+
+//----------------------------------------------------------------------------
+void cmFindPackageCommand::AppendToProperty(const char* propertyName)
+{
+ std::string propertyValue;
+ const char *prop =
+ this->Makefile->GetCMakeInstance()->GetProperty(propertyName);
+ if (prop && *prop)
+ {
+ propertyValue = prop;
+
+ std::vector<std::string> contents;
+ cmSystemTools::ExpandListArgument(propertyValue, contents, false);
+
+ bool alreadyInserted = false;
+ for(std::vector<std::string>::const_iterator it = contents.begin();
+ it != contents.end(); ++ it )
+ {
+ if (*it == this->Name)
+ {
+ alreadyInserted = true;
+ break;
+ }
+ }
+ if (!alreadyInserted)
+ {
+ propertyValue += ";";
+ propertyValue += this->Name;
+ }
+ }
+ else
+ {
+ propertyValue = this->Name;
+ }
+ this->Makefile->GetCMakeInstance()->SetProperty(propertyName,
+ propertyValue.c_str());
+ }
+
+//----------------------------------------------------------------------------
+void cmFindPackageCommand::AppendSuccessInformation(bool quiet)
+{
+ std::string found = this->Name;
+ found += "_FOUND";
+ std::string upperFound = cmSystemTools::UpperCase(found);
+
+ const char* upperResult = this->Makefile->GetDefinition(upperFound.c_str());
+ const char* result = this->Makefile->GetDefinition(found.c_str());
+ if ((cmSystemTools::IsOn(result)) || (cmSystemTools::IsOn(upperResult)))
+ {
+ this->AppendToProperty("PACKAGES_FOUND");
+ if (!quiet)
+ {
+ this->AppendToProperty("ENABLED_FEATURES");
+ }
+ }
+ else
+ {
+ this->AppendToProperty("PACKAGES_NOT_FOUND");
+ if (!quiet)
+ {
+ this->AppendToProperty("DISABLED_FEATURES");
+ }
+ }
+}
diff --git a/Source/cmake.cxx b/Source/cmake.cxx
index 17b04e1..8e7179e 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -3044,6 +3044,32 @@ void cmake::DefineProperties(cmake *cm)
"FIND_LIBRARY command should automatically search the lib64 variant of "
"directories called lib in the search path when building 64-bit "
"binaries.");
+ cm->DefineProperty
+ ("ENABLED_FEATURES", cmProperty::GLOBAL,
+ "List of features which are enabled during the CMake run.",
+ "List of features which are enabled during the CMake run. Be default "
+ "it contains the names of all packages which were found. This is "
+ "determined using the <NAME>_FOUND variables. Packages which are "
+ "searched QUIET are not listed. A project can add its own features to "
+ "this list.This property is used by the macros in FeatureSummary.cmake.");
+ cm->DefineProperty
+ ("DISABLED_FEATURES", cmProperty::GLOBAL,
+ "List of features which are disabled during the CMake run.",
+ "List of features which are disabled during the CMake run. Be default "
+ "it contains the names of all packages which were not found. This is "
+ "determined using the <NAME>_FOUND variables. Packages which are "
+ "searched QUIET are not listed. A project can add its own features to "
+ "this list.This property is used by the macros in FeatureSummary.cmake.");
+ cm->DefineProperty
+ ("PACKAGES_FOUND", cmProperty::GLOBAL,
+ "List of packages which were found during the CMake run.",
+ "List of packages which were found during the CMake run. Whether a "
+ "package has been found is determined using the <NAME>_FOUND variables.");
+ cm->DefineProperty
+ ("PACKAGES_NOT_FOUND", cmProperty::GLOBAL,
+ "List of packages which were not found during the CMake run.",
+ "List of packages which were not found during the CMake run. Whether a "
+ "package has been found is determined using the <NAME>_FOUND variables.");
}