WSJT-X/CMakeCPackOptions.cmake.in
Bill Somerville 46064e3af3 Add on-line KVASD install to Windows NSIS installer
To comply  with the  WSJT_X GPL  v3 license,  the closed  source KVASD
executable  must  be  delivered   separately  and  optionally  to  end
users. To facilitate  this a new install option has  been added to the
Windows  installer  to install  KVASD  by  downloading it  at  install
time. The installer  first downloads the KVASD EULA  from the Internet
and presents it  to the user for reading and  agreement.  If agreement
is  given  the  KVASD  binary  is downloaded  from  the  Internet  and
checksummed using an  MD5 hash, if that passes, it  is installed along
with WSJT-X.  An  uninstall record is also written to  ensure that, if
installed, KVASD will be un-installed if WSJT-X is un-installed.

To facilitate this enhancment to the NSIS installer the standard CPack
NSIS  installer script  template has  been overridden  with a  project
specific version.   This version also  implements the more  modern and
recomended nsDialogs mechanism for  installer custom page construction
including the install options page. See CMake/Modules/NSIS.template.in
for  details   and  CMakeCPackOptions.cmake.in   for  usage   in  this
installer.

Merged from branch wsjtx-1.4.



git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@4663 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
2014-11-27 17:17:19 +00:00

275 lines
9.8 KiB
CMake

# This file is configured at cmake time, and loaded at cpack time.
# To pass variables to cpack from cmake, they must be configured
# in this file.
set (CPACK_PACKAGE_VENDOR "@PROJECT_VENDOR@")
set (CPACK_PACKAGE_CONTACT "@PROJECT_CONTACT@")
set (CPACK_PACKAGE_DESCRIPTION_FILE "@PROJECT_SOURCE_DIR@/Copyright.txt")
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "@PROJECT_SUMMARY_DESCRIPTION@")
set (CPACK_RESOURCE_FILE_LICENSE "@PROJECT_SOURCE_DIR@/license.txt")
set (CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
set (CPACK_PACKAGE_EXECUTABLES wsjtx "@PROJECT_NAME@")
set (CPACK_CREATE_DESKTOP_LINKS wsjtx)
set (CPACK_STRIP_FILES TRUE)
#
# components
#
#set (CPACK_COMPONENTS_ALL runtime kvasd)
#set (CPACK_COMPONENT_RUNTIME_DISPLAY_NAME "@PROJECT_NAME@ Application")
#set (CPACK_COMPONENT_RUNTIME_DESCRIPTION "@WSJTX_DESCRIPTION_SUMMARY@")
#set (CPACK_COMPONENT_KVASD_DISPLAY_NAME "KVASD Reed Solomon Decoder")
#set (CPACK_COMPONENT_KVASD_DESCRIPTION "Optional decoder component")
if (CPACK_GENERATOR MATCHES "NSIS")
set (CPACK_STRIP_FILES FALSE) # breaks Qt packaging on Windows
set (CPACK_NSIS_INSTALL_ROOT "C:\\WSJT")
# set the install/unistall icon used for the installer itself
# There is a bug in NSI that does not handle full unix paths properly.
set (CPACK_NSIS_MUI_ICON "@PROJECT_SOURCE_DIR@/icons/windows-icons\\wsjtx.ico")
set (CPACK_NSIS_MUI_UNIICON "@PROJECT_SOURCE_DIR@/icons/windows-icons\\wsjtx.ico")
# set the package header icon for MUI
set (CPACK_PACKAGE_ICON "@PROJECT_SOURCE_DIR@/icons/windows-icons\\installer_logo.bmp")
# tell cpack to create links to the doc files
set (CPACK_NSIS_MENU_LINKS
"@PROJECT_MANUAL_DIRECTORY_URL@/@PROJECT_MANUAL@" "@PROJECT_NAME@ Documentation"
"@PROJECT_HOMEPAGE@" "@PROJECT_NAME@ Web Site"
)
# Use the icon from wsjtx for add-remove programs
set (CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\wsjtx.exe")
set (CPACK_NSIS_DISPLAY_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
set (CPACK_NSIS_HELP_LINK "@PROJECT_MANUAL_DIRECTORY_URL@/@PROJECT_MANUAL@")
set (CPACK_NSIS_URL_INFO_ABOUT "@PROJECT_HOMEPAGE@")
set (CPACK_NSIS_CONTACT "${CPACK_PACKAGE_CONTACT}")
set (CPACK_NSIS_MUI_FINISHPAGE_RUN "wsjtx.exe")
set (CPACK_NSIS_MODIFY_PATH ON)
set (CPACK_NSIS_EXTRA_DEFINES "
;
; enable local plugins
;
!ifdef NSIS_WIN32_MAKENSIS
!define NSISCONF_3 ';' ; NSIS 2 tries to parse some preprocessor instructions inside \"!if 0\" blocks!
!addincludedir '@CMAKE_CURRENT_SOURCE_DIR@\\contrib\\NSIS\\Include'
!if \${NSIS_PACKEDVERSION} > 0x02ffffff ; NSIS 3+:
!define /redef NSISCONF_3 ''
\${NSISCONF_3} !addplugindir /x86-ansi '@CMAKE_CURRENT_SOURCE_DIR@\\contrib\\NSIS\\Plugins-i386-ansi'
\${NSISCONF_3} !addplugindir /x86-unicode '@CMAKE_CURRENT_SOURCE_DIR@\\contrib\\NSIS\\Plugins-i386-unicode'
!else ; NSIS 2:
!addplugindir '@CMAKE_CURRENT_SOURCE_DIR@\\contrib\\NSIS\\Plugins-i386-ansi'
!endif ;~ NSIS_PACKEDVERSION
!undef NSISCONF_3
!endif ;~ NSIS_WIN32_MAKENSIS
; global variables
Var KVASD_EXECUTABLE
Var CB_INSTALL_KVASD
Var INSTALL_KVASD
Var RichEditLicense
Var CheckBoxAgree
Var KVASD_LICENSE
; page callbacks
Function KVASD_page_create
Push $R0
\${If} $INSTALL_KVASD = \${BST_CHECKED}
\${AndIfNot} \${FileExists} $KVASD_LICENSE
GetTempFileName $KVASD_LICENSE
retry_eula:
NSISdl::download /TIMEOUT=30000 @PROJECT_KVASD_URL@/kvasd_eula.txt $KVASD_LICENSE
Pop $R0
\${If} $R0 != success
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION 'Download: @PROJECT_KVASD_URL@/kvasd_eula.txt$\\nFailed: $R0' IDRETRY retry_eula
StrCpy $INSTALL_KVASD \${BST_UNCHECKED}
Delete $KVASD_LICENSE
\${EndIf}
\${EndIf}
\${If} $INSTALL_KVASD = \${BST_CHECKED}
\${AndIf} \${FileExists} $KVASD_LICENSE
!insertmacro MUI_HEADER_TEXT `$(MUI_TEXT_LICENSE_TITLE)` `Please agree the terms of this license before installing KVASD`
; disable install button until agreed
GetDlgItem $R0 $HWNDPARENT 1
EnableWindow $R0 0
nsDialogs::Create 1018
Pop $R0
; \${If} $R0 == error
; Abort
; \${EndIf}
nsDialogs::CreateControl RichEdit20A \${WS_VISIBLE}|\${WS_CHILD}|\${WS_TABSTOP}|\${WS_VSCROLL}|\${ES_MULTILINE}|\${ES_READONLY} \${__NSD_Text_EXSTYLE} 0 0 100% -24u ''
Pop $RichEditLicense
nsRichEdit::Load $RichEditLicense $KVASD_LICENSE
\${NSD_CreateCheckBox} 0 -20u 160u 12u `$(^AcceptBtn)`
Pop $CheckBoxAgree
\${NSD_OnClick} $CheckBoxAgree KVASD_Page_CheckBoxAgree_Click
nsDialogs::Show
\${Else}
Abort ; skip page
\${EndIf}
Pop $R0
FunctionEnd
Function KVASD_page_leave
FunctionEnd
; field callbacks
Function KVASD_Page_CheckBoxAgree_Click
Pop $0
\${NSD_GetState} $CheckBoxAgree $R0
\${If} $R0 = \${BST_CHECKED}
GetDlgItem $R0 $HWNDPARENT 1
EnableWindow $R0 1
\${Else}
GetDlgItem $R0 $HWNDPARENT 1
EnableWindow $R0 0
\${EndIf}
FunctionEnd"
)
set (CPACK_NSIS_EXTRA_INIT_COMMANDS "
; initial value of $INSATLL_KVASD chack box
IntOp $INSTALL_KVASD 0 + \${BST_CHECKED}"
)
set (CPACK_NSIS_EXTRA_PAGES "
; custom page for KVASD license display and acceptance
Page custom KVASD_page_create KVASD_page_leave"
)
set (CPACK_NSIS_EXTRA_INSTALL_OPTIONS "
; add a chackbox for installing KVASD
\${NSD_CreateCheckBox} 0u 110u 100% 10u 'Install the optional KVASD decoder'
Pop $CB_INSTALL_KVASD
\${NSD_SetState} $CB_INSTALL_KVASD $INSTALL_KVASD"
)
set (CPACK_NSIS_EXTRA_INSTALL_OPTIONS_READ "
\${NSD_GetState} $CB_INSTALL_KVASD $INSTALL_KVASD"
)
set (CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "
\${If} $INSTALL_KVASD = \${BST_CHECKED}
;
; fetch KVASD license
;
StrCpy $5 @PROJECT_KVASD_URL@/@SYSTEM_NAME@/kvasd@CMAKE_EXECUTABLE_SUFFIX@
GetTempFileName $1
retry:
NSISdl::download /TIMEOUT=30000 $5.md5 $1
Pop $R0
\${If} $R0 != success
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION 'Download: $5.md5$\\nFailed: $R0' IDRETRY retry
Abort
\${EndIf}
ClearErrors
FileOpen $2 $1 r
\${If} \${Errors}
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION 'Failed to read MD5 hash file: $5.md5' IDRETRY retry
Abort
\${EndIf}
; extract MD5 hash
FileRead $2 $3 32
FileClose $2
;
; fetch kvasd executable
;
GetTempFileName $KVASD_EXECUTABLE
NSISdl::download /TIMEOUT=30000 $5 $KVASD_EXECUTABLE
Pop $R0
\${If} $R0 != success
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION 'Download: $5$\\nFailed: $R0' IDRETRY retry
Abort
\${EndIf}
; calculate MD5 hash
Crypto::HashFile 'MD5' $KVASD_EXECUTABLE
Pop $0
\${If} $3 != $0
MessageBox MB_RETRYCANCEL|MB_ICONQUESTION 'MD5 hash check failed on: $5$\\nExpected: [$4]$\\n Actual: [$0]' IDRETRY retry
Abort
\${EndIf}
skip_kvasd:
Delete $1 ; MD5 hash file
\${EndIf}
; save $INSTALL_KVASD to registry for use in teh un-installer
WriteRegDWORD SHCTX 'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${CPACK_PACKAGE_INSTALL_REGISTRY_KEY}' \\
'InstallKvasd' $INSTALL_KVASD"
)
set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
; install the kvasd executable
\${If} $INSTALL_KVASD = \${BST_CHECKED}
\${AndIf} \${FileExists} $KVASD_EXECUTABLE
DetailPrint 'Installing: $INSTDIR\\@WSJT_BIN_DESTINATION@\\kvasd@CMAKE_EXECUTABLE_SUFFIX@'
Rename $KVASD_EXECUTABLE '$INSTDIR\\@WSJT_BIN_DESTINATION@\\kvasd@CMAKE_EXECUTABLE_SUFFIX@'
\${EndIf}"
)
set (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
; fetch $INSTALL_KVASD from registry
ReadRegDWORD $INSTALL_KVASD SHCTX \\
'Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${CPACK_PACKAGE_INSTALL_REGISTRY_KEY}' 'InstallKvasd'
; conditionally un-install the kvasd executable
\${If} $INSTALL_KVASD = \${BST_CHECKED}
Delete '$INSTDIR\\@WSJT_BIN_DESTINATION@\\kvasd@CMAKE_EXECUTABLE_SUFFIX@'
\${EndIf}"
)
endif ()
if ("${CPACK_GENERATOR}" STREQUAL "PackageMaker")
set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}-pkg")
set (CPACK_PACKAGE_DEFAULT_LOCATION "/Applications")
set (CPACK_PACKAGING_INSTALL_PREFIX "/")
endif ()
if ("${CPACK_GENERATOR}" STREQUAL "DragNDrop")
set (CPACK_DMG_VOLUME_NAME "@PROJECT_NAME@")
set (CPACK_DMG_BACKGROUND_IMAGE "@PROJECT_SOURCE_DIR@/icons/Darwin/DragNDrop Background.png")
set (CPACK_DMG_DS_STORE "@PROJECT_SOURCE_DIR@/Darwin/wsjtx_DMG.DS_Store")
set (CPACK_BUNDLE_NAME "@WSJTX_BUNDLE_NAME@")
set (CPACK_PACKAGE_ICON "@PROJECT_BINARY_DIR@/wsjtx.icns")
set (CPACK_BUNDLE_ICON "@PROJECT_BINARY_DIR@/wsjtx.icns")
set (CPACK_BUNDLE_STARTUP_COMMAND "@PROJECT_SOURCE_DIR@/Mac-wsjtx-startup.sh")
endif ()
if ("${CPACK_GENERATOR}" STREQUAL "WIX")
# Reset CPACK_PACKAGE_VERSION to deal with WiX restriction.
# But the file names still use the full CMake_VERSION value:
set (CPACK_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-@wsjtx_VERSION@-${CPACK_SYSTEM_NAME}")
set (CPACK_SOURCE_PACKAGE_FILE_NAME
"${CPACK_PACKAGE_NAME}-@wsjtx_VERSION@-Source")
if (NOT CPACK_WIX_SIZEOF_VOID_P)
set (CPACK_WIX_SIZEOF_VOID_P "@CMAKE_SIZEOF_VOID_P@")
endif ()
endif ()
if ("${CPACK_GENERATOR}" STREQUAL "DEB")
set (CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE})
set (CPACK_COMPONENTS_ALL ${CPACK_COMPONENTS_ALL} Debian)
endif ("${CPACK_GENERATOR}" STREQUAL "DEB")
if ("${CPACK_GENERATOR}" STREQUAL "RPM")
set (CPACK_PACKAGE_FILE_NAME ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}.${CPACK_RPM_PACKAGE_ARCHITECTURE})
endif ("${CPACK_GENERATOR}" STREQUAL "RPM")
message (STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")