浏览代码

CPack Backward-compatibly enforce DESTDIR for DEB and RPM

Eric NOULARD 15 年之前
父节点
当前提交
40dc97dc73

+ 4 - 1
Source/CPack/cmCPackDebGenerator.cxx

@@ -43,7 +43,10 @@ cmCPackDebGenerator::~cmCPackDebGenerator()
 int cmCPackDebGenerator::InitializeInternal()
 {
   this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr");
-
+  if (cmSystemTools::IsOff(this->GetOption("CPACK_SET_DESTDIR")))
+    {
+    this->SetOption("CPACK_SET_DESTDIR", "I_ON");
+    }
   return this->Superclass::InitializeInternal();
 }
 

+ 14 - 2
Source/CPack/cmCPackGenerator.cxx

@@ -171,7 +171,8 @@ int cmCPackGenerator::InstallProject()
   std::string bareTempInstallDirectory
     = this->GetOption("CPACK_TEMPORARY_INSTALL_DIRECTORY");
   std::string tempInstallDirectoryStr = bareTempInstallDirectory;
-  bool setDestDir = cmSystemTools::IsOn(this->GetOption("CPACK_SET_DESTDIR"));
+  bool setDestDir = cmSystemTools::IsOn(this->GetOption("CPACK_SET_DESTDIR"))
+                  | cmSystemTools::IsInternallyOn(this->GetOption("CPACK_SET_DESTDIR"));
   if (!setDestDir)
     {
     tempInstallDirectoryStr += this->GetPackagingInstallPrefix();
@@ -414,7 +415,8 @@ int cmCPackGenerator::InstallProjectViaInstallScript(
         // underneath the tempInstallDirectory. The value of the project's
         // CMAKE_INSTALL_PREFIX is sent in here as the value of the
         // CPACK_INSTALL_PREFIX variable.
-       std::string dir;
+
+        std::string dir;
         if (this->GetOption("CPACK_INSTALL_PREFIX"))
           {
           dir += this->GetOption("CPACK_INSTALL_PREFIX");
@@ -643,6 +645,16 @@ int cmCPackGenerator::InstallProjectViaInstallCMakeProjects(
           // value of the project's CMAKE_INSTALL_PREFIX is sent in here as
           // the value of the CPACK_INSTALL_PREFIX variable.
           //
+          // If DESTDIR has been 'internally set ON' this means that
+          // the underlying CPack specific generator did ask for that
+          // In this case we may overrode CPACK_INSTALL_PREFIX with
+          // CPACK_PACKAGING_INSTALL_PREFIX
+          // I know this is tricky and awkward but it's the price for
+          // CPACK_SET_DESTDIR backward compatibility.
+          if (cmSystemTools::IsInternallyOn(this->GetOption("CPACK_SET_DESTDIR")))
+            {
+            this->SetOption("CPACK_INSTALL_PREFIX",this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX"));
+            }
           std::string dir;
           if (this->GetOption("CPACK_INSTALL_PREFIX"))
             {

+ 5 - 1
Source/CPack/cmCPackRPMGenerator.cxx

@@ -11,6 +11,7 @@
 ============================================================================*/
 #include "cmCPackRPMGenerator.h"
 #include "cmCPackLog.h"
+#include "cmSystemTools.h"
 
 //----------------------------------------------------------------------
 cmCPackRPMGenerator::cmCPackRPMGenerator()
@@ -26,7 +27,10 @@ cmCPackRPMGenerator::~cmCPackRPMGenerator()
 int cmCPackRPMGenerator::InitializeInternal()
 {
   this->SetOptionIfNotSet("CPACK_PACKAGING_INSTALL_PREFIX", "/usr");
-
+  if (cmSystemTools::IsOff(this->GetOption("CPACK_SET_DESTDIR")))
+    {
+    this->SetOption("CPACK_SET_DESTDIR", "I_ON");
+    }
   return this->Superclass::InitializeInternal();
 }
 

+ 16 - 1
Source/cmSystemTools.cxx

@@ -283,7 +283,22 @@ void cmSystemTools::ReportLastSystemError(const char* msg)
   cmSystemTools::Error(m.c_str());
 }
 
- 
+bool cmSystemTools::IsInternallyOn(const char* val)
+{
+  if (!val)
+    {
+    return false;
+    }
+  std::basic_string<char> v = val;
+
+  for(std::basic_string<char>::iterator c = v.begin();
+      c != v.end(); c++)
+    {
+    *c = static_cast<char>(toupper(*c));
+    }
+  return (v == "I_ON" || v == "i_on");
+}
+
 bool cmSystemTools::IsOn(const char* val)
 {
   if (!val)

+ 6 - 0
Source/cmSystemTools.h

@@ -103,6 +103,12 @@ public:
       cmSystemTools::s_ErrorOccured = false;
     }
   
+  /**
+   * Does a string indicates that CMake/CPack/CTest internally
+   * forced this value. This is not the same as On, but this
+   * may be considered as "internally switched on".
+   */
+  static bool IsInternallyOn(const char* val);
   /** 
    * does a string indicate a true or on value ? This is not the same
    * as ifdef.