summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/CPack.cmake36
-rw-r--r--Modules/NSIS.template.in18
-rw-r--r--Source/CPack/cmCPackNSISGenerator.cxx32
-rw-r--r--Templates/CPackConfig.cmake.in3
4 files changed, 65 insertions, 24 deletions
diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake
index e0295a2..2a80741 100644
--- a/Modules/CPack.cmake
+++ b/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.
diff --git a/Modules/NSIS.template.in b/Modules/NSIS.template.in
index 97ad662..e84a112 100644
--- a/Modules/NSIS.template.in
+++ b/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
diff --git a/Source/CPack/cmCPackNSISGenerator.cxx b/Source/CPack/cmCPackNSISGenerator.cxx
index 31b48c2..baf0002 100644
--- a/Source/CPack/cmCPackNSISGenerator.cxx
+++ b/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 )
{
diff --git a/Templates/CPackConfig.cmake.in b/Templates/CPackConfig.cmake.in
index 656f442..be52b74 100644
--- a/Templates/CPackConfig.cmake.in
+++ b/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@")