| 
					
				 | 
			
			
				@@ -99,11 +99,14 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool doing_targets = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool doing_destination = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool doing_permissions = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  bool archive_settings = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool library_settings = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool runtime_settings = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::vector<cmTarget*> targets; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char* archive_destination = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* library_destination = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char* runtime_destination = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string archive_permissions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::string library_permissions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::string runtime_permissions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for(unsigned int i=1; i < args.size(); ++i) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -122,12 +125,23 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_destination = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_permissions = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else if(args[i] == "ARCHIVE") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // Switch to setting only archive properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      doing_targets = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      doing_destination = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      doing_permissions = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      archive_settings = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      library_settings = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      runtime_settings = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else if(args[i] == "LIBRARY") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Switch to setting only library properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_targets = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_destination = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_permissions = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      archive_settings = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       library_settings = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       runtime_settings = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -137,6 +151,7 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_targets = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_destination = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       doing_permissions = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      archive_settings = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       library_settings = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       runtime_settings = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -174,6 +189,10 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else if(doing_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Set the destination in the active set(s) of properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(archive_settings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        archive_destination = args[i].c_str(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if(library_settings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         library_destination = args[i].c_str(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -187,6 +206,18 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else if(doing_permissions) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Set the permissions in the active set(s) of properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(archive_settings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Check the requested permission. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(!this->CheckPermissions(args[i], archive_permissions)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          e << args[0] << " given invalid permission \"" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            << args[i] << "\"."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if(library_settings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // Check the requested permission. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -227,15 +258,17 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(!library_destination && !runtime_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if(!archive_destination && !library_destination && !runtime_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     this->SetError("TARGETS given no DESTINATION!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Compute destination paths. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  std::string archive_dest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::string library_dest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   std::string runtime_dest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  this->ComputeDestination(archive_destination, archive_dest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   this->ComputeDestination(library_destination, library_dest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   this->ComputeDestination(runtime_destination, runtime_dest); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -255,12 +288,12 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // platform. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #if defined(_WIN32) || defined(__CYGWIN__) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // This is a DLL platform. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(library_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(archive_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          // The import library uses the LIBRARY properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // The import library uses the ARCHIVE properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           this->Makefile->AddInstallGenerator( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            new cmInstallTargetGenerator(target, library_dest.c_str(), true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                         library_permissions.c_str())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new cmInstallTargetGenerator(target, archive_dest.c_str(), true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         archive_permissions.c_str())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(runtime_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -278,13 +311,39 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             new cmInstallTargetGenerator(target, library_dest.c_str(), false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                          library_permissions.c_str())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          e << "TARGETS given no LIBRARY DESTINATION for shared library " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "target \"" << target.GetName() << "\"."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       case cmTarget::STATIC_LIBRARY: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Static libraries use ARCHIVE properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(archive_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          this->Makefile->AddInstallGenerator( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new cmInstallTargetGenerator(target, archive_dest.c_str(), false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         archive_permissions.c_str())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          e << "TARGETS given no ARCHIVE DESTINATION for static library " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            "target \"" << target.GetName() << "\"."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       case cmTarget::MODULE_LIBRARY: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // Static libraries and modules use LIBRARY properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Modules use LIBRARY properties. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(library_destination) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           this->Makefile->AddInstallGenerator( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -294,16 +353,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           cmOStringStream e; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          e << "TARGETS given no LIBRARY DESTINATION for "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          if(target.GetType() == cmTarget::STATIC_LIBRARY) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            e << "static library"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            e << "module"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          e << " target \"" << target.GetName() << "\"."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          e << "TARGETS given no LIBRARY DESTINATION for module target \"" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            << target.GetName() << "\"."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           this->SetError(e.str().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           return false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           } 
			 |