Bladeren bron

ENH: Improved INSTALL_FILES and INSTALL_PROGRAMS commands to allow each call to the command in a single directory to specify a different install path.

Brad King 24 jaren geleden
bovenliggende
commit
3d86ad7237

+ 14 - 16
Source/cmInstallFilesCommand.cxx

@@ -50,14 +50,16 @@ bool cmInstallFilesCommand::InitialPass(std::vector<std::string>& args)
     return false;
     }
 
-  cmTargets &tgts = m_Makefile->GetTargets();
+  // Create an INSTALL_FILES target specifically for this path.
+  m_TargetName = "INSTALL_FILES_"+args[0];
+  cmTarget target;
+  target.SetInAll(false);
+  target.SetType(cmTarget::INSTALL_FILES);
+  target.SetInstallPath(args[0].c_str());
+  m_Makefile->GetTargets().insert(cmTargets::value_type(m_TargetName, target));
+
   std::vector<std::string>::iterator s = args.begin();
-  if (tgts.find("INSTALL_FILES") != tgts.end())
-    {
-    tgts["INSTALL_FILES"].SetInstallPath(args[0].c_str());
-    }
-  ++s;
-  for (;s != args.end(); ++s)
+  for (++s;s != args.end(); ++s)
     {
     m_FinalArgs.push_back(*s);
     }
@@ -67,14 +69,10 @@ bool cmInstallFilesCommand::InitialPass(std::vector<std::string>& args)
 
 void cmInstallFilesCommand::FinalPass() 
 {
-  cmTargets &tgts = m_Makefile->GetTargets();
   std::string testf;
   std::string ext = m_FinalArgs[0];
-
-  if (tgts.find("INSTALL_FILES") == tgts.end())
-    {
-    return;
-    }
+  std::vector<std::string>& targetSourceLists =
+    m_Makefile->GetTargets()[m_TargetName].GetSourceLists();
   
   // two different options
   if (m_FinalArgs.size() > 1)
@@ -98,7 +96,7 @@ void cmInstallFilesCommand::FinalPass()
           {
           testf = c->GetSourceName() + ext;
           // add to the result
-          tgts["INSTALL_FILES"].GetSourceLists().push_back(testf);
+          targetSourceLists.push_back(testf);
           }
         }
       // if one wasn't found then assume it is a single class
@@ -106,7 +104,7 @@ void cmInstallFilesCommand::FinalPass()
         {
         testf = temps + ext;
         // add to the result
-        tgts["INSTALL_FILES"].GetSourceLists().push_back(testf);
+        targetSourceLists.push_back(testf);
         }
       }
     }
@@ -122,7 +120,7 @@ void cmInstallFilesCommand::FinalPass()
     // for each argument, get the files 
     for (;s != files.end(); ++s)
       {
-      tgts["INSTALL_FILES"].GetSourceLists().push_back(*s);
+      targetSourceLists.push_back(*s);
       }
     }
 }

+ 1 - 0
Source/cmInstallFilesCommand.h

@@ -102,6 +102,7 @@ public:
   cmTypeMacro(cmInstallFilesCommand, cmCommand);
 
  private:
+  std::string m_TargetName;
   std::vector<std::string> m_FinalArgs;
 };
 

+ 14 - 16
Source/cmInstallProgramsCommand.cxx

@@ -50,29 +50,27 @@ bool cmInstallProgramsCommand::InitialPass(std::vector<std::string>& args)
     return false;
     }
 
-  cmTargets &tgts = m_Makefile->GetTargets();
+  // Create an INSTALL_PROGRAMS target specifically for this path.
+  m_TargetName = "INSTALL_PROGRAMS_"+args[0];
+  cmTarget target;
+  target.SetInAll(false);
+  target.SetType(cmTarget::INSTALL_PROGRAMS);
+  target.SetInstallPath(args[0].c_str());
+  m_Makefile->GetTargets().insert(cmTargets::value_type(m_TargetName, target));
+
   std::vector<std::string>::iterator s = args.begin();
-  if (tgts.find("INSTALL_PROGRAMS") != tgts.end())
-    {
-    tgts["INSTALL_PROGRAMS"].SetInstallPath(args[0].c_str());
-    }
-  ++s;
-  for (;s != args.end(); ++s)
+  for (++s;s != args.end(); ++s)
     {
     m_FinalArgs.push_back(*s);
-    }
+    }  
   
   return true;
 }
 
 void cmInstallProgramsCommand::FinalPass() 
 {
-  cmTargets &tgts = m_Makefile->GetTargets();
-
-  if (tgts.find("INSTALL_PROGRAMS") == tgts.end())
-    {
-    return;
-    }
+  std::vector<std::string>& targetSourceLists =
+    m_Makefile->GetTargets()[m_TargetName].GetSourceLists();
   
   // two different options
   if (m_FinalArgs.size() > 1)
@@ -85,7 +83,7 @@ void cmInstallProgramsCommand::FinalPass()
       std::string temps = *s;
       m_Makefile->ExpandVariablesInString(temps);
       // add to the result
-      tgts["INSTALL_PROGRAMS"].GetSourceLists().push_back(temps);
+      targetSourceLists.push_back(temps);
       }
     }
   else     // reg exp list
@@ -98,7 +96,7 @@ void cmInstallProgramsCommand::FinalPass()
     // for each argument, get the programs 
     for (;s != programs.end(); ++s)
       {
-      tgts["INSTALL_PROGRAMS"].GetSourceLists().push_back(*s);
+      targetSourceLists.push_back(*s);
       }
     }
 }

+ 1 - 0
Source/cmInstallProgramsCommand.h

@@ -102,6 +102,7 @@ public:
   cmTypeMacro(cmInstallProgramsCommand, cmCommand);
 
  private:
+  std::string m_TargetName;
   std::vector<std::string> m_FinalArgs;
 };
 

+ 0 - 7
Source/cmMakefile.cxx

@@ -122,13 +122,6 @@ void cmMakefile::AddDefaultCommands()
 #if defined(__APPLE__)
   this->AddDefinition("APPLE", "1");
 #endif
-  // always creat an empty install targets for files and programs.
-  cmTarget target;
-  target.SetInAll(false);
-  target.SetType(cmTarget::INSTALL_FILES);
-  m_Targets.insert(cmTargets::value_type("INSTALL_FILES", target));
-  target.SetType(cmTarget::INSTALL_PROGRAMS);
-  m_Targets.insert(cmTargets::value_type("INSTALL_PROGRAMS", target));
 }
 
 cmMakefile::~cmMakefile()