Răsfoiți Sursa

ENH: getting some of the property changed chewcked into CVS at least

Ken Martin 19 ani în urmă
părinte
comite
49a3349b59

+ 34 - 0
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;
+}

+ 42 - 0
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

+ 58 - 0
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;
+    }
+}
+

+ 49 - 0
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

+ 85 - 0
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();
+}

+ 41 - 0
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
+

+ 140 - 0
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();
+}
+

+ 45 - 0
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
+

+ 140 - 0
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;
+}
+

+ 68 - 0
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