| 
					
				 | 
			
			
				@@ -30,14 +30,12 @@ cmExportCommand::cmExportCommand() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ,ArgumentGroup() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ,Targets(&Helper, "TARGETS") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ,Append(&Helper, "APPEND", &ArgumentGroup) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+,ExportSetName(&Helper, "EXPORT", &ArgumentGroup) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ,Namespace(&Helper, "NAMESPACE", &ArgumentGroup) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ,Filename(&Helper, "FILE", &ArgumentGroup) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ,ExportOld(&Helper, "EXPORT_LINK_INTERFACE_LIBRARIES", &ArgumentGroup) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // at first TARGETS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  this->Targets.Follows(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // and after that the other options in any order 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  this->ArgumentGroup.Follows(&this->Targets); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  this->ExportSet = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -55,6 +53,16 @@ bool cmExportCommand 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return this->HandlePackage(args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else if (args[0] == "EXPORT") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this->ExportSetName.Follows(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this->ArgumentGroup.Follows(&this->ExportSetName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this->Targets.Follows(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this->ArgumentGroup.Follows(&this->Targets); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::vector<std::string> unknownArgs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   this->Helper.Parse(&args, &unknownArgs); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -65,31 +73,32 @@ bool cmExportCommand 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (this->Targets.WasFound() == false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this->SetError("TARGETS option missing."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string fname; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if(!this->Filename.WasFound()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this->SetError("FILE <filename> option missing."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (args[0] != "EXPORT") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this->SetError("FILE <filename> option missing."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fname = this->ExportSetName.GetString() + ".cmake"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Make sure the file has a .cmake extension. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(cmSystemTools::GetFilenameLastExtension(this->Filename.GetCString()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     != ".cmake") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    e << "FILE option given filename \"" << this->Filename.GetString() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      << "\" which does not have an extension of \".cmake\".\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Make sure the file has a .cmake extension. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(cmSystemTools::GetFilenameLastExtension(this->Filename.GetCString()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      != ".cmake") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      e << "FILE option given filename \"" << this->Filename.GetString() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        << "\" which does not have an extension of \".cmake\".\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fname = this->Filename.GetString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Get the file to write. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  std::string fname = this->Filename.GetString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if(cmSystemTools::FileIsFullPath(fname.c_str())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(!this->Makefile->CanIWriteThisFile(fname.c_str())) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -104,57 +113,95 @@ bool cmExportCommand 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Interpret relative paths with respect to the current build dir. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fname = this->Makefile->GetCurrentOutputDirectory(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fname += "/"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    fname += this->Filename.GetString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    std::string dir = this->Makefile->GetCurrentOutputDirectory(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fname = dir + "/" + fname; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for(std::vector<std::string>::const_iterator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      currentTarget = this->Targets.GetVector().begin(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      currentTarget != this->Targets.GetVector().end(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ++currentTarget) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::vector<std::string> targets; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cmGlobalGenerator *gg = this->Makefile->GetLocalGenerator() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        ->GetGlobalGenerator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if(args[0] == "EXPORT") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (this->Makefile->IsAlias(currentTarget->c_str())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (this->Append.IsEnabled()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      e << "EXPORT signature does not recognise the APPEND option."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (this->ExportOld.IsEnabled()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      e << "given ALIAS target \"" << *currentTarget 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        << "\" which may not be exported."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      e << "EXPORT signature does not recognise the " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        "EXPORT_LINK_INTERFACE_LIBRARIES option."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if(cmTarget* target = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       this->Makefile->GetLocalGenerator()-> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       GetGlobalGenerator()->FindTarget(0, currentTarget->c_str())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cmExportSetMap &setMap = gg->GetExportSets(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    std::string setName = this->ExportSetName.GetString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (setMap.find(setName) == setMap.end()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if(target->GetType() == cmTarget::OBJECT_LIBRARY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      e << "Export set \"" << setName << "\" not found."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this->ExportSet = setMap[setName]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else if (this->Targets.WasFound()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for(std::vector<std::string>::const_iterator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        currentTarget = this->Targets.GetVector().begin(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        currentTarget != this->Targets.GetVector().end(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ++currentTarget) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (this->Makefile->IsAlias(currentTarget->c_str())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        e << "given OBJECT library \"" << *currentTarget 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        e << "given ALIAS target \"" << *currentTarget 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           << "\" which may not be exported."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(cmTarget* target = gg->FindTarget(0, currentTarget->c_str())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(target->GetType() == cmTarget::OBJECT_LIBRARY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          e << "given OBJECT library \"" << *currentTarget 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            << "\" which may not be exported."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        e << "given target \"" << *currentTarget 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          << "\" which is not built by this project."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      targets.push_back(*currentTarget); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (this->Append.IsEnabled()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      e << "given target \"" << *currentTarget 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        << "\" which is not built by this project."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (cmExportBuildFileGenerator *ebfg = gg->GetExportedTargetsFile(fname)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ebfg->AppendTargets(targets); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cmGlobalGenerator *gg = this->Makefile->GetLocalGenerator() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        ->GetGlobalGenerator(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (this->Append.IsEnabled()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (cmExportBuildFileGenerator *ebfg = gg->GetExportedTargetsFile(fname)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      ebfg->AppendTargets(this->Targets.GetVector()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    this->SetError("EXPORT or TARGETS specifier missing."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Setup export file generation. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -162,7 +209,14 @@ bool cmExportCommand 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ebfg->SetExportFile(fname.c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ebfg->SetNamespace(this->Namespace.GetCString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ebfg->SetAppendMode(this->Append.IsEnabled()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ebfg->SetTargets(this->Targets.GetVector()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (this->ExportSet) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ebfg->SetExportSet(this->ExportSet); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ebfg->SetTargets(targets); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ebfg->SetMakefile(this->Makefile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ebfg->SetExportOld(this->ExportOld.IsEnabled()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |