Jelajahi Sumber

ENH: Several CPack fixes. First, allow user to set CMAKE_MODULE_PATH for CPack; make SetOptionIfNotSet more robust to handle empty options; do test TGZ, STGZ, and TZ, Add handling (and test) of Install Script; set environment variable CMAKE_INSTALL_PREFIX

Andy Cedilnik 19 tahun lalu
induk
melakukan
e31dc3abe5

+ 2 - 0
Modules/CPack.cmake

@@ -56,6 +56,8 @@ cpack_set_if_not_set(CPACK_RESOURCE_FILE_README
 cpack_set_if_not_set(CPACK_RESOURCE_FILE_WELCOME
 cpack_set_if_not_set(CPACK_RESOURCE_FILE_WELCOME
   "${CMAKE_ROOT}/Templates/CPack.GenericWelcome.txt")
   "${CMAKE_ROOT}/Templates/CPack.GenericWelcome.txt")
 
 
+cpack_set_if_not_set(CPACK_MODULE_PATH "${CMAKE_MODULE_PATH}")
+
 IF(CPACK_NSIS_MODIFY_PATH)
 IF(CPACK_NSIS_MODIFY_PATH)
   SET(CPACK_NSIS_MODIFY_PATH ON)
   SET(CPACK_NSIS_MODIFY_PATH ON)
 ENDIF(CPACK_NSIS_MODIFY_PATH)
 ENDIF(CPACK_NSIS_MODIFY_PATH)

+ 53 - 1
Source/CPack/cmCPackGenericGenerator.cxx

@@ -184,6 +184,14 @@ int cmCPackGenericGenerator::InstallProject()
     return 0;
     return 0;
     }
     }
 
 
+  // If the CPackConfig file sets CPACK_INSTALL_SCRIPT then run them
+  // as listed
+  if ( !this->InstallProjectViaInstallScript(
+      movable, tempInstallDirectory) )
+    {
+    return 0;
+    }
+
   // If the CPackConfig file sets CPACK_INSTALLED_DIRECTORIES
   // If the CPackConfig file sets CPACK_INSTALLED_DIRECTORIES
   // then glob it and copy it to CPACK_TEMPORARY_DIRECTORY
   // then glob it and copy it to CPACK_TEMPORARY_DIRECTORY
   // This is used in Source packageing
   // This is used in Source packageing
@@ -258,6 +266,9 @@ int cmCPackGenericGenerator::InstallProjectViaInstallCommands(
   const char* installCommands = this->GetOption("CPACK_INSTALL_COMMANDS");
   const char* installCommands = this->GetOption("CPACK_INSTALL_COMMANDS");
   if ( installCommands && *installCommands )
   if ( installCommands && *installCommands )
     {
     {
+    std::string tempInstallDirectoryEnv = "CMAKE_INSTALL_PREFIX=";
+    tempInstallDirectoryEnv += tempInstallDirectory;
+    cmSystemTools::PutEnv(tempInstallDirectoryEnv.c_str());
     std::vector<std::string> installCommandsVector;
     std::vector<std::string> installCommandsVector;
     cmSystemTools::ExpandListArgument(installCommands,installCommandsVector);
     cmSystemTools::ExpandListArgument(installCommands,installCommandsVector);
     std::vector<std::string>::iterator it;
     std::vector<std::string>::iterator it;
@@ -390,6 +401,46 @@ int cmCPackGenericGenerator::InstallProjectViaInstalledDirectories(
   return 1;
   return 1;
 }
 }
 
 
+//----------------------------------------------------------------------
+int cmCPackGenericGenerator::InstallProjectViaInstallScript(
+  bool movable, const char* tempInstallDirectory)
+{
+  const char* cmakeScripts
+    = this->GetOption("CPACK_INSTALL_SCRIPT");
+  std::string currentWorkingDirectory =
+    cmSystemTools::GetCurrentWorkingDirectory();
+  cmCPackLogger(cmCPackLog::LOG_OUTPUT,
+    "- Install scripts: " << cmakeScripts << std::endl);
+  if ( cmakeScripts && *cmakeScripts )
+    {
+    std::vector<std::string> cmakeScriptsVector;
+    cmSystemTools::ExpandListArgument(cmakeScripts,
+      cmakeScriptsVector);
+    std::vector<std::string>::iterator it;
+    for ( it = cmakeScriptsVector.begin();
+      it != cmakeScriptsVector.end();
+      ++it )
+      {
+      std::string installScript = it->c_str();
+
+      cmCPackLogger(cmCPackLog::LOG_OUTPUT,
+        "- Install script: " << installScript << std::endl);
+      if ( movable )
+        {
+        this->SetOption("CMAKE_INSTALL_PREFIX", tempInstallDirectory);
+        }
+      this->SetOptionIfNotSet("CMAKE_CURRENT_BINARY_DIR", tempInstallDirectory);
+      this->SetOptionIfNotSet("CMAKE_CURRENT_SOURCE_DIR", tempInstallDirectory);
+      int res = this->MakefileMap->ReadListFile(0, installScript.c_str());
+      if ( cmSystemTools::GetErrorOccuredFlag() || !res )
+        {
+        return 0;
+        }
+      }
+    }
+  return 1;
+}
+
 //----------------------------------------------------------------------
 //----------------------------------------------------------------------
 int cmCPackGenericGenerator::InstallProjectViaInstallCMakeProjects(
 int cmCPackGenericGenerator::InstallProjectViaInstallCMakeProjects(
   bool movable, const char* tempInstallDirectory)
   bool movable, const char* tempInstallDirectory)
@@ -535,7 +586,8 @@ int cmCPackGenericGenerator::InstallProjectViaInstallCMakeProjects(
 void cmCPackGenericGenerator::SetOptionIfNotSet(const char* op,
 void cmCPackGenericGenerator::SetOptionIfNotSet(const char* op,
   const char* value)
   const char* value)
 {
 {
-  if ( this->MakefileMap->GetDefinition(op) )
+  const char* def = this->MakefileMap->GetDefinition(op);
+  if ( def && *def )
     {
     {
     return;
     return;
     }
     }

+ 2 - 0
Source/CPack/cmCPackGenericGenerator.h

@@ -110,6 +110,8 @@ protected:
   //! Run install commands if specified
   //! Run install commands if specified
   virtual int InstallProjectViaInstallCommands(
   virtual int InstallProjectViaInstallCommands(
     bool movable, const char* tempInstallDirectory);
     bool movable, const char* tempInstallDirectory);
+  virtual int InstallProjectViaInstallScript(
+    bool movable, const char* tempInstallDirectory);
   virtual int InstallProjectViaInstalledDirectories(
   virtual int InstallProjectViaInstalledDirectories(
     bool movable, const char* tempInstallDirectory);
     bool movable, const char* tempInstallDirectory);
   virtual int InstallProjectViaInstallCMakeProjects(
   virtual int InstallProjectViaInstallCMakeProjects(

+ 5 - 0
Source/CPack/cpack.cxx

@@ -301,6 +301,11 @@ int main (int argc, char *argv[])
       globalMF->AddDefinition(cdit->first.c_str(), cdit->second.c_str());
       globalMF->AddDefinition(cdit->first.c_str(), cdit->second.c_str());
       }
       }
 
 
+    const char* cpackModulesPath = globalMF->GetDefinition("CPACK_MODULE_PATH");
+    if ( cpackModulesPath )
+      {
+      globalMF->AddDefinition("CMAKE_MODULE_PATH", cpackModulesPath);
+      }
     const char* genList = globalMF->GetDefinition("CPACK_GENERATOR");
     const char* genList = globalMF->GetDefinition("CPACK_GENERATOR");
     if ( !genList )
     if ( !genList )
       {
       {

+ 2 - 1
Tests/SimpleInstall/CMakeLists.txt

@@ -218,6 +218,7 @@ ENDIF(CMAKE_CONFIGURATION_TYPES)
 # Dummy test of CPack
 # Dummy test of CPack
 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Test of packaging with cpack")
 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Test of packaging with cpack")
 SET(CPACK_PACKAGE_VENDOR "Kitware")
 SET(CPACK_PACKAGE_VENDOR "Kitware")
+SET(CPACK_INSTALL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/PackageScript.cmake")
 
 
 IF(WIN32 AND NOT UNIX)
 IF(WIN32 AND NOT UNIX)
   FIND_PROGRAM(NSIS_MAKENSIS NAMES makensis
   FIND_PROGRAM(NSIS_MAKENSIS NAMES makensis
@@ -229,7 +230,7 @@ IF(WIN32 AND NOT UNIX)
   ENDIF(NOT NSIS_MAKENSIS)
   ENDIF(NOT NSIS_MAKENSIS)
 ENDIF(WIN32 AND NOT UNIX)
 ENDIF(WIN32 AND NOT UNIX)
 IF(UNIX AND NOT APPLE)
 IF(UNIX AND NOT APPLE)
-  #  SET(CPACK_GENERATOR "TGZ;STGZ")
+  SET(CPACK_GENERATOR "TGZ;STGZ;TZ")
   #  FIND_PROGRAM(found_compress
   #  FIND_PROGRAM(found_compress
   #    NAMES compress)
   #    NAMES compress)
   #  IF(found_compress)
   #  IF(found_compress)

+ 2 - 1
Tests/SimpleInstallS2/CMakeLists.txt

@@ -218,6 +218,7 @@ ENDIF(CMAKE_CONFIGURATION_TYPES)
 # Dummy test of CPack
 # Dummy test of CPack
 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Test of packaging with cpack")
 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Test of packaging with cpack")
 SET(CPACK_PACKAGE_VENDOR "Kitware")
 SET(CPACK_PACKAGE_VENDOR "Kitware")
+SET(CPACK_INSTALL_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/PackageScript.cmake")
 
 
 IF(WIN32 AND NOT UNIX)
 IF(WIN32 AND NOT UNIX)
   FIND_PROGRAM(NSIS_MAKENSIS NAMES makensis
   FIND_PROGRAM(NSIS_MAKENSIS NAMES makensis
@@ -229,7 +230,7 @@ IF(WIN32 AND NOT UNIX)
   ENDIF(NOT NSIS_MAKENSIS)
   ENDIF(NOT NSIS_MAKENSIS)
 ENDIF(WIN32 AND NOT UNIX)
 ENDIF(WIN32 AND NOT UNIX)
 IF(UNIX AND NOT APPLE)
 IF(UNIX AND NOT APPLE)
-  #  SET(CPACK_GENERATOR "TGZ;STGZ")
+  SET(CPACK_GENERATOR "TGZ;STGZ;TZ")
   #  FIND_PROGRAM(found_compress
   #  FIND_PROGRAM(found_compress
   #    NAMES compress)
   #    NAMES compress)
   #  IF(found_compress)
   #  IF(found_compress)