From e7511b7fbe09a4007269992edcde2dc98144da47 Mon Sep 17 00:00:00 2001 From: Konstantin Podsvirov Date: Tue, 29 Jul 2014 01:58:37 +0400 Subject: [PATCH] CPackIFW: Add package configuration variables --- CMakeCPack.cmake | 1 + CMakeCPackOptions.cmake.in | 9 +++- Modules/CPackIFW.cmake | 40 ++++++++++++++-- Source/CPack/cmCPackIFWGenerator.cxx | 70 ++++++++++++++++++++++++++-- 4 files changed, 109 insertions(+), 11 deletions(-) diff --git a/CMakeCPack.cmake b/CMakeCPack.cmake index 5b096ade36..b27cd69d15 100644 --- a/CMakeCPack.cmake +++ b/CMakeCPack.cmake @@ -74,6 +74,7 @@ if(EXISTS "${CMAKE_ROOT}/Modules/CPack.cmake") string(TOUPPER ${_CPACK_IFW_COMPONENT_NAME} _CPACK_IFW_COMPONENT_UNAME) if(${CMAKE_SYSTEM_NAME} MATCHES Windows) + set(_CPACK_IFW_PACKAGE_ICON "set(CPACK_IFW_PACKAGE_ICON \"${CMake_SOURCE_DIR}/Source/QtDialog/CMakeSetup.ico\")") if(BUILD_QtDialog) set(_CPACK_IFW_SHORTCUT_OPTIONAL "${_CPACK_IFW_SHORTCUT_OPTIONAL}component.addOperation(\"CreateShortcut\", \"@TargetDir@/bin/cmake-gui.exe\", \"@StartMenuDir@/CMake (cmake-gui).lnk\");\n") endif() diff --git a/CMakeCPackOptions.cmake.in b/CMakeCPackOptions.cmake.in index 135c07df59..5127220882 100644 --- a/CMakeCPackOptions.cmake.in +++ b/CMakeCPackOptions.cmake.in @@ -34,12 +34,17 @@ include("@QT_DIALOG_CPACK_OPTIONS_FILE@" OPTIONAL) if(CPACK_GENERATOR MATCHES "IFW") # Version with QtIFW limitations set(CPACK_PACKAGE_VERSION "@_CPACK_IFW_PACKAGE_VERSION@") + # Installer configuration + set(CPACK_IFW_PACKAGE_TITLE "CMake Build Tool") + set(CPACK_IFW_PRODUCT_URL "http://www.cmake.org") + @_CPACK_IFW_PACKAGE_ICON@ + set(CPACK_IFW_PACKAGE_WINDOW_ICON "@CMake_SOURCE_DIR@/Source/QtDialog/CMakeSetup128.png") # Enable install default component set(CPACK_COMPONENTS_ALL "@_CPACK_IFW_COMPONENT_NAME@") - # Configuration + # Component configuration set(CPACK_COMPONENT_@_CPACK_IFW_COMPONENT_UNAME@_DISPLAY_NAME "@CPACK_PACKAGE_NAME@") set(CPACK_COMPONENT_@_CPACK_IFW_COMPONENT_UNAME@_DESCRIPTION "@CPACK_PACKAGE_DESCRIPTION_SUMMARY@") - # IFW Configuration + # IFW component onfiguration set(CPACK_IFW_COMPONENT_@_CPACK_IFW_COMPONENT_UNAME@_NAME "@CPACK_PACKAGE_NAME@") set(CPACK_IFW_COMPONENT_@_CPACK_IFW_COMPONENT_UNAME@_LICENSES "@CPACK_PACKAGE_NAME@ Copyright" "@CPACK_RESOURCE_FILE_LICENSE@") @_CPACK_IFW_COMPONENT_SCRIPT@ diff --git a/Modules/CPackIFW.cmake b/Modules/CPackIFW.cmake index 8207b5eccb..1f6de8f0da 100644 --- a/Modules/CPackIFW.cmake +++ b/Modules/CPackIFW.cmake @@ -29,8 +29,37 @@ # Variables # ^^^^^^^^^ # -# Variables that Change Behavior -# """""""""""""""""""""""""""""" +# You can use the following variables to change behavior of CPack ``IFW`` generator. +# +# Package +# """"""" +# +# .. variable:: CPACK_IFW_PACKAGE_TITLE +# +# Name of the installer as displayed on the title bar. +# By default used :variable:`CPACK_PACKAGE_DESCRIPTION_SUMMARY` +# +# .. variable:: CPACK_IFW_PACKAGE_PUBLISHER +# +# Publisher of the software (as shown in the Windows Control Panel). +# By default used :variable:`CPACK_PACKAGE_VENDOR` +# +# .. variable:: CPACK_IFW_PRODUCT_URL +# +# URL to a page that contains product information on your web site. +# +# .. variable:: CPACK_IFW_PACKAGE_ICON +# +# Filename for a custom installer icon. The actual file is '.icns' (Mac OS X), +# '.ico' (Windows). No functionality on Unix. +# +# .. variable:: CPACK_IFW_PACKAGE_WINDOW_ICON +# +# Filename for a custom window icon in PNG format for the Installer application. +# +# .. variable:: CPACK_IFW_PACKAGE_LOGO +# +# Filename for a logo used as QWizard::LogoPixmap. # # .. variable:: CPACK_IFW_TARGET_DIRECTORY # @@ -45,6 +74,9 @@ # # You can use predefined variables. # +# Components +# """""""""" +# # .. variable:: CPACK_IFW_RESOLVE_DUPLICATE_NAMES # # Resolve duplicate names when installing components with groups. @@ -54,8 +86,8 @@ # Additional prepared packages dirs that will be used to resolve # dependent components. # -# Advanced Variables -# """""""""""""""""" +# Advanced +# """""""" # # .. variable:: CPACK_IFW_BINARYCREATOR_EXECUTABLE # diff --git a/Source/CPack/cmCPackIFWGenerator.cxx b/Source/CPack/cmCPackIFWGenerator.cxx index 51c0f2ec9f..3a7f539a45 100644 --- a/Source/CPack/cmCPackIFWGenerator.cxx +++ b/Source/CPack/cmCPackIFWGenerator.cxx @@ -680,14 +680,19 @@ int cmCPackIFWGenerator::IfwCreateConfigFile() ifwPkgName = "Your package"; } - std::string ifwPkgDescription; - if (const char *name = this->GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) + std::string pkgTitle; + if (const char *title = this->GetOption("CPACK_IFW_PACKAGE_TITLE")) { - ifwPkgDescription = name; + pkgTitle = title; + } + else if (const char *description = + this->GetOption("CPACK_PACKAGE_DESCRIPTION_SUMMARY")) + { + pkgTitle = description; } else { - ifwPkgDescription = "Your package description"; + pkgTitle = "Your package description"; } std::string ifwPkgVersion; @@ -711,9 +716,64 @@ int cmCPackIFWGenerator::IfwCreateConfigFile() cfg << "" << std::endl; cfg << " " << cmXMLSafe(ifwPkgName).str() << "" << std::endl; cfg << " " << ifwPkgVersion << "" << std::endl; - cfg << " " << cmXMLSafe(ifwPkgDescription).str() << "" + cfg << " " << cmXMLSafe(pkgTitle).str() << "" << std::endl; + // Publisher + std::string ifwPublisher; + if(const char *publisher = GetOption("CPACK_IFW_PACKAGE_PUBLISHER")) + { + ifwPublisher = publisher; + } + else if(const char *vendor = GetOption("CPACK_PACKAGE_VENDOR")) + { + ifwPublisher = vendor; + } + if(!ifwPublisher.empty()) + { + cfg << " " << cmXMLSafe(ifwPublisher).str() + << "" << std::endl; + } + + // ProductUrl + if(const char *url = GetOption("CPACK_IFW_PRODUCT_URL")) + { + cfg << " " << url << "" << std::endl; + } + + // ApplicationIcon + const char *pkgApplicationIcon = GetOption("CPACK_IFW_PACKAGE_ICON"); + if(pkgApplicationIcon && cmSystemTools::FileExists(pkgApplicationIcon)) + { + std::string name = cmSystemTools::GetFilenameName(pkgApplicationIcon); + std::string path = this->toplevel + "/config/" + name; + name = cmSystemTools::GetFilenameWithoutExtension(name); + cmsys::SystemTools::CopyFileIfDifferent(pkgApplicationIcon, path.data()); + cfg << " " << name + << "" << std::endl; + } + + // WindowIcon + const char *pkgWindowIcon = GetOption("CPACK_IFW_PACKAGE_WINDOW_ICON"); + if(pkgWindowIcon && cmSystemTools::FileExists(pkgWindowIcon)) + { + std::string name = cmSystemTools::GetFilenameName(pkgWindowIcon); + std::string path = this->toplevel + "/config/" + name; + cmsys::SystemTools::CopyFileIfDifferent(pkgWindowIcon, path.data()); + cfg << " " << name + << "" << std::endl; + } + + // Logo + const char *pkgLogo = GetOption("CPACK_IFW_PACKAGE_LOGO"); + if(pkgLogo && cmSystemTools::FileExists(pkgLogo)) + { + std::string name = cmSystemTools::GetFilenameName(pkgLogo); + std::string path = this->toplevel + "/config/" + name; + cmsys::SystemTools::CopyFileIfDifferent(pkgLogo, path.data()); + cfg << " " << name << "" << std::endl; + } + // Default target directory for installation if (ifwTargetDir) {