From 3e03bca2cd532fe933a9f8d0dcecc1a9d22593e9 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Thu, 18 Oct 2007 09:40:10 -0400 Subject: ENH: add ability to create links on the start menu --- CMakeCPack.cmake | 16 ++++++++-- Modules/NSIS.template.in | 4 +-- Source/CPack/cmCPackNSISGenerator.cxx | 55 +++++++++++++++++++++++++++++++++++ Source/CPack/cmCPackNSISGenerator.h | 2 ++ 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/CMakeCPack.cmake b/CMakeCPack.cmake index eb98e6d..dba3e9f 100644 --- a/CMakeCPack.cmake +++ b/CMakeCPack.cmake @@ -41,8 +41,18 @@ IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") # There is a bug in NSI that does not handle full unix paths properly. Make # sure there is at least one set of four (4) backlasshes. SET(CPACK_PACKAGE_ICON "${CMake_SOURCE_DIR}/Utilities/Release\\\\CMakeInstall.bmp") - SET(CPACK_PACKAGE_EXECUTABLES "CMakeSetup" "CMake") - SET(CPACK_CREATE_DESKTOP_LINK_CMakeSetup 1) + # tell cpack the executables you want in the start menu as links + SET(CPACK_PACKAGE_EXECUTABLES "CMakeSetup" "CMake" ) + # tell cpack to create links to the doc files + SET(CPACK_NSIS_MENU_LINKS + "doc/cmake-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}/CMakeSetup.html" "CMakeSetup Help" + "doc/cmake-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}/cmake.html" "CMake Help" + "doc/cmake-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}/cmake-properties.html" + "CMake Properties and Variables Help" + "doc/cmake-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}/ctest.html" "CTest Help" + "doc/cmake-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}/cmake-modules.html" "CMake Modules Help" + "doc/cmake-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}/cmake-commands.html" "CMake Commands Help" + "doc/cmake-${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}/cpack.html" "CPack Help") SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\CMakeSetup.exe") SET(CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_INSTALL_DIRECTORY} a cross-platform, open-source build system") SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\www.cmake.org") @@ -82,7 +92,7 @@ IF(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") SET(CPACK_CYGWIN_PATCH_FILE "${CMake_BINARY_DIR}/@CPACK_PACKAGE_FILE_NAME@-@CPACK_CYGWIN_PATCH_NUMBER@.patch") # include the sub directory for cygwin releases - SUBDIRS(Utilities/Release/Cygwin) + INCLUDE(Utilities/Release/Cygwin) # when packaging source make sure the .build directory is not included SET(CPACK_SOURCE_IGNORE_FILES "/CVS/" "/\\\\.build/" "/\\\\.svn/" "\\\\.swp$" "\\\\.#" "/#" "~$") diff --git a/Modules/NSIS.template.in b/Modules/NSIS.template.in index d039bc5..976f435 100644 --- a/Modules/NSIS.template.in +++ b/Modules/NSIS.template.in @@ -409,8 +409,8 @@ FunctionEnd ;-------------------------------- ; Define some macro setting for the gui - !define CPACK_PACKAGE_ICON@CPACK_PACKAGE_ICON@ - !ifndef CPACK_PACKAGE_ICON + !define CPACK_PACKAGE_ICON "@CPACK_PACKAGE_ICON@" + !ifdef CPACK_PACKAGE_ICON !define MUI_HEADERIMAGE_BITMAP "@CPACK_PACKAGE_ICON@" !endif diff --git a/Source/CPack/cmCPackNSISGenerator.cxx b/Source/CPack/cmCPackNSISGenerator.cxx index b9db822..63d62bf 100644 --- a/Source/CPack/cmCPackNSISGenerator.cxx +++ b/Source/CPack/cmCPackNSISGenerator.cxx @@ -256,6 +256,7 @@ int cmCPackNSISGenerator::InitializeInternal() << ".lnk\"" << std::endl; } } + this->CreateMenuLinks(str, deleteStr); this->SetOptionIfNotSet("CPACK_NSIS_CREATE_ICONS", str.str().c_str()); this->SetOptionIfNotSet("CPACK_NSIS_DELETE_ICONS", deleteStr.str().c_str()); @@ -266,6 +267,60 @@ int cmCPackNSISGenerator::InitializeInternal() } //---------------------------------------------------------------------- +void cmCPackNSISGenerator::CreateMenuLinks( cmOStringStream& str, + cmOStringStream& deleteStr) +{ + const char* cpackMenuLinks + = this->GetOption("CPACK_NSIS_MENU_LINKS"); + if(!cpackMenuLinks) + { + return; + } + cmCPackLogger(cmCPackLog::LOG_DEBUG, "The cpackMenuLinks: " + << cpackMenuLinks << "." << std::endl); + std::vector cpackMenuLinksVector; + cmSystemTools::ExpandListArgument(cpackMenuLinks, + cpackMenuLinksVector); + if ( cpackMenuLinksVector.size() % 2 != 0 ) + { + cmCPackLogger(cmCPackLog::LOG_ERROR, + "CPACK_PACKAGE_EXECUTABLES should contain pairs of and " + "." << std::endl); + return; + } + std::vector::iterator it; + for ( it = cpackMenuLinksVector.begin(); + it != cpackMenuLinksVector.end(); + ++it ) + { + std::string sourceName = *it; + /* convert / to \\ */ + cmSystemTools::ReplaceString(sourceName, "/", "\\"); + ++ it; + std::string linkName = *it; + str << " CreateShortCut \"$SMPROGRAMS\\$STARTMENU_FOLDER\\" + << linkName << ".lnk\" \"$INSTDIR\\" << sourceName << "\"" + << std::endl; + deleteStr << " Delete \"$SMPROGRAMS\\$MUI_TEMP\\" << linkName + << ".lnk\"" << std::endl; + // see if CPACK_CREATE_DESKTOP_LINK_ExeName is on + // if so add a desktop link + std::string desktop = "CPACK_CREATE_DESKTOP_LINK_"; + desktop += linkName; + if(this->IsSet(desktop.c_str())) + { + str << " StrCmp \"$INSTALL_DESKTOP\" \"1\" 0 +2\n"; + str << " CreateShortCut \"$DESKTOP\\" + << linkName << ".lnk\" \"$INSTDIR\\" << sourceName << "\"" + << std::endl; + deleteStr << " StrCmp \"$INSTALL_DESKTOP\" \"1\" 0 +2\n"; + deleteStr << " Delete \"$DESKTOP\\" << linkName + << ".lnk\"" << std::endl; + } + } +} + +//---------------------------------------------------------------------- bool cmCPackNSISGenerator::GetListOfSubdirectories(const char* topdir, std::vector& dirs) { diff --git a/Source/CPack/cmCPackNSISGenerator.h b/Source/CPack/cmCPackNSISGenerator.h index ff075d6..0bd7763 100644 --- a/Source/CPack/cmCPackNSISGenerator.h +++ b/Source/CPack/cmCPackNSISGenerator.h @@ -39,6 +39,8 @@ public: protected: virtual int InitializeInternal(); + void CreateMenuLinks( cmOStringStream& str, + cmOStringStream& deleteStr); int CompressFiles(const char* outFileName, const char* toplevel, const std::vector& files); virtual const char* GetOutputExtension() { return ".exe"; } -- cgit v0.12