diff options
Diffstat (limited to 'Source/cmAddCustomCommandCommand.cxx')
-rw-r--r-- | Source/cmAddCustomCommandCommand.cxx | 139 |
1 files changed, 95 insertions, 44 deletions
diff --git a/Source/cmAddCustomCommandCommand.cxx b/Source/cmAddCustomCommandCommand.cxx index f3ecc93..e30a82e 100644 --- a/Source/cmAddCustomCommandCommand.cxx +++ b/Source/cmAddCustomCommandCommand.cxx @@ -17,71 +17,122 @@ // cmAddCustomCommandCommand -bool cmAddCustomCommandCommand::InitialPass(std::vector<std::string> const& argsIn) +bool cmAddCustomCommandCommand::InitialPass(std::vector<std::string> const& args) { - if (argsIn.size() < 6) + /* No control on the number of arguments for now since everything can + be optional in that implementation. Should be fixed but this command + is so flexible that too much constraint could prevent user to achieve + a particular task. + Let's complain at the end of this function about the lack of a particular + arg. For the moment, let's say that SOURCE, COMMAND, TARGET are always + required + */ + if (args.size() < 6) { this->SetError("called with wrong number of arguments."); return false; } - std::vector<std::string> args = argsIn; - - if(args[2] != "ARGS") - { - this->SetError("Wrong syntax. The third argument should be ARGS"); - return false; - } - int cc=3; + std::string source, command, target; + std::vector<std::string> command_args, depends, outputs; - std::vector<std::string> commandArgs; - while(args[cc] != "DEPENDS" && cc < argsIn.size()) - { - m_Makefile->ExpandVariablesInString(args[cc]); - commandArgs.push_back(args[cc]); - cc++; - } + enum tdoing { + doing_source, + doing_command, + doing_target, + doing_args, + doing_depends, + doing_outputs, + doing_nothing + }; + + tdoing doing = doing_nothing; - if(cc == argsIn.size()-1) + for (unsigned int j = 0; j < args.size(); ++j) { - this->SetError("Wrong syntax. Missing DEPENDS."); - return false; + std::string copy = args[j]; + m_Makefile->ExpandVariablesInString(copy); + + if(copy == "SOURCE") + { + doing = doing_source; + } + else if(copy == "COMMAND") + { + doing = doing_command; + } + else if(copy == "TARGET") + { + doing = doing_target; + } + else if(copy == "ARGS") + { + doing = doing_args; + } + else if (copy == "DEPENDS") + { + doing = doing_depends; + } + else if (copy == "OUTPUTS") + { + doing = doing_outputs; + } + else + { + switch (doing) + { + case doing_source: + source = copy; + break; + case doing_command: + command = copy; + break; + case doing_target: + target = copy; + break; + case doing_args: + command_args.push_back(copy); + break; + case doing_depends: + depends.push_back(copy); + break; + case doing_outputs: + outputs.push_back(copy); + break; + default: + this->SetError("Wrong syntax. Unknow type of argument."); + return false; + } + } } - cc++ ; // Skip DEPENDS - std::vector<std::string> depends; - while(args[cc] != "OUTPUTS" && cc < argsIn.size()) + /* At this point we could complain about the lack of arguments. + For the moment, let's say that SOURCE, COMMAND, TARGET are always + required. + */ + + if(source.empty()) { - m_Makefile->ExpandVariablesInString(args[cc]); - depends.push_back(args[cc]); - cc++; + this->SetError("Wrong syntax. Empty SOURCE."); + return false; } - - if(cc == argsIn.size()-1) + if(command.empty()) { - this->SetError("Wrong syntax. Missing OUTPUTS."); + this->SetError("Wrong syntax. Empty COMMAND."); return false; } - cc ++; // Skip OUTPUTS - - std::vector<std::string> outputs; - while(cc < argsIn.size()-1) + if(target.empty()) { - m_Makefile->ExpandVariablesInString(args[cc]); - outputs.push_back(args[cc]); - cc++; + this->SetError("Wrong syntax. Empty TARGET."); + return false; } - m_Makefile->ExpandVariablesInString(args[0]); - m_Makefile->ExpandVariablesInString(args[1]); - m_Makefile->ExpandVariablesInString(args[argsIn.size()-1]); - - m_Makefile->AddCustomCommand(args[0].c_str(), - args[1].c_str(), - commandArgs, + m_Makefile->AddCustomCommand(source.c_str(), + command.c_str(), + command_args, depends, outputs, - args[argsIn.size()-1].c_str()); + target.c_str()); return true; } |