From 1d96f839d7e67548e51b8d3729cf74ea167e4e08 Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Thu, 23 Feb 2006 09:38:40 -0500 Subject: ENH: Several NSIS features --- Modules/CPack.cmake | 36 +++++++++++++++++++++-------------- Modules/NSIS.template.in | 18 ++++++++++-------- Source/CPack/cmCPackNSISGenerator.cxx | 32 ++++++++++++++++++++++++++++++- Templates/CPackConfig.cmake.in | 3 ++- 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 # -..--. 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 #include #include +#include //---------------------------------------------------------------------- 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@") -- cgit v0.12