diff --git a/Makefile b/Makefile
index 5a5ded0a60..75c63cbbaf 100644
--- a/Makefile
+++ b/Makefile
@@ -12,25 +12,18 @@
# to check the engine and official mod dlls for code style violations, run:
# make check
#
-# to install, run:
+# to compile and install Red Alert, Tiberian Dawn, and Dune 2000, run:
# make [prefix=/foo] [bindir=/bar/bin] install
#
-# to install Linux startup scripts, desktop files and icons:
-# make install-linux-shortcuts [DEBUG=false]
+# to install Linux startup scripts, desktop files, icons, and MIME metadata
+# make install-linux-shortcuts
#
-# to install the engine and common mod files (omitting the default mods):
-# make install-engine
-# make install-dependencies
-# make install-common-mod-files
-#
-# to uninstall, run:
-# make uninstall
+# to install Linux AppStream metadata
+# make install-linux-appdata
#
# for help, run:
# make help
#
-# to start the game, run:
-# openra
############################## TOOLCHAIN ###############################
#
@@ -44,12 +37,9 @@ WHITELISTED_THIRDPARTY_ASSEMBLIES = ICSharpCode.SharpZipLib.dll FuzzyLogicLibrar
# This list *must* be kept in sync with the files packaged by the AppImageSupport and OpenRALauncherOSX repositories
WHITELISTED_CORE_ASSEMBLIES = mscorlib.dll System.dll System.Configuration.dll System.Core.dll System.Numerics.dll System.Security.dll System.Xml.dll Mono.Security.dll netstandard.dll
-NUNIT_LIBS_PATH :=
-NUNIT_LIBS := $(NUNIT_LIBS_PATH)nunit.framework.dll
-
######################### UTILITIES/SETTINGS ###########################
#
-# install locations
+# Install locations for local installs and downstream packaging
prefix ?= /usr/local
datarootdir ?= $(prefix)/share
datadir ?= $(datarootdir)
@@ -59,24 +49,21 @@ libdir ?= $(prefix)/lib
gameinstalldir ?= $(libdir)/openra
BIN_INSTALL_DIR = $(DESTDIR)$(bindir)
-DATA_INSTALL_DIR = $(DESTDIR)$(gameinstalldir)
+DATA_INSTALL_DIR = $(DESTDIR)$(datadir)
+OPENRA_INSTALL_DIR = $(DESTDIR)$(gameinstalldir)
-# install tools
+# Toolchain
+CWD = $(shell pwd)
+MSBUILD = msbuild -verbosity:m -nologo
+MONO = mono
RM = rm
RM_R = $(RM) -r
RM_F = $(RM) -f
RM_RF = $(RM) -rf
-CP = cp
-CP_R = $(CP) -r
-INSTALL = install
-INSTALL_DIR = $(INSTALL) -d
-INSTALL_PROGRAM = $(INSTALL) -m755
-INSTALL_DATA = $(INSTALL) -m644
-# Toolchain
-MSBUILD = msbuild -verbosity:m -nologo
+VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
-# dependencies
+# Detect target platform for dependencies if not given by the user
ifndef TARGETPLATFORM
UNAME_S := $(shell uname -s)
UNAME_M := $(shell uname -m)
@@ -91,49 +78,11 @@ endif
endif
endif
-# program targets
-VERSION = $(shell git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null || echo git-`git rev-parse --short HEAD`)
+OPENRA_UTILITY = ENGINE_DIR=".." $(MONO) --debug bin/OpenRA.Utility.exe
-check-scripts:
- @echo
- @echo "Checking for Lua syntax errors..."
- @luac -p $(shell find mods/*/maps/* -iname '*.lua')
- @luac -p $(shell find lua/* -iname '*.lua')
- @luac -p $(shell find mods/*/bits/scripts/* -iname '*.lua')
-
-check:
- @echo
- @echo "Compiling in debug mode..."
- @$(MSBUILD) -t:build -p:Configuration=Debug
- @echo
- @echo "Checking runtime assemblies..."
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe all --check-runtime-assemblies $(WHITELISTED_OPENRA_ASSEMBLIES) $(WHITELISTED_THIRDPARTY_ASSEMBLIES) $(WHITELISTED_CORE_ASSEMBLIES)
- @echo
- @echo "Checking for explicit interface violations..."
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe all --check-explicit-interfaces
- @echo
- @echo "Checking for incorrect conditional trait interface overrides..."
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe all --check-conditional-trait-interface-overrides
-
-test: core
- @echo
- @echo "Testing Tiberian Sun mod MiniYAML..."
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe ts --check-yaml
- @echo
- @echo "Testing Dune 2000 mod MiniYAML..."
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe d2k --check-yaml
- @echo
- @echo "Testing Tiberian Dawn mod MiniYAML..."
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe cnc --check-yaml
- @echo
- @echo "Testing Red Alert mod MiniYAML..."
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe ra --check-yaml
-
-########################## MAKE/INSTALL RULES ##########################
+##################### DEVELOPMENT BUILDS AND TESTS #####################
#
-all: core
-
-core:
+all:
@command -v $(firstword $(MSBUILD)) >/dev/null || (echo "OpenRA requires the '$(MSBUILD)' tool provided by Mono >= 5.18."; exit 1)
@$(MSBUILD) -t:Build -restore -p:Configuration=Release -p:TargetPlatform=$(TARGETPLATFORM)
ifeq ($(TARGETPLATFORM), unix-generic)
@@ -142,195 +91,60 @@ endif
@./fetch-geoip.sh
clean:
- @-$(RM_F) *.config IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP
@-$(RM_RF) ./bin ./*/bin ./*/obj
- @ $(MSBUILD) -t:clean
+ @$(MSBUILD) -t:Clean
+ @-$(RM_F) IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP
+check:
+ @echo
+ @echo "Compiling in debug mode..."
+ @$(MSBUILD) -t:build -restore -p:Configuration=Debug
+ @echo
+ @echo "Checking runtime assemblies..."
+ @$(OPENRA_UTILITY) all --check-runtime-assemblies $(WHITELISTED_OPENRA_ASSEMBLIES) $(WHITELISTED_THIRDPARTY_ASSEMBLIES) $(WHITELISTED_CORE_ASSEMBLIES)
+ @echo
+ @echo "Checking for explicit interface violations..."
+ @$(OPENRA_UTILITY) all --check-explicit-interfaces
+ @echo
+ @echo "Checking for incorrect conditional trait interface overrides..."
+ @$(OPENRA_UTILITY) all --check-conditional-trait-interface-overrides
+
+check-scripts:
+ @echo
+ @echo "Checking for Lua syntax errors..."
+ @luac -p $(shell find mods/*/maps/* -iname '*.lua')
+ @luac -p $(shell find lua/* -iname '*.lua')
+ @luac -p $(shell find mods/*/bits/scripts/* -iname '*.lua')
+
+test: all
+ @echo
+ @echo "Testing Tiberian Sun mod MiniYAML..."
+ @$(OPENRA_UTILITY) ts --check-yaml
+ @echo
+ @echo "Testing Dune 2000 mod MiniYAML..."
+ @$(OPENRA_UTILITY) d2k --check-yaml
+ @echo
+ @echo "Testing Tiberian Dawn mod MiniYAML..."
+ @$(OPENRA_UTILITY) cnc --check-yaml
+ @echo
+ @echo "Testing Red Alert mod MiniYAML..."
+ @$(OPENRA_UTILITY) ra --check-yaml
+
+############# LOCAL INSTALLATION AND DOWNSTREAM PACKAGING ##############
+#
version: VERSION mods/ra/mod.yaml mods/cnc/mod.yaml mods/d2k/mod.yaml mods/ts/mod.yaml mods/modcontent/mod.yaml mods/all/mod.yaml
- @echo "$(VERSION)" > VERSION
- @for i in $? ; do \
- awk '{sub("Version:.*$$","Version: $(VERSION)"); print $0}' $${i} > $${i}.tmp && \
- awk '{sub("/[^/]*: User$$", "/$(VERSION): User"); print $0}' $${i}.tmp > $${i} && \
- rm $${i}.tmp; \
- done
+ @sh -c '. ./packaging/functions.sh; set_engine_version $(VERSION) .'
+ @sh -c '. ./packaging/functions.sh; set_mod_version $(VERSION) mods/ra/mod.yaml mods/cnc/mod.yaml mods/d2k/mod.yaml mods/ts/mod.yaml mods/modcontent/mod.yaml mods/all/mod.yaml'
-install: core install-engine install-common-mod-files install-default-mods
- @$(CP) *.sh "$(DATA_INSTALL_DIR)"
+install:
+ @sh -c '. ./packaging/functions.sh; install_assemblies_mono $(CWD) $(OPENRA_INSTALL_DIR) $(TARGETPLATFORM) True True True'
+ @sh -c '. ./packaging/functions.sh; install_data $(CWD) $(OPENRA_INSTALL_DIR) cnc d2k ra'
-install-linux-shortcuts: install-linux-scripts install-linux-icons install-linux-desktop
-
-install-dependencies:
-ifeq ($(TARGETPLATFORM), $(filter $(TARGETPLATFORM),win-x86 win-x64))
- @-echo "Installing OpenRA dependencies to $(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/soft_oal.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/SDL2.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/freetype6.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/lua51.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/libEGL.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/libGLESv2.dll "$(DATA_INSTALL_DIR)"
-
-endif
-ifeq ($(TARGETPLATFORM), linux-x64)
- @-echo "Installing OpenRA dependencies to $(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/soft_oal.so "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/SDL2.so "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/freetype6.so "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/lua51.so "$(DATA_INSTALL_DIR)"
-endif
-ifeq ($(TARGETPLATFORM), osx-x64)
- @-echo "Installing OpenRA dependencies to $(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/soft_oal.dylib "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/SDL2.dylib "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/freetype6.dylib "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/lua51.dylib "$(DATA_INSTALL_DIR)"
-endif
-
-install-engine:
- @-echo "Installing OpenRA engine to $(DATA_INSTALL_DIR)"
- @$(INSTALL_DIR) "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/OpenRA.exe "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/OpenRA.Server.exe "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/OpenRA.Utility.exe "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/OpenRA.Game.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/OpenRA.Platforms.Default.dll "$(DATA_INSTALL_DIR)"
-
-ifneq ($(TARGETPLATFORM), $(filter $(TARGETPLATFORM),win-x86 win-x64))
- @$(INSTALL_DATA) bin/OpenRA.Platforms.Default.dll.config "$(DATA_INSTALL_DIR)"
-endif
- @$(INSTALL_DATA) VERSION "$(DATA_INSTALL_DIR)/VERSION"
- @$(INSTALL_DATA) AUTHORS "$(DATA_INSTALL_DIR)/AUTHORS"
- @$(INSTALL_DATA) COPYING "$(DATA_INSTALL_DIR)/COPYING"
- @$(INSTALL_DATA) IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP "$(DATA_INSTALL_DIR)/IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP"
-
- @$(CP_R) glsl "$(DATA_INSTALL_DIR)"
- @$(CP_R) lua "$(DATA_INSTALL_DIR)"
- @$(CP) bin/SDL2-CS* "$(DATA_INSTALL_DIR)"
- @$(CP) bin/OpenAL-CS* "$(DATA_INSTALL_DIR)"
- @$(CP) bin/Eluant* "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/ICSharpCode.SharpZipLib.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/FuzzyLogicLibrary.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/Open.Nat.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/BeaconLib.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/DiscordRPC.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/Newtonsoft.Json.dll "$(DATA_INSTALL_DIR)"
-
-install-common-mod-files:
- @-echo "Installing OpenRA common mod files to $(DATA_INSTALL_DIR)"
- @$(INSTALL_DIR) "$(DATA_INSTALL_DIR)/mods"
- @$(CP_R) mods/common "$(DATA_INSTALL_DIR)/mods/"
- @$(INSTALL_PROGRAM) bin/OpenRA.Mods.Common.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) bin/OpenRA.Mods.Cnc.dll "$(DATA_INSTALL_DIR)"
- @$(INSTALL_DATA) "global mix database.dat" "$(DATA_INSTALL_DIR)/global mix database.dat"
-
-install-default-mods:
- @-echo "Installing OpenRA default mods to $(DATA_INSTALL_DIR)"
- @$(INSTALL_DIR) "$(DATA_INSTALL_DIR)/mods"
- @$(CP_R) mods/cnc "$(DATA_INSTALL_DIR)/mods/"
- @$(CP_R) mods/ra "$(DATA_INSTALL_DIR)/mods/"
- @$(CP_R) mods/d2k "$(DATA_INSTALL_DIR)/mods/"
- @$(INSTALL_PROGRAM) bin/OpenRA.Mods.D2k.dll "$(DATA_INSTALL_DIR)"
- @$(CP_R) mods/modcontent "$(DATA_INSTALL_DIR)/mods/"
-
-install-linux-icons:
- for SIZE in 16x16 32x32 48x48 64x64 128x128; do \
- $(INSTALL_DIR) "$(DESTDIR)$(datadir)/icons/hicolor/$$SIZE/apps"; \
- $(INSTALL_DATA) packaging/artwork/ra_$$SIZE.png "$(DESTDIR)$(datadir)/icons/hicolor/$$SIZE/apps/openra-ra.png"; \
- $(INSTALL_DATA) packaging/artwork/cnc_$$SIZE.png "$(DESTDIR)$(datadir)/icons/hicolor/$$SIZE/apps/openra-cnc.png"; \
- $(INSTALL_DATA) packaging/artwork/d2k_$$SIZE.png "$(DESTDIR)$(datadir)/icons/hicolor/$$SIZE/apps/openra-d2k.png"; \
- done
- $(INSTALL_DIR) "$(DESTDIR)$(datadir)/icons/hicolor/scalable/apps"
- $(INSTALL_DATA) packaging/artwork/ra_scalable.svg "$(DESTDIR)$(datadir)/icons/hicolor/scalable/apps/openra-ra.svg"
- $(INSTALL_DATA) packaging/artwork/cnc_scalable.svg "$(DESTDIR)$(datadir)/icons/hicolor/scalable/apps/openra-cnc.svg"
-
-install-linux-desktop:
- @$(INSTALL_DIR) "$(DESTDIR)$(datadir)/applications"
- @sed 's/{MODID}/ra/g' packaging/linux/openra.desktop.in | sed 's/{MODNAME}/Red Alert/g' | sed 's/{TAG}/$(VERSION)/g' > packaging/linux/openra-ra.desktop
- @$(INSTALL_DATA) packaging/linux/openra-ra.desktop "$(DESTDIR)$(datadir)/applications"
- @sed 's/{MODID}/cnc/g' packaging/linux/openra.desktop.in | sed 's/{MODNAME}/Tiberian Dawn/g' | sed 's/{TAG}/$(VERSION)/g' > packaging/linux/openra-cnc.desktop
- @$(INSTALL_DATA) packaging/linux/openra-cnc.desktop "$(DESTDIR)$(datadir)/applications"
- @sed 's/{MODID}/d2k/g' packaging/linux/openra.desktop.in | sed 's/{MODNAME}/Dune 2000/g' | sed 's/{TAG}/$(VERSION)/g' > packaging/linux/openra-d2k.desktop
- @$(INSTALL_DATA) packaging/linux/openra-d2k.desktop "$(DESTDIR)$(datadir)/applications"
- @-$(RM) packaging/linux/openra-ra.desktop packaging/linux/openra-cnc.desktop packaging/linux/openra-d2k.desktop
-
-install-linux-mime:
- @$(INSTALL_DIR) "$(DESTDIR)$(datadir)/mime/packages/"
- @sed 's/{MODID}/ra/g' packaging/linux/openra-mimeinfo.xml.in | sed 's/{TAG}/$(VERSION)/g' > packaging/linux/openra-mimeinfo.xml
- @$(INSTALL_DATA) packaging/linux/openra-mimeinfo.xml "$(DESTDIR)$(datadir)/mime/packages/openra-ra.xml"
- @sed 's/{MODID}/cnc/g' packaging/linux/openra-mimeinfo.xml.in | sed 's/{TAG}/$(VERSION)/g' > packaging/linux/openra-mimeinfo.xml
- @$(INSTALL_DATA) packaging/linux/openra-mimeinfo.xml "$(DESTDIR)$(datadir)/mime/packages/openra-cnc.xml"
- @sed 's/{MODID}/d2k/g' packaging/linux/openra-mimeinfo.xml.in | sed 's/{TAG}/$(VERSION)/g' > packaging/linux/openra-mimeinfo.xml
- @$(INSTALL_DATA) packaging/linux/openra-mimeinfo.xml "$(DESTDIR)$(datadir)/mime/packages/openra-d2k.xml"
+install-linux-shortcuts:
+ @sh -c '. ./packaging/functions.sh; install_linux_shortcuts $(CWD) $(OPENRA_INSTALL_DIR) $(BIN_INSTALL_DIR) $(DATA_INSTALL_DIR) $(VERSION) cnc d2k ra'
install-linux-appdata:
- @$(INSTALL_DIR) "$(DESTDIR)$(datadir)/appdata/"
- @sed 's/{MODID}/ra/g' packaging/linux/openra.appdata.xml.in | sed 's/{MOD_NAME}/Red Alert/g' | sed 's/{SCREENSHOT_RA}/ type="default"/g' | sed 's/{SCREENSHOT_CNC}//g' | sed 's/{SCREENSHOT_D2K}//g'> packaging/linux/openra-ra.appdata.xml
- @$(INSTALL_DATA) packaging/linux/openra-ra.appdata.xml "$(DESTDIR)$(datadir)/appdata/"
- @sed 's/{MODID}/cnc/g' packaging/linux/openra.appdata.xml.in | sed 's/{MOD_NAME}/Tiberian Dawn/g' | sed 's/{SCREENSHOT_RA}//g' | sed 's/{SCREENSHOT_CNC}/ type="default"/g' | sed 's/{SCREENSHOT_D2K}//g'> packaging/linux/openra-cnc.appdata.xml
- @$(INSTALL_DATA) packaging/linux/openra-cnc.appdata.xml "$(DESTDIR)$(datadir)/appdata/"
- @sed 's/{MODID}/d2k/g' packaging/linux/openra.appdata.xml.in | sed 's/{MOD_NAME}/Dune 2000/g' | sed 's/{SCREENSHOT_RA}//g' | sed 's/{SCREENSHOT_CNC}//g' | sed 's/{SCREENSHOT_D2K}/ type="default"/g'> packaging/linux/openra-d2k.appdata.xml
- @$(INSTALL_DATA) packaging/linux/openra-d2k.appdata.xml "$(DESTDIR)$(datadir)/appdata/"
- @-$(RM) packaging/linux/openra-ra.appdata.xml packaging/linux/openra-cnc.appdata.xml packaging/linux/openra-d2k.appdata.xml
-
-install-man-page:
- @$(INSTALL_DIR) "$(DESTDIR)$(mandir)/man6/"
- @ENGINE_DIR=".." mono --debug bin/OpenRA.Utility.exe all --man-page > openra.6
- @$(INSTALL_DATA) openra.6 "$(DESTDIR)$(mandir)/man6/"
- @-$(RM) openra.6
-
-install-linux-scripts:
-ifeq ($(DEBUG), $(filter $(DEBUG),false no n off 0))
- @sed 's/{DEBUG}//' packaging/linux/openra.in | sed 's|{GAME_INSTALL_DIR}|$(gameinstalldir)|' | sed 's|{BIN_DIR}|$(bindir)|' > packaging/linux/openra.debug.in
- @sed 's/{DEBUG}//' packaging/linux/openra-server.in | sed 's|{GAME_INSTALL_DIR}|$(gameinstalldir)|' | sed 's|{BIN_DIR}|$(bindir)|' > packaging/linux/openra-server.debug.in
-else
- @sed 's/{DEBUG}/--debug/' packaging/linux/openra.in | sed 's|{GAME_INSTALL_DIR}|$(gameinstalldir)|' | sed 's|{BIN_DIR}|$(bindir)|' > packaging/linux/openra.debug.in
- @sed 's/{DEBUG}/--debug/' packaging/linux/openra-server.in | sed 's|{GAME_INSTALL_DIR}|$(gameinstalldir)|' | sed 's|{BIN_DIR}|$(bindir)|' > packaging/linux/openra-server.debug.in
-endif
-
- @sed 's/{MODID}/ra/g' packaging/linux/openra.debug.in | sed 's/{TAG}/$(VERSION)/g' | sed 's/{MODNAME}/Red Alert/g' > packaging/linux/openra-ra
- @sed 's/{MODID}/cnc/g' packaging/linux/openra.debug.in | sed 's/{TAG}/$(VERSION)/g' | sed 's/{MODNAME}/Tiberian Dawn/g' > packaging/linux/openra-cnc
- @sed 's/{MODID}/d2k/g' packaging/linux/openra.debug.in | sed 's/{TAG}/$(VERSION)/g' | sed 's/{MODNAME}/Dune 2000/g' > packaging/linux/openra-d2k
-
- @$(INSTALL_DIR) "$(BIN_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) -m +rx packaging/linux/openra-ra "$(BIN_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) -m +rx packaging/linux/openra-cnc "$(BIN_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) -m +rx packaging/linux/openra-d2k "$(BIN_INSTALL_DIR)"
- @-$(RM) packaging/linux/openra-ra packaging/linux/openra-cnc packaging/linux/openra-d2k packaging/linux/openra.debug.in
-
- @sed 's/{MODID}/ra/g' packaging/linux/openra-server.debug.in | sed 's/{MODNAME}/Red Alert/g' > packaging/linux/openra-ra-server
- @sed 's/{MODID}/cnc/g' packaging/linux/openra-server.debug.in | sed 's/{MODNAME}/Tiberian Dawn/g' > packaging/linux/openra-cnc-server
- @sed 's/{MODID}/d2k/g' packaging/linux/openra-server.debug.in | sed 's/{MODNAME}/Dune 2000/g' > packaging/linux/openra-d2k-server
-
- @$(INSTALL_DIR) "$(BIN_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) -m +rx packaging/linux/openra-ra-server "$(BIN_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) -m +rx packaging/linux/openra-cnc-server "$(BIN_INSTALL_DIR)"
- @$(INSTALL_PROGRAM) -m +rx packaging/linux/openra-d2k-server "$(BIN_INSTALL_DIR)"
- @-$(RM) packaging/linux/openra-ra-server packaging/linux/openra-cnc-server packaging/linux/openra-d2k-server packaging/linux/openra-server.debug.in
-
-uninstall:
- @-$(RM_R) "$(DATA_INSTALL_DIR)"
- @-$(RM_F) "$(BIN_INSTALL_DIR)/openra-ra"
- @-$(RM_F) "$(BIN_INSTALL_DIR)/openra-ra-server"
- @-$(RM_F) "$(BIN_INSTALL_DIR)/openra-cnc"
- @-$(RM_F) "$(BIN_INSTALL_DIR)/openra-cnc-server"
- @-$(RM_F) "$(BIN_INSTALL_DIR)/openra-d2k"
- @-$(RM_F) "$(BIN_INSTALL_DIR)/openra-d2k-server"
- @-$(RM_F) "$(DESTDIR)$(datadir)/applications/openra-ra.desktop"
- @-$(RM_F) "$(DESTDIR)$(datadir)/applications/openra-cnc.desktop"
- @-$(RM_F) "$(DESTDIR)$(datadir)/applications/openra-d2k.desktop"
- @-for SIZE in 16x16 32x32 48x48 64x64 128x128; do \
- $(RM_F) "$(DESTDIR)$(datadir)/icons/hicolor/$$SIZE/apps/openra-ra.png"; \
- $(RM_F) "$(DESTDIR)$(datadir)/icons/hicolor/$$SIZE/apps/openra-cnc.png"; \
- $(RM_F) "$(DESTDIR)$(datadir)/icons/hicolor/$$SIZE/apps/openra-d2k.png"; \
- done
- @-$(RM_F) "$(DESTDIR)$(datadir)/icons/hicolor/scalable/apps/openra-ra.svg"
- @-$(RM_F) "$(DESTDIR)$(datadir)/icons/hicolor/scalable/apps/openra-cnc.svg"
- @-$(RM_F) "$(DESTDIR)$(datadir)/mime/packages/openra-ra.xml"
- @-$(RM_F) "$(DESTDIR)$(datadir)/mime/packages/openra-cnc.xml"
- @-$(RM_F) "$(DESTDIR)$(datadir)/mime/packages/openra-d2k.xml"
- @-$(RM_F) "$(DESTDIR)$(datadir)/appdata/openra-ra.appdata.xml"
- @-$(RM_F) "$(DESTDIR)$(datadir)/appdata/openra-cnc.appdata.xml"
- @-$(RM_F) "$(DESTDIR)$(datadir)/appdata/openra-d2k.appdata.xml"
- @-$(RM_F) "$(DESTDIR)$(mandir)/man6/openra.6"
+ @sh -c '. ./packaging/functions.sh; install_linux_appdata $(CWD) $(DATA_INSTALL_DIR) cnc d2k ra'
help:
@echo 'to compile, run:'
@@ -345,22 +159,14 @@ help:
@echo 'to check the engine and official mod dlls for code style violations, run:'
@echo ' make test'
@echo
- @echo 'to install, run:'
- @echo ' make [prefix=/foo] [bindir=/bar/bin] install'
+ @echo 'to compile and install Red Alert, Tiberian Dawn, and Dune 2000 run:'
+ @echo ' make [prefix=/foo] install'
@echo
- @echo 'to install Linux startup scripts, desktop files and icons'
- @echo ' make install-linux-shortcuts [DEBUG=false]'
+ @echo 'to install Linux startup scripts, desktop files, icons, and MIME metadata'
+ @echo ' make install-linux-shortcuts'
@echo
- @echo ' to install the engine and common mod files (omitting the default mods):'
- @echo ' make install-engine'
- @echo ' make install-dependencies'
- @echo ' make install-common-mod-files'
- @echo
- @echo 'to uninstall, run:'
- @echo ' make uninstall'
- @echo
- @echo 'to start the game, run:'
- @echo ' openra'
+ @echo 'to install Linux AppStream metadata'
+ @echo ' make install-linux-appdata'
########################### MAKEFILE SETTINGS ##########################
#
@@ -368,4 +174,4 @@ help:
.SUFFIXES:
-.PHONY: check-scripts check test all core clean version install install-linux-shortcuts install-dependencies install-engine install-common-mod-files install-default-mods install-linux-icons install-linux-desktop install-linux-mime install-linux-appdata install-man-page install-linux-scripts uninstall help
+.PHONY: all clean check check-scripts test version install install-linux-shortcuts install-linux-appdata help
diff --git a/appveyor.yml b/appveyor.yml
index f81557015a..73f4802102 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -21,8 +21,7 @@ after_test:
- move /Y %APPVEYOR_BUILD_FOLDER%\bin\* %APPVEYOR_BUILD_FOLDER%
- if defined APPVEYOR_REPO_TAG_NAME set VERSION=%APPVEYOR_REPO_TAG_NAME%
- if not defined APPVEYOR_REPO_TAG_NAME set VERSION=%APPVEYOR_REPO_COMMIT:~0,7%
- - '"C:\Program Files (x86)\NSIS\makensis.exe" /DSRCDIR="%APPVEYOR_BUILD_FOLDER%" /DTAG="git-%VERSION%" /DSUFFIX=" (dev)" /V3 packaging/windows/OpenRA.nsi'
- - move /Y %APPVEYOR_BUILD_FOLDER%\packaging\windows\OpenRA.Setup.exe %APPVEYOR_BUILD_FOLDER%\OpenRA-%VERSION%.exe
+ - '"C:\Program Files (x86)\NSIS\makensis.exe" /DSRCDIR="%APPVEYOR_BUILD_FOLDER%" /DTAG="git-%VERSION%" /DSUFFIX=" (dev)" /V3 /DOUTFILE="OpenRA-$(VERSION).exe" packaging/windows/OpenRA.nsi'
artifacts:
- path: OpenRA-$(VERSION).exe
diff --git a/packaging/functions.sh b/packaging/functions.sh
new file mode 100755
index 0000000000..b84ead0b9d
--- /dev/null
+++ b/packaging/functions.sh
@@ -0,0 +1,332 @@
+#!/bin/sh
+# Helper functions for packaging and installing OpenRA
+
+####
+# This file must stay /bin/sh and POSIX compliant for macOS and BSD portability.
+# Copy-paste the entire script into http://shellcheck.net to check.
+####
+
+# Compile and publish (using Mono) the core engine and specified mod assemblies to the target directory
+# Arguments:
+# SRC_PATH: Path to the root OpenRA directory
+# DEST_PATH: Path to the root of the install destination (will be created if necessary)
+# TARGETPLATFORM: Platform type (win-x86, win-x64, osx-x64, linux-x64, unix-generic)
+# COPY_GENERIC_LAUNCHER: If set to True the OpenRA.exe will also be copied (True, False)
+# COPY_CNC_DLL: If set to True the OpenRA.Mods.Cnc.dll will also be copied (True, False)
+# COPY_D2K_DLL: If set to True the OpenRA.Mods.D2k.dll and OpenRA.Mods.Cnc.dll will also be copied (True, False)
+# Used by:
+# Makefile (install target for local installs and downstream packaging)
+# Linux AppImage packaging
+# macOS packaging
+# Windows packaging
+# Mod SDK Linux AppImage packaging
+# Mod SDK macOS packaging
+# Mod SDK Windows packaging
+install_assemblies_mono() {
+ SRC_PATH="${1}"
+ DEST_PATH="${2}"
+ TARGETPLATFORM="${3}"
+ COPY_GENERIC_LAUNCHER="${4}"
+ COPY_CNC_DLL="${5}"
+ COPY_D2K_DLL="${6}"
+
+ echo "Building assemblies"
+ ORIG_PWD=$(pwd)
+ cd "${SRC_PATH}" || exit 1
+ msbuild -verbosity:m -nologo -t:Clean
+ rm -rf "${SRC_PATH:?}/bin"
+ msbuild -verbosity:m -nologo -t:Build -restore -p:Configuration=Release -p:TargetPlatform="${TARGETPLATFORM}"
+ if [ "${TARGETPLATFORM}" = "unix-generic" ]; then
+ ./configure-system-libraries.sh
+ fi
+
+ ./fetch-geoip.sh
+ cd "${ORIG_PWD}" || exit 1
+
+ echo "Installing engine to ${DEST_PATH}"
+ install -d "${DEST_PATH}"
+
+ # Core engine
+ install -m755 "${SRC_PATH}/bin/OpenRA.Server.exe" "${DEST_PATH}"
+ install -m755 "${SRC_PATH}/bin/OpenRA.Utility.exe" "${DEST_PATH}"
+ install -m644 "${SRC_PATH}/bin/OpenRA.Game.dll" "${DEST_PATH}"
+ install -m644 "${SRC_PATH}/bin/OpenRA.Platforms.Default.dll" "${DEST_PATH}"
+ if [ "${COPY_GENERIC_LAUNCHER}" = "True" ]; then
+ install -m755 "${SRC_PATH}/bin/OpenRA.exe" "${DEST_PATH}"
+ fi
+
+ # Mod dlls
+ install -m644 "${SRC_PATH}/bin/OpenRA.Mods.Common.dll" "${DEST_PATH}"
+ if [ "${COPY_CNC_DLL}" = "True" ]; then
+ install -m644 "${SRC_PATH}/bin/OpenRA.Mods.Cnc.dll" "${DEST_PATH}"
+ fi
+
+ if [ "${COPY_D2K_DLL}" = "True" ]; then
+ install -m644 "${SRC_PATH}/bin/OpenRA.Mods.D2k.dll" "${DEST_PATH}"
+ fi
+
+ # Managed Dependencies
+ for LIB in ICSharpCode.SharpZipLib.dll FuzzyLogicLibrary.dll Open.Nat.dll BeaconLib.dll DiscordRPC.dll Newtonsoft.Json.dll SDL2-CS.dll OpenAL-CS.Core.dll Eluant.dll; do
+ install -m644 "${SRC_PATH}/bin/${LIB}" "${DEST_PATH}"
+ done
+
+ # Native dependencies
+ if [ "${TARGETPLATFORM}" = "win-x86" ] || [ "${TARGETPLATFORM}" = "win-x64" ]; then
+ echo "Installing dependencies for ${TARGETPLATFORM} to ${DEST_PATH}"
+ for LIB in soft_oal.dll SDL2.dll freetype6.dll lua51.dll libEGL.dll libGLESv2.dll; do
+ install -m644 "${SRC_PATH}/bin/${LIB}" "${DEST_PATH}"
+ done
+ else
+ for LIB in OpenRA.Platforms.Default.dll.config SDL2-CS.dll.config OpenAL-CS.Core.dll.config Eluant.dll.config; do
+ install -m644 "${SRC_PATH}/bin/${LIB}" "${DEST_PATH}"
+ done
+ fi
+
+ if [ "${TARGETPLATFORM}" = "linux-x64" ]; then
+ echo "Installing dependencies for ${TARGETPLATFORM} to ${DEST_PATH}"
+ for LIB in soft_oal.so SDL2.so freetype6.so lua51.so; do
+ install -m755 "${SRC_PATH}/bin/${LIB}" "${DEST_PATH}"
+ done
+ fi
+
+ if [ "${TARGETPLATFORM}" = "osx-x64" ]; then
+ echo "Installing dependencies for ${TARGETPLATFORM} to ${DEST_PATH}"
+ for LIB in soft_oal.dylib SDL2.dylib freetype6.dylib lua51.dylib; do
+ install -m755 "${SRC_PATH}/bin/${LIB}" "${DEST_PATH}"
+ done
+ fi
+}
+
+# Copy the core engine and specified mod data to the target directory
+# Arguments:
+# SRC_PATH: Path to the root OpenRA directory
+# DEST_PATH: Path to the root of the install destination (will be created if necessary)
+# MOD [MOD...]: One or more mod ids to copy (cnc, d2k, ra)
+# Used by:
+# Makefile (install target for local installs and downstream packaging)
+# Linux AppImage packaging
+# macOS packaging
+# Windows packaging
+# Mod SDK Linux AppImage packaging
+# Mod SDK macOS packaging
+# Mod SDK Windows packaging
+install_data() {
+ SRC_PATH="${1}"
+ DEST_PATH="${2}"
+ shift 2
+
+ echo "Installing engine files to ${DEST_PATH}"
+ for FILE in VERSION AUTHORS COPYING IP2LOCATION-LITE-DB1.IPV6.BIN.ZIP "global mix database.dat"; do
+ install -m644 "${SRC_PATH}/${FILE}" "${DEST_PATH}"
+ done
+
+ cp -r "${SRC_PATH}/glsl" "${DEST_PATH}"
+ cp -r "${SRC_PATH}/lua" "${DEST_PATH}"
+
+ echo "Installing common mod files to ${DEST_PATH}"
+ install -d "${DEST_PATH}/mods"
+ cp -r "${SRC_PATH}/mods/common" "${DEST_PATH}/mods/"
+
+ while [ -n "${1}" ]; do
+ MOD_ID="${1}"
+ if [ "${MOD_ID}" = "ra" ] || [ "${MOD_ID}" = "cnc" ] || [ "${MOD_ID}" = "d2k" ]; then
+ echo "Installing mod ${MOD_ID} to ${DEST_PATH}"
+ cp -r "${SRC_PATH}/mods/${MOD_ID}" "${DEST_PATH}/mods/"
+ cp -r "${SRC_PATH}/mods/modcontent" "${DEST_PATH}/mods/"
+ fi
+
+ shift
+ done
+}
+
+# Compile and publish (using Mono) a windows launcher with the specified mod details to the target directory
+# Arguments:
+# SRC_PATH: Path to the root OpenRA directory
+# DEST_PATH: Path to the root of the install destination (will be created if necessary)
+# TARGETPLATFORM: Platform type (win-x86, win-x64)
+# MOD_ID: Mod id to launch (e.g. "ra")
+# LAUNCHER_NAME: Filename (without the .exe extension) for the launcher
+# MOD_NAME: Human-readable mod name to show in the crash dialog (e.g. "Red Alert")
+# ICON_PATH: Path to a windows .ico file
+# FAQ_URL: URL to load when the "View FAQ" button is pressed in the crash dialog (e.g. https://wiki.openra.net/FAQ)
+# Used by:
+# Windows packaging
+# Mod SDK Windows packaging
+install_windows_launcher()
+{
+ SRC_PATH="${1}"
+ DEST_PATH="${2}"
+ TARGETPLATFORM="${3}"
+ MOD_ID="${4}"
+ LAUNCHER_NAME="${5}"
+ MOD_NAME="${6}"
+ ICON_PATH="${7}"
+ FAQ_URL="${8}"
+
+ msbuild -verbosity:m -nologo -t:Clean "${SRC_PATH}/OpenRA.WindowsLauncher/OpenRA.WindowsLauncher.csproj"
+ rm -rf "${SRC_PATH:?}/bin"
+ msbuild -t:Build "${SRC_PATH}/OpenRA.WindowsLauncher/OpenRA.WindowsLauncher.csproj" -restore -p:Configuration=Release -p:TargetPlatform="${TARGETPLATFORM}" -p:LauncherName="${LAUNCHER_NAME}" -p:LauncherIcon="${ICON_PATH}" -p:ModID="${MOD_ID}" -p:DisplayName="${MOD_NAME}" -p:FaqUrl="${FAQ_URL}"
+ install -m755 "${SRC_PATH}/bin/${LAUNCHER_NAME}.exe" "${DEST_PATH}"
+ install -m644 "${SRC_PATH}/bin/${LAUNCHER_NAME}.exe.config" "${DEST_PATH}"
+
+ # Enable the full 4GB address space for the 32 bit game executable
+ # The server and utility do not use enough memory to need this
+ if [ "${TARGETPLATFORM}" = "win-x86" ]; then
+ python3 "${SRC_PATH}/packaging/windows/MakeLAA.py" "${DEST_PATH}/${LAUNCHER_NAME}.exe"
+ fi
+}
+
+# Write a version string to the engine VERSION file
+# Arguments:
+# VERSION: OpenRA version string
+# DEST_PATH: Path to the root of the install destination
+# Used by:
+# Makefile (install target for local installs and downstream packaging)
+# Linux AppImage packaging
+# macOS packaging
+# Windows packaging
+# Mod SDK Linux AppImage packaging
+# Mod SDK macOS packaging
+# Mod SDK Windows packaging
+set_engine_version() {
+ VERSION="${1}"
+ DEST_PATH="${2}"
+ echo "${VERSION}" > "${DEST_PATH}/VERSION"
+}
+
+# Write a version string to a list of specified mod.yamls
+# Arguments:
+# VERSION: OpenRA version string
+# MOD_YAML_PATH [MOD_YAML_PATH...]: One or more mod.yaml files to update
+# Used by:
+# Makefile (install target for local installs and downstream packaging)
+# Linux AppImage packaging
+# macOS packaging
+# Windows packaging
+# Mod SDK Linux AppImage packaging
+# Mod SDK macOS packaging
+# Mod SDK Windows packaging
+set_mod_version() {
+ VERSION="${1}"
+ shift
+ while [ -n "${1}" ]; do
+ MOD_YAML_PATH="${1}"
+ awk -v v="${VERSION}" '{sub("Version:.*$", "Version: " v); print $0}' "${MOD_YAML_PATH}" > "${MOD_YAML_PATH}.tmp"
+ awk -v v="${VERSION}" '{sub("/[^/]*: User$", "/"v ": User"); print $0}' "${MOD_YAML_PATH}.tmp" > "${MOD_YAML_PATH}"
+ rm "${MOD_YAML_PATH}.tmp"
+ shift
+ done
+}
+
+# Copy launch wrappers, application icons, desktop, and MIME files to the target directory
+# Arguments:
+# SRC_PATH: Path to the root OpenRA directory
+# OPENRA_PATH: Path to the OpenRA installation (e.g. /usr/local/lib/openra)
+# BIN_PATH: Path to install wrapper scripts (e.g. /usr/local/bin)
+# SHARE_PATH: Parent path to the icons and applications directory (e.g. /usr/local/share)
+# VERSION: OpenRA version string
+# MOD [MOD...]: One or more mod ids to copy (cnc, d2k, ra)
+# Used by:
+# Makefile (install-linux-shortcuts target for local installs and downstream packaging)
+install_linux_shortcuts() {
+ SRC_PATH="${1}"
+ OPENRA_PATH="${2}"
+ BIN_PATH="${3}"
+ SHARE_PATH="${4}"
+ VERSION="${5}"
+ shift 5
+
+ while [ -n "${1}" ]; do
+ MOD_ID="${1}"
+ if [ "${MOD_ID}" = "ra" ] || [ "${MOD_ID}" = "cnc" ] || [ "${MOD_ID}" = "d2k" ]; then
+ if [ "${MOD_ID}" = "cnc" ]; then
+ MOD_NAME="Tiberian Dawn"
+ fi
+
+ if [ "${MOD_ID}" = "d2k" ]; then
+ MOD_NAME="Dune 2000"
+ fi
+
+ if [ "${MOD_ID}" = "ra" ]; then
+ MOD_NAME="Red Alert"
+ fi
+
+ # bin wrappers
+ install -d "${DEST_PATH}/bin"
+
+ sed 's/{DEBUG}/--debug/' "${SRC_PATH}/packaging/linux/openra.in" | sed "s|{GAME_INSTALL_DIR}|${OPENRA_PATH}|" | sed "s|{BIN_DIR}|${DEST_PATH}/bin)|" | sed "s/{MODID}/${MOD_ID}/g" | sed "s/{TAG}/${VERSION}/g" | sed "s/{MODNAME}/${MOD_NAME}/g" > "${SRC_PATH}/packaging/linux/openra-${MOD_ID}"
+ sed 's/{DEBUG}/--debug/' "${SRC_PATH}/packaging/linux/openra-server.in" | sed "s|{GAME_INSTALL_DIR}|${OPENRA_PATH}|" | sed "s/{MODID}/${MOD_ID}/g" > "${SRC_PATH}/packaging/linux/openra-${MOD_ID}-server"
+ install -m755 "${SRC_PATH}/packaging/linux/openra-${MOD_ID}" "${BIN_PATH}"
+ install -m755 "${SRC_PATH}/packaging/linux/openra-${MOD_ID}-server" "${BIN_PATH}"
+ rm "${SRC_PATH}/packaging/linux/openra-${MOD_ID}" "${SRC_PATH}/packaging/linux/openra-${MOD_ID}-server"
+
+ # desktop files
+ install -d "${SHARE_PATH}/applications"
+ sed "s/{MODID}/${MOD_ID}/g" "${SRC_PATH}/packaging/linux/openra.desktop.in" | sed "s/{MODNAME}/${MOD_NAME}/g" | sed "s/{TAG}/${VERSION}/g" > "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.desktop"
+ install -m644 "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.desktop" "${SHARE_PATH}/applications"
+ rm "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.desktop"
+
+ # icons
+ for SIZE in 16x16 32x32 48x48 64x64 128x128; do
+ install -d "${SHARE_PATH}/icons/hicolor/${SIZE}/apps"
+ install -m644 "${SRC_PATH}/packaging/artwork/${MOD_ID}_${SIZE}.png" "${SHARE_PATH}/icons/hicolor/${SIZE}/apps/openra-${MOD_ID}.png"
+ done
+
+ if [ "${MOD_ID}" = "ra" ] || [ "${MOD_ID}" = "cnc" ]; then
+ install -d "${SHARE_PATH}/icons/hicolor/scalable/apps"
+ install -m644 "${SRC_PATH}/packaging/artwork/${MOD_ID}_scalable.svg" "${SHARE_PATH}/icons/hicolor/scalable/apps/openra-${MOD_ID}.svg"
+ fi
+
+ # MIME info
+ install -d "${SHARE_PATH}/mime/packages"
+ sed "s/{MODID}/${MOD_ID}/g" "${SRC_PATH}/packaging/linux/openra-mimeinfo.xml.in" | sed "s/{TAG}/${VERSION}/g" > "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.xml"
+ install -m644 "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.xml" "${SHARE_PATH}/mime/packages/openra-${MOD_ID}.xml"
+ rm "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.xml"
+ fi
+
+ shift
+ done
+}
+
+# Copy AppStream metadata to the target directory
+# Arguments:
+# SRC_PATH: Path to the root OpenRA directory
+# SHARE_PATH: Parent path to the appdata directory (e.g. /usr/local/share)
+# MOD [MOD...]: One or more mod ids to copy (cnc, d2k, ra)
+# Used by:
+# Makefile (install-linux-appdata target for local installs and downstream packaging)
+install_linux_appdata() {
+ SRC_PATH="${1}"
+ SHARE_PATH="${2}"
+ shift 2
+ while [ -n "${1}" ]; do
+ MOD_ID="${1}"
+ SCREENSHOT_CNC=
+ SCREENSHOT_D2K=
+ SCREENSHOT_RA=
+ if [ "${MOD_ID}" = "ra" ] || [ "${MOD_ID}" = "cnc" ] || [ "${MOD_ID}" = "d2k" ]; then
+ if [ "${MOD_ID}" = "cnc" ]; then
+ MOD_NAME="Tiberian Dawn"
+ SCREENSHOT_CNC=" type=\"default\""
+ fi
+
+ if [ "${MOD_ID}" = "d2k" ]; then
+ MOD_NAME="Dune 2000"
+ SCREENSHOT_D2K=" type=\"default\""
+ fi
+
+ if [ "${MOD_ID}" = "ra" ]; then
+ MOD_NAME="Red Alert"
+ SCREENSHOT_RA=" type=\"default\""
+ fi
+ fi
+
+ install -d "${SHARE_PATH}/appdata"
+
+ sed "s/{MODID}/${MOD_ID}/g" "${SRC_PATH}/packaging/linux/openra.appdata.xml.in" | sed "s/{MOD_NAME}/${MOD_NAME}/g" | sed "s/{SCREENSHOT_RA}/${SCREENSHOT_RA}/g" | sed "s/{SCREENSHOT_CNC}/${SCREENSHOT_CNC}/g" | sed "s/{SCREENSHOT_D2K}/${SCREENSHOT_D2K}/g"> "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.appdata.xml"
+ install -m644 "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.appdata.xml" "${SHARE_PATH}/appdata"
+ rm "${SRC_PATH}/packaging/linux/openra-${MOD_ID}.appdata.xml"
+
+ shift
+ done
+}
diff --git a/packaging/linux/buildpackage.sh b/packaging/linux/buildpackage.sh
index a802269284..240f6a7d28 100755
--- a/packaging/linux/buildpackage.sh
+++ b/packaging/linux/buildpackage.sh
@@ -15,6 +15,7 @@ fi
# Set the working dir to the location of this script
cd "$(dirname "$0")" || exit 1
+. ../functions.sh
TAG="$1"
OUTPUTDIR="$2"
@@ -42,20 +43,6 @@ if [ ! -d "${OUTPUTDIR}" ]; then
exit 1
fi
-echo "Building core files"
-
-pushd "${SRCDIR}" > /dev/null || exit 1
-
-make clean
-
-make core TARGETPLATFORM=linux-x64
-make version VERSION="${TAG}"
-make install-engine prefix="usr" DESTDIR="${BUILTDIR}/"
-make install-common-mod-files prefix="usr" DESTDIR="${BUILTDIR}/"
-make install-dependencies TARGETPLATFORM=linux-x64 prefix="usr" DESTDIR="${BUILTDIR}/"
-
-popd > /dev/null || exit 1
-
# Add native libraries
echo "Downloading dependencies"
if command -v curl >/dev/null 2>&1; then
@@ -66,29 +53,21 @@ else
wget -cq https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage || exit 3
fi
+# travis-ci doesn't support mounting FUSE filesystems so extract and run the contents manually
chmod a+x appimagetool-x86_64.AppImage
+./appimagetool-x86_64.AppImage --appimage-extract
echo "Building AppImage"
-mkdir libs
-pushd libs
-tar xf ../mono.tar.bz2
+mkdir "${BUILTDIR}"
+tar xf mono.tar.bz2 -C "${BUILTDIR}"
+chmod 0755 "${BUILTDIR}/usr/bin/mono"
+chmod 0644 "${BUILTDIR}/etc/mono/config"
+chmod 0644 "${BUILTDIR}/etc/mono/4.5/machine.config"
+chmod 0644 "${BUILTDIR}/usr/lib/mono/4.5/Facades/"*.dll
+chmod 0644 "${BUILTDIR}/usr/lib/mono/4.5/"*.dll "${BUILTDIR}/usr/lib/mono/4.5/"*.exe
+chmod 0755 "${BUILTDIR}/usr/lib/"*.so
-install -d "${BUILTDIR}/usr/bin"
-install -d "${BUILTDIR}/etc/mono/4.5"
-install -d "${BUILTDIR}/usr/lib/mono/4.5/Facades"
-
-install -Dm 0755 usr/bin/mono "${BUILTDIR}/usr/bin/"
-
-install -Dm 0644 /etc/mono/config "${BUILTDIR}/etc/mono/"
-install -Dm 0644 /etc/mono/4.5/machine.config "${BUILTDIR}/etc/mono/4.5"
-
-for f in $(ls usr/lib/mono/4.5/Facades/*.dll); do install -Dm 0644 "$f" "${BUILTDIR}/usr/lib/mono/4.5/Facades/"; done
-for f in $(ls usr/lib/mono/4.5/*.dll usr/lib/mono/4.5/*.exe); do install -Dm 0644 "$f" "${BUILTDIR}/usr/lib/mono/4.5/"; done
-for f in $(ls usr/lib/*.so); do install -Dm 0755 "$f" "${BUILTDIR}/usr/lib/"; done
-
-popd
-
-rm -rf libs mono.tar.bz2
+rm -rf mono.tar.bz2
build_appimage() {
MOD_ID=${1}
@@ -99,28 +78,30 @@ build_appimage() {
cp -r "${BUILTDIR}" "${APPDIR}"
- # Add mod files
- pushd "${SRCDIR}" > /dev/null || exit 1
- cp -r "mods/${MOD_ID}" mods/modcontent "${APPDIR}/usr/lib/openra/mods"
-
- # HACK: The D2k dll is not copied by install-common-mod-files so we must do this ourselves
+ IS_D2K="False"
if [ "${MOD_ID}" = "d2k" ]; then
- cp "bin/OpenRA.Mods.D2k.dll" "${APPDIR}/usr/lib/openra"
+ IS_D2K="True"
fi
- popd > /dev/null || exit 1
+
+ install_assemblies_mono "${SRCDIR}" "${APPDIR}/usr/lib/openra" "linux-x64" "True" "True" "${IS_D2K}"
+ install_data "${SRCDIR}" "${APPDIR}/usr/lib/openra" "${MOD_ID}"
+ set_engine_version "${TAG}" "${APPDIR}/usr/lib/openra"
+ set_mod_version "${TAG}" "${APPDIR}/usr/lib/openra/mods/${MOD_ID}/mod.yaml" "${APPDIR}/usr/lib/openra/mods/modcontent/mod.yaml"
# Add launcher and icons
- sed "s/{MODID}/${MOD_ID}/g" AppRun.in | sed "s/{MODNAME}/${DISPLAY_NAME}/g" > AppRun.temp
- install -m 0755 AppRun.temp "${APPDIR}/AppRun"
+ sed "s/{MODID}/${MOD_ID}/g" AppRun.in | sed "s/{MODNAME}/${DISPLAY_NAME}/g" > "${APPDIR}/AppRun"
+ chmod 0755 "${APPDIR}/AppRun"
- sed "s/{MODID}/${MOD_ID}/g" openra.desktop.in | sed "s/{MODNAME}/${DISPLAY_NAME}/g" | sed "s/{TAG}/${TAG}/g" | sed "s/{DISCORDAPPID}/${DISCORD_ID}/g" > temp.desktop
- echo "StartupWMClass=openra-${MOD_ID}-${TAG}" >> temp.desktop
+ mkdir -p "${APPDIR}/usr/share/applications"
+ # Note that the non-discord version of the desktop file is used by the Mod SDK and must be maintained in parallel with the discord version!
+ sed "s/{MODID}/${MOD_ID}/g" openra.desktop.discord.in | sed "s/{MODNAME}/${DISPLAY_NAME}/g" | sed "s/{TAG}/${TAG}/g" | sed "s/{DISCORDAPPID}/${DISCORD_ID}/g" > "${APPDIR}/usr/share/applications/openra-${MOD_ID}.desktop"
+ chmod 0755 "${APPDIR}/usr/share/applications/openra-${MOD_ID}.desktop"
+ cp "${APPDIR}/usr/share/applications/openra-${MOD_ID}.desktop" "${APPDIR}/openra-${MOD_ID}.desktop"
- install -Dm 0755 temp.desktop "${APPDIR}/usr/share/applications/openra-${MOD_ID}.desktop"
- install -m 0755 temp.desktop "${APPDIR}/openra-${MOD_ID}.desktop"
-
- sed "s/{MODID}/${MOD_ID}/g" openra-mimeinfo.xml.in | sed "s/{TAG}/${TAG}/g" > temp.xml
- install -Dm 0755 temp.xml "${APPDIR}/usr/share/mime/packages/openra-${MOD_ID}.xml"
+ mkdir -p "${APPDIR}/usr/share/mime/packages"
+ # Note that the non-discord version of the mimeinfo file is used by the Mod SDK and must be maintained in parallel with the discord version!
+ sed "s/{MODID}/${MOD_ID}/g" openra-mimeinfo.xml.discord.in | sed "s/{TAG}/${TAG}/g" | sed "s/{DISCORDAPPID}/${DISCORD_ID}/g" > "${APPDIR}/usr/share/mime/packages/openra-${MOD_ID}.xml"
+ chmod 0755 "${APPDIR}/usr/share/mime/packages/openra-${MOD_ID}.xml"
if [ -f "${ARTWORK_DIR}/${MOD_ID}_scalable.svg" ]; then
install -Dm644 "${ARTWORK_DIR}/${MOD_ID}_scalable.svg" "${APPDIR}/usr/share/icons/hicolor/scalable/apps/openra-${MOD_ID}.svg"
@@ -133,24 +114,20 @@ build_appimage() {
fi
done
- sed "s/{MODID}/${MOD_ID}/g" openra.appimage.in | sed "s/{TAG}/${TAG}/g" | sed "s/{MODNAME}/${DISPLAY_NAME}/g" > openra-mod.temp
- install -m 0755 openra-mod.temp "${APPDIR}/usr/bin/openra-${MOD_ID}"
+ sed "s/{MODID}/${MOD_ID}/g" openra.appimage.in | sed "s/{TAG}/${TAG}/g" | sed "s/{MODNAME}/${DISPLAY_NAME}/g" > "${APPDIR}/usr/bin/openra-${MOD_ID}"
+ chmod 0755 "${APPDIR}/usr/bin/openra-${MOD_ID}"
- sed "s/{MODID}/${MOD_ID}/g" openra-server.appimage.in > openra-mod-server.temp
- install -m 0755 openra-mod-server.temp "${APPDIR}/usr/bin/openra-${MOD_ID}-server"
+ sed "s/{MODID}/${MOD_ID}/g" openra-server.appimage.in > "${APPDIR}/usr/bin/openra-${MOD_ID}-server"
+ chmod 0755 "${APPDIR}/usr/bin/openra-${MOD_ID}-server"
- sed "s/{MODID}/${MOD_ID}/g" openra-utility.appimage.in > openra-mod-utility.temp
- install -m 0755 openra-mod-utility.temp "${APPDIR}/usr/bin/openra-${MOD_ID}-utility"
+ sed "s/{MODID}/${MOD_ID}/g" openra-utility.appimage.in > "${APPDIR}/usr/bin/openra-${MOD_ID}-utility"
+ chmod 0755 "${APPDIR}/usr/bin/openra-${MOD_ID}-utility"
install -m 0755 gtk-dialog.py "${APPDIR}/usr/bin/gtk-dialog.py"
-
install -m 0755 restore-environment.sh "${APPDIR}/usr/bin/restore-environment.sh"
- # travis-ci doesn't support mounting FUSE filesystems so extract and run the contents manually
- ./appimagetool-x86_64.AppImage --appimage-extract
-
# Embed update metadata if (and only if) compiled on travis
- if [ ! -z "${TRAVIS_REPO_SLUG}" ]; then
+ if [ -n "${TRAVIS_REPO_SLUG}" ]; then
ARCH=x86_64 ./squashfs-root/AppRun --no-appstream -u "zsync|https://master.openra.net/appimagecheck?mod=${MOD_ID}&channel=${UPDATE_CHANNEL}" "${APPDIR}" "${OUTPUTDIR}/${APPIMAGE}"
zsyncmake -u "https://github.com/${TRAVIS_REPO_SLUG}/releases/download/${TAG}/${APPIMAGE}" -o "${OUTPUTDIR}/${APPIMAGE}.zsync" "${OUTPUTDIR}/${APPIMAGE}"
else
@@ -165,4 +142,4 @@ build_appimage "cnc" "Tiberian Dawn" "699223250181292033"
build_appimage "d2k" "Dune 2000" "712711732770111550"
# Clean up
-rm -rf openra-mod.temp openra-mod-server.temp openra-mod-utility.temp temp.desktop temp.xml AppRun.temp appimagetool-x86_64.AppImage squashfs-root "${BUILTDIR}"
+rm -rf appimagetool-x86_64.AppImage squashfs-root "${BUILTDIR}"
diff --git a/packaging/linux/openra-mimeinfo.xml.discord.in b/packaging/linux/openra-mimeinfo.xml.discord.in
new file mode 100644
index 0000000000..fd8e5ddf43
--- /dev/null
+++ b/packaging/linux/openra-mimeinfo.xml.discord.in
@@ -0,0 +1,14 @@
+
+
+
+
+
+ Join OpenRA server
+
+
+
+
+ Launch OpenRA from Discord
+
+
+
diff --git a/packaging/linux/openra-server.appimage.in b/packaging/linux/openra-server.appimage.in
index d53260e094..cf8f77c1ba 100755
--- a/packaging/linux/openra-server.appimage.in
+++ b/packaging/linux/openra-server.appimage.in
@@ -2,4 +2,4 @@
HERE="$(dirname "$(readlink -f "${0}")")"
cd "${HERE}/../lib/openra" || exit 1
-mono --debug OpenRA.Server.exe Game.Mod={MODID} "$@"
+mono --debug OpenRA.Server.exe Game.Mod="{MODID}" "$@"
diff --git a/packaging/linux/openra.desktop.discord.in b/packaging/linux/openra.desktop.discord.in
new file mode 100644
index 0000000000..19fa05629c
--- /dev/null
+++ b/packaging/linux/openra.desktop.discord.in
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=OpenRA - {MODNAME}
+GenericName=Real Time Strategy Game
+GenericName[de]=Echtzeit-Strategiespiel
+Icon=openra-{MODID}
+Exec=openra-{MODID} %U
+Terminal=false
+Categories=Game;StrategyGame;
+StartupWMClass=openra-{MODID}-{TAG}
+MimeType=x-scheme-handler/openra-{MODID}-{TAG};x-scheme-handler/discord-{DISCORDAPPID};
diff --git a/packaging/linux/openra.desktop.in b/packaging/linux/openra.desktop.in
index 42e21aafa0..e02ecd724a 100644
--- a/packaging/linux/openra.desktop.in
+++ b/packaging/linux/openra.desktop.in
@@ -4,9 +4,9 @@ Version=1.0
Name=OpenRA - {MODNAME}
GenericName=Real Time Strategy Game
GenericName[de]=Echtzeit-Strategiespiel
-Comment=Reimagining of early Westwood Games
Icon=openra-{MODID}
Exec=openra-{MODID} %U
Terminal=false
Categories=Game;StrategyGame;
-MimeType=x-scheme-handler/openra-{MODID}-{TAG};x-scheme-handler/discord-{DISCORDAPPID};
+StartupWMClass=openra-{MODID}-{TAG}
+MimeType=x-scheme-handler/openra-{MODID}-{TAG};
diff --git a/packaging/macos/Eluant.dll.config b/packaging/macos/Eluant.dll.config
deleted file mode 100644
index 43be429756..0000000000
--- a/packaging/macos/Eluant.dll.config
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/packaging/macos/buildpackage.sh b/packaging/macos/buildpackage.sh
index db7d40ffbc..35838ff2c6 100755
--- a/packaging/macos/buildpackage.sh
+++ b/packaging/macos/buildpackage.sh
@@ -1,8 +1,9 @@
#!/bin/bash
# OpenRA packaging script for macOS
#
-# The application bundles will be signed if the following environment variable is defined:
-# MACOS_DEVELOPER_IDENTITY: Certificate name, of the form `Developer\ ID\ Application:\ `
+# The application bundles will be signed if the following environment variables are defined:
+# MACOS_DEVELOPER_IDENTITY: The alphanumeric identifier listed in the certificate name ("Developer ID Application: ()")
+# or as Team ID in your Apple Developer account Membership Details.
# If the identity is not already in the default keychain, specify the following environment variables to import it:
# MACOS_DEVELOPER_CERTIFICATE_BASE64: base64 content of the exported .p12 developer ID certificate.
# Generate using `base64 certificate.p12 | pbcopy`
@@ -12,6 +13,7 @@
# MACOS_DEVELOPER_USERNAME: Email address for the developer account
# MACOS_DEVELOPER_PASSWORD: App-specific password for the developer account
#
+set -e
MONO_TAG="osx-launcher-20200830"
@@ -20,13 +22,14 @@ if [ $# -ne "2" ]; then
exit 1
fi
-if [[ "$OSTYPE" != "darwin"* ]]; then
+if [[ "${OSTYPE}" != "darwin"* ]]; then
echo >&2 "macOS packaging requires a macOS host"
exit 1
fi
# Set the working dir to the location of this script
-cd "$(dirname "$0")" || exit 1
+cd "$(dirname "${0}")" || exit 1
+. ../functions.sh
# Import code signing certificate
if [ -n "${MACOS_DEVELOPER_CERTIFICATE_BASE64}" ] && [ -n "${MACOS_DEVELOPER_CERTIFICATE_PASSWORD}" ] && [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then
@@ -40,34 +43,39 @@ if [ -n "${MACOS_DEVELOPER_CERTIFICATE_BASE64}" ] && [ -n "${MACOS_DEVELOPER_CER
rm -fr build.p12
fi
-TAG="$1"
-OUTPUTDIR="$2"
+TAG="${1}"
+OUTPUTDIR="${2}"
SRCDIR="$(pwd)/../.."
BUILTDIR="$(pwd)/build"
ARTWORK_DIR="$(pwd)/../artwork/"
modify_plist() {
- sed "s|$1|$2|g" "$3" > "$3.tmp" && mv "$3.tmp" "$3"
+ sed "s|${1}|${2}|g" "${3}" > "${3}.tmp" && mv "${3}.tmp" "${3}"
}
# Copies the game files and sets metadata
-populate_bundle() {
- TEMPLATE_DIR="${BUILTDIR}/${1}"
- MOD_ID=${2}
- MOD_NAME=${3}
- DISCORD_APPID=${4}
+build_app() {
+ TEMPLATE_DIR="${1}"
+ LAUNCHER_DIR="${2}"
+ MOD_ID="${3}"
+ MOD_NAME="${4}"
+ DISCORD_APPID="${5}"
- cp -r "${BUILTDIR}/OpenRA.app" "${TEMPLATE_DIR}"
+ LAUNCHER_CONTENTS_DIR="${LAUNCHER_DIR}/Contents"
+ LAUNCHER_RESOURCES_DIR="${LAUNCHER_CONTENTS_DIR}/Resources"
- # Add mod files
- pushd "${SRCDIR}" > /dev/null || exit 1
- cp -r "mods/${MOD_ID}" mods/modcontent "${TEMPLATE_DIR}/Contents/Resources/mods"
+ cp -r "${TEMPLATE_DIR}" "${LAUNCHER_DIR}"
- # HACK: The D2k dll is not copied by install-common-mod-files so we must do this ourselves
+ IS_D2K="False"
if [ "${MOD_ID}" = "d2k" ]; then
- cp "bin/OpenRA.Mods.D2k.dll" "${TEMPLATE_DIR}/Contents/Resources"
+ IS_D2K="True"
fi
- popd > /dev/null || exit 1
+
+ # Install engine and mod files
+ install_assemblies_mono "${SRCDIR}" "${LAUNCHER_RESOURCES_DIR}" "osx-x64" "True" "True" "${IS_D2K}"
+ install_data "${SRCDIR}" "${LAUNCHER_RESOURCES_DIR}" "${MOD_ID}"
+ set_engine_version "${TAG}" "${LAUNCHER_RESOURCES_DIR}"
+ set_mod_version "${TAG}" "${LAUNCHER_RESOURCES_DIR}/mods/${MOD_ID}/mod.yaml" "${LAUNCHER_RESOURCES_DIR}/mods/modcontent/mod.yaml"
# Assemble multi-resolution icon
mkdir "${MOD_ID}.iconset"
@@ -80,19 +88,19 @@ populate_bundle() {
cp "${ARTWORK_DIR}/${MOD_ID}_256x256.png" "${MOD_ID}.iconset/icon_256x256.png"
cp "${ARTWORK_DIR}/${MOD_ID}_512x512.png" "${MOD_ID}.iconset/icon_256x256@2x.png"
cp "${ARTWORK_DIR}/${MOD_ID}_1024x1024.png" "${MOD_ID}.iconset/icon_512x512@2x.png"
- iconutil --convert icns "${MOD_ID}.iconset" -o "${TEMPLATE_DIR}/Contents/Resources/${MOD_ID}.icns"
+ iconutil --convert icns "${MOD_ID}.iconset" -o "${LAUNCHER_RESOURCES_DIR}/${MOD_ID}.icns"
rm -rf "${MOD_ID}.iconset"
- # Copy macOS specific files
- modify_plist "{MOD_ID}" "${MOD_ID}" "${TEMPLATE_DIR}/Contents/Info.plist"
- modify_plist "{MOD_NAME}" "${MOD_NAME}" "${TEMPLATE_DIR}/Contents/Info.plist"
- modify_plist "{JOIN_SERVER_URL_SCHEME}" "openra-${MOD_ID}-${TAG}" "${TEMPLATE_DIR}/Contents/Info.plist"
- modify_plist "{DISCORD_URL_SCHEME}" "discord-${DISCORD_APPID}" "${TEMPLATE_DIR}/Contents/Info.plist"
+ # Set launcher metadata
+ modify_plist "{MOD_ID}" "${MOD_ID}" "${LAUNCHER_CONTENTS_DIR}/Info.plist"
+ modify_plist "{MOD_NAME}" "${MOD_NAME}" "${LAUNCHER_CONTENTS_DIR}/Info.plist"
+ modify_plist "{JOIN_SERVER_URL_SCHEME}" "openra-${MOD_ID}-${TAG}" "${LAUNCHER_CONTENTS_DIR}/Info.plist"
+ modify_plist "{DISCORD_URL_SCHEME}" "discord-${DISCORD_APPID}" "${LAUNCHER_CONTENTS_DIR}/Info.plist"
# Sign binaries with developer certificate
if [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then
- codesign -s "${MACOS_DEVELOPER_IDENTITY}" --timestamp --options runtime -f --entitlements entitlements.plist "${BUILTDIR}/${1}/Contents/Resources/"*.dylib
- codesign -s "${MACOS_DEVELOPER_IDENTITY}" --timestamp --options runtime -f --entitlements entitlements.plist --deep "${BUILTDIR}/${1}"
+ codesign -s "${MACOS_DEVELOPER_IDENTITY}" --timestamp --options runtime -f --entitlements entitlements.plist "${LAUNCHER_RESOURCES_DIR}/"*.dylib
+ codesign -s "${MACOS_DEVELOPER_IDENTITY}" --timestamp --options runtime -f --entitlements entitlements.plist --deep "${LAUNCHER_DIR}"
fi
}
@@ -101,47 +109,36 @@ build_platform() {
DMG_PATH="${2}"
echo "Building launchers (${PLATFORM})"
- mkdir -p "${BUILTDIR}/OpenRA.app/Contents/Resources"
- mkdir -p "${BUILTDIR}/OpenRA.app/Contents/MacOS"
- echo "APPL????" > "${BUILTDIR}/OpenRA.app/Contents/PkgInfo"
- cp Eluant.dll.config "${BUILTDIR}/OpenRA.app/Contents/Resources"
- cp Info.plist.in "${BUILTDIR}/OpenRA.app/Contents/Info.plist"
- modify_plist "{DEV_VERSION}" "${TAG}" "${BUILTDIR}/OpenRA.app/Contents/Info.plist"
- modify_plist "{FAQ_URL}" "http://wiki.openra.net/FAQ" "${BUILTDIR}/OpenRA.app/Contents/Info.plist"
+ # Prepare generic template for the mods to duplicate and customize
+ TEMPLATE_DIR="${BUILTDIR}/template.app"
+ mkdir -p "${TEMPLATE_DIR}/Contents/Resources"
+ mkdir -p "${TEMPLATE_DIR}/Contents/MacOS"
+ echo "APPL????" > "${TEMPLATE_DIR}/Contents/PkgInfo"
+ cp Info.plist.in "${TEMPLATE_DIR}/Contents/Info.plist"
+ modify_plist "{DEV_VERSION}" "${TAG}" "${TEMPLATE_DIR}/Contents/Info.plist"
+ modify_plist "{FAQ_URL}" "http://wiki.openra.net/FAQ" "${TEMPLATE_DIR}/Contents/Info.plist"
if [ "${PLATFORM}" = "compat" ]; then
- modify_plist "{MINIMUM_SYSTEM_VERSION}" "10.9" "${BUILTDIR}/OpenRA.app/Contents/Info.plist"
- clang -m64 launcher-mono.m -o "${BUILTDIR}/OpenRA.app/Contents/MacOS/OpenRA" -framework AppKit -mmacosx-version-min=10.9
+ modify_plist "{MINIMUM_SYSTEM_VERSION}" "10.9" "${TEMPLATE_DIR}/Contents/Info.plist"
+ clang -m64 launcher-mono.m -o "${TEMPLATE_DIR}/Contents/MacOS/OpenRA" -framework AppKit -mmacosx-version-min=10.9
else
- modify_plist "{MINIMUM_SYSTEM_VERSION}" "10.13" "${BUILTDIR}/OpenRA.app/Contents/Info.plist"
- clang -m64 launcher.m -o "${BUILTDIR}/OpenRA.app/Contents/MacOS/OpenRA" -framework AppKit -mmacosx-version-min=10.13
+ modify_plist "{MINIMUM_SYSTEM_VERSION}" "10.13" "${TEMPLATE_DIR}/Contents/Info.plist"
+ clang -m64 launcher.m -o "${TEMPLATE_DIR}/Contents/MacOS/OpenRA" -framework AppKit -mmacosx-version-min=10.13
curl -s -L -O https://github.com/OpenRA/OpenRALauncherOSX/releases/download/${MONO_TAG}/mono.zip || exit 3
unzip -qq -d "${BUILTDIR}/mono" mono.zip
- mv "${BUILTDIR}/mono/mono" "${BUILTDIR}/OpenRA.app/Contents/MacOS/"
- mv "${BUILTDIR}/mono/etc" "${BUILTDIR}/OpenRA.app/Contents/Resources"
- mv "${BUILTDIR}/mono/lib" "${BUILTDIR}/OpenRA.app/Contents/Resources"
+ mv "${BUILTDIR}/mono/mono" "${TEMPLATE_DIR}/Contents/MacOS/"
+ mv "${BUILTDIR}/mono/etc" "${TEMPLATE_DIR}/Contents/Resources"
+ mv "${BUILTDIR}/mono/lib" "${TEMPLATE_DIR}/Contents/Resources"
rm mono.zip
rmdir "${BUILTDIR}/mono"
fi
- echo "Building core files"
+ build_app "${TEMPLATE_DIR}" "${BUILTDIR}/OpenRA - Red Alert.app" "ra" "Red Alert" "699222659766026240"
+ build_app "${TEMPLATE_DIR}" "${BUILTDIR}/OpenRA - Tiberian Dawn.app" "cnc" "Tiberian Dawn" "699223250181292033"
+ build_app "${TEMPLATE_DIR}" "${BUILTDIR}/OpenRA - Dune 2000.app" "d2k" "Dune 2000" "712711732770111550"
- pushd "${SRCDIR}" > /dev/null || exit 1
- make clean
- make core TARGETPLATFORM=osx-x64
- make version VERSION="${TAG}"
-
- make install-engine gameinstalldir="/Contents/Resources/" DESTDIR="${BUILTDIR}/OpenRA.app"
- make install-common-mod-files gameinstalldir="/Contents/Resources/" DESTDIR="${BUILTDIR}/OpenRA.app"
- make install-dependencies TARGETPLATFORM=osx-x64 gameinstalldir="/Contents/Resources/" DESTDIR="${BUILTDIR}/OpenRA.app"
- popd > /dev/null || exit 1
-
- populate_bundle "OpenRA - Red Alert.app" "ra" "Red Alert" "699222659766026240"
- populate_bundle "OpenRA - Tiberian Dawn.app" "cnc" "Tiberian Dawn" "699223250181292033"
- populate_bundle "OpenRA - Dune 2000.app" "d2k" "Dune 2000" "712711732770111550"
-
- rm -rf "${BUILTDIR}/OpenRA.app"
+ rm -rf "${TEMPLATE_DIR}"
echo "Packaging disk image"
hdiutil create "${DMG_PATH}" -format UDRW -volname "OpenRA" -fs HFS+ -srcfolder build
@@ -197,7 +194,7 @@ build_platform() {
notarize_package() {
DMG_PATH="${1}"
NOTARIZE_DMG_PATH="${DMG_PATH%.*}"-notarization.dmg
- echo "Submitting ${PACKAGE_NAME} for notarization"
+ echo "Submitting ${DMG_PATH} for notarization"
# Reset xcode search path to fix xcrun not finding altool
sudo xcode-select -r
diff --git a/packaging/windows/OpenRA.nsi b/packaging/windows/OpenRA.nsi
index de684dd38f..60fc213237 100644
--- a/packaging/windows/OpenRA.nsi
+++ b/packaging/windows/OpenRA.nsi
@@ -19,7 +19,7 @@
!include "WordFunc.nsh"
Name "OpenRA"
-OutFile "OpenRA.Setup.exe"
+OutFile "${OUTFILE}"
ManifestDPIAware true
diff --git a/packaging/windows/buildpackage.sh b/packaging/windows/buildpackage.sh
index 6fdff4d5f8..794ce236ff 100755
--- a/packaging/windows/buildpackage.sh
+++ b/packaging/windows/buildpackage.sh
@@ -1,4 +1,7 @@
#!/bin/bash
+# OpenRA packaging script for Windows
+
+set -e
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; }
@@ -12,6 +15,7 @@ fi
# Set the working dir to the location of this script
cd "$(dirname "$0")" || exit 1
+. ../functions.sh
TAG="$1"
OUTPUTDIR="$2"
@@ -19,7 +23,7 @@ SRCDIR="$(pwd)/../.."
BUILTDIR="$(pwd)/build"
ARTWORK_DIR="$(pwd)/../artwork/"
-FAQ_URL="http://wiki.openra.net/FAQ"
+FAQ_URL="https://wiki.openra.net/FAQ"
SUFFIX=" (dev)"
if [[ ${TAG} == release* ]]; then
@@ -35,19 +39,8 @@ function makelauncher()
MOD_ID="${3}"
PLATFORM="${4}"
- # Create multi-resolution icon
convert "${ARTWORK_DIR}/${MOD_ID}_16x16.png" "${ARTWORK_DIR}/${MOD_ID}_24x24.png" "${ARTWORK_DIR}/${MOD_ID}_32x32.png" "${ARTWORK_DIR}/${MOD_ID}_48x48.png" "${ARTWORK_DIR}/${MOD_ID}_256x256.png" "${BUILTDIR}/${MOD_ID}.ico"
-
- # Create mod-specific launcher
- msbuild -t:Build "${SRCDIR}/OpenRA.WindowsLauncher/OpenRA.WindowsLauncher.csproj" -restore -p:Configuration=Release -p:TargetPlatform="win-${PLATFORM}" -p:LauncherName="${LAUNCHER_NAME}" -p:LauncherIcon="${BUILTDIR}/${MOD_ID}.ico" -p:ModID="${MOD_ID}" -p:DisplayName="${DISPLAY_NAME}" -p:FaqUrl="${FAQ_URL}"
- cp "${SRCDIR}/bin/${LAUNCHER_NAME}.exe" "${BUILTDIR}"
- cp "${SRCDIR}/bin/${LAUNCHER_NAME}.exe.config" "${BUILTDIR}"
-
- # Enable the full 4GB address space for the 32 bit game executable
- # The server and utility do not use enough memory to need this
- if [ "${PLATFORM}" = "x86" ]; then
- python3 MakeLAA.py "${BUILTDIR}/${LAUNCHER_NAME}.exe"
- fi
+ install_windows_launcher "${SRCDIR}" "${BUILTDIR}" "win-${PLATFORM}" "${MOD_ID}" "${LAUNCHER_NAME}" "${DISPLAY_NAME}" "${BUILTDIR}/${MOD_ID}.ico" "${FAQ_URL}"
}
function build_platform()
@@ -55,37 +48,24 @@ function build_platform()
PLATFORM="${1}"
echo "Building core files (${PLATFORM})"
- if [ "${PLATFORM}" = "win-x86" ]; then
+ if [ "${PLATFORM}" = "x86" ]; then
USE_PROGRAMFILES32="-DUSE_PROGRAMFILES32=true"
else
USE_PROGRAMFILES32=""
fi
- pushd "${SRCDIR}" > /dev/null || exit 1
- make clean
- make core TARGETPLATFORM="win-${PLATFORM}"
- make version VERSION="${TAG}"
- make install-engine TARGETPLATFORM="win-${PLATFORM}" gameinstalldir="" DESTDIR="${BUILTDIR}"
- make install-common-mod-files gameinstalldir="" DESTDIR="${BUILTDIR}"
- make install-default-mods gameinstalldir="" DESTDIR="${BUILTDIR}"
- make install-dependencies TARGETPLATFORM="win-${PLATFORM}" gameinstalldir="" DESTDIR="${BUILTDIR}"
- popd > /dev/null || exit 1
+ install_assemblies_mono "${SRCDIR}" "${BUILTDIR}" "win-${PLATFORM}" "False" "True" "True"
+ install_data "${SRCDIR}" "${BUILTDIR}" "cnc" "d2k" "ra"
+ set_engine_version "${TAG}" "${BUILTDIR}"
+ set_mod_version "${TAG}" "${BUILTDIR}/mods/cnc/mod.yaml" "${BUILTDIR}/mods/d2k/mod.yaml" "${BUILTDIR}/mods/ra/mod.yaml" "${BUILTDIR}/mods/modcontent/mod.yaml"
echo "Compiling Windows launchers (${PLATFORM})"
- makelauncher "RedAlert" "Red Alert" "ra" ${PLATFORM}
- makelauncher "TiberianDawn" "Tiberian Dawn" "cnc" ${PLATFORM}
- makelauncher "Dune2000" "Dune 2000" "d2k" ${PLATFORM}
-
- # Remove redundant generic launcher
- rm "${BUILTDIR}/OpenRA.exe"
+ makelauncher "RedAlert" "Red Alert" "ra" "${PLATFORM}"
+ makelauncher "TiberianDawn" "Tiberian Dawn" "cnc" "${PLATFORM}"
+ makelauncher "Dune2000" "Dune 2000" "d2k" "${PLATFORM}"
echo "Building Windows setup.exe ($1)"
- makensis -V2 -DSRCDIR="${BUILTDIR}" -DTAG="${TAG}" -DSUFFIX="${SUFFIX}" ${USE_PROGRAMFILES32} OpenRA.nsi
- if [ $? -eq 0 ]; then
- mv OpenRA.Setup.exe "${OUTPUTDIR}/OpenRA-${TAG}-${PLATFORM}.exe"
- else
- exit 1
- fi
+ makensis -V2 -DSRCDIR="${BUILTDIR}" -DTAG="${TAG}" -DSUFFIX="${SUFFIX}" -DOUTFILE="${OUTPUTDIR}/OpenRA-${TAG}-${PLATFORM}.exe" ${USE_PROGRAMFILES32} OpenRA.nsi || exit 1
echo "Packaging zip archive ($1)"
pushd "${BUILTDIR}" > /dev/null