Compare commits
8 Commits
sponsors
...
devtest-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afde6850d1 | ||
|
|
297d01d463 | ||
|
|
f9d6338a98 | ||
|
|
18d1d7d62a | ||
|
|
63dd4b382e | ||
|
|
f61fda19f5 | ||
|
|
c18d509ddd | ||
|
|
1782794bac |
5
.github/workflows/packaging.yml
vendored
5
.github/workflows/packaging.yml
vendored
@@ -39,6 +39,11 @@ jobs:
|
||||
- name: Clone Repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Install .NET 5
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '5.0.x'
|
||||
|
||||
- name: Prepare Environment
|
||||
run: echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> ${GITHUB_ENV}
|
||||
|
||||
|
||||
15
Makefile
15
Makefile
@@ -25,18 +25,6 @@
|
||||
# make help
|
||||
#
|
||||
|
||||
############################## TOOLCHAIN ###############################
|
||||
#
|
||||
# List of .NET assemblies that we can guarantee exist
|
||||
WHITELISTED_OPENRA_ASSEMBLIES = OpenRA.dll OpenRA.Utility.dll OpenRA.Server.dll OpenRA.Platforms.Default.dll OpenRA.Game.dll OpenRA.Mods.Common.dll OpenRA.Mods.Cnc.dll OpenRA.Mods.D2k.dll
|
||||
|
||||
# These are explicitly shipped alongside our core files by the packaging script
|
||||
WHITELISTED_THIRDPARTY_ASSEMBLIES = ICSharpCode.SharpZipLib.dll FuzzyLogicLibrary.dll Eluant.dll BeaconLib.dll Open.Nat.dll SDL2-CS.dll OpenAL-CS.Core.dll DiscordRPC.dll Newtonsoft.Json.dll
|
||||
|
||||
# These are shipped in our custom minimal mono runtime and also available in the full system-installed .NET/mono stack
|
||||
# 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 Microsoft.Win32.Registry.dll System.Security.AccessControl.dll System.Security.Principal.Windows.dll System.Xml.Linq.dll System.Runtime.Serialization.dll
|
||||
|
||||
######################### UTILITIES/SETTINGS ###########################
|
||||
#
|
||||
# Install locations for local installs and downstream packaging
|
||||
@@ -100,9 +88,6 @@ check:
|
||||
@echo "Compiling in debug mode..."
|
||||
@$(MSBUILD) -t:build -restore -p:Configuration=Debug -p:TargetPlatform=$(TARGETPLATFORM) -p:Mono=true -p:DefineConstants="MONO"
|
||||
@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
|
||||
|
||||
@@ -65,4 +65,8 @@
|
||||
<Analyzer Remove="@(Analyzer)" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
<ItemGroup>
|
||||
<TrimmerRootAssembly Include="netstandard" />
|
||||
<TrimmerRootAssembly Include="System.IO.Pipes" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you 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. For more
|
||||
* information, see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace OpenRA.Mods.Common.UtilityCommands
|
||||
{
|
||||
public class CheckRuntimeAssembliesCommand : IUtilityCommand
|
||||
{
|
||||
string IUtilityCommand.Name { get { return "--check-runtime-assemblies"; } }
|
||||
|
||||
bool IUtilityCommand.ValidateArguments(string[] args)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
[Desc("ASSEMBLY [ASSEMBLY ...]", "Check the runtime dependencies of the mod against a given whitelist of " +
|
||||
"assembly (dll and exe) names and generate an error if any unlisted files are required.")]
|
||||
void IUtilityCommand.Run(Utility utility, string[] args)
|
||||
{
|
||||
var whitelist = args
|
||||
.Skip(1)
|
||||
.Select(a => Path.GetFileName(a))
|
||||
.ToArray();
|
||||
|
||||
// Load the renderer assembly so we can check its dependencies
|
||||
Assembly.LoadFile(Path.Combine(Platform.BinDir, "OpenRA.Platforms.Default.dll"));
|
||||
|
||||
var missing = new List<string>();
|
||||
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
|
||||
{
|
||||
var assemblyName = Path.GetFileName(a.Location);
|
||||
if (!whitelist.Contains(assemblyName))
|
||||
missing.Add(assemblyName);
|
||||
}
|
||||
|
||||
if (missing.Any())
|
||||
{
|
||||
Console.WriteLine("error: The following assemblies are referenced but not whitelisted:");
|
||||
foreach (var m in missing)
|
||||
Console.WriteLine(" " + m);
|
||||
Environment.Exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,4 +40,8 @@
|
||||
<Analyzer Remove="@(Analyzer)" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
<ItemGroup>
|
||||
<TrimmerRootAssembly Include="netstandard" />
|
||||
<TrimmerRootAssembly Include="System.IO.Pipes" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -40,4 +40,8 @@
|
||||
<Analyzer Remove="@(Analyzer)" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
<ItemGroup>
|
||||
<TrimmerRootAssembly Include="netstandard" />
|
||||
<TrimmerRootAssembly Include="System.IO.Pipes" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -58,4 +58,8 @@
|
||||
<Analyzer Remove="@(Analyzer)" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
<ItemGroup>
|
||||
<TrimmerRootAssembly Include="netstandard" />
|
||||
<TrimmerRootAssembly Include="System.IO.Pipes" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
# COPY_D2K_DLL: If set to True the OpenRA.Mods.D2k.dll will also be copied (True, False)
|
||||
# Used by:
|
||||
# Makefile (install target for local installs and downstream packaging)
|
||||
# Linux AppImage packaging
|
||||
# macOS packaging
|
||||
# Mod SDK Linux AppImage packaging
|
||||
# Mod SDK macOS packaging
|
||||
# Mod SDK Windows packaging
|
||||
@@ -41,58 +39,36 @@ install_assemblies_mono() {
|
||||
./configure-system-libraries.sh
|
||||
fi
|
||||
|
||||
if [ "${COPY_GENERIC_LAUNCHER}" != "True" ]; then
|
||||
rm "${SRC_PATH}/bin/OpenRA.dll"
|
||||
fi
|
||||
|
||||
if [ "${COPY_CNC_DLL}" != "True" ]; then
|
||||
rm "${SRC_PATH}/bin/OpenRA.Mods.Cnc.dll"
|
||||
fi
|
||||
|
||||
if [ "${COPY_D2K_DLL}" != "True" ]; then
|
||||
rm "${SRC_PATH}/bin/OpenRA.Mods.D2k.dll"
|
||||
fi
|
||||
|
||||
cd "${ORIG_PWD}" || exit 1
|
||||
|
||||
echo "Installing engine to ${DEST_PATH}"
|
||||
install -d "${DEST_PATH}"
|
||||
|
||||
# Core engine
|
||||
install -m755 "${SRC_PATH}/bin/OpenRA.Server.dll" "${DEST_PATH}"
|
||||
install -m755 "${SRC_PATH}/bin/OpenRA.Utility.dll" "${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.dll" "${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}"
|
||||
for LIB in "${SRC_PATH}/bin/"*.dll "${SRC_PATH}/bin/"*.dll.config; do
|
||||
install -m644 "${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}"
|
||||
for LIB in "${SRC_PATH}/bin/"*.so; do
|
||||
install -m755 "${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}"
|
||||
for LIB in "${SRC_PATH}/bin/"*.dylib; do
|
||||
install -m755 "${LIB}" "${DEST_PATH}"
|
||||
done
|
||||
fi
|
||||
}
|
||||
@@ -107,6 +83,8 @@ install_assemblies_mono() {
|
||||
# COPY_D2K_DLL: If set to True the OpenRA.Mods.D2k.dll will also be copied (True, False)
|
||||
# Used by:
|
||||
# Windows packaging
|
||||
# macOS packaging
|
||||
# Linux AppImage packaging
|
||||
install_assemblies() {
|
||||
SRC_PATH="${1}"
|
||||
DEST_PATH="${2}"
|
||||
@@ -118,7 +96,7 @@ install_assemblies() {
|
||||
ORIG_PWD=$(pwd)
|
||||
cd "${SRC_PATH}" || exit 1
|
||||
|
||||
dotnet publish -c Release -p:TargetPlatform="${TARGETPLATFORM}" -p:CopyGenericLauncher="${COPY_GENERIC_LAUNCHER}" -p:CopyCncDll="${COPY_CNC_DLL}" -p:CopyD2kDll="${COPY_D2K_DLL}" -r "${TARGETPLATFORM}" -o "${DEST_PATH}"
|
||||
dotnet publish -c Release -p:TargetPlatform="${TARGETPLATFORM}" -p:PublishTrimmed=true -p:CopyGenericLauncher="${COPY_GENERIC_LAUNCHER}" -p:CopyCncDll="${COPY_CNC_DLL}" -p:CopyD2kDll="${COPY_D2K_DLL}" -r "${TARGETPLATFORM}" -o "${DEST_PATH}"
|
||||
|
||||
cd "${ORIG_PWD}" || exit 1
|
||||
}
|
||||
|
||||
@@ -2,43 +2,15 @@
|
||||
|
||||
HERE="$(dirname "$(readlink -f "${0}")")"
|
||||
|
||||
# Stash original environment values so they can be restored
|
||||
# when switching to other mods using restore-environment
|
||||
export OPENRA_ORIG_PATH="${PATH}"
|
||||
export OPENRA_ORIG_XDG_DATA_DIRS="${XDG_DATA_DIRS}"
|
||||
export OPENRA_ORIG_DYLD_LIBRARY_PATH="${DYLD_LIBRARY_PATH}"
|
||||
export OPENRA_ORIG_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}"
|
||||
export OPENRA_ORIG_MONO_PATH="${MONO_PATH}"
|
||||
export OPENRA_ORIG_MONO_CFG_DIR="${MONO_CFG_DIR}"
|
||||
export OPENRA_ORIG_MONO_CONFIG="${MONO_CONFIG}"
|
||||
|
||||
# Override runtime paths to use bundled mono and shared libraries
|
||||
export PATH="${HERE}/usr/bin:${PATH}"
|
||||
export XDG_DATA_DIRS="${HERE}/usr/share:${XDG_DATA_DIRS}"
|
||||
export DYLD_LIBRARY_PATH="${HERE}/usr/lib:${DYLD_LIBRARY_PATH}"
|
||||
export LD_LIBRARY_PATH="${HERE}/usr/lib:${LD_LIBRARY_PATH}"
|
||||
export MONO_PATH="${HERE}/usr/lib/mono/4.5"
|
||||
export MONO_CFG_DIR="${HERE}/etc"
|
||||
export MONO_CONFIG="${HERE}/etc/mono/config"
|
||||
|
||||
# Update/create the mono certificate store to enable https web queries
|
||||
if [ -f "/etc/pki/tls/certs/ca-bundle.crt" ]; then
|
||||
mono "${HERE}/usr/lib/mono/4.5/cert-sync.exe" --quiet --user /etc/pki/tls/certs/ca-bundle.crt
|
||||
elif [ -f "/etc/ssl/certs/ca-certificates.crt" ]; then
|
||||
mono "${HERE}/usr/lib/mono/4.5/cert-sync.exe" --quiet --user /etc/ssl/certs/ca-certificates.crt
|
||||
else
|
||||
echo "WARNING: Unable to sync system certificate store - https requests will fail"
|
||||
fi
|
||||
|
||||
# Run the game or server
|
||||
if [ -n "$1" ] && [ "$1" = "--server" ]; then
|
||||
# Drop the --server argument
|
||||
shift
|
||||
exec "openra-{MODID}-server" "$@"
|
||||
"${HERE}/usr/bin/openra-{MODID}-server" "$@"
|
||||
elif [ -n "$1" ] && [ "$1" = "--utility" ]; then
|
||||
# Drop the --utility argument
|
||||
shift
|
||||
exec "openra-{MODID}-utility" "$@"
|
||||
"${HERE}/usr/bin/openra-{MODID}-utility" "$@"
|
||||
else
|
||||
exec "openra-{MODID}" "$@"
|
||||
"${HERE}/usr/bin/openra-{MODID}" "$@"
|
||||
fi
|
||||
|
||||
@@ -19,7 +19,6 @@ cd "$(dirname "$0")" || exit 1
|
||||
TAG="$1"
|
||||
OUTPUTDIR="$2"
|
||||
SRCDIR="$(pwd)/../.."
|
||||
BUILTDIR="$(pwd)/build"
|
||||
ARTWORK_DIR="$(pwd)/../artwork/"
|
||||
|
||||
UPDATE_CHANNEL=""
|
||||
@@ -43,30 +42,16 @@ if [ ! -d "${OUTPUTDIR}" ]; then
|
||||
fi
|
||||
|
||||
# Add native libraries
|
||||
echo "Downloading dependencies"
|
||||
echo "Downloading appimagetool"
|
||||
if command -v curl >/dev/null 2>&1; then
|
||||
curl -s -L -O https://github.com/OpenRA/AppImageSupport/releases/download/${DEPENDENCIES_TAG}/mono.tar.bz2 || exit 3
|
||||
curl -s -L -O https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage || exit 3
|
||||
else
|
||||
wget -cq https://github.com/OpenRA/AppImageSupport/releases/download/${DEPENDENCIES_TAG}/mono.tar.bz2 || exit 3
|
||||
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 "${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
|
||||
|
||||
rm -rf mono.tar.bz2
|
||||
echo "Building AppImages"
|
||||
|
||||
build_appimage() {
|
||||
MOD_ID=${1}
|
||||
@@ -75,14 +60,12 @@ build_appimage() {
|
||||
APPDIR="$(pwd)/${MOD_ID}.appdir"
|
||||
APPIMAGE="OpenRA-$(echo "${DISPLAY_NAME}" | sed 's/ /-/g')${SUFFIX}-x86_64.AppImage"
|
||||
|
||||
cp -r "${BUILTDIR}" "${APPDIR}"
|
||||
|
||||
IS_D2K="False"
|
||||
if [ "${MOD_ID}" = "d2k" ]; then
|
||||
IS_D2K="True"
|
||||
fi
|
||||
|
||||
install_assemblies_mono "${SRCDIR}" "${APPDIR}/usr/lib/openra" "linux-x64" "True" "True" "${IS_D2K}"
|
||||
install_assemblies "${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"
|
||||
@@ -113,6 +96,7 @@ build_appimage() {
|
||||
fi
|
||||
done
|
||||
|
||||
mkdir -p "${APPDIR}/usr/bin"
|
||||
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}"
|
||||
|
||||
@@ -123,14 +107,13 @@ build_appimage() {
|
||||
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"
|
||||
|
||||
# Embed update metadata if (and only if) compiled on GitHub Actions
|
||||
if [ -n "${GITHUB_REPOSITORY}" ]; 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}"
|
||||
ARCH=x86_64 ./appimagetool-x86_64.AppImage --no-appstream -u "zsync|https://master.openra.net/appimagecheck?mod=${MOD_ID}&channel=${UPDATE_CHANNEL}" "${APPDIR}" "${OUTPUTDIR}/${APPIMAGE}"
|
||||
zsyncmake -u "https://github.com/${GITHUB_REPOSITORY}/releases/download/${TAG}/${APPIMAGE}" -o "${OUTPUTDIR}/${APPIMAGE}.zsync" "${OUTPUTDIR}/${APPIMAGE}"
|
||||
else
|
||||
ARCH=x86_64 ./squashfs-root/AppRun --no-appstream "${APPDIR}" "${OUTPUTDIR}/${APPIMAGE}"
|
||||
ARCH=x86_64 ./appimagetool-x86_64.AppImage --no-appstream "${APPDIR}" "${OUTPUTDIR}/${APPIMAGE}"
|
||||
fi
|
||||
|
||||
rm -rf "${APPDIR}"
|
||||
@@ -141,4 +124,4 @@ build_appimage "cnc" "Tiberian Dawn" "699223250181292033"
|
||||
build_appimage "d2k" "Dune 2000" "712711732770111550"
|
||||
|
||||
# Clean up
|
||||
rm -rf appimagetool-x86_64.AppImage squashfs-root "${BUILTDIR}"
|
||||
rm -rf appimagetool-x86_64.AppImage "${BUILTDIR}"
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
HERE="$(dirname "$(readlink -f "${0}")")"
|
||||
cd "${HERE}/../lib/openra" || exit 1
|
||||
|
||||
mono --debug OpenRA.Server.dll Game.Mod="{MODID}" "$@"
|
||||
./OpenRA.Server Game.Mod="{MODID}" "$@"
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
|
||||
# OpenRA.Utility relies on keeping the original working directory, so don't change directory
|
||||
HERE="$(dirname "$(readlink -f "${0}")")"
|
||||
mono --debug "${HERE}/../lib/openra/OpenRA.Utility.dll" {MODID} "$@"
|
||||
"${HERE}/../lib/openra/OpenRA.Utility" {MODID} "$@"
|
||||
|
||||
@@ -35,7 +35,7 @@ fi
|
||||
|
||||
# Run the game
|
||||
export SDL_VIDEO_X11_WMCLASS="openra-{MODID}-{TAG}"
|
||||
mono --debug OpenRA.dll Game.Mod={MODID} Engine.LaunchPath="${LAUNCHER}" Engine.LaunchWrapper="${HERE}/restore-environment.sh" "${JOIN_SERVER}" "$@"
|
||||
./OpenRA Game.Mod={MODID} Engine.LaunchPath="${LAUNCHER}" "${JOIN_SERVER}" "$@"
|
||||
|
||||
# Show a crash dialog if something went wrong
|
||||
if [ $? != 0 ] && [ $? != 1 ]; then
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Restore the environment variables that were set by AppRun
|
||||
export PATH="${OPENRA_ORIG_PATH}"
|
||||
export XDG_DATA_DIRS="${OPENRA_ORIG_XDG_DATA_DIRS}"
|
||||
export DYLD_LIBRARY_PATH="${OPENRA_ORIG_DYLD_LIBRARY_PATH}"
|
||||
export LD_LIBRARY_PATH="${OPENRA_ORIG_LD_LIBRARY_PATH}"
|
||||
unset OPENRA_ORIG_PATH OPENRA_ORIG_XDG_DATA_DIRS OPENRA_ORIG_DYLD_LIBRARY_PATH OPENRA_ORIG_LD_LIBRARY_PATH
|
||||
|
||||
unset MONO_PATH MONO_CFG_DIR MONO_CONFIG
|
||||
if [ -n "${OPENRA_ORIG_MONO_PATH}" ]; then
|
||||
export MONO_PATH="${OPENRA_ORIG_MONO_PATH}"
|
||||
fi
|
||||
|
||||
if [ -n "${OPENRA_ORIG_MONO_CFG_DIR}" ]; then
|
||||
export MONO_CFG_DIR="${OPENRA_ORIG_MONO_CFG_DIR}"
|
||||
fi
|
||||
|
||||
if [ -n "${OPENRA_ORIG_MONO_CONFIG}" ]; then
|
||||
export MONO_CONFIG="${OPENRA_ORIG_MONO_CONFIG}"
|
||||
fi
|
||||
|
||||
unset SDL_VIDEO_X11_WMCLASS OPENRA_ORIG_MONO_PATH OPENRA_ORIG_MONO_CFG_DIR OPENRA_ORIG_MONO_CONFIG
|
||||
|
||||
# Run the given command
|
||||
exec "$@"
|
||||
@@ -7,7 +7,7 @@
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>{MOD_NAME}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>OpenRA</string>
|
||||
<string>Launcher</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>{MOD_ID}.icns</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
||||
@@ -55,13 +55,15 @@ modify_plist() {
|
||||
|
||||
# Copies the game files and sets metadata
|
||||
build_app() {
|
||||
TEMPLATE_DIR="${1}"
|
||||
LAUNCHER_DIR="${2}"
|
||||
MOD_ID="${3}"
|
||||
MOD_NAME="${4}"
|
||||
DISCORD_APPID="${5}"
|
||||
PLATFORM="${1}"
|
||||
TEMPLATE_DIR="${2}"
|
||||
LAUNCHER_DIR="${3}"
|
||||
MOD_ID="${4}"
|
||||
MOD_NAME="${5}"
|
||||
DISCORD_APPID="${6}"
|
||||
|
||||
LAUNCHER_CONTENTS_DIR="${LAUNCHER_DIR}/Contents"
|
||||
LAUNCHER_ASSEMBLY_DIR="${LAUNCHER_CONTENTS_DIR}/MacOS"
|
||||
LAUNCHER_RESOURCES_DIR="${LAUNCHER_CONTENTS_DIR}/Resources"
|
||||
|
||||
cp -r "${TEMPLATE_DIR}" "${LAUNCHER_DIR}"
|
||||
@@ -72,7 +74,12 @@ build_app() {
|
||||
fi
|
||||
|
||||
# Install engine and mod files
|
||||
install_assemblies_mono "${SRCDIR}" "${LAUNCHER_RESOURCES_DIR}" "osx-x64" "True" "True" "${IS_D2K}"
|
||||
if [ "${PLATFORM}" = "compat" ]; then
|
||||
install_assemblies_mono "${SRCDIR}" "${LAUNCHER_ASSEMBLY_DIR}" "osx-x64" "True" "True" "${IS_D2K}"
|
||||
else
|
||||
install_assemblies "${SRCDIR}" "${LAUNCHER_ASSEMBLY_DIR}" "osx-x64" "True" "True" "${IS_D2K}"
|
||||
fi
|
||||
|
||||
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"
|
||||
@@ -99,7 +106,6 @@ build_app() {
|
||||
|
||||
# Sign binaries with developer certificate
|
||||
if [ -n "${MACOS_DEVELOPER_IDENTITY}" ]; then
|
||||
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
|
||||
}
|
||||
@@ -120,23 +126,15 @@ build_platform() {
|
||||
|
||||
if [ "${PLATFORM}" = "compat" ]; then
|
||||
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
|
||||
clang -m64 launcher-mono.m -o "${TEMPLATE_DIR}/Contents/MacOS/Launcher" -framework AppKit -mmacosx-version-min=10.9
|
||||
else
|
||||
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" "${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"
|
||||
clang -m64 launcher.m -o "${TEMPLATE_DIR}/Contents/MacOS/Launcher" -framework AppKit -mmacosx-version-min=10.13
|
||||
fi
|
||||
|
||||
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"
|
||||
build_app "${PLATFORM}" "${TEMPLATE_DIR}" "${BUILTDIR}/OpenRA - Red Alert.app" "ra" "Red Alert" "699222659766026240"
|
||||
build_app "${PLATFORM}" "${TEMPLATE_DIR}" "${BUILTDIR}/OpenRA - Tiberian Dawn.app" "cnc" "Tiberian Dawn" "699223250181292033"
|
||||
build_app "${PLATFORM}" "${TEMPLATE_DIR}" "${BUILTDIR}/OpenRA - Dune 2000.app" "d2k" "Dune 2000" "712711732770111550"
|
||||
|
||||
rm -rf "${TEMPLATE_DIR}"
|
||||
|
||||
@@ -183,6 +181,25 @@ build_platform() {
|
||||
SetFile -c icnC "/Volumes/OpenRA/.VolumeIcon.icns"
|
||||
SetFile -a C "/Volumes/OpenRA"
|
||||
|
||||
# Replace duplicate .NET runtime files with hard links to improve compression
|
||||
if [ "${PLATFORM}" != "compat" ]; then
|
||||
OIFS="$IFS"
|
||||
IFS=$'\n'
|
||||
for MOD in "Red Alert" "Tiberian Dawn"; do
|
||||
for f in $(find /Volumes/OpenRA/OpenRA\ -\ ${MOD}.app/Contents/MacOS/*); do
|
||||
g="/Volumes/OpenRA/OpenRA - Dune 2000.app/Contents/MacOS/"$(basename "${f}")
|
||||
hashf=$(shasum "${f}" | awk '{ print $1 }')
|
||||
hashg=$(shasum "${g}" | awk '{ print $1 }')
|
||||
if [ "${hashf}" = "${hashg}" ]; then
|
||||
echo "Deduplicating ${f}"
|
||||
rm "${f}"
|
||||
ln "${g}" "${f}"
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS="$OIFS"
|
||||
fi
|
||||
|
||||
chmod -Rf go-w /Volumes/OpenRA
|
||||
sync
|
||||
sync
|
||||
@@ -200,7 +217,7 @@ notarize_package() {
|
||||
sudo xcode-select -r
|
||||
|
||||
# Create a temporary read-only dmg for submission (notarization service rejects read/write images)
|
||||
hdiutil convert "${DMG_PATH}" -format UDZO -imagekey zlib-level=9 -ov -o "${NOTARIZE_DMG_PATH}"
|
||||
hdiutil convert "${DMG_PATH}" -format ULFO -ov -o "${NOTARIZE_DMG_PATH}"
|
||||
|
||||
NOTARIZATION_UUID=$(xcrun altool --notarize-app --primary-bundle-id "net.openra.packaging" -u "${MACOS_DEVELOPER_USERNAME}" -p "${MACOS_DEVELOPER_PASSWORD}" --file "${NOTARIZE_DMG_PATH}" 2>&1 | awk -F' = ' '/RequestUUID/ { print $2; exit }')
|
||||
if [ -z "${NOTARIZATION_UUID}" ]; then
|
||||
@@ -242,10 +259,17 @@ notarize_package() {
|
||||
}
|
||||
|
||||
finalize_package() {
|
||||
INPUT_PATH="${1}"
|
||||
OUTPUT_PATH="${2}"
|
||||
PLATFORM="${1}"
|
||||
INPUT_PATH="${2}"
|
||||
OUTPUT_PATH="${3}"
|
||||
|
||||
if [ "${PLATFORM}" = "compat" ]; then
|
||||
hdiutil convert "${INPUT_PATH}" -format UDZO -imagekey zlib-level=9 -ov -o "${OUTPUT_PATH}"
|
||||
else
|
||||
# ULFO offers better compression and faster decompression speeds, but is only supported by 10.11+
|
||||
hdiutil convert "${INPUT_PATH}" -format ULFO -ov -o "${OUTPUT_PATH}"
|
||||
fi
|
||||
|
||||
hdiutil convert "${INPUT_PATH}" -format UDZO -imagekey zlib-level=9 -ov -o "${OUTPUT_PATH}"
|
||||
rm "${INPUT_PATH}"
|
||||
}
|
||||
|
||||
@@ -263,5 +287,5 @@ if [ -n "${MACOS_DEVELOPER_USERNAME}" ] && [ -n "${MACOS_DEVELOPER_PASSWORD}" ];
|
||||
wait
|
||||
fi
|
||||
|
||||
finalize_package "build.dmg" "${OUTPUTDIR}/OpenRA-${TAG}.dmg"
|
||||
finalize_package "build-compat.dmg" "${OUTPUTDIR}/OpenRA-${TAG}-compat.dmg"
|
||||
finalize_package "standard" "build.dmg" "${OUTPUTDIR}/OpenRA-${TAG}.dmg"
|
||||
finalize_package "compat" "build-compat.dmg" "${OUTPUTDIR}/OpenRA-${TAG}-compat.dmg"
|
||||
|
||||
@@ -262,8 +262,9 @@ static int check_mono_version(const char *version, const char *req_version)
|
||||
|
||||
NSMutableArray *launchArgs = [NSMutableArray arrayWithCapacity: [gameArgs count] + 2];
|
||||
[launchArgs addObject: @"--debug"];
|
||||
[launchArgs addObject: [gamePath stringByAppendingPathComponent: gameName]];
|
||||
[launchArgs addObject: [exePath stringByAppendingPathComponent: gameName]];
|
||||
[launchArgs addObject: [NSString stringWithFormat:@"Engine.LaunchPath=\"%@\"", engineLaunchPath]];
|
||||
[launchArgs addObject: [NSString stringWithFormat:@"Engine.EngineDir=../Resources"]];
|
||||
|
||||
if (modId)
|
||||
[launchArgs addObject: [NSString stringWithFormat:@"Game.Mod=%@", modId]];
|
||||
|
||||
@@ -131,16 +131,11 @@ NSTask *gameTask;
|
||||
launched = YES;
|
||||
|
||||
// Default values - can be overriden by setting certain keys Info.plist
|
||||
NSString *gameName = @"OpenRA.dll";
|
||||
NSString *modId = nil;
|
||||
|
||||
NSDictionary *plist = [[NSBundle mainBundle] infoDictionary];
|
||||
if (plist)
|
||||
{
|
||||
NSString *exeValue = [plist objectForKey:@"MonoGameExe"];
|
||||
if (exeValue && [exeValue length] > 0)
|
||||
gameName = exeValue;
|
||||
|
||||
NSString *modIdValue = [plist objectForKey:@"ModId"];
|
||||
if (modIdValue && [modIdValue length] > 0)
|
||||
modId = modIdValue;
|
||||
@@ -149,21 +144,20 @@ NSTask *gameTask;
|
||||
NSString *exePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent: @"Contents/MacOS/"];
|
||||
NSString *gamePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent: @"Contents/Resources/"];
|
||||
|
||||
NSString *launchPath = [exePath stringByAppendingPathComponent: @"mono"];
|
||||
NSString *appPath = [exePath stringByAppendingPathComponent: @"OpenRA"];
|
||||
NSString *launchPath = [exePath stringByAppendingPathComponent: @"OpenRA"];
|
||||
NSString *appPath = [exePath stringByAppendingPathComponent: @"Launcher"];
|
||||
NSString *engineLaunchPath = [self resolveTranslocatedPath: appPath];
|
||||
|
||||
NSMutableArray *launchArgs = [NSMutableArray arrayWithCapacity: [gameArgs count] + 2];
|
||||
[launchArgs addObject: @"--debug"];
|
||||
[launchArgs addObject: [gamePath stringByAppendingPathComponent: gameName]];
|
||||
[launchArgs addObject: [NSString stringWithFormat:@"Engine.LaunchPath=\"%@\"", engineLaunchPath]];
|
||||
[launchArgs addObject: [NSString stringWithFormat:@"Engine.EngineDir=../Resources"]];
|
||||
|
||||
if (modId)
|
||||
[launchArgs addObject: [NSString stringWithFormat:@"Game.Mod=%@", modId]];
|
||||
|
||||
[launchArgs addObjectsFromArray: gameArgs];
|
||||
|
||||
NSLog(@"Running mono with arguments:");
|
||||
NSLog(@"Running OpenRA with arguments:");
|
||||
for (size_t i = 0; i < [launchArgs count]; i++)
|
||||
NSLog(@"%@", [launchArgs objectAtIndex: i]);
|
||||
|
||||
@@ -172,12 +166,6 @@ NSTask *gameTask;
|
||||
[gameTask setLaunchPath: launchPath];
|
||||
[gameTask setArguments: launchArgs];
|
||||
|
||||
NSMutableDictionary *environment = [NSMutableDictionary dictionaryWithDictionary: [[NSProcessInfo processInfo] environment]];
|
||||
[environment setObject: [gamePath stringByAppendingPathComponent: @"lib/mono/4.5"] forKey: @"MONO_PATH"];
|
||||
[environment setObject: [gamePath stringByAppendingPathComponent: @"etc"] forKey: @"MONO_CFG_DIR"];
|
||||
[environment setObject: [gamePath stringByAppendingPathComponent: @"etc/mono/config"] forKey: @"MONO_CONFIG"];
|
||||
[gameTask setEnvironment: environment];
|
||||
|
||||
[[NSNotificationCenter defaultCenter]
|
||||
addObserver: self
|
||||
selector: @selector(taskExited:)
|
||||
|
||||
Reference in New Issue
Block a user