Przeglądaj źródła

ENH: Do not generate install target unless some INSTALL or INSTALL_* commands have been used. This addresses bug#2827.

Brad King 19 lat temu
rodzic
commit
239fce5caa

+ 63 - 52
Source/cmGlobalGenerator.cxx

@@ -42,6 +42,9 @@ cmGlobalGenerator::cmGlobalGenerator()
 
   // Relative paths are not configured in the constructor.
   this->RelativePathsConfigured = false;
+
+  // Whether an install target is needed.
+  this->InstallTargetEnabled = false;
 }
 
 cmGlobalGenerator::~cmGlobalGenerator()
@@ -927,6 +930,11 @@ void cmGlobalGenerator::AddInstallComponent(const char* component)
     }
 }
 
+void cmGlobalGenerator::EnableInstallTarget()
+{
+  this->InstallTargetEnabled = true;
+}
+
 cmLocalGenerator *cmGlobalGenerator::CreateLocalGenerator()
 {
   cmLocalGenerator *lg = new cmLocalGenerator;
@@ -1448,66 +1456,69 @@ void cmGlobalGenerator::CreateDefaultGlobalTargets(cmTargets* targets)
     }
 
   //Install
-  std::string cmd;
-  cpackCommandLines.erase(cpackCommandLines.begin(), cpackCommandLines.end());
-  singleLine.erase(singleLine.begin(), singleLine.end());
-  depends.erase(depends.begin(), depends.end());
-  if ( this->GetPreinstallTargetName() )
-    {
-    depends.push_back(this->GetPreinstallTargetName());
-    }
-  else
+  if(this->InstallTargetEnabled)
     {
-    const char* noall =
-      mf->GetDefinition("CMAKE_SKIP_INSTALL_ALL_DEPENDENCY");
-    if(!noall || cmSystemTools::IsOff(noall))
+    std::string cmd;
+    cpackCommandLines.erase(cpackCommandLines.begin(), cpackCommandLines.end());
+    singleLine.erase(singleLine.begin(), singleLine.end());
+    depends.erase(depends.begin(), depends.end());
+    if ( this->GetPreinstallTargetName() )
       {
-      depends.push_back(this->GetAllTargetName());
+      depends.push_back(this->GetPreinstallTargetName());
       }
-    }
-  if(mf->GetDefinition("CMake_BINARY_DIR"))
-    {
-    // We are building CMake itself.  We cannot use the original
-    // executable to install over itself.
-    cmd = mf->GetDefinition("EXECUTABLE_OUTPUT_PATH");
-    if(cmakeCfgIntDir && *cmakeCfgIntDir && cmakeCfgIntDir[0] != '.')
+    else
       {
-      cmd += "/";
-      cmd += cmakeCfgIntDir;
+      const char* noall =
+        mf->GetDefinition("CMAKE_SKIP_INSTALL_ALL_DEPENDENCY");
+      if(!noall || cmSystemTools::IsOff(noall))
+        {
+        depends.push_back(this->GetAllTargetName());
+        }
       }
-    cmd += "/cmake";
-    }
-  else
-    {
-    cmd = cmakeCommand;
-    }
-  singleLine.push_back(cmd.c_str());
-  if ( cmakeCfgIntDir && *cmakeCfgIntDir && cmakeCfgIntDir[0] != '.' )
-    {
-    std::string cfgArg = "-DBUILD_TYPE=";
-    cfgArg += mf->GetDefinition("CMAKE_CFG_INTDIR");
-    singleLine.push_back(cfgArg);
-    }
-  singleLine.push_back("-P");
-  singleLine.push_back("cmake_install.cmake");
-  cpackCommandLines.push_back(singleLine);
-  (*targets)[this->GetInstallTargetName()] =
-    this->CreateGlobalTarget(
-      this->GetInstallTargetName(), "Install the project...",
-      &cpackCommandLines, depends);
-
-  // install_local
-  if(const char* install_local = this->GetInstallLocalTargetName())
-    {
-    singleLine.insert(singleLine.begin()+1, "-DCMAKE_INSTALL_LOCAL_ONLY=1");
-    cpackCommandLines.erase(cpackCommandLines.begin(),
-                            cpackCommandLines.end());
+    if(mf->GetDefinition("CMake_BINARY_DIR"))
+      {
+      // We are building CMake itself.  We cannot use the original
+      // executable to install over itself.
+      cmd = mf->GetDefinition("EXECUTABLE_OUTPUT_PATH");
+      if(cmakeCfgIntDir && *cmakeCfgIntDir && cmakeCfgIntDir[0] != '.')
+        {
+        cmd += "/";
+        cmd += cmakeCfgIntDir;
+        }
+      cmd += "/cmake";
+      }
+    else
+      {
+      cmd = cmakeCommand;
+      }
+    singleLine.push_back(cmd.c_str());
+    if ( cmakeCfgIntDir && *cmakeCfgIntDir && cmakeCfgIntDir[0] != '.' )
+      {
+      std::string cfgArg = "-DBUILD_TYPE=";
+      cfgArg += mf->GetDefinition("CMAKE_CFG_INTDIR");
+      singleLine.push_back(cfgArg);
+      }
+    singleLine.push_back("-P");
+    singleLine.push_back("cmake_install.cmake");
     cpackCommandLines.push_back(singleLine);
-
-    (*targets)[install_local] =
+    (*targets)[this->GetInstallTargetName()] =
       this->CreateGlobalTarget(
-        install_local, "Installing only the local directory...",
+        this->GetInstallTargetName(), "Install the project...",
         &cpackCommandLines, depends);
+
+    // install_local
+    if(const char* install_local = this->GetInstallLocalTargetName())
+      {
+      singleLine.insert(singleLine.begin()+1, "-DCMAKE_INSTALL_LOCAL_ONLY=1");
+      cpackCommandLines.erase(cpackCommandLines.begin(),
+                              cpackCommandLines.end());
+      cpackCommandLines.push_back(singleLine);
+
+      (*targets)[install_local] =
+        this->CreateGlobalTarget(
+          install_local, "Installing only the local directory...",
+          &cpackCommandLines, depends);
+      }
     }
 }
 

+ 2 - 0
Source/cmGlobalGenerator.h

@@ -123,6 +123,7 @@ public:
   void AddLocalGenerator(cmLocalGenerator *lg);
 
   void AddInstallComponent(const char* component);
+  void EnableInstallTarget();
   
   static int s_TryCompileTimeout;
   
@@ -221,6 +222,7 @@ protected:
 
   // Set of named installation components requested by the project.
   std::set<cmStdString> InstallComponents;
+  bool InstallTargetEnabled;
 
   // Manifest of all targets that will be built for each configuration.
   // This is computed just before local generators generate.

+ 4 - 0
Source/cmInstallCommand.cxx

@@ -33,6 +33,10 @@ bool cmInstallCommand::InitialPass(std::vector<std::string> const& args)
     return true;
     }
 
+  // Enable the install target.
+  this->Makefile->GetLocalGenerator()
+    ->GetGlobalGenerator()->EnableInstallTarget();
+
   // Switch among the command modes.
   if(args[0] == "SCRIPT")
     {

+ 5 - 0
Source/cmInstallFilesCommand.cxx

@@ -25,6 +25,11 @@ bool cmInstallFilesCommand
     this->SetError("called with incorrect number of arguments");
     return false;
     }
+
+  // Enable the install target.
+  this->Makefile->GetLocalGenerator()
+    ->GetGlobalGenerator()->EnableInstallTarget();
+
   std::vector<std::string> args;
   this->Makefile->ExpandSourceListArguments(argsIn, args, 2);
 

+ 4 - 0
Source/cmInstallProgramsCommand.cxx

@@ -26,6 +26,10 @@ bool cmInstallProgramsCommand
     return false;
     }
 
+  // Enable the install target.
+  this->Makefile->GetLocalGenerator()
+    ->GetGlobalGenerator()->EnableInstallTarget();
+
   // Create an INSTALL_PROGRAMS target specifically for this path.
   this->TargetName = "INSTALL_PROGRAMS_"+args[0];
   cmTarget& target = this->Makefile->GetTargets()[this->TargetName];

+ 4 - 0
Source/cmInstallTargetsCommand.cxx

@@ -26,6 +26,10 @@ bool cmInstallTargetsCommand
     return false;
     }
 
+  // Enable the install target.
+  this->Makefile->GetLocalGenerator()
+    ->GetGlobalGenerator()->EnableInstallTarget();
+
   cmTargets &tgts = this->Makefile->GetTargets();
   std::vector<std::string>::const_iterator s = args.begin();
   ++s;