diff options
-rw-r--r-- | Source/cmSetPropertiesCommand.cxx | 20 | ||||
-rw-r--r-- | Source/cmSetPropertiesCommand.h | 3 | ||||
-rw-r--r-- | Source/cmSetSourceFilesPropertiesCommand.cxx | 92 | ||||
-rw-r--r-- | Source/cmSetSourceFilesPropertiesCommand.h | 7 | ||||
-rw-r--r-- | Source/cmake.cxx | 5 |
5 files changed, 88 insertions, 39 deletions
diff --git a/Source/cmSetPropertiesCommand.cxx b/Source/cmSetPropertiesCommand.cxx index 8024c6a..8ac03e7 100644 --- a/Source/cmSetPropertiesCommand.cxx +++ b/Source/cmSetPropertiesCommand.cxx @@ -17,6 +17,7 @@ #include "cmSetPropertiesCommand.h" #include "cmSetTargetPropertiesCommand.h" #include "cmSetTestsPropertiesCommand.h" +#include "cmSetSourceFilesPropertiesCommand.h" // cmSetPropertiesCommand bool cmSetPropertiesCommand::InitialPass( @@ -93,6 +94,11 @@ bool cmSetPropertiesCommand::InitialPass( scope = cmProperty::TEST; scopeName = args[1].c_str(); } + else if (args[0] == "SOURCE_FILE" && numFiles == 2) + { + scope = cmProperty::SOURCE_FILE; + scopeName = args[1].c_str(); + } else { this->SetError("called with illegal arguments."); @@ -151,7 +157,19 @@ bool cmSetPropertiesCommand::InitialPass( } break; case cmProperty::SOURCE_FILE: - // not implemented yet + { + std::string errors; + bool ret = cmSetSourceFilesPropertiesCommand:: + RunCommand(this->Makefile, + args.begin()+1, args.begin()+2, + args.begin() + 2, args.end(), + errors); + if (!ret) + { + this->SetError(errors.c_str()); + } + return ret; + } break; } diff --git a/Source/cmSetPropertiesCommand.h b/Source/cmSetPropertiesCommand.h index b949e36..73ba1bd 100644 --- a/Source/cmSetPropertiesCommand.h +++ b/Source/cmSetPropertiesCommand.h @@ -56,7 +56,8 @@ public: " PROPERTIES prop1 value1\n" " prop2 value2 ...)\n" "Set properties on something. The scope_value is either GLOBAL " - "DIRECTORY dir_name, TARGET tgt_name, or TEST test_name." + "DIRECTORY dir_name, TARGET tgt_name, SOURCE_FILE src_name, " + "or TEST test_name." ; } diff --git a/Source/cmSetSourceFilesPropertiesCommand.cxx b/Source/cmSetSourceFilesPropertiesCommand.cxx index 8c085ff..5e7618d 100644 --- a/Source/cmSetSourceFilesPropertiesCommand.cxx +++ b/Source/cmSetSourceFilesPropertiesCommand.cxx @@ -28,56 +28,89 @@ bool cmSetSourceFilesPropertiesCommand::InitialPass( return false; } - // first collect up the list of files + // break the arguments into source file names and properties + int numFiles = 0; + std::vector<std::string>::const_iterator j; + j = args.begin(); + // old style allows for specifier before PROPERTIES keyword + while (*j != "ABSTRACT" && + *j != "WRAP_EXCLUDE" && + *j != "GENERATED" && + *j != "COMPILE_FLAGS" && + *j != "OBJECT_DEPENDS" && + *j != "PROPERTIES") + { + numFiles++; + ++j; + } + + // now call the worker function + std::string errors; + bool ret = + cmSetSourceFilesPropertiesCommand + ::RunCommand(this->Makefile, + args.begin(), + args.begin() + numFiles, + args.begin() + numFiles, + args.end(), errors); + if (!ret) + { + this->SetError(errors.c_str()); + } + return ret; +} + +bool cmSetSourceFilesPropertiesCommand +::RunCommand(cmMakefile *mf, + std::vector<std::string>::const_iterator filebeg, + std::vector<std::string>::const_iterator fileend, + std::vector<std::string>::const_iterator propbeg, + std::vector<std::string>::const_iterator propend, + std::string &errors) +{ std::vector<std::string> propertyPairs; - bool doingFiles = true; bool generated = false; - int numFiles = 0; std::vector<std::string>::const_iterator j; - for(j= args.begin(); j != args.end();++j) + // build the property pairs + for(j= propbeg; j != propend;++j) { // old style allows for specifier before PROPERTIES keyword if(*j == "ABSTRACT") { - doingFiles = false; propertyPairs.push_back("ABSTRACT"); propertyPairs.push_back("1"); } else if(*j == "WRAP_EXCLUDE") { - doingFiles = false; propertyPairs.push_back("WRAP_EXCLUDE"); propertyPairs.push_back("1"); } else if(*j == "GENERATED") { - doingFiles = false; generated = true; propertyPairs.push_back("GENERATED"); propertyPairs.push_back("1"); } else if(*j == "COMPILE_FLAGS") { - doingFiles = false; propertyPairs.push_back("COMPILE_FLAGS"); ++j; - if(j == args.end()) + if(j == propend) { - this->SetError("called with incorrect number of arguments " - "COMPILE_FLAGS with no flags"); + errors = "called with incorrect number of arguments " + "COMPILE_FLAGS with no flags"; return false; } propertyPairs.push_back(*j); } else if(*j == "OBJECT_DEPENDS") { - doingFiles = false; propertyPairs.push_back("OBJECT_DEPENDS"); ++j; - if(j == args.end()) + if(j == propend) { - this->SetError("called with incorrect number of arguments " - "OBJECT_DEPENDS with no dependencies"); + errors = "called with incorrect number of arguments " + "OBJECT_DEPENDS with no dependencies"; return false; } propertyPairs.push_back(*j); @@ -87,13 +120,13 @@ bool cmSetSourceFilesPropertiesCommand::InitialPass( // now loop through the rest of the arguments, new style ++j; bool dontPush = false; - while (j != args.end()) + while (j != propend) { propertyPairs.push_back(*j); if(*j == "GENERATED") { ++j; - if(j != args.end() && cmSystemTools::IsOn(j->c_str())) + if(j != propend && cmSystemTools::IsOn(j->c_str())) { generated = true; } @@ -101,10 +134,10 @@ bool cmSetSourceFilesPropertiesCommand::InitialPass( else if(*j == "MACOSX_PACKAGE_LOCATION") { ++j; - if(j == args.end()) + if(j == propend) { - this->SetError("called with incorrect number of arguments " - "MACOSX_PACKAGE_LOCATION with no flags"); + errors = "called with incorrect number of arguments " + "MACOSX_PACKAGE_LOCATION with no flags"; return false; } propertyPairs.push_back(*j); @@ -122,9 +155,9 @@ bool cmSetSourceFilesPropertiesCommand::InitialPass( { ++j; } - if(j == args.end()) + if(j == propend) { - this->SetError("called with incorrect number of arguments."); + errors = "called with incorrect number of arguments."; return false; } if ( !dontPush ) @@ -137,29 +170,24 @@ bool cmSetSourceFilesPropertiesCommand::InitialPass( // 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?"); + errors = "called with illegal arguments, maybe missing a " + "PROPERTIES specifier?"; return false; } } // now loop over all the files - int i; - unsigned int k; - for(i = 0; i < numFiles; ++i) + for(j= filebeg; j != fileend;++j) { // get the source file cmSourceFile* sf = - this->Makefile->GetOrCreateSource(args[i].c_str(), generated); + mf->GetOrCreateSource(j->c_str(), generated); if(sf) { // now loop through all the props and set them + unsigned int k; for (k = 0; k < propertyPairs.size(); k = k + 2) { sf->SetProperty(propertyPairs[k].c_str(),propertyPairs[k+1].c_str()); diff --git a/Source/cmSetSourceFilesPropertiesCommand.h b/Source/cmSetSourceFilesPropertiesCommand.h index 63d3f73..1d14443 100644 --- a/Source/cmSetSourceFilesPropertiesCommand.h +++ b/Source/cmSetSourceFilesPropertiesCommand.h @@ -82,6 +82,13 @@ public: } cmTypeMacro(cmSetSourceFilesPropertiesCommand, cmCommand); + + static bool RunCommand(cmMakefile *mf, + std::vector<std::string>::const_iterator filebeg, + std::vector<std::string>::const_iterator fileend, + std::vector<std::string>::const_iterator propbeg, + std::vector<std::string>::const_iterator propend, + std::string &errors); }; diff --git a/Source/cmake.cxx b/Source/cmake.cxx index ba8334e..3f6143a 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -2854,19 +2854,14 @@ bool cmake::IsPropertyChained(const char *name, cmProperty::ScopeType scope) { case cmProperty::GLOBAL: return this->GlobalProperties.IsPropertyChained(name); - break; case cmProperty::TARGET: return this->TargetProperties.IsPropertyChained(name); - break; case cmProperty::SOURCE_FILE: return this->SourceFileProperties.IsPropertyChained(name); - break; case cmProperty::DIRECTORY: return this->DirectoryProperties.IsPropertyChained(name); - break; case cmProperty::TEST: return this->DirectoryProperties.IsPropertyChained(name); - break; } return false; |