|
|
@@ -16,6 +16,8 @@
|
|
|
=========================================================================*/
|
|
|
#include "cmForEachCommand.h"
|
|
|
|
|
|
+#include <cmsys/auto_ptr.hxx>
|
|
|
+
|
|
|
bool cmForEachFunctionBlocker::
|
|
|
IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
|
|
|
cmExecutionStatus &inStatus)
|
|
|
@@ -116,6 +118,10 @@ bool cmForEachCommand
|
|
|
this->SetError("called with incorrect number of arguments");
|
|
|
return false;
|
|
|
}
|
|
|
+ if(args.size() > 1 && args[1] == "IN")
|
|
|
+ {
|
|
|
+ return this->HandleInMode(args);
|
|
|
+ }
|
|
|
|
|
|
// create a function blocker
|
|
|
cmForEachFunctionBlocker *f = new cmForEachFunctionBlocker();
|
|
|
@@ -197,3 +203,45 @@ bool cmForEachCommand
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmForEachCommand::HandleInMode(std::vector<std::string> const& args)
|
|
|
+{
|
|
|
+ cmsys::auto_ptr<cmForEachFunctionBlocker> f(new cmForEachFunctionBlocker());
|
|
|
+ f->Args.push_back(args[0]);
|
|
|
+
|
|
|
+ enum Doing { DoingNone, DoingLists, DoingItems };
|
|
|
+ Doing doing = DoingNone;
|
|
|
+ for(unsigned int i=2; i < args.size(); ++i)
|
|
|
+ {
|
|
|
+ if(doing == DoingItems)
|
|
|
+ {
|
|
|
+ f->Args.push_back(args[i]);
|
|
|
+ }
|
|
|
+ else if(args[i] == "LISTS")
|
|
|
+ {
|
|
|
+ doing = DoingLists;
|
|
|
+ }
|
|
|
+ else if(args[i] == "ITEMS")
|
|
|
+ {
|
|
|
+ doing = DoingItems;
|
|
|
+ }
|
|
|
+ else if(doing == DoingLists)
|
|
|
+ {
|
|
|
+ const char* value = this->Makefile->GetDefinition(args[i].c_str());
|
|
|
+ if(value && *value)
|
|
|
+ {
|
|
|
+ cmSystemTools::ExpandListArgument(value, f->Args, true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ cmOStringStream e;
|
|
|
+ e << "Unknown argument:\n" << " " << args[i] << "\n";
|
|
|
+ this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this->Makefile->AddFunctionBlocker(f.release()); // TODO: pass auto_ptr
|
|
|
+ return true;
|
|
|
+}
|