Commit 277bd1db authored by Brad King's avatar Brad King
Browse files

Drop CMAKE_STRICT mode

With our modern development workflow it is less likely a property will
be added to C++ code without documentation.  This mode only existed to
support the DocTest which had very limited coverage of the properties
anyway.
parent 678aaad1
......@@ -536,10 +536,6 @@ configure_file(
"${CMAKE_CURRENT_BINARY_DIR}/DartLocal.conf"
COPYONLY)
option(CMAKE_STRICT
"Perform strict testing to record property and variable access. Can be used to report any undefined properties or variables" OFF)
mark_as_advanced(CMAKE_STRICT)
if(NOT CMake_VERSION_IS_RELEASE)
if("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU" AND
NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS 4.2)
......
......@@ -16,7 +16,6 @@
#cmakedefine HAVE_ENVIRON_NOT_REQUIRE_PROTOTYPE
#cmakedefine HAVE_UNSETENV
#cmakedefine CMAKE_USE_ELF_PARSER
#cmakedefine CMAKE_STRICT
#define CMAKE_ROOT_DIR "${CMake_SOURCE_DIR}"
#define CMAKE_BUILD_DIR "${CMake_BINARY_DIR}"
#define CMAKE_DATA_DIR "/@CMAKE_DATA_DIR@"
......@@ -1778,14 +1778,6 @@ void cmMakefile::AddDefinition(const char* name, const char* value)
return;
}
#ifdef CMAKE_STRICT
if (this->GetCMakeInstance())
{
this->GetCMakeInstance()->
RecordPropertyAccess(name,cmProperty::VARIABLE);
}
#endif
this->Internal->VarStack.top().Set(name, value);
if (this->Internal->VarUsageStack.size() &&
this->VariableInitialized(name))
......@@ -2448,13 +2440,6 @@ bool cmMakefile::IsDefinitionSet(const char* name) const
const char* cmMakefile::GetDefinition(const char* name) const
{
#ifdef CMAKE_STRICT
if (this->GetCMakeInstance())
{
this->GetCMakeInstance()->
RecordPropertyAccess(name,cmProperty::VARIABLE);
}
#endif
if (this->WarnUnused)
{
this->Internal->VarUsageStack.top().insert(name);
......
......@@ -40,19 +40,7 @@ void cmPropertyMap::SetProperty(const char *name, const char *value,
this->erase(name);
return;
}
#ifdef CMAKE_STRICT
if (!this->CMakeInstance)
{
cmSystemTools::Error("CMakeInstance not set on a property map!");
abort();
}
else
{
this->CMakeInstance->RecordPropertyAccess(name,scope);
}
#else
(void)scope;
#endif
cmProperty *prop = this->GetOrCreateProperty(name);
prop->Set(name,value);
......@@ -66,19 +54,7 @@ void cmPropertyMap::AppendProperty(const char* name, const char* value,
{
return;
}
#ifdef CMAKE_STRICT
if (!this->CMakeInstance)
{
cmSystemTools::Error("CMakeInstance not set on a property map!");
abort();
}
else
{
this->CMakeInstance->RecordPropertyAccess(name,scope);
}
#else
(void)scope;
#endif
cmProperty *prop = this->GetOrCreateProperty(name);
prop->Append(name,value,asString);
......@@ -95,19 +71,6 @@ const char *cmPropertyMap
return 0;
}
// has the property been defined?
#ifdef CMAKE_STRICT
if (!this->CMakeInstance)
{
cmSystemTools::Error("CMakeInstance not set on a property map!");
abort();
}
else
{
this->CMakeInstance->RecordPropertyAccess(name,scope);
}
#endif
cmPropertyMap::const_iterator it = this->find(name);
if (it == this->end())
{
......
......@@ -1865,11 +1865,6 @@ int cmake::Generate()
{
return -1;
}
if (this->GetProperty("REPORT_UNDEFINED_PROPERTIES"))
{
this->ReportUndefinedPropertyAccesses
(this->GetProperty("REPORT_UNDEFINED_PROPERTIES"));
}
// Save the cache again after a successful Generate so that any internal
// variables created during Generate are saved. (Specifically target GUIDs
// for the Visual Studio and Xcode generators.)
......@@ -2646,112 +2641,6 @@ cmPropertyDefinition *cmake
return 0;
}
void cmake::RecordPropertyAccess(const char *name,
cmProperty::ScopeType scope)
{
this->AccessedProperties.insert
(std::pair<cmStdString,cmProperty::ScopeType>(name,scope));
}
void cmake::ReportUndefinedPropertyAccesses(const char *filename)
{
if(!this->GlobalGenerator)
{ return; }
FILE *progFile = fopen(filename,"w");
if(!progFile)
{ return; }
// what are the enabled languages?
std::vector<std::string> enLangs;
this->GlobalGenerator->GetEnabledLanguages(enLangs);
// Common configuration names.
// TODO: Compute current configuration(s).
std::vector<std::string> enConfigs;
enConfigs.push_back("");
enConfigs.push_back("DEBUG");
enConfigs.push_back("RELEASE");
enConfigs.push_back("MINSIZEREL");
enConfigs.push_back("RELWITHDEBINFO");
// take all the defined properties and add definitions for all the enabled
// languages
std::set<std::pair<cmStdString,cmProperty::ScopeType> > aliasedProperties;
std::map<cmProperty::ScopeType, cmPropertyDefinitionMap>::iterator i;
i = this->PropertyDefinitions.begin();
for (;i != this->PropertyDefinitions.end(); ++i)
{
cmPropertyDefinitionMap::iterator j;
for (j = i->second.begin(); j != i->second.end(); ++j)
{
// TODO: What if both <LANG> and <CONFIG> appear?
if (j->first.find("<CONFIG>") != std::string::npos)
{
std::vector<std::string>::const_iterator k;
for (k = enConfigs.begin(); k != enConfigs.end(); ++k)
{
std::string tmp = j->first;
cmSystemTools::ReplaceString(tmp, "<CONFIG>", k->c_str());
// add alias
aliasedProperties.insert
(std::pair<cmStdString,cmProperty::ScopeType>(tmp,i->first));
}
}
if (j->first.find("<LANG>") != std::string::npos)
{
std::vector<std::string>::const_iterator k;
for (k = enLangs.begin(); k != enLangs.end(); ++k)
{
std::string tmp = j->first;
cmSystemTools::ReplaceString(tmp, "<LANG>", k->c_str());
// add alias
aliasedProperties.insert
(std::pair<cmStdString,cmProperty::ScopeType>(tmp,i->first));
}
}
}
}
std::set<std::pair<cmStdString,cmProperty::ScopeType> >::const_iterator ap;
ap = this->AccessedProperties.begin();
for (;ap != this->AccessedProperties.end(); ++ap)
{
if (!this->IsPropertyDefined(ap->first.c_str(),ap->second) &&
aliasedProperties.find(std::pair<cmStdString,cmProperty::ScopeType>
(ap->first,ap->second)) ==
aliasedProperties.end())
{
const char *scopeStr = "";
switch (ap->second)
{
case cmProperty::TARGET:
scopeStr = "TARGET";
break;
case cmProperty::SOURCE_FILE:
scopeStr = "SOURCE_FILE";
break;
case cmProperty::DIRECTORY:
scopeStr = "DIRECTORY";
break;
case cmProperty::TEST:
scopeStr = "TEST";
break;
case cmProperty::VARIABLE:
scopeStr = "VARIABLE";
break;
case cmProperty::CACHED_VARIABLE:
scopeStr = "CACHED_VARIABLE";
break;
default:
scopeStr = "unknown";
break;
}
fprintf(progFile, "%s with scope %s\n", ap->first.c_str(), scopeStr);
}
}
fclose(progFile);
}
bool cmake::IsPropertyDefined(const char *name, cmProperty::ScopeType scope)
{
return this->PropertyDefinitions[scope].IsPropertyDefined(name);
......
......@@ -358,10 +358,6 @@ class cmake
debugging configurations.*/
std::vector<std::string> const& GetDebugConfigs();
// record accesses of properties and variables
void RecordPropertyAccess(const char *name, cmProperty::ScopeType scope);
void ReportUndefinedPropertyAccesses(const char *filename);
// Define the properties
static void DefineProperties(cmake *cm);
......
......@@ -508,9 +508,6 @@ if(BUILD_TESTING)
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/SubProject")
endif()
if (CMAKE_STRICT)
ADD_TEST_MACRO(DocTest DocTest)
endif ()
# macro to add a test that will build a nightly release
# of CMake for given platform using the release scripts
macro(ADD_NIGHTLY_BUILD_TEST name script)
......
cmake_minimum_required (VERSION 2.6)
project (DocTest)
add_executable (DocTest DocTest.cxx)
set_property(GLOBAL PROPERTY REPORT_UNDEFINED_PROPERTIES
"${CMAKE_CURRENT_BINARY_DIR}/UndefinedProperties.txt")
#include <fstream>
#include <iostream>
#include <stdio.h>
int main ()
{
int result = 0;
// parse the dart test file
std::ifstream fin("UndefinedProperties.txt");
if(!fin)
{
fprintf(stderr,"failed to find undefined properties file");
return 1;
}
char buffer[1024];
while ( fin )
{
buffer[0] = 0;
fin.getline(buffer, 1023);
buffer[1023] = 0;
std::string line = buffer;
if(line.size() && line.find("with scope VARIABLE") == std::string::npos)
{
fprintf(stderr, "%s\n", line.c_str());
result = 1;
}
}
fin.close();
return result;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment