فهرست منبع

ENH: Add support for preinstall for cmake generated projects when packaging them

Andy Cedilnik 20 سال پیش
والد
کامیت
bad1215a85
4فایلهای تغییر یافته به همراه68 افزوده شده و 14 حذف شده
  1. 3 2
      Modules/CPack.cmake
  2. 56 2
      Source/CPack/cmCPackGenericGenerator.cxx
  3. 8 8
      Source/cmGlobalGenerator.h
  4. 1 2
      Source/ctest.cxx

+ 3 - 2
Modules/CPack.cmake

@@ -12,7 +12,7 @@ MACRO(cpack_set_if_not_set name value)
 ENDMACRO(cpack_set_if_not_set)
 
 # Set the package name
-cpack_set_if_not_set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
+cpack_set_if_not_set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
 cpack_set_if_not_set(CPACK_PACKAGE_VERSION_MAJOR "0")
 cpack_set_if_not_set(CPACK_PACKAGE_VERSION_MINOR "1")
 cpack_set_if_not_set(CPACK_PACKAGE_VERSION_PATCH "1")
@@ -20,7 +20,7 @@ cpack_set_if_not_set(CPACK_PACKAGE_VERSION
   "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
 cpack_set_if_not_set(CPACK_PACKAGE_VENDOR "Humanity")
 cpack_set_if_not_set(CPACK_PACKAGE_DESCRIPTION_SUMMARY
-  "${PROJECT_NAME} built using CMake")
+  "${CMAKE_PROJECT_NAME} built using CMake")
 
 cpack_set_if_not_set(CPACK_PACKAGE_DESCRIPTION_FILE
   "${CMAKE_ROOT}/Templates/CPack.GenericDescription.txt")
@@ -70,6 +70,7 @@ ENDIF(NOT CPACK_GENERATOR)
 cpack_set_if_not_set(CPACK_BINARY_DIR "${CMAKE_BINARY_DIR}")
 cpack_set_if_not_set(CPACK_INSTALL_CMAKE_PROJECTS
   "${CMAKE_BINARY_DIR};${CMAKE_PROJECT_NAME}")
+cpack_set_if_not_set(CPACK_CMAKE_GENERATOR "${CMAKE_GENERATOR}")
 
 SET(_CPACK_UNUSED_VARIABLES_)
 GET_CMAKE_PROPERTY(res VARIABLES)

+ 56 - 2
Source/CPack/cmCPackGenericGenerator.cxx

@@ -225,14 +225,25 @@ int cmCPackGenericGenerator::InstallProject()
           {
           cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem copying file: "
             << inFile.c_str() << " -> " << filePath.c_str() << std::endl);
+          return 0;
           }
         }
       }
     }
   const char* cmakeProjects
     = this->GetOption("CPACK_INSTALL_CMAKE_PROJECTS");
+  const char* cmakeGenerator
+    = this->GetOption("CPACK_CMAKE_GENERATOR");
   if ( cmakeProjects )
     {
+    if ( !cmakeGenerator )
+      {
+      cmCPackLogger(cmCPackLog::LOG_ERROR,
+        "CPACK_INSTALL_CMAKE_PROJECTS is specified, but CPACK_CMAKE_GENERATOR "
+        "is not. CPACK_CMAKE_GENERATOR is required to install the project."
+        << std::endl);
+      return 0;
+      }
     std::vector<std::string> cmakeProjectsVector;
     cmSystemTools::ExpandListArgument(cmakeProjects,
       cmakeProjectsVector);
@@ -244,9 +255,53 @@ int cmCPackGenericGenerator::InstallProject()
       std::string installDirectory = it->c_str();
       ++it;
       std::string installProjectName = it->c_str();
+      std::string installFile = installDirectory + "/cmake_install.cmake";
+
+      const char* buildConfig = this->GetOption("CPACK_BUILD_CONFIG");
+      cmGlobalGenerator* globalGenerator 
+        = this->MakefileMap->GetCMakeInstance()->CreateGlobalGenerator(
+          cmakeGenerator);
+
+      // Does this generator require pre-install?
+      if ( globalGenerator->GetPreinstallTargetName() )
+        {
+        globalGenerator->FindMakeProgram(this->MakefileMap);
+        const char* cmakeMakeProgram
+          = this->MakefileMap->GetDefinition("CMAKE_MAKE_PROGRAM");
+        std::string buildCommand
+          = globalGenerator->GenerateBuildCommand(cmakeMakeProgram,
+            installProjectName.c_str(), 0, 
+            globalGenerator->GetPreinstallTargetName(),
+            buildConfig, false);
+        cmCPackLogger(cmCPackLog::LOG_DEBUG,
+          "- Install command: " << buildCommand << std::endl);
+        cmCPackLogger(cmCPackLog::LOG_OUTPUT,
+          "- Run preinstall target for: " << installProjectName << std::endl);
+        std::string output;
+        int retVal = 1;
+        bool resB = cmSystemTools::RunSingleCommand(buildCommand.c_str(), &output,
+          &retVal, installDirectory.c_str(), this->GeneratorVerbose, 0);
+        if ( !resB || retVal )
+          {
+          std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
+          tmpFile += "/PreinstallOutput.log";
+          cmGeneratedFileStream ofs(tmpFile.c_str());
+          ofs << "# Run command: " << buildCommand.c_str() << std::endl
+            << "# Directory: " << installDirectory.c_str() << std::endl
+            << "# Output:" << std::endl
+            << output.c_str() << std::endl;
+          cmCPackLogger(cmCPackLog::LOG_ERROR,
+            "Problem running install command: " << buildCommand.c_str()
+            << std::endl
+            << "Please check " << tmpFile.c_str() << " for errors"
+            << std::endl);
+          return 0;
+          }
+        }
+      delete globalGenerator;
+      
       cmCPackLogger(cmCPackLog::LOG_OUTPUT,
         "- Install project: " << installProjectName << std::endl);
-      std::string installFile = installDirectory + "/cmake_install.cmake";
       cmake cm;
       cmGlobalGenerator gg;
       gg.SetCMakeInstance(&cm);
@@ -257,7 +312,6 @@ int cmCPackGenericGenerator::InstallProject()
         {
         mf->AddDefinition("CMAKE_INSTALL_PREFIX", tempInstallDirectory);
         }
-      const char* buildConfig = this->GetOption("CPACK_BUILD_CONFIG");
       if ( buildConfig && *buildConfig )
         {
         mf->AddDefinition("BUILD_TYPE", buildConfig);

+ 8 - 8
Source/cmGlobalGenerator.h

@@ -175,6 +175,14 @@ public:
       configuration.  This is valid during generation only.  */
   cmTargetManifest const& GetTargetManifest() { return this->TargetManifest; }
 
+  virtual const char* GetAllTargetName()          { return "ALL_BUILD"; }
+  virtual const char* GetInstallTargetName()      { return "INSTALL"; }
+  virtual const char* GetPreinstallTargetName()   { return 0; }
+  virtual const char* GetTestTargetName()         { return "RUN_TESTS"; }
+  virtual const char* GetPackageTargetName()      { return "PACKAGE"; }
+  virtual const char* GetEditCacheTargetName()    { return 0; }
+  virtual const char* GetRebuildCacheTargetName() { return 0; }
+
 protected:
   // Fill the ProjectMap, this must be called after LocalGenerators 
   // has been populated.
@@ -189,14 +197,6 @@ protected:
     const cmCustomCommandLines* commandLines,
     std::vector<std::string> depends, bool depends_on_all = false);
 
-  virtual const char* GetAllTargetName()          { return "ALL_BUILD"; }
-  virtual const char* GetInstallTargetName()      { return "INSTALL"; }
-  virtual const char* GetPreinstallTargetName()   { return 0; }
-  virtual const char* GetTestTargetName()         { return "RUN_TESTS"; }
-  virtual const char* GetPackageTargetName()      { return "PACKAGE"; }
-  virtual const char* GetEditCacheTargetName()    { return 0; }
-  virtual const char* GetRebuildCacheTargetName() { return 0; }
-
   bool ForceUnixPaths;
   bool ToolSupportsColorVT100;
   cmStdString FindMakeProgramFile;

+ 1 - 2
Source/ctest.cxx

@@ -21,6 +21,7 @@
 #include "cmake.h"
 #include "cmDocumentation.h"
 
+
 //----------------------------------------------------------------------------
 static const cmDocumentationEntry cmDocumentationName[] =
 {
@@ -207,8 +208,6 @@ int main (int argc, char *argv[])
     nocwd = 1;
     }
 
-
-
   // If there is a testing input file, check for documentation options
   // only if there are actually arguments.  We want running without
   // arguments to run tests.