From ae242bee66ceca11300a265114fa19819bf4f989 Mon Sep 17 00:00:00 2001 From: beaglejoe Date: Tue, 4 Jun 2019 00:55:22 +0000 Subject: [PATCH] Added OPTION_PACKAGING to control custom packaging (WIP) git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@6669 30fe4595-0a0c-4342-8851-515496e4dcbd --- CMakeLists.txt | 8 +- cmake/FindNSIS.cmake | 19 ++ cmake/options.cmake | 2 + cmake/packagemaker-nsis.cmake | 111 +++++++ packaging/sources/sd-src-base.lst | 4 +- packaging/windows/speed-dreams.nsh.in | 401 ++++++++++++++++++++++++++ 6 files changed, 543 insertions(+), 2 deletions(-) create mode 100644 cmake/FindNSIS.cmake create mode 100644 cmake/packagemaker-nsis.cmake create mode 100644 packaging/windows/speed-dreams.nsh.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 2cc18b164..85ee7206f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,6 +157,12 @@ ELSE(MSVC) ENDIF(MSVC) ADD_CUSTOM_TARGET(${_UNINST_TGT_NAME} "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake" ) +IF(OPTION_PACKAGING) + IF(MSVC) + INCLUDE(cmake/packagemaker-nsis.cmake) + ENDIF(MSVC) +ELSE(OPTION_PACKAGING) # Configure CPack. -INCLUDE(cmake/packagemaker.cmake) + INCLUDE(cmake/packagemaker.cmake) +ENDIF(OPTION_PACKAGING) diff --git a/cmake/FindNSIS.cmake b/cmake/FindNSIS.cmake new file mode 100644 index 000000000..9e3ca1739 --- /dev/null +++ b/cmake/FindNSIS.cmake @@ -0,0 +1,19 @@ +# CMake does not allow for braces in $ENV{}, so a temporary variable must be used. +set(PROGRAMFILES_X86 "ProgramFiles(x86)") +set(NSIS_INET_PLUGIN ) + +find_program(NSIS_MAKE_EXE + NAMES makensis + PATHS $ENV{PROGRAMFILES}/NSIS $ENV{${PROGRAMFILES_X86}}/NSIS +) + + +if(NSIS_MAKE_EXE) + get_filename_component(NSIS_LOCATION ${NSIS_MAKE_EXE} DIRECTORY) + Message(STATUS "NSIS_LOCATION = ${NSIS_LOCATION}") + + find_file(NSIS_INET_PLUGIN INetC.dll PATHS ${NSIS_LOCATION} PATH_SUFFIXES Plugins) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(NSIS DEFAULT_MSG NSIS_MAKE_EXE) diff --git a/cmake/options.cmake b/cmake/options.cmake index de09b437b..668db0b2d 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -88,6 +88,8 @@ MACRO(ADD_SD_COMPILE_OPTIONS) SET(OPTION_CLIENT_SERVER false CACHE BOOL "Build with Client/Server network architecture") + SET(OPTION_PACKAGING true CACHE BOOL "Enable Packaging for distribution") + IF(APPLE) # Automatically set OPTION_USE_MACPORTS (at least until someone fixes the regular APPLE build) MESSAGE(STATUS "Automatically set OPTION_USE_MACPORTS (at least until someone fixes the regular APPLE build)") diff --git a/cmake/packagemaker-nsis.cmake b/cmake/packagemaker-nsis.cmake new file mode 100644 index 000000000..1247c643d --- /dev/null +++ b/cmake/packagemaker-nsis.cmake @@ -0,0 +1,111 @@ +#============================================================================== +# +# file : .cmake +# copyright : (C) 2019 Joe Thompson +# email : beaglejoe@users.sourceforge.net +# web : www.speed-dreams.org +# version : $Id:$ +# +#============================================================================== +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +#============================================================================== +FIND_PACKAGE(NSIS) + +Message(STATUS "NSIS_FOUND = ${NSIS_FOUND}") +Message(STATUS "NSIS_MAKE_EXE = ${NSIS_MAKE_EXE}") +Message(STATUS "NSIS_INET_PLUGIN = ${NSIS_INET_PLUGIN}") + + +if(NSIS_FOUND AND NSIS_MAKE_EXE AND NSIS_INET_PLUGIN) + FILE(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_INSTALL_PREFIX}" NSIS_INSTALL_DIR) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/readme_for_user.txt" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/readme_for_user.txt" COPYONLY) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/speed-dreams.ini" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/speed-dreams.ini" COPYONLY) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/speed-dreams.nsh.in" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/speed-dreams.nsh" @ONLY) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/speed-dreams-base.nsi" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/speed-dreams-base.nsi" @ONLY) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/speed-dreams-hq-cars-and-tracks.nsi" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/speed-dreams-hq-cars-and-tracks.nsi" @ONLY) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/speed-dreams-more-hq-cars-and-tracks.nsi" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/speed-dreams-more-hq-cars-and-tracks.nsi" @ONLY) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/speed-dreams-wip-cars-and-tracks.nsi" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/speed-dreams-wip-cars-and-tracks.nsi" @ONLY) + + CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/packaging/windows/speed-dreams-unmaintained.nsi" + "${CMAKE_CURRENT_BINARY_DIR}/packaging/speed-dreams-unmaintained.nsi" @ONLY) + + #ADD_CUSTOM_TARGET(PACKAGE_BASE DEPENDS INSTALL) + # can't depend on built-in target INSTALL, so we ADD_CUSTOM_COMMAND + # below to make sure INSTALL is done + ADD_CUSTOM_TARGET(PACKING_INSTALL) + + ADD_CUSTOM_TARGET(PACKAGE_ALL DEPENDS PACKAGE_BASE + PACKAGE_HQ + PACKAGE_MORE_HQ + PACKAGE_WIP + PACKAGE_UNMAINTAINED) + + ADD_CUSTOM_TARGET(PACKAGE_BASE DEPENDS PACKING_INSTALL) + ADD_CUSTOM_TARGET(PACKAGE_HQ DEPENDS PACKING_INSTALL) + ADD_CUSTOM_TARGET(PACKAGE_MORE_HQ DEPENDS PACKING_INSTALL) + ADD_CUSTOM_TARGET(PACKAGE_WIP DEPENDS PACKING_INSTALL) + ADD_CUSTOM_TARGET(PACKAGE_UNMAINTAINED DEPENDS PACKING_INSTALL) + + ADD_CUSTOM_COMMAND(TARGET PACKING_INSTALL + COMMAND "${CMAKE_COMMAND}" --build . --target INSTALL --config $ + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Building INSTALL...") + + ADD_CUSTOM_COMMAND(TARGET PACKAGE_BASE + COMMAND ${NSIS_MAKE_EXE} speed-dreams-base.nsi + WORKING_DIRECTORY packaging + COMMENT "Building base package...") + + ADD_CUSTOM_COMMAND(TARGET PACKAGE_HQ + COMMAND ${NSIS_MAKE_EXE} speed-dreams-hq-cars-and-tracks.nsi + WORKING_DIRECTORY packaging + COMMENT "Building HQ package...") + + ADD_CUSTOM_COMMAND(TARGET PACKAGE_MORE_HQ + COMMAND ${NSIS_MAKE_EXE} speed-dreams-more-hq-cars-and-tracks.nsi + WORKING_DIRECTORY packaging + COMMENT "Building More HQ package...") + + ADD_CUSTOM_COMMAND(TARGET PACKAGE_WIP + COMMAND ${NSIS_MAKE_EXE} speed-dreams-wip-cars-and-tracks.nsi + WORKING_DIRECTORY packaging + COMMENT "Building WIP package...") + + ADD_CUSTOM_COMMAND(TARGET PACKAGE_UNMAINTAINED + COMMAND ${NSIS_MAKE_EXE} speed-dreams-unmaintained.nsi + WORKING_DIRECTORY packaging + COMMENT "Building unmaintained package...") +else(NSIS_FOUND AND NSIS_MAKE_EXE AND NSIS_INET_PLUGIN) + if(NOT NSIS_FOUND) + Message(WARNING "NSIS NOT FOUND Packaging targets NOT added.") + elseif(NOT NSIS_INET_PLUGIN) + Message(WARNING "INetC.dll NOT FOUND Packaging targets NOT added.") + endif(NOT NSIS_FOUND) +endif() \ No newline at end of file diff --git a/packaging/sources/sd-src-base.lst b/packaging/sources/sd-src-base.lst index 8386ee31c..08c71d00d 100644 --- a/packaging/sources/sd-src-base.lst +++ b/packaging/sources/sd-src-base.lst @@ -25,7 +25,9 @@ src/drivers/simplix/src src/drivers/dandroid/CMakeLists.txt src/drivers/dandroid/src -src/drivers/kilo2008 +src/drivers/shadow/CMakeLists.txt +src/drivers/shadow/README +src/drivers/shadow/src src/drivers/human src/drivers/networkhuman diff --git a/packaging/windows/speed-dreams.nsh.in b/packaging/windows/speed-dreams.nsh.in new file mode 100644 index 000000000..cf1e20b06 --- /dev/null +++ b/packaging/windows/speed-dreams.nsh.in @@ -0,0 +1,401 @@ +; +; Common definitions for all the Speed Dreams installers +; +; copyright : (C) 2011 onwards Jean-Philippe Meuret +; $Id: speed-dreams.nsh 6567 2018-11-22 01:06:58Z beaglejoe $ +; +; This program is free software; you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation; either version 2 of the License, or +; (at your option) any later version. + +!ifndef VER_MAJOR + !define VER_MAJOR 2 +!endif + +!ifndef VER_MINOR + !define VER_MINOR 3 +!endif + +!ifndef VER_PATCH + !define VER_PATCH 0 +!endif + +!ifndef VER_EXTRA + !define VER_EXTRA "" +!endif + +;!echo "VER_EXTRA = ${VER_EXTRA}" + +!ifndef VER_REVISION + !define VER_REVISION "r@SVN_REV@" +!endif + +; Create TODAY variable containing today's date in the format we use +!define /date TODAY "%Y%m%d" + +!ifndef VER_RELDATE + !define VER_RELDATE ${TODAY} ; Initial guess ;-) + ;!define VER_RELDATE 20131102 ; Initial guess ;-) +!endif + +!define GAME_SHORT_NAME "Speed Dreams" +!define GAME_NAME "${GAME_SHORT_NAME} ${VER_MAJOR}" +!define GAME_SHORT_FS_NAME "speed-dreams" +!define GAME_FS_NAME "${GAME_SHORT_FS_NAME}-${VER_MAJOR}" +!define GAME_SUBTITLE "'an Open Motorsport Sim'" +!define GAME_VERSION "${VER_MAJOR}.${VER_MINOR}.${VER_PATCH}${VER_EXTRA}" +!define GAME_VERSIONNED_NAME "${GAME_SHORT_NAME} ${GAME_VERSION}" +!define GAME_LONG_VERSION "${GAME_VERSION}-${VER_REVISION}" +!define GAME_LONG_NAME "${GAME_SHORT_NAME} ${GAME_LONG_VERSION}" +!define GAME_PUBLISHER "the Speed Dreams Team" +!define GAME_WEB_SITE "http://www.speed-dreams.org" +!define GAME_BUG_TRACKER "http://sourceforge.net/p/speed-dreams/tickets/" +!define GAME_DOWNLOAD_URL "http://sourceforge.net/projects/speed-dreams/files/${VER_MAJOR}.${VER_MINOR}.${VER_PATCH}" +!define COMMUNITY_WEB_SITE "http://community.speed-dreams.org" + +!define GAME_ROOT_REGKEY "HKLM" +!define GAME_INST_REGKEY "Software\Microsoft\Windows\CurrentVersion\${GAME_FS_NAME}.exe" +!define GAME_UNINST_REGKEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GAME_NAME}" +!define GAME_DIR_REGKEY "Software\${GAME_PUBLISHER}\${GAME_NAME}" + +; Folder where the build system installed everything +!ifndef BUILD_INST_DIR +; !define BUILD_INST_DIR "\${GAME_FS_NAME}-build" + !define BUILD_INST_DIR "@NSIS_INSTALL_DIR@" +!endif + +; Default target installation folder +!define INST_INST_DIR_SUFFIX "${GAME_SHORT_FS_NAME}-${GAME_VERSION}" + +; Core name for each installer +!define BASE_SETUP_KEY "base" +!define HQCARSTRACKS_SETUP_KEY "hq-cars-and-tracks" +!define MOREHQCARSTRACKS_SETUP_KEY "more-hq-cars-and-tracks" +!define WIPCARSTRACKS_SETUP_KEY "wip-cars-and-tracks" +!define UNMAINTAINED_SETUP_KEY "unmaintained" + +; Common installer settings +SetCompressor /SOLID lzma ; 1-block compression, smaller but longer (generation, extraction) +;SetCompressor lzma ; A bit bigger, but faster generation and extraction + +; Usefull libs. +!include "LogicLib.nsh" + +; Common MUI Settings +!include "MUI.nsh" ; TODO: Move to MUI2 + +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP "..\..\data\data\img\header.bmp" + +!define MUI_WELCOMEFINISHPAGE_BITMAP "..\..\data\data\img\header-vert.bmp" + +!define MUI_ABORTWARNING + +!define MUI_ICON "..\..\data\data\icons\icon.ico" +!define MUI_UNICON "..\..\data\data\icons\icon.ico" + +!define MUI_LICENSEPAGE_CHECKBOX + +; StrLoc function =========================================================== +; This function outputs the relative index position from the start or end of a string, +; where a substring is located. +; Adapted from StrLoc 2.0 by Diego Pedroso (http://nsis.sourceforge.net/StrLoc) + +!define StrLoc "!insertmacro _StrLoc" + +!macro _StrLoc Result String SubString StartPoint + Push `${String}` + Push `${SubString}` + Push `${StartPoint}` + Call StrLoc + Pop `${Result}` +!macroend + +Function StrLoc + + ;Get arguments from the stack + Exch $R0 ; R0 : StartPoint + Exch 1 + Exch $R1 ; R1 : SubString + Exch 2 + Exch $R2 ; R2 : String + Push $R3 + Push $R4 + Push $R5 + Push $R6 + + ;Get "String" and "SubString" length + StrLen $R3 $R1 ; R3 : SubStringLen + StrLen $R4 $R2 ; R4 : StringLen + + ;Start "StartCharPos" counter + StrCpy $R5 0 ; R5 : StartCharPos + + ;Loop until "SubString" is found or "String" reaches its end + ${Do} + + ;Remove everything before and after the searched part ("TempStr") + StrCpy $R6 $R2 $R3 $R5 ; R6 : TmpString + + ;Compare "TempStr" with "SubString" + ${If} $R6 == $R1 + ${If} $R0 == "<" + IntOp $R6 $R3 + $R5 + IntOp $R0 $R4 - $R6 + ${Else} + StrCpy $R0 $R5 + ${EndIf} + ${ExitDo} + ${EndIf} + ;If not "SubString", this could be "String"'s end + ${If} $R5 >= $R4 + StrCpy $R0 "" + ${ExitDo} + ${EndIf} + ;If not, continue the loop + IntOp $R5 $R5 + 1 + ${Loop} + + ;Return + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Exch + Pop $R1 + Exch $R0 + +FunctionEnd + +; Parse the given SF.net download page ======================================== +; and retrieve the URL of the target file on the default (auto-select) mirror. +!define GetAutoSelectMirrorURL "!insertmacro _GetAutoSelectMirrorURL" + +!macro _GetAutoSelectMirrorURL ResultURL HTMLFile + Push "${HTMLFile}" + Call GetAutoSelectMirrorURL + Pop "${ResultURL}" +!macroend + +Function GetAutoSelectMirrorURL + + ;Get arguments from the stack + Exch $R0 ; R0 : HTMLFile + Push $R1 + Push $R2 + Push $R3 + Push $R4 + Push $R5 + + ;DetailPrint "GetAutoSelectMirrorURL:" + ;DetailPrint " HTMLFile='$R0' ..." + + StrCpy $R2 "" ; R2 : ResultURL + + ClearErrors + FileOpen $R1 $R0 r ; R1 : FileHdle + IfErrors Done + + ;DetailPrint " File open ..." + + StrCpy $R3 "" ; R3 : Line + + ${Do} + + ClearErrors + StrCpy $R4 $R3 ; R4 : PrevLine + FileRead $R1 $R3 + IfErrors DoneRead + + ;DetailPrint " Line read ..." + ;DetailPrint " '$R3'" + + ${StrLoc} $R5 $R3 "direct link, or try another" 0 ; R5 : StringPos + ;DetailPrint "Found direct link ? $R5" + ${If} $R5 != "" + ${StrLoc} $R5 $R4 "" +!define DownloadFromSFNet "!insertmacro _DownloadFromSFNet" + +!macro _DownloadFromSFNet StatusVar SourceURL TargetPathName + Push "${SourceURL}" + Push "${TargetPathName}" + Call DownloadFromSFNet + Pop "${StatusVar}" +!macroend + +Function DownloadFromSFNet + + ;Get arguments from the stack + Exch $R0 ; R0 : TargetPathName + Exch 1 + Exch $R1 ; R1 : SourceURL + Push $R2 + Push $R3 + Push $R4 + + StrCpy $R2 $R0 ; R2 : TargetPathName + + StrCpy $R3 "success" ; R3 : Status + + DetailPrint "1) Downloading default mirror URL (auto-selected by SF.net) ..." + inetc::get "$R1" "$R2.html" /end + Pop $R0 + ${If} $R0 != "OK" + + ${If} $R0 == "cancel" + StrCpy $R3 "Mirror selection page download was cancelled" + DetailPrint "... cancelled." + ${Else} + StrCpy $R3 "Mirror selection page download failed$\n($R0)" + DetailPrint "... failed." + ${EndIf} + MessageBox MB_OK|MB_ICONSTOP "$R3" + + ${Else} + + ${GetAutoSelectMirrorURL} $R4 $R2.html ; R4 : RealURL + ;DetailPrint " File='$R2.html' ..." + ;DetailPrint " URL='$R4' ..." + + ${If} $R4 == "" + + StrCpy $R3 "Failed to get file URL on default mirror$\nfrom $R1" + MessageBox MB_OK|MB_ICONSTOP "$R3" + DetailPrint "... failed to extract default mirror URL." + + ${Else} + + DetailPrint "2) Downloading file from $R4 ..." + inetc::get "$R4" "$R2" /end + Pop $R0 + ${If} $R0 != "OK" + + ${If} $R0 == "cancel" + StrCpy $R3 "File download was cancelled" + DetailPrint "... cancelled." + ${Else} + StrCpy $R3 "Failed to download file$\nfrom $R4$\n($R0)" + DetailPrint "... failed." + ${EndIf} + Delete "$R2" + MessageBox MB_OK|MB_ICONSTOP "$R3" + + ${Else} + + DetailPrint "3) Done in $R2." + + ${EndIf} + + ${EndIf} + + ${EndIf} + + Delete "$R2.html" + + ; Return + StrCpy $R0 $R3 ; R0 : Status + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Exch $R0 ; "success" on success, or else "" + +FunctionEnd + + +!macro DownloadPackageIfNeededAndThenInstall PackageFileName PackageTitle PackageSizeMb + + ; Check if the target installer file is already here, next to the current one. + ${IfNot} ${FileExists} "$EXEDIR\${PackageFileName}" + + ; If not, ask the user if he really wants to download. + MessageBox MB_OKCANCEL|MB_ICONQUESTION "${PackageFileName} not found$\nnext to $EXEFILE on your disk.$\n$\nClick OK to download it from ${GAME_DOWNLOAD_URL},$\nor Cancel to skip.$\n$\nNote: This might take several minutes, as it's about ${PackageSizeMb} megabytes." IDCANCEL SkipDownload + + ; Download + DetailPrint "Downloading ${PackageTitle} ..." + ${DownloadFromSFNet} $0 "${GAME_DOWNLOAD_URL}/${PackageFileName}" "$EXEDIR\${PackageFileName}" + + ${If} $0 != "success" + + MessageBox MB_OK|MB_ICONSTOP "Skipping installation of ${PackageTitle}." + + SetAutoClose false + + Return + + ${EndIf} + + ${EndIf} + + DetailPrint "Installing ${PackageTitle} ..." + ExecWait '$EXEDIR\${PackageFileName}' $0 + DetailPrint "Done (exit code $0)." + ${If} $0 != "0" + SetAutoClose false + ${EndIf} + + Return + + SkipDownload: + + DetailPrint "Skipping installation of ${PackageTitle} on user's request." + +!macroend + +!macro CheckIfBasePackageInstalled + + ; Check if the base package is installed and OK, and abort if not. + ReadRegStr $R0 ${GAME_ROOT_REGKEY} "${GAME_DIR_REGKEY}" "" + ${If} $R0 == "" + MessageBox MB_OK|MB_ICONSTOP "No base package found for ${GAME_NAME}$\n$\nPlease, first download and run ${GAME_SHORT_FS_NAME}-${BASE_SETUP_KEY}-${GAME_LONG_VERSION}-win32-setup.exe$\nfrom ${GAME_DOWNLOAD_URL}" + Abort + ${EndIf} + + ${If} ${FileExists} "$R0\bin\${GAME_FS_NAME}.exe" + Nop + ${Else} + MessageBox MB_OK|MB_ICONSTOP "A base package for ${GAME_NAME} was found, but it is no more usable and/or corrupted$\n$\nPlease, first (download and) run again ${GAME_SHORT_FS_NAME}-${BASE_SETUP_KEY}-${GAME_LONG_VERSION}-win32-setup.exe$\nfrom ${GAME_DOWNLOAD_URL}" + Abort + ${EndIf} + +!macroend +