| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /*=========================================================================
- 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(!value)
- {
- this->erase(name);
- return;
- }
- #ifdef CMAKE_STRICT
- 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;
- case cmProperty::VARIABLE:
- msg += "variable.";
- break;
- case cmProperty::CACHED_VARIABLE:
- msg += "cached variable.";
- break;
- default:
- msg += "unknown.";
- break;
- }
- cmSystemTools::Error(msg.c_str());
- }
- #else
- (void)scope;
- #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?
- #ifdef CMAKE_STRICT
- 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;
- case cmProperty::VARIABLE:
- msg += "variable.";
- break;
- case cmProperty::CACHED_VARIABLE:
- msg += "cached variable.";
- 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?
- if (this->CMakeInstance)
- {
- chain = this->CMakeInstance->IsPropertyChained(name,scope);
- }
- return 0;
- }
- return it->second.GetValue();
- }
|