From 817bffb4237359c8d7c21f1a93f8938dc64482b7 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 15 Jul 2017 15:02:14 +0000 Subject: [PATCH] Add Windows and macOS packaging scripts. --- mod.config | 87 +++++++++- packaging/osx/buildpackage.sh | 90 +++++++++++ packaging/osx/example.icns | Bin 0 -> 70471 bytes packaging/package-all.sh | 27 ++++ packaging/windows/buildpackage.nsi | 246 +++++++++++++++++++++++++++++ packaging/windows/buildpackage.sh | 78 +++++++++ packaging/windows/example.ico | Bin 0 -> 29227 bytes 7 files changed, 520 insertions(+), 8 deletions(-) create mode 100755 packaging/osx/buildpackage.sh create mode 100644 packaging/osx/example.icns create mode 100755 packaging/package-all.sh create mode 100644 packaging/windows/buildpackage.nsi create mode 100755 packaging/windows/buildpackage.sh create mode 100644 packaging/windows/example.ico diff --git a/mod.config b/mod.config index d924e65..1525b98 100644 --- a/mod.config +++ b/mod.config @@ -1,20 +1,91 @@ -# The id of the mod to launch by default. This must exist as a directory in the mods directory +############################################################################## +# Core Configuration +# +# Basic settings that should be changed by all projects. +############################################################################## + +# The id of the mod packaged by this project. +# This must exist as a directory in the mods directory. MOD_ID="example" +# The OpenRA engine version to use for this project. ENGINE_VERSION="1b0ae1e" -# Import the default OpenRA mods for use as external mod references -# in your mod.yaml. Accepts values "True" or "False". -# WARNING: This setting is provided to simplify early mod development -# and must be disabled before installers can be generated +# Enable this to make the default OpenRA mods available for use in your mod.yaml +# Packages list (via $mod references). Accepts values "True" or "False". +# WARNING: This setting is provided to simplify early project development, +# and must be disabled before you can package installers for your project! INCLUDE_DEFAULT_MODS="False" -# Automatically manage engine dependencies +############################################################################## +# Packaging Configuration +# +# Settings controlling the creation of installers. +############################################################################## + +# The prefix used for the installer filenames. +# - Windows installers will be named as {PACKAGING_INSTALLER_NAME}-{TAG}.exe +# - macOS installers will be named as {PACKAGING_INSTALLER_NAME}-{TAG}.zip +PACKAGING_INSTALLER_NAME="ExampleMod" + +# The human-readable name for this project. +# This is used in: +# - Crash dialogs (all platforms) +# - macOS .app bundle name +# - macOS menu bar +# - macOS "About" window +# - Windows installer +# - Windows start menu +# - Windows desktop shortcut +# - Windows "Programs and Features" list +PACKAGING_DISPLAY_NAME="Example Mod" + +# The URL for the project homepage. +# This is used in: +# - Windows "Add/Remove Programs" list +PACKAGING_WEBSITE_URL="http://openra.net" + +# The URL that is opened when a player presses the "FAQ" button in the crash dialog. +PACKAGING_FAQ_URL="http://wiki.openra.net/FAQ" + +# The human-readable project authors. +# This is used in: +# - Windows "Add/Remove Programs" list +PACKAGING_AUTHORS="Example Mod authors" + +# The git tag to use for the macOS Launcher files. +PACKAGING_OSX_LAUNCHER_TAG="osx-launcher-20170708" + +# Filename to use for the launcher executable on Windows. +PACKAGING_WINDOWS_LAUNCHER_NAME="ExampleMod" + +# The name of the Windows Program Files directory to install the project files to. +PACKAGING_WINDOWS_INSTALL_DIR_NAME="OpenRA Example Mod" + +# The key prefix used for Windows registry metadata. +# This should not contain spaces or special characters. +PACKAGING_WINDOWS_REGISTRY_KEY="OpenRAExampleMod" + +############################################################################## +# Advanced Configuration +# +# Most projects will not need to modify these +############################################################################## + +# Automatic engine managment will treat the OpenRA engine files like a read-only dependency. +# Disable this if you would like to modify or manager your own engine files. AUTOMATIC_ENGINE_MANAGEMENT="True" + +# The URL to download the engine files from when AUTOMATIC_ENGINE_MANAGEMENT is enabled. AUTOMATIC_ENGINE_SOURCE="https://github.com/OpenRA/OpenRA/archive/${ENGINE_VERSION}.zip" -# Temporary file/directory names used when automatically downloading the engine +# Temporary file/directory names used by automatic engine management. AUTOMATIC_ENGINE_EXTRACT_DIRECTORY="./engine_temp" AUTOMATIC_ENGINE_TEMP_ARCHIVE_NAME="engine.zip" - ENGINE_DIRECTORY="./engine" + +# The url to download the OpenRA macOS launcher files. +PACKAGING_OSX_LAUNCHER_SOURCE="https://github.com/OpenRA/OpenRALauncherOSX/releases/download/${PACKAGING_OSX_LAUNCHER_TAG}/launcher.zip" + +# Temporary file name used when downloading the OpenRA macOS launcher files. +PACKAGING_OSX_LAUNCHER_TEMP_ARCHIVE_NAME="launcher.zip" diff --git a/packaging/osx/buildpackage.sh b/packaging/osx/buildpackage.sh new file mode 100755 index 0000000..fc13082 --- /dev/null +++ b/packaging/osx/buildpackage.sh @@ -0,0 +1,90 @@ +#!/bin/bash +# OpenRA packaging script for macOS + +command -v make >/dev/null 2>&1 || { echo >&2 "The OpenRA mod template requires make."; exit 1; } +command -v python >/dev/null 2>&1 || { echo >&2 "The OpenRA mod template requires python."; exit 1; } +command -v curl >/dev/null 2>&1 || { echo >&2 "The OpenRA mod template requires curl."; exit 1; } + +if [ $# -ne "2" ]; then + echo "Usage: `basename $0` tag outputdir" + exit 1 +fi + +PACKAGING_DIR=$(python -c "import os; print(os.path.dirname(os.path.realpath('$0')))") +TEMPLATE_ROOT="${PACKAGING_DIR}/../../" + +# shellcheck source=mod.config +. "${TEMPLATE_ROOT}/mod.config" + +if [ -f "${TEMPLATE_ROOT}/user.config" ]; then + # shellcheck source=user.config + . "${TEMPLATE_ROOT}/user.config" +fi + +if [ "${INCLUDE_DEFAULT_MODS}" = "True" ]; then + echo "Cannot generate installers while INCLUDE_DEFAULT_MODS is enabled." + echo "Make sure that this setting is disabled in both your mod.config and user.config." + exit 1 +fi + +# Set the working dir to the location of this script +cd "${PACKAGING_DIR}" + +TAG="$1" +OUTPUTDIR="$2" +BUILTDIR="$(pwd)/build" +PACKAGING_OSX_APP_NAME="OpenRA - ${PACKAGING_DISPLAY_NAME}.app" + +modify_plist() { + sed "s|$1|$2|g" "$3" > "$3.tmp" && mv "$3.tmp" "$3" +} + +echo "Building launcher" +curl -s -L -o "${PACKAGING_OSX_LAUNCHER_TEMP_ARCHIVE_NAME}" -O "${PACKAGING_OSX_LAUNCHER_SOURCE}" || exit 3 + +unzip -qq -d "${BUILTDIR}" "${PACKAGING_OSX_LAUNCHER_TEMP_ARCHIVE_NAME}" +rm "${PACKAGING_OSX_LAUNCHER_TEMP_ARCHIVE_NAME}" + +modify_plist "{DEV_VERSION}" "${TAG}" "${BUILTDIR}/OpenRA.app/Contents/Info.plist" +modify_plist "{FAQ_URL}" "${PACKAGING_FAQ_URL}" "${BUILTDIR}/OpenRA.app/Contents/Info.plist" +echo "Building core files" + +pushd ${TEMPLATE_ROOT} > /dev/null + +if [ ! -f "${ENGINE_DIRECTORY}/Makefile" ]; then + echo "Required engine files not found." + echo "Run \`make\` in the mod directory to fetch and build the required files, then try again."; + exit 1 +fi + +make version VERSION="${TAG}" + +pushd ${ENGINE_DIRECTORY} > /dev/null +make osx-dependencies +make core SDK="-sdk:4.5" +make install-engine gameinstalldir="/Contents/Resources/" DESTDIR="${BUILTDIR}/OpenRA.app" +make install-common-mod-files gameinstalldir="/Contents/Resources/" DESTDIR="${BUILTDIR}/OpenRA.app" +popd > /dev/null +popd > /dev/null + +# Add mod files +cp -r "${TEMPLATE_ROOT}/mods/"* "${BUILTDIR}/OpenRA.app/Contents/Resources/mods" +cp "${MOD_ID}.icns" "${BUILTDIR}/OpenRA.app/Contents/Resources/" + +pushd "${BUILTDIR}" > /dev/null +mv "OpenRA.app" "${PACKAGING_OSX_APP_NAME}" + +# Copy macOS specific files +modify_plist "{MOD_ID}" "${MOD_ID}" "${PACKAGING_OSX_APP_NAME}/Contents/Info.plist" +modify_plist "{MOD_NAME}" "${PACKAGING_DISPLAY_NAME}" "${PACKAGING_OSX_APP_NAME}/Contents/Info.plist" +modify_plist "{JOIN_SERVER_URL_SCHEME}" "openra-${MOD_ID}-${TAG}" "${PACKAGING_OSX_APP_NAME}/Contents/Info.plist" + +echo "Packaging zip archive" + +zip "${PACKAGING_INSTALLER_NAME}-${TAG}" -r -9 "${PACKAGING_OSX_APP_NAME}" --quiet --symlinks +mv "${PACKAGING_INSTALLER_NAME}-${TAG}.zip" ${OUTPUTDIR} + +popd > /dev/null + +# Clean up +rm -rf "${BUILTDIR}" diff --git a/packaging/osx/example.icns b/packaging/osx/example.icns new file mode 100644 index 0000000000000000000000000000000000000000..68e41c80551542abd1fb481749723612ed43daab GIT binary patch literal 70471 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�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/dev/null +echo "Building Windows package" +./buildpackage.sh "$1" "$2" +if [ $? -ne 0 ]; then + echo "Windows package build failed." +fi +popd >/dev/null + +pushd osx >/dev/null +echo "Building macOS package" +./buildpackage.sh "$1" "$2" +if [ $? -ne 0 ]; then + echo "macOS package build failed." +fi +popd >/dev/null + +echo "Package build done." diff --git a/packaging/windows/buildpackage.nsi b/packaging/windows/buildpackage.nsi new file mode 100644 index 0000000..376fb1c --- /dev/null +++ b/packaging/windows/buildpackage.nsi @@ -0,0 +1,246 @@ +; Copyright 2007-2015 OpenRA developers (see AUTHORS) +; This file is part of OpenRA. +; +; OpenRA 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 3 of the License, or +; (at your option) any later version. +; +; OpenRA 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 OpenRA. If not, see . + + +!include "MUI2.nsh" +!include "FileFunc.nsh" +!include "WordFunc.nsh" + +Name "${PACKAGING_DISPLAY_NAME}" +OutFile "OpenRA.Setup.exe" + +InstallDir "$PROGRAMFILES\${PACKAGING_WINDOWS_INSTALL_DIR_NAME}" +InstallDirRegKey HKLM "Software\${PACKAGING_WINDOWS_REGISTRY_KEY}" "InstallDir" + +SetCompressor lzma +RequestExecutionLevel admin + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "${SRCDIR}\COPYING" +!insertmacro MUI_PAGE_DIRECTORY + +!define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" +!define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${PACKAGING_WINDOWS_REGISTRY_KEY}" +!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" +!define MUI_STARTMENUPAGE_DEFAULTFOLDER "OpenRA" + +Var StartMenuFolder +!insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder + +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_INSTFILES + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" + +;*************************** +;Section Definitions +;*************************** +Section "-Reg" Reg + + ; Installation directory + WriteRegStr HKLM "Software\${PACKAGING_WINDOWS_REGISTRY_KEY}" "InstallDir" $INSTDIR + + ; Join server URL Scheme + WriteRegStr HKLM "Software\Classes\openra-${MOD_ID}-${TAG}" "" "URL:Join OpenRA server" + WriteRegStr HKLM "Software\Classes\openra-${MOD_ID}-${TAG}" "URL Protocol" "" + WriteRegStr HKLM "Software\Classes\openra-${MOD_ID}-${TAG}\DefaultIcon" "" "$INSTDIR\${MOD_ID}.ico,0" + WriteRegStr HKLM "Software\Classes\openra-${MOD_ID}-${TAG}\Shell\Open\Command" "" "$INSTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe Launch.URI=%1" + +SectionEnd + +Section "Game" GAME + SectionIn RO + + SetOutPath "$INSTDIR" + File /r "${SRCDIR}\mods" + File "${SRCDIR}\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" + File "${SRCDIR}\OpenRA.Game.exe" + File "${SRCDIR}\OpenRA.Game.exe.config" + File "${SRCDIR}\OpenRA.Utility.exe" + File "${SRCDIR}\OpenRA.Server.exe" + File "${SRCDIR}\OpenRA.Platforms.Default.dll" + File "${SRCDIR}\ICSharpCode.SharpZipLib.dll" + File "${SRCDIR}\FuzzyLogicLibrary.dll" + File "${SRCDIR}\Open.Nat.dll" + File "${SRCDIR}\VERSION" + File "${SRCDIR}\AUTHORS" + File "${SRCDIR}\COPYING" + File "${SRCDIR}\${MOD_ID}.ico" + File "${SRCDIR}\SharpFont.dll" + File "${SRCDIR}\SDL2-CS.dll" + File "${SRCDIR}\OpenAL-CS.dll" + File "${SRCDIR}\global mix database.dat" + File "${SRCDIR}\MaxMind.Db.dll" + File "${SRCDIR}\GeoLite2-Country.mmdb.gz" + File "${SRCDIR}\eluant.dll" + File "${SRCDIR}\SmarIrc4net.dll" + File "${SRCDIR}\rix0rrr.BeaconLib.dll" + File "${DEPSDIR}\soft_oal.dll" + File "${DEPSDIR}\SDL2.dll" + File "${DEPSDIR}\freetype6.dll" + File "${DEPSDIR}\lua51.dll" + + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + CreateDirectory "$SMPROGRAMS\$StartMenuFolder" + CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${PACKAGING_DISPLAY_NAME}.lnk" $OUTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe "" \ + "$OUTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" "" "" "" "" + !insertmacro MUI_STARTMENU_WRITE_END + + SetOutPath "$INSTDIR\lua" + File "${SRCDIR}\lua\*.lua" + + SetOutPath "$INSTDIR\glsl" + File "${SRCDIR}\glsl\*.frag" + File "${SRCDIR}\glsl\*.vert" + + ; Estimated install size for the control panel properties + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "EstimatedSize" "$0" + + SetShellVarContext all + CreateDirectory "$APPDATA\OpenRA\ModMetadata" + nsExec::ExecToLog '"$INSTDIR\OpenRA.Utility.exe" ${MOD_ID} --register-mod "$INSTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" system' + nsExec::ExecToLog '"$INSTDIR\OpenRA.Utility.exe" ${MOD_ID} --clear-invalid-mod-registrations system' + SetShellVarContext current + +SectionEnd + +Section "Desktop Shortcut" DESKTOPSHORTCUT + SetOutPath "$INSTDIR" + CreateShortCut "$DESKTOP\OpenRA - ${PACKAGING_DISPLAY_NAME}.lnk" $INSTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe "" \ + "$INSTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" "" "" "" "" +SectionEnd + +;*************************** +;Dependency Sections +;*************************** +Section "-DotNet" DotNet + ClearErrors + ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" "Install" + IfErrors error 0 + IntCmp $0 1 0 error 0 + ClearErrors + ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install" + IfErrors error 0 + IntCmp $0 1 done error done + error: + MessageBox MB_OK ".NET Framework v4.5 or later is required to run OpenRA." + Abort + done: +SectionEnd + +;*************************** +;Uninstaller Sections +;*************************** +Section "-Uninstaller" + WriteUninstaller $INSTDIR\uninstaller.exe + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "DisplayName" "${PACKAGING_DISPLAY_NAME}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "UninstallString" "$INSTDIR\uninstaller.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "InstallLocation" "$INSTDIR" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "DisplayIcon" "$INSTDIR\${MOD_ID}.ico" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "Publisher" "${PACKAGING_AUTHORS}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "URLInfoAbout" "${PACKAGING_WEBSITE_URL}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "DisplayVersion" "${TAG}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "NoModify" "1" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" "NoRepair" "1" +SectionEnd + +!macro Clean UN +Function ${UN}Clean + nsExec::ExecToLog '"$INSTDIR\OpenRA.Utility.exe" ${MOD_ID} --unregister-mod system' + + RMDir /r $INSTDIR\mods + RMDir /r $INSTDIR\maps + RMDir /r $INSTDIR\glsl + RMDir /r $INSTDIR\lua + Delete $INSTDIR\${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe + Delete $INSTDIR\OpenRA.Game.exe + Delete $INSTDIR\OpenRA.Game.exe.config + Delete $INSTDIR\OpenRA.Utility.exe + Delete $INSTDIR\OpenRA.Server.exe + Delete $INSTDIR\OpenRA.Platforms.Default.dll + Delete $INSTDIR\ICSharpCode.SharpZipLib.dll + Delete $INSTDIR\FuzzyLogicLibrary.dll + Delete $INSTDIR\Open.Nat.dll + Delete $INSTDIR\SharpFont.dll + Delete $INSTDIR\VERSION + Delete $INSTDIR\AUTHORS + Delete $INSTDIR\COPYING + Delete $INSTDIR\${MOD_ID}.ico + Delete "$INSTDIR\global mix database.dat" + Delete $INSTDIR\MaxMind.Db.dll + Delete $INSTDIR\GeoLite2-Country.mmdb.gz + Delete $INSTDIR\KopiLua.dll + Delete $INSTDIR\soft_oal.dll + Delete $INSTDIR\SDL2.dll + Delete $INSTDIR\lua51.dll + Delete $INSTDIR\eluant.dll + Delete $INSTDIR\freetype6.dll + Delete $INSTDIR\SDL2-CS.dll + Delete $INSTDIR\OpenAL-CS.dll + Delete $INSTDIR\SmarIrc4net.dll + Delete $INSTDIR\rix0rrr.BeaconLib.dll + RMDir /r $INSTDIR\Support + + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PACKAGING_WINDOWS_REGISTRY_KEY}" + DeleteRegKey HKLM "Software\Classes\openra-${MOD_ID}-${TAG}" + + Delete $INSTDIR\uninstaller.exe + RMDir $INSTDIR + + !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder + + ; Clean up start menu: Delete all our icons, and the OpenRA folder + ; *only* if we were the only installed version + Delete "$SMPROGRAMS\$StartMenuFolder\${PACKAGING_DISPLAY_NAME}.lnk" + RMDir "$SMPROGRAMS\$StartMenuFolder" + + Delete "$DESKTOP\OpenRA - ${PACKAGING_DISPLAY_NAME}.lnk" + DeleteRegKey HKLM "Software\${PACKAGING_WINDOWS_REGISTRY_KEY}" +FunctionEnd +!macroend + +!insertmacro Clean "" +!insertmacro Clean "un." + +Section "Uninstall" + Call un.Clean +SectionEnd + +;*************************** +;Section Descriptions +;*************************** +LangString DESC_GAME ${LANG_ENGLISH} "${PACKAGING_DISPLAY_NAME} game files." +LangString DESC_DESKTOPSHORTCUT ${LANG_ENGLISH} "Place shortcut on the Desktop." + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${GAME} $(DESC_GAME) + !insertmacro MUI_DESCRIPTION_TEXT ${DESKTOPSHORTCUT} $(DESC_DESKTOPSHORTCUT) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +;*************************** +;Callbacks +;*************************** + +Function .onInstFailed + Call Clean +FunctionEnd diff --git a/packaging/windows/buildpackage.sh b/packaging/windows/buildpackage.sh new file mode 100755 index 0000000..9e5d7da --- /dev/null +++ b/packaging/windows/buildpackage.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +command -v curl >/dev/null 2>&1 || { echo >&2 "Windows packaging requires curl."; exit 1; } +command -v makensis >/dev/null 2>&1 || { echo >&2 "Windows packaging requires makensis."; exit 1; } + +if [ $# -ne "2" ]; then + echo "Usage: `basename $0` tag outputdir" + exit 1 +fi + +PACKAGING_DIR=$(python -c "import os; print(os.path.dirname(os.path.realpath('$0')))") +TEMPLATE_ROOT="${PACKAGING_DIR}/../../" + +# shellcheck source=mod.config +. "${TEMPLATE_ROOT}/mod.config" + +if [ -f "${TEMPLATE_ROOT}/user.config" ]; then + # shellcheck source=user.config + . "${TEMPLATE_ROOT}/user.config" +fi + +if [ "${INCLUDE_DEFAULT_MODS}" = "True" ]; then + echo "Cannot generate installers while INCLUDE_DEFAULT_MODS is enabled." + echo "Make sure that this setting is disabled in both your mod.config and user.config." + exit 1 +fi + +# Set the working dir to the location of this script +cd "${PACKAGING_DIR}" + +TAG="$1" +OUTPUTDIR="$2" +BUILTDIR="$(pwd)/build" + +LAUNCHER_LIBS="-r:System.dll -r:System.Drawing.dll -r:System.Windows.Forms.dll -r:${BUILTDIR}/OpenRA.Game.exe" + +echo "Building core files" + +pushd ${TEMPLATE_ROOT} > /dev/null + +if [ ! -f "${ENGINE_DIRECTORY}/Makefile" ]; then + echo "Required engine files not found." + echo "Run \`make\` in the mod directory to fetch and build the required files, then try again."; + exit 1 +fi + +make version VERSION="${TAG}" + +pushd ${ENGINE_DIRECTORY} > /dev/null +SRC_DIR="$(pwd)" +make windows-dependencies +make core SDK="-sdk:4.5" +make install-engine gameinstalldir="" DESTDIR="${BUILTDIR}" +make install-common-mod-files gameinstalldir="" DESTDIR="${BUILTDIR}" +popd > /dev/null +popd > /dev/null + +# Add mod files +cp -r "${TEMPLATE_ROOT}/mods/"* "${BUILTDIR}/mods" +cp "${MOD_ID}.ico" "${BUILTDIR}" +cp "${SRC_DIR}/OpenRA.Game.exe.config" "${BUILTDIR}" + +echo "Compiling Windows launcher" +sed "s|DISPLAY_NAME|${PACKAGING_DISPLAY_NAME}|" "${SRC_DIR}/packaging/windows/WindowsLauncher.cs.in" | sed "s|MOD_ID|${MOD_ID}|" | sed "s|FAQ_URL|${PACKAGING_FAQ_URL}|" > "${BUILTDIR}/WindowsLauncher.cs" +mcs -sdk:4.5 "${BUILTDIR}/WindowsLauncher.cs" -warn:4 -codepage:utf8 -warnaserror -out:"${BUILTDIR}/${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" -t:winexe ${LAUNCHER_LIBS} -win32icon:"${MOD_ID}.ico" +rm "${BUILTDIR}/WindowsLauncher.cs" +mono "${SRC_DIR}/fixheader.exe" "${BUILTDIR}/${PACKAGING_WINDOWS_LAUNCHER_NAME}.exe" > /dev/null + +echo "Building Windows setup.exe" +makensis -V2 -DSRCDIR="${BUILTDIR}" -DDEPSDIR="${SRC_DIR}/thirdparty/download/windows" -DTAG="${TAG}" -DMOD_ID="${MOD_ID}" -DPACKAGING_WINDOWS_INSTALL_DIR_NAME="${PACKAGING_WINDOWS_INSTALL_DIR_NAME}" -DPACKAGING_WINDOWS_LAUNCHER_NAME="${PACKAGING_WINDOWS_LAUNCHER_NAME}" -DPACKAGING_DISPLAY_NAME="${PACKAGING_DISPLAY_NAME}" -DPACKAGING_WEBSITE_URL="${PACKAGING_WEBSITE_URL}" -DPACKAGING_AUTHORS="${PACKAGING_AUTHORS}" -DPACKAGING_WINDOWS_REGISTRY_KEY="${PACKAGING_WINDOWS_REGISTRY_KEY}" buildpackage.nsi +if [ $? -eq 0 ]; then + mv OpenRA.Setup.exe "${OUTPUTDIR}/${PACKAGING_INSTALLER_NAME}-$TAG.exe" +else + exit 1 +fi + +# Cleanup +rm -rf "${BUILTDIR}" diff --git a/packaging/windows/example.ico b/packaging/windows/example.ico new file mode 100644 index 0000000000000000000000000000000000000000..8acff6612c47ed02b6b20cd62a50bfa53a0aa407 GIT binary patch literal 29227 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 qQII@?=JvX+$jIw?f!q