|
|
@@ -59,6 +59,10 @@ bool cmListCommand
|
|
|
{
|
|
|
return this->HandleRemoveItemCommand(args);
|
|
|
}
|
|
|
+ if(subCommand == "REMOVE_DUPLICATES")
|
|
|
+ {
|
|
|
+ return this->HandleRemoveDuplicatesCommand(args);
|
|
|
+ }
|
|
|
if(subCommand == "SORT")
|
|
|
{
|
|
|
return this->HandleSortCommand(args);
|
|
|
@@ -392,6 +396,68 @@ bool cmListCommand
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+//----------------------------------------------------------------------------
|
|
|
+bool cmListCommand
|
|
|
+::HandleRemoveDuplicatesCommand(std::vector<std::string> const& args)
|
|
|
+{
|
|
|
+ if(args.size() < 2)
|
|
|
+ {
|
|
|
+ this->SetError("sub-command REMOVE_DUPLICATES requires a list as an argument.");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ const std::string& listName = args[1];
|
|
|
+ // expand the variable
|
|
|
+ std::vector<std::string> varArgsExpanded;
|
|
|
+ if ( !this->GetList(varArgsExpanded, listName.c_str()) )
|
|
|
+ {
|
|
|
+ this->SetError("sub-command REMOVE_DUPLICATES requires list to be present.");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ std::string value;
|
|
|
+
|
|
|
+#if 0
|
|
|
+ // Fast version, but does not keep the ordering
|
|
|
+
|
|
|
+ std::set<std::string> unique(varArgsExpanded.begin(), varArgsExpanded.end());
|
|
|
+ std::set<std::string>::iterator it;
|
|
|
+ for ( it = unique.begin(); it != unique.end(); ++ it )
|
|
|
+ {
|
|
|
+ if (value.size())
|
|
|
+ {
|
|
|
+ value += ";";
|
|
|
+ }
|
|
|
+ value += it->c_str();
|
|
|
+ }
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+ // Slower version, keep the ordering
|
|
|
+
|
|
|
+ std::set<std::string> unique;
|
|
|
+ std::vector<std::string>::iterator it;
|
|
|
+ for ( it = varArgsExpanded.begin(); it != varArgsExpanded.end(); ++ it )
|
|
|
+ {
|
|
|
+ if (unique.find(*it) != unique.end())
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ unique.insert(*it);
|
|
|
+
|
|
|
+ if (value.size())
|
|
|
+ {
|
|
|
+ value += ";";
|
|
|
+ }
|
|
|
+ value += it->c_str();
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+ this->Makefile->AddDefinition(listName.c_str(), value.c_str());
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
//----------------------------------------------------------------------------
|
|
|
bool cmListCommand
|
|
|
::HandleSortCommand(std::vector<std::string> const& args)
|