summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/cmProperty.cxx34
-rw-r--r--Source/cmProperty.h42
-rw-r--r--Source/cmPropertyDefinition.cxx58
-rw-r--r--Source/cmPropertyDefinition.h49
-rw-r--r--Source/cmPropertyDefinitionMap.cxx85
-rw-r--r--Source/cmPropertyDefinitionMap.h41
-rw-r--r--Source/cmPropertyMap.cxx140
-rw-r--r--Source/cmPropertyMap.h45
-rw-r--r--Source/cmSetPropertiesCommand.cxx140
-rw-r--r--Source/cmSetPropertiesCommand.h68
10 files changed, 702 insertions, 0 deletions
diff --git a/Source/cmProperty.cxx b/Source/cmProperty.cxx
new file mode 100644
index 0000000000..dbfeae9aff
--- /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 0000000000..451bb942bd
--- /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 0000000000..817a0d6f2e
--- /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 0000000000..cc571eee0f
--- /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 0000000000..bfc6112ec1
--- /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<cmDocumentationEntry>& 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 0000000000..60136d845f
--- /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<cmStdString,cmPropertyDefinition>
+{
+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<cmDocumentationEntry>& v) const;
+};
+
+#endif
+
diff --git a/Source/cmPropertyMap.cxx b/Source/cmPropertyMap.cxx
new file mode 100644
index 0000000000..7e4c3fc50f
--- /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 0000000000..11d35d689c
--- /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<cmStdString,cmProperty>
+{
+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 0000000000..e242ebe532
--- /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<std::string> 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<std::string> propertyPairs;
+ bool doingFiles = true;
+ int numFiles = 0;
+ std::vector<std::string>::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<std::string>::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 0000000000..78ee8151a9
--- /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<std::string> 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