Jelajahi Sumber

ENH: Several NSIS features

Andy Cedilnik 20 tahun lalu
induk
melakukan
1d96f839d7

+ 22 - 14
Modules/CPack.cmake

@@ -16,6 +16,8 @@ cpack_set_if_not_set(CPACK_PACKAGE_NAME "${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")
+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")
@@ -25,6 +27,10 @@ cpack_set_if_not_set(CPACK_PACKAGE_DESCRIPTION_FILE
 # <project>-<major>.<minor>.<patch>-<release>-<platform>.<pkgtype>
 cpack_set_if_not_set(CPACK_PACKAGE_FILE_NAME
   "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}-${CMAKE_SYSTEM_NAME}")
+cpack_set_if_not_set(CPACK_PACKAGE_INSTALL_DIRECTORY
+  "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}")
+cpack_set_if_not_set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY
+  "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}")
 
 IF(NOT EXISTS "${CPACK_PACKAGE_DESCRIPTION_FILE}")
   MESSAGE(SEND_ERROR "CPack package description file: \"${CPACK_PACKAGE_DESCRIPTION_FILE}\" could not be found.")
@@ -36,7 +42,7 @@ IF(NOT CPACK_GENERATOR)
     IF(APPLE)
       SET(CPACK_GENERATOR "PackageMaker")
     ELSE(APPLE)
-      SET(CPACK_GENERATOR "TGZ")
+      SET(CPACK_GENERATOR "STGZ")
     ENDIF(APPLE)
   ELSE(UNIX)
     SET(CPACK_GENERATOR "NSIS")
@@ -50,19 +56,21 @@ SET(CPACK_BINARY_DIR "${CMAKE_BINARY_DIR}")
 # Search for system runtime libraries based on the platform.  This is
 # not complete because it is used only for the release process by the
 # developers.
-IF(MSVC)
-  STRING(REGEX REPLACE "\\\\" "/" SYSTEMROOT "$ENV{SYSTEMROOT}")
-  FOREACH(lib
-      "${SYSTEMROOT}/system32/mfc71.dll"
-      "${SYSTEMROOT}/system32/msvcp71.dll"
-      "${SYSTEMROOT}/system32/msvcr71.dll"
-      )
-    IF(EXISTS ${lib})
-      SET(CMake_INSTALL_SYSTEM_RUNTIME_LIBS
-        ${CMake_INSTALL_SYSTEM_RUNTIME_LIBS} ${lib})
-    ENDIF(EXISTS ${lib})
-  ENDFOREACH(lib)
-ENDIF(MSVC)
+IF(NOT CPACK_DISABLE_EXTRA_MSVC_LIBRARIES)
+  IF(MSVC)
+    STRING(REGEX REPLACE "\\\\" "/" SYSTEMROOT "$ENV{SYSTEMROOT}")
+    FOREACH(lib
+        "${SYSTEMROOT}/system32/mfc71.dll"
+        "${SYSTEMROOT}/system32/msvcp71.dll"
+        "${SYSTEMROOT}/system32/msvcr71.dll"
+        )
+      IF(EXISTS ${lib})
+        SET(CMake_INSTALL_SYSTEM_RUNTIME_LIBS
+          ${CMake_INSTALL_SYSTEM_RUNTIME_LIBS} ${lib})
+      ENDIF(EXISTS ${lib})
+    ENDFOREACH(lib)
+  ENDIF(MSVC)
+ENDIF(NOT CPACK_DISABLE_EXTRA_MSVC_LIBRARIES)
 
 # Include system runtime libraries in the installation if any are
 # specified by CMake_INSTALL_SYSTEM_RUNTIME_LIBS.

+ 10 - 8
Modules/NSIS.template.in

@@ -19,7 +19,7 @@
   !include "MUI.nsh"
 
   ;Default installation folder
-  InstallDir "$PROGRAMFILES\@CPACK_PACKAGE_NAME@ ${VERSION}"  
+  InstallDir "$PROGRAMFILES\@CPACK_PACKAGE_INSTALL_DIRECTORY@"  
 
 ;--------------------------------
 ; determine admin versus local install
@@ -51,7 +51,7 @@ FunctionEnd
 ;General
 
   ;Name and file
-  Name "@CPACK_PACKAGE_NAME@ ${VERSION}"
+  Name "@CPACK_PACKAGE_INSTALL_DIRECTORY@"
   OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@"
 
 ;--------------------------------
@@ -312,7 +312,7 @@ FunctionEnd
   
   ;Start Menu Folder Page Configuration
   !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" 
-  !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_NAME@ ${VERSION}" 
+  !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" 
   !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
   !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
 
@@ -344,10 +344,8 @@ Section "Dummy Section" SecDummy
   SetOutPath "$INSTDIR"
   File /r "${INST_DIR}\*.*"
 
-  @CPACK_NSIS_EXTRA_COMMANDS@
-
   ;Store installation folder
-  WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_NAME@ ${VERSION}" "" $INSTDIR
+  WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR
   
   ;Create uninstaller
   WriteUninstaller "$INSTDIR\Uninstall.exe"
@@ -359,6 +357,8 @@ Section "Dummy Section" SecDummy
 @CPACK_NSIS_CREATE_ICONS@
 @CPACK_NSIS_CREATE_EXTRA_ICONS@
   CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+
+@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@
   
   !insertmacro MUI_STARTMENU_WRITE_END
 
@@ -395,6 +395,8 @@ FunctionEnd
 
 Section "Uninstall"
 
+@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@
+
   ;Remove files we installed.
   ;Keep the list of directories here in sync with the File commands above.
 @CPACK_NSIS_DELETE_FILES@
@@ -407,7 +409,7 @@ Section "Uninstall"
   RMDir "$INSTDIR"
 
   ; Remove the registry entries.
-  DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_NAME@ ${VERSION}"
+  DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
 
   !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP
     
@@ -428,7 +430,7 @@ Section "Uninstall"
     StrCmp $MUI_TEMP $SMPROGRAMS startMenuDeleteLoopDone startMenuDeleteLoop
   startMenuDeleteLoopDone:
 
-  DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_NAME@ ${VERSION}"
+  DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@"
 
   Push $INSTDIR\bin
   Call un.RemoveFromPath

+ 31 - 1
Source/CPack/cmCPackNSISGenerator.cxx

@@ -27,6 +27,7 @@
 #include <cmsys/SystemTools.hxx>
 #include <cmsys/Glob.hxx>
 #include <cmsys/Directory.hxx>
+#include <cmsys/RegularExpression.hxx>
 
 //----------------------------------------------------------------------
 cmCPackNSISGenerator::cmCPackNSISGenerator()
@@ -129,8 +130,37 @@ int cmCPackNSISGenerator::Initialize(const char* name, cmMakefile* mf)
     cmCPackLogger(cmCPackLog::LOG_ERROR, "Cannot find NSIS compiler" << std::endl);
     return 0;
     }
-  this->SetOption("CPACK_INSTALLER_PROGRAM", nsisPath.c_str());
+  std::string nsisCmd = "\"" + nsisPath + "\" /VERSION";
+  cmCPackLogger(cmCPackLog::LOG_VERBOSE, "Test NSIS version: " << nsisCmd.c_str() << std::endl);
+  std::string output;
+  int retVal = 1;
+  bool resS = cmSystemTools::RunSingleCommand(nsisCmd.c_str(), &output, &retVal, 0, m_GeneratorVerbose, 0);
+
+  cmsys::RegularExpression versionRex("v([0-9]+.[0-9]+)");
+  if ( !resS || retVal || !versionRex.find(output))
+    {
+    std::string tmpFile = this->GetOption("CPACK_TOPLEVEL_DIRECTORY");
+    tmpFile += "/NSISOutput.log";
+    cmGeneratedFileStream ofs(tmpFile.c_str());
+    ofs << "# Run command: " << nsisCmd.c_str() << std::endl
+      << "# Output:" << std::endl
+      << output.c_str() << std::endl;
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem checking NSIS version with command: " << nsisCmd.c_str() << std::endl
+      << "Please check " << tmpFile.c_str() << " for errors" << std::endl);
+    return 0;
+    }
+  float nsisVersion = atof(versionRex.match(1).c_str());
+  float minNSISVersion = 2.09;
+  cmCPackLogger(cmCPackLog::LOG_DEBUG, "NSIS Version: "
+    << nsisVersion << std::endl);
+  if ( nsisVersion < minNSISVersion )
+    {
+    cmCPackLogger(cmCPackLog::LOG_ERROR, "CPack requires NSIS Version 2.09 or greater. NSIS found on the system was: "
+      << nsisVersion << std::endl);
+    return 0;
+    }
 
+  this->SetOption("CPACK_INSTALLER_PROGRAM", nsisPath.c_str());
   const char* cpackPackageExecutables = this->GetOption("CPACK_PACKAGE_EXECUTABLES");
   if ( cpackPackageExecutables )
     {

+ 2 - 1
Templates/CPackConfig.cmake.in

@@ -1,7 +1,8 @@
 SET(CPACK_GENERATOR "@CPACK_GENERATOR@")
 
 SET(CPACK_PACKAGE_NAME "@CPACK_PACKAGE_NAME@")
-
+SET(CPACK_PACKAGE_INSTALL_DIRECTORY "@CPACK_PACKAGE_INSTALL_DIRECTORY@")
+SET(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@")
 SET(CPACK_PACKAGE_VERSION_MAJOR "@CPACK_PACKAGE_VERSION_MAJOR@")
 SET(CPACK_PACKAGE_VERSION_MINOR "@CPACK_PACKAGE_VERSION_MINOR@")
 SET(CPACK_PACKAGE_VERSION_PATCH "@CPACK_PACKAGE_VERSION_PATCH@")