/*============================================================================ CMake - Cross Platform Makefile Generator Copyright 2000-2009 Kitware, Inc., Insight Software Consortium Distributed under the OSI-approved BSD License (the "License"); see accompanying file Copyright.txt for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the License for more information. ============================================================================*/ #include "cmSeparateArgumentsCommand.h" // cmSeparateArgumentsCommand bool cmSeparateArgumentsCommand ::InitialPass(std::vector const& args, cmExecutionStatus &) { if(args.empty()) { this->SetError("must be given at least one argument."); return false; } std::string var; std::string command; enum Mode { ModeOld, ModeUnix, ModeWindows }; Mode mode = ModeOld; enum Doing { DoingNone, DoingVariable, DoingMode, DoingCommand }; Doing doing = DoingVariable; for(unsigned int i=0; i < args.size(); ++i) { if(doing == DoingVariable) { var = args[i]; doing = DoingMode; } else if(doing == DoingMode && args[i] == "UNIX_COMMAND") { mode = ModeUnix; doing = DoingCommand; } else if(doing == DoingMode && args[i] == "WINDOWS_COMMAND") { mode = ModeWindows; doing = DoingCommand; } else if(doing == DoingCommand) { command = args[i]; doing = DoingNone; } else { cmOStringStream e; e << "given unknown argument " << args[i]; this->SetError(e.str().c_str()); return false; } } if(mode == ModeOld) { // Original space-replacement version of command. if(const char* def = this->Makefile->GetDefinition(var.c_str())) { std::string value = def; cmSystemTools::ReplaceString(value, " ", ";"); this->Makefile->AddDefinition(var.c_str(), value.c_str()); } } else { // Parse the command line. std::vector vec; if(mode == ModeUnix) { cmSystemTools::ParseUnixCommandLine(command.c_str(), vec); } else // if(mode == ModeWindows) { cmSystemTools::ParseWindowsCommandLine(command.c_str(), vec); } // Construct the result list value. std::string value; const char* sep = ""; for(std::vector::const_iterator vi = vec.begin(); vi != vec.end(); ++vi) { // Separate from the previous argument. value += sep; sep = ";"; // Preserve semicolons. for(std::string::const_iterator si = vi->begin(); si != vi->end(); ++si) { if(*si == ';') { value += '\\'; } value += *si; } } this->Makefile->AddDefinition(var.c_str(), value.c_str()); } return true; }