From 49a3349b59791ec68c9932fcfb9119be039d8316 Mon Sep 17 00:00:00 2001 From: Ken Martin Date: Fri, 1 Dec 2006 13:35:21 -0500 Subject: ENH: getting some of the property changed chewcked into CVS at least --- Source/cmProperty.cxx | 34 +++++++++ Source/cmProperty.h | 42 +++++++++++ Source/cmPropertyDefinition.cxx | 58 +++++++++++++++ Source/cmPropertyDefinition.h | 49 +++++++++++++ Source/cmPropertyDefinitionMap.cxx | 85 ++++++++++++++++++++++ Source/cmPropertyDefinitionMap.h | 41 +++++++++++ Source/cmPropertyMap.cxx | 140 +++++++++++++++++++++++++++++++++++++ Source/cmPropertyMap.h | 45 ++++++++++++ Source/cmSetPropertiesCommand.cxx | 140 +++++++++++++++++++++++++++++++++++++ Source/cmSetPropertiesCommand.h | 68 ++++++++++++++++++ 10 files changed, 702 insertions(+) create mode 100644 Source/cmProperty.cxx create mode 100644 Source/cmProperty.h create mode 100644 Source/cmPropertyDefinition.cxx create mode 100644 Source/cmPropertyDefinition.h create mode 100644 Source/cmPropertyDefinitionMap.cxx create mode 100644 Source/cmPropertyDefinitionMap.h create mode 100644 Source/cmPropertyMap.cxx create mode 100644 Source/cmPropertyMap.h create mode 100644 Source/cmSetPropertiesCommand.cxx create mode 100644 Source/cmSetPropertiesCommand.h diff --git a/Source/cmProperty.cxx b/Source/cmProperty.cxx new file mode 100644 index 0000000..dbfeae9 --- /dev/null +++ b/Source/cmProperty.cxx @@ -0,0 +1,34 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmProperty.h" +#include "cmSystemTools.h" + +void cmProperty::Set(const char *name, const char *value) +{ + this->Name = name; + this->Value = value; + this->ValueHasBeenSet = true; +} + +const char *cmProperty::GetValue() const +{ + if (this->ValueHasBeenSet) + { + return this->Value.c_str(); + } + return 0; +} diff --git a/Source/cmProperty.h b/Source/cmProperty.h new file mode 100644 index 0000000..451bb94 --- /dev/null +++ b/Source/cmProperty.h @@ -0,0 +1,42 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmProperty_h +#define cmProperty_h + +#include "cmStandardIncludes.h" + +class cmProperty +{ +public: + enum ScopeType { TARGET, SOURCE_FILE, DIRECTORY, GLOBAL, TEST }; + + // set this property + void Set(const char *name, const char *value); + + // get the value + const char *GetValue() const; + + // construct with the value not set + cmProperty() { this->ValueHasBeenSet = false; }; + +protected: + std::string Name; + std::string Value; + bool ValueHasBeenSet; +}; + +#endif diff --git a/Source/cmPropertyDefinition.cxx b/Source/cmPropertyDefinition.cxx new file mode 100644 index 0000000..817a0d6 --- /dev/null +++ b/Source/cmPropertyDefinition.cxx @@ -0,0 +1,58 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmPropertyDefinition.h" +#include "cmSystemTools.h" + +cmDocumentationEntry cmPropertyDefinition::GetDocumentation() const +{ + cmDocumentationEntry e; + e.name = this->LongName.c_str(); + e.brief = + this->ShortDescription.size() ? this->ShortDescription.c_str() : 0; + e.full = this->FullDescription.size() ? this->FullDescription.c_str() : 0; + return e; +} + +void cmPropertyDefinition +::DefineProperty(const char *name, cmProperty::ScopeType scope, + const char *ShortDescription, + const char *FullDescription, + bool chain) +{ + this->Name = name; + this->Scope = scope; + this->Chained = chain; + if (ShortDescription) + { + this->ShortDescription = ShortDescription; + } + if (FullDescription) + { + this->FullDescription = FullDescription; + } + this->LongName = this->Name; + switch (this->Scope) + { + case cmProperty::TARGET: this->LongName += " on a target"; + break; + case cmProperty::SOURCE_FILE: this->LongName += " on a source file"; + break; + case cmProperty::DIRECTORY: this->LongName += " on a directory"; + break; + } +} + diff --git a/Source/cmPropertyDefinition.h b/Source/cmPropertyDefinition.h new file mode 100644 index 0000000..cc571ee --- /dev/null +++ b/Source/cmPropertyDefinition.h @@ -0,0 +1,49 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmPropertyDefinition_h +#define cmPropertyDefinition_h + +#include "cmProperty.h" + +class cmPropertyDefinition +{ +public: + // Define this property + void DefineProperty(const char *name, cmProperty::ScopeType scope, + const char *ShortDescription, + const char *FullDescription, + bool chained); + + // get the documentation string + cmDocumentationEntry GetDocumentation() const; + + // basic constructor + cmPropertyDefinition() { this->Chained = false; }; + + // is it chained? + bool IsChained() {return this->Chained; }; + +protected: + std::string Name; + std::string LongName; + std::string ShortDescription; + std::string FullDescription; + cmProperty::ScopeType Scope; + bool Chained; +}; + +#endif diff --git a/Source/cmPropertyDefinitionMap.cxx b/Source/cmPropertyDefinitionMap.cxx new file mode 100644 index 0000000..bfc6112 --- /dev/null +++ b/Source/cmPropertyDefinitionMap.cxx @@ -0,0 +1,85 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmPropertyDefinitionMap.h" +#include "cmSystemTools.h" + + +void cmPropertyDefinitionMap +::DefineProperty(const char *name, cmProperty::ScopeType scope, + const char *ShortDescription, + const char *FullDescription, + bool chain) +{ + if (!name) + { + return; + } + + cmPropertyDefinitionMap::iterator it = this->find(name); + cmPropertyDefinition *prop; + if (it == this->end()) + { + prop = &(*this)[name]; + prop->DefineProperty(name,scope,ShortDescription, FullDescription, chain); + } +} + +void cmPropertyDefinitionMap +::GetPropertiesDocumentation(std::vector& v) const +{ + for(cmPropertyDefinitionMap::const_iterator j = this->begin(); + j != this->end(); ++j) + { + cmDocumentationEntry e = j->second.GetDocumentation(); + if (e.brief) + { + v.push_back(e); + } + } +} + +bool cmPropertyDefinitionMap::IsPropertyDefined(const char *name) +{ + if (!name) + { + return false; + } + + cmPropertyDefinitionMap::iterator it = this->find(name); + if (it == this->end()) + { + return false; + } + + return true; +} + +bool cmPropertyDefinitionMap::IsPropertyChained(const char *name) +{ + if (!name) + { + return false; + } + + cmPropertyDefinitionMap::iterator it = this->find(name); + if (it == this->end()) + { + return false; + } + + return it->second.IsChained(); +} diff --git a/Source/cmPropertyDefinitionMap.h b/Source/cmPropertyDefinitionMap.h new file mode 100644 index 0000000..60136d8 --- /dev/null +++ b/Source/cmPropertyDefinitionMap.h @@ -0,0 +1,41 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmPropertyDefinitionMap_h +#define cmPropertyDefinitionMap_h + +#include "cmPropertyDefinition.h" + +class cmPropertyDefinitionMap : public std::map +{ +public: + // define the property + void DefineProperty(const char *name, cmProperty::ScopeType scope, + const char *ShortDescription, + const char *FullDescription, + bool chain); + + // has a named property been defined + bool IsPropertyDefined(const char *name); + + // is a named property set to chain + bool IsPropertyChained(const char *name); + + void GetPropertiesDocumentation(std::vector& v) const; +}; + +#endif + diff --git a/Source/cmPropertyMap.cxx b/Source/cmPropertyMap.cxx new file mode 100644 index 0000000..7e4c3fc --- /dev/null +++ b/Source/cmPropertyMap.cxx @@ -0,0 +1,140 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmPropertyMap.h" +#include "cmSystemTools.h" +#include "cmake.h" + +cmProperty *cmPropertyMap::GetOrCreateProperty(const char *name) +{ + cmPropertyMap::iterator it = this->find(name); + cmProperty *prop; + if (it == this->end()) + { + prop = &(*this)[name]; + } + else + { + prop = &(it->second); + } + return prop; +} + +void cmPropertyMap::SetProperty(const char *name, const char *value, + cmProperty::ScopeType scope) +{ + if (!name) + { + return; + } + +#if 0 + if (!this->CMakeInstance) + { + cmSystemTools::Error("CMakeInstance not set on a property map!"); + abort(); + } + else if (!this->CMakeInstance->IsPropertyDefined(name,scope)) + { + // is a property being queried without being defined first? If so then + // report it as we probably need to document it + std::string msg = "Property "; + msg += name; + msg += " set yet undefined on "; + switch (scope) + { + case cmProperty::TARGET: + msg += "target."; + break; + case cmProperty::SOURCE_FILE: + msg += "source file."; + break; + case cmProperty::DIRECTORY: + msg += "directory."; + break; + case cmProperty::TEST: + msg += "test."; + break; + default: + msg += "unknown."; + break; + } + cmSystemTools::Error(msg.c_str()); + } +#endif + + cmProperty *prop = this->GetOrCreateProperty(name); + prop->Set(name,value); +} + +const char *cmPropertyMap +::GetPropertyValue(const char *name, + cmProperty::ScopeType scope, + bool &chain) const +{ + chain = false; + if (!name) + { + return 0; + } + + // has the property been defined? +#if 0 + if (!this->CMakeInstance) + { + cmSystemTools::Error("CMakeInstance not set on a property map!"); + abort(); + } + else if (!this->CMakeInstance->IsPropertyDefined(name,scope)) + { + // is a property being queried without being defined first? If so then + // report it as we probably need to document it + std::string msg = "Property "; + msg += name; + msg += " queried yet undefined on "; + switch (scope) + { + case cmProperty::TARGET: + msg += "target."; + break; + case cmProperty::SOURCE_FILE: + msg += "source file."; + break; + case cmProperty::DIRECTORY: + msg += "directory."; + break; + case cmProperty::TEST: + msg += "test."; + break; + default: + msg += "unknown."; + break; + } + cmSystemTools::Error(msg.c_str()); + } +#endif + + cmPropertyMap::const_iterator it = this->find(name); + if (it == this->end()) + { + // should we chain up? + chain = this->CMakeInstance->IsPropertyChained(name,scope); + return 0; + } + + return it->second.GetValue(); +} + diff --git a/Source/cmPropertyMap.h b/Source/cmPropertyMap.h new file mode 100644 index 0000000..11d35d6 --- /dev/null +++ b/Source/cmPropertyMap.h @@ -0,0 +1,45 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmPropertyMap_h +#define cmPropertyMap_h + +#include "cmProperty.h" + +class cmake; + +class cmPropertyMap : public std::map +{ +public: + cmProperty *GetOrCreateProperty(const char *name); + + void SetProperty(const char *name, const char *value, + cmProperty::ScopeType scope); + + const char *GetPropertyValue(const char *name, + cmProperty::ScopeType scope, + bool &chain) const; + + void SetCMakeInstance(cmake *cm) { this->CMakeInstance = cm; }; + + cmPropertyMap() { this->CMakeInstance = 0;}; + +private: + cmake *CMakeInstance; +}; + +#endif + diff --git a/Source/cmSetPropertiesCommand.cxx b/Source/cmSetPropertiesCommand.cxx new file mode 100644 index 0000000..e242ebe --- /dev/null +++ b/Source/cmSetPropertiesCommand.cxx @@ -0,0 +1,140 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#include "cmSetPropertiesCommand.h" +#include "cmSetTargetPropertiesCommand.h" + +// cmSetPropertiesCommand +bool cmSetPropertiesCommand::InitialPass( + std::vector const& args) +{ + if(args.size() < 2 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + // first collect up the list of files + std::vector propertyPairs; + bool doingFiles = true; + int numFiles = 0; + std::vector::const_iterator j; + for(j= args.begin(); j != args.end();++j) + { + if(*j == "PROPERTIES") + { + doingFiles = false; + // now loop through the rest of the arguments, new style + ++j; + while (j != args.end()) + { + propertyPairs.push_back(*j); + ++j; + if(j == args.end()) + { + this->SetError("called with incorrect number of arguments."); + return false; + } + propertyPairs.push_back(*j); + ++j; + } + // break out of the loop because j is already == end + break; + } + else if (doingFiles) + { + numFiles++; + } + else + { + this->SetError("called with illegal arguments, maybe missing " + "a PROPERTIES specifier?"); + return false; + } + } + if(propertyPairs.size() == 0) + { + this->SetError("called with illegal arguments, maybe missing " + "a PROPERTIES specifier?"); + return false; + } + + cmProperty::ScopeType scope; + const char *scopeName = 0; + if (args[0] == "GLOBAL" && numFiles == 1) + { + scope = cmProperty::GLOBAL; + } + else if (args[0] == "DIRECTORY" && numFiles == 1) + { + scope = cmProperty::DIRECTORY; + } + else if (args[0] == "TARGET" && numFiles == 2) + { + scope = cmProperty::TARGET; + scopeName = args[1].c_str(); + } + else + { + this->SetError("called with illegal arguments."); + return false; + } + + switch (scope) + { + case cmProperty::TARGET: + { + bool ret = cmSetTargetPropertiesCommand:: + SetOneTarget(scopeName,propertyPairs, this->Makefile); + if (!ret) + { + std::string message = "Can not find target to add properties to: "; + message += scopeName; + this->SetError(message.c_str()); + } + return ret; + } + break; + case cmProperty::DIRECTORY: + { + std::string errors; + bool ret = + cmSetDirectoryPropertiesCommand::RunCommand(this->Makefile, + args.begin() + 2, + args.end(), + errors); + if (!ret) + { + this->SetError(errors.c_str()); + return ret; + } + } + break; + case cmProperty::GLOBAL: + { + std::vector::const_iterator j; + for(j= propertyPairs.begin(); j != propertyPairs.end(); ++j) + { + this->Makefile->GetCMakeInstance()->SetProperty(j->c_str(), + (++j)->c_str()); + } + } + break; + } + + return true; +} + diff --git a/Source/cmSetPropertiesCommand.h b/Source/cmSetPropertiesCommand.h new file mode 100644 index 0000000..78ee815 --- /dev/null +++ b/Source/cmSetPropertiesCommand.h @@ -0,0 +1,68 @@ +/*========================================================================= + + Program: CMake - Cross-Platform Makefile Generator + Module: $RCSfile$ + Language: C++ + Date: $Date$ + Version: $Revision$ + + Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved. + See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details. + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the above copyright notices for more information. + +=========================================================================*/ +#ifndef cmSetsPropertiesCommand_h +#define cmSetsPropertiesCommand_h + +#include "cmCommand.h" + +class cmSetPropertiesCommand : public cmCommand +{ +public: + virtual cmCommand* Clone() + { + return new cmSetPropertiesCommand; + } + + /** + * This is called when the command is first encountered in + * the input file. + */ + virtual bool InitialPass(std::vector const& args); + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "SET_PROPERTIES";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Set properties used by CMake."; + } + + /** + * Longer documentation. + */ + virtual const char* GetFullDocumentation() + { + return + " SET_PROPERTIES(scope_value\n" + " PROPERTIES prop1 value1\n" + " prop2 value2 ...)\n" + "Set properties on something. The scope_value is either GLOBAL " + "DIRECTORY dir_name> or TARGET tgt_name." + ; + } + + cmTypeMacro(cmSetPropertiesCommand, cmCommand); +}; + + + +#endif -- cgit v0.12