diff options
-rw-r--r-- | Source/cmGetPropertyCommand.cxx | 160 | ||||
-rw-r--r-- | Source/cmGetPropertyCommand.h | 73 |
2 files changed, 233 insertions, 0 deletions
diff --git a/Source/cmGetPropertyCommand.cxx b/Source/cmGetPropertyCommand.cxx new file mode 100644 index 0000000..182be33 --- /dev/null +++ b/Source/cmGetPropertyCommand.cxx @@ -0,0 +1,160 @@ +/*========================================================================= + + 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 "cmGetPropertyCommand.h" + +#include "cmake.h" +#include "cmTest.h" + +// cmGetPropertyCommand +bool cmGetPropertyCommand::InitialPass( + std::vector<std::string> const& args) +{ + if(args.size() < 3 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + + // the last argument in the property to get + const char *property = args[args.size()-1].c_str(); + std::string output = "NOTFOUND"; + + cmProperty::ScopeType scope; + const char *scopeName = 0; + if (args[1] == "GLOBAL" && args.size() == 3) + { + scope = cmProperty::GLOBAL; + } + else if (args[1] == "DIRECTORY" && args.size() >= 3) + { + scope = cmProperty::DIRECTORY; + if (args.size() >= 4) + { + scopeName = args[2].c_str(); + } + } + else if (args[1] == "TARGET" && args.size() == 4) + { + scope = cmProperty::TARGET; + scopeName = args[2].c_str(); + } + else if (args[1] == "TEST" && args.size() == 4) + { + scope = cmProperty::TEST; + scopeName = args[2].c_str(); + } + else if (args[1] == "SOURCE_FILE" && args.size() == 4) + { + scope = cmProperty::SOURCE_FILE; + scopeName = args[2].c_str(); + } + else + { + this->SetError("called with illegal arguments."); + return false; + } + + switch (scope) + { + case cmProperty::TARGET: + { + cmTarget *tgt = this->Makefile->GetLocalGenerator()->GetGlobalGenerator() + ->FindTarget(0, scopeName, true); + if (tgt) + { + cmTarget& target = *tgt; + const char *prop = target.GetProperty(property); + if (prop) + { + output = prop; + } + } + } + break; + case cmProperty::DIRECTORY: + { + cmLocalGenerator *lg = this->Makefile->GetLocalGenerator(); + if (args.size() >= 4) + { + std::string sd = scopeName; + // make sure the start dir is a full path + if (!cmSystemTools::FileIsFullPath(sd.c_str())) + { + sd = this->Makefile->GetStartDirectory(); + sd += "/"; + sd += scopeName; + } + + // The local generators are associated with collapsed paths. + sd = cmSystemTools::CollapseFullPath(sd.c_str()); + + // lookup the makefile from the directory name + lg = + this->Makefile->GetLocalGenerator()->GetGlobalGenerator()-> + FindLocalGenerator(sd.c_str()); + } + if (!lg) + { + this->SetError + ("DIRECTORY argument provided but requested directory not found. " + "This could be because the directory argument was invalid or, " + "it is valid but has not been processed yet."); + return false; + } + const char *prop = lg->GetMakefile()->GetProperty(property); + if (prop) + { + output = prop; + } + } + break; + case cmProperty::GLOBAL: + { + const char *prop = + this->Makefile->GetCMakeInstance()->GetProperty(property); + if (prop) + { + output = prop; + } + } + break; + case cmProperty::TEST: + { + cmTest *test = this->Makefile->GetTest(scopeName); + const char *prop = test->GetProperty(property); + if (prop) + { + output = prop; + } + } + break; + case cmProperty::SOURCE_FILE: + { + cmSourceFile* sf = this->Makefile->GetSource(scopeName); + const char *prop = sf->GetProperty(property); + if (prop) + { + output = prop; + } + } + break; + } + + this->Makefile->AddDefinition(args[0].c_str(), output.c_str()); + return true; +} + diff --git a/Source/cmGetPropertyCommand.h b/Source/cmGetPropertyCommand.h new file mode 100644 index 0000000..76b360a --- /dev/null +++ b/Source/cmGetPropertyCommand.h @@ -0,0 +1,73 @@ +/*========================================================================= + + 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 cmGetPropertyCommand_h +#define cmGetPropertyCommand_h + +#include "cmCommand.h" + +class cmGetPropertyCommand : public cmCommand +{ +public: + virtual cmCommand* Clone() + { + return new cmGetPropertyCommand; + } + + /** + * This is called when the command is first encountered in + * the input file. + */ + virtual bool InitialPass(std::vector<std::string> const& args); + + /** + * This determines if the command is invoked when in script mode. + */ + virtual bool IsScriptable() { return true; } + + /** + * The name of the command as specified in CMakeList.txt. + */ + virtual const char* GetName() { return "GET_PROPERTY";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Get a property."; + } + + /** + * Longer documentation. + */ + virtual const char* GetFullDocumentation() + { + return + " GET_PROPERTY(VAR scope_value property)\n" + "Get a property from cmake. The scope_value is either GLOBAL " + "DIRECTORY dir_name, TARGET tgt_name, SOURCE_FILE src_name, " + "or TEST test_name. The resulting value is " + "stored in the variable VAR. If the property is not found, " + "CMake will report an error."; + } + + cmTypeMacro(cmGetPropertyCommand, cmCommand); +}; + + + +#endif |