summaryrefslogtreecommitdiffstats
path: root/Source/cmSeparateArgumentsCommand.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2009-07-14 14:15:47 (GMT)
committerBrad King <brad.king@kitware.com>2009-07-14 14:15:47 (GMT)
commitb23b1800a586b0afb316f92d9bde82896c804ef5 (patch)
treef58cf1b529d826c3801939b6c9cb762e66950039 /Source/cmSeparateArgumentsCommand.cxx
parent7a907f87f8a7ec08f8d402dd2fafd2a189e81bbc (diff)
downloadCMake-b23b1800a586b0afb316f92d9bde82896c804ef5.zip
CMake-b23b1800a586b0afb316f92d9bde82896c804ef5.tar.gz
CMake-b23b1800a586b0afb316f92d9bde82896c804ef5.tar.bz2
ENH: Teach separate_arguments() to parse commands
This adds UNIX_COMMAND and WINDOWS_COMMAND modes to the command. These modes parse unix- and windows-style command lines.
Diffstat (limited to 'Source/cmSeparateArgumentsCommand.cxx')
-rw-r--r--Source/cmSeparateArgumentsCommand.cxx94
1 files changed, 85 insertions, 9 deletions
diff --git a/Source/cmSeparateArgumentsCommand.cxx b/Source/cmSeparateArgumentsCommand.cxx
index 6e015b7..54cba49 100644
--- a/Source/cmSeparateArgumentsCommand.cxx
+++ b/Source/cmSeparateArgumentsCommand.cxx
@@ -20,19 +20,95 @@
bool cmSeparateArgumentsCommand
::InitialPass(std::vector<std::string> const& args, cmExecutionStatus &)
{
- if(args.size() != 1 )
+ if(args.empty())
{
- this->SetError("called with incorrect number of arguments");
+ this->SetError("must be given at least one argument.");
return false;
}
- const char* cacheValue = this->Makefile->GetDefinition(args[0].c_str());
- if(!cacheValue)
+
+ 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
{
- return true;
+ // Parse the command line.
+ std::vector<std::string> 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<std::string>::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());
}
- std::string value = cacheValue;
- cmSystemTools::ReplaceString(value," ", ";");
- this->Makefile->AddDefinition(args[0].c_str(), value.c_str());
+
return true;
}
-