From 1161d76bc609840d5f7bccc8157ff6f757d9d67f Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Sat, 21 Dec 2002 11:14:47 -0500 Subject: [PATCH] ENH: add target properties files --- Source/cmGetTargetPropertyCommand.cxx | 45 +++++++++++ Source/cmGetTargetPropertyCommand.h | 67 +++++++++++++++++ Source/cmSetTargetPropertiesCommand.cxx | 99 +++++++++++++++++++++++++ Source/cmSetTargetPropertiesCommand.h | 66 +++++++++++++++++ 4 files changed, 277 insertions(+) create mode 100644 Source/cmGetTargetPropertyCommand.cxx create mode 100644 Source/cmGetTargetPropertyCommand.h create mode 100644 Source/cmSetTargetPropertiesCommand.cxx create mode 100644 Source/cmSetTargetPropertiesCommand.h diff --git a/Source/cmGetTargetPropertyCommand.cxx b/Source/cmGetTargetPropertyCommand.cxx new file mode 100644 index 000000000..21626ace7 --- /dev/null +++ b/Source/cmGetTargetPropertyCommand.cxx @@ -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. + +=========================================================================*/ +#include "cmGetTargetPropertyCommand.h" + +// cmSetTargetPropertyCommand +bool cmGetTargetPropertyCommand::InitialPass( + std::vector const& args) +{ + if(args.size() != 3 ) + { + this->SetError("called with incorrect number of arguments"); + return false; + } + const char* var = args[0].c_str(); + const char* targetName = args[1].c_str(); + cmTargets& targets = m_Makefile->GetTargets(); + cmTargets::iterator i = targets.find(targetName); + if ( i != targets.end()) + { + cmTarget& target = i->second; + const char *prop = target.GetProperty(args[2].c_str()); + if (prop) + { + m_Makefile->AddDefinition(var, prop); + return true; + } + } + m_Makefile->AddDefinition(var, "NOT_FOUND"); + return true; +} + diff --git a/Source/cmGetTargetPropertyCommand.h b/Source/cmGetTargetPropertyCommand.h new file mode 100644 index 000000000..52075aabf --- /dev/null +++ b/Source/cmGetTargetPropertyCommand.h @@ -0,0 +1,67 @@ +/*========================================================================= + + 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 cmGetTargetPropertyCommand_h +#define cmGetTargetPropertyCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +class cmGetTargetPropertyCommand : public cmCommand +{ +public: + virtual cmCommand* Clone() + { + return new cmGetTargetPropertyCommand; + } + + /** + * 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 "GET_TARGET_PROPERTY";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Get a property for a file"; + } + + /** + * Longer documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "GET_TARGET_PROPERTY(VAR target property) " + "Get a property from a source file. The value of the property is " + " stored in the variable VAR. If the property is not found, var " + "will be set to NOT_FOUND"; + } + + cmTypeMacro(cmGetTargetPropertyCommand, cmCommand); +}; + + + +#endif diff --git a/Source/cmSetTargetPropertiesCommand.cxx b/Source/cmSetTargetPropertiesCommand.cxx new file mode 100644 index 000000000..e7532b344 --- /dev/null +++ b/Source/cmSetTargetPropertiesCommand.cxx @@ -0,0 +1,99 @@ +/*========================================================================= + + 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 "cmSetTargetPropertiesCommand.h" + +// cmSetTargetPropertiesCommand +bool cmSetTargetPropertiesCommand::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; + } + + cmTargets& targets = m_Makefile->GetTargets(); + // now loop over all the targets + int i; + unsigned int k; + for(i = 0; i < numFiles; ++i) + { + // if the file is already in the makefile just set properites on it + cmTargets::iterator t = targets.find(args[i]); + if ( t != targets.end()) + { + cmTarget& target = t->second; + // now loop through all the props and set them + for (k = 0; k < propertyPairs.size(); k = k + 2) + { + target.SetProperty(propertyPairs[k].c_str(),propertyPairs[k+1].c_str()); + } + } + // if file is not already in the makefile, then add it + else + { + std::string message = "Can not find target to add properties to: "; + message += args[i]; + this->SetError(message.c_str()); + } + } + return true; +} + diff --git a/Source/cmSetTargetPropertiesCommand.h b/Source/cmSetTargetPropertiesCommand.h new file mode 100644 index 000000000..d436433b5 --- /dev/null +++ b/Source/cmSetTargetPropertiesCommand.h @@ -0,0 +1,66 @@ +/*========================================================================= + + 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 cmSetTargetsPropertiesCommand_h +#define cmSetTargetsPropertiesCommand_h + +#include "cmStandardIncludes.h" +#include "cmCommand.h" + +class cmSetTargetPropertiesCommand : public cmCommand +{ +public: + virtual cmCommand* Clone() + { + return new cmSetTargetPropertiesCommand; + } + + /** + * 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_TARGET_PROPERTIES";} + + /** + * Succinct documentation. + */ + virtual const char* GetTerseDocumentation() + { + return "Set attributes for a specific list of files."; + } + + /** + * Longer documentation. + */ + virtual const char* GetFullDocumentation() + { + return + "SET_TARGET_PROPERTIES(target1 target2 .. filen PROPERTIES prop1 value1 prop2 value2 ... prop2 valuen)" + "Set properties on a target. The syntax for the command is to list all the files you want " + "to change, and then provide the values you want to set next. Properties that cmake knows about are PREFIX and POSTFIX for Unix systems and libraries. CMake also knows about LINK_FLAGS, which can be used to add extra flags to the link step of a target. You can use and prop value pair you want and extract it later with the GET_TARGET_PROPERTY command."; + } + + cmTypeMacro(cmSetTargetPropertiesCommand, cmCommand); +}; + + + +#endif