/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmSeparateArgumentsCommand.h" #include #include #include "cmMakefile.h" #include "cmSystemTools.h" class cmExecutionStatus; // 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] == "NATIVE_COMMAND") { #ifdef _WIN32 mode = ModeWindows; #else mode = ModeUnix; #endif doing = DoingCommand; } 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 { std::ostringstream e; e << "given unknown argument " << args[i]; this->SetError(e.str()); return false; } } if (mode == ModeOld) { // Original space-replacement version of command. if (const char* def = this->Makefile->GetDefinition(var)) { std::string value = def; std::replace(value.begin(), value.end(), ' ', ';'); this->Makefile->AddDefinition(var, 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, value.c_str()); } return true; }