tr1: release 4.9
Some checks are pending
Run code linters / Run code linters (push) Waiting to run
Publish a pre-release / Build TR1 (push) Has been skipped
Publish a pre-release / Build TR2 (push) Has been skipped
Publish a pre-release / Create a prerelease (push) Has been skipped

This commit is contained in:
Marcin Kurczewski 2025-03-31 14:12:05 +02:00
commit e88764f280
No known key found for this signature in database
GPG key ID: CC65E6FD28CAE42A
28 changed files with 317 additions and 682 deletions

View file

@ -10,14 +10,8 @@ jobs:
strategy:
matrix:
include:
- game_version: tr1
platform: win
- game_version: tr1
platform: linux
- game_version: tr2
platform: win
- game_version: tr2
platform: linux
- platform: win
- platform: linux
steps:
- name: Login to Docker Hub
uses: docker/login-action@v1
@ -35,5 +29,5 @@ jobs:
- name: Build Docker image (${{ matrix.platform }})
run: |
just ${{ matrix.game_version }}-image-${{ matrix.platform }}
just ${{ matrix.game_version }}-push-image-${{ matrix.platform }}
just image-${{ matrix.platform }}
just push-image-${{ matrix.platform }}

View file

@ -38,52 +38,16 @@ _docker_run *args:
-v {{CWD}}:/app/ \
{{args}}
image-win force="1": (_docker_build "tools/shared/docker/game-win/Dockerfile" "rrdash/trx-win" force)
image-linux force="1": (_docker_build "tools/shared/docker/game-linux/Dockerfile" "rrdash/trx-linux" force)
image-win-config force="1": (_docker_build "tools/shared/docker/config/Dockerfile" "rrdash/trx-config" force)
image-win-installer force="1": (_docker_build "tools/shared/docker/installer/Dockerfile" "rrdash/trx-installer" force)
tr1-image-linux force="1": (_docker_build "tools/tr1/docker/game-linux/Dockerfile" "rrdash/tr1x-linux" force)
tr1-image-win force="1": (_docker_build "tools/tr1/docker/game-win/Dockerfile" "rrdash/tr1x" force)
tr1-image-win-config force="1": (_docker_build "tools/tr1/docker/config/Dockerfile" "rrdash/tr1x-config" force)
tr1-image-win-installer force="1": (_docker_build "tools/tr1/docker/installer/Dockerfile" "rrdash/tr1x-installer" force)
push-image-linux: (image-linux "0") (_docker_push "rrdash/trx-linux")
push-image-win: (image-win "0") (_docker_push "rrdash/trx-win")
tr1-push-image-linux: (tr1-image-linux "0") (_docker_push "rrdash/tr1x-linux")
tr1-push-image-win: (tr1-image-win "0") (_docker_push "rrdash/tr1x")
tr1-build-linux target='debug': (tr1-image-linux "0") (_docker_run "-e" "TARGET="+target "rrdash/tr1x-linux")
tr1-build-win target='debug': (tr1-image-win "0") (_docker_run "-e" "TARGET="+target "rrdash/tr1x")
tr1-build-win-config: (tr1-image-win-config "0") (_docker_run "rrdash/tr1x-config")
tr1-build-win-installer: (tr1-image-win-installer "0") (_docker_run "rrdash/tr1x-installer")
tr1-package-linux target='release': (tr1-build-linux target) (_docker_run "rrdash/tr1x-linux" "package")
tr1-package-win target='release': (tr1-build-win target) (_docker_run "rrdash/tr1x" "package")
tr1-package-win-all target='release': (tr1-build-win target) (tr1-build-win-config) (_docker_run "rrdash/tr1x" "package")
tr1-package-win-installer target='release': (tr1-build-win target) (tr1-build-win-config) (_docker_run "rrdash/tr1x" "package" "-o" "tools/installer/TR1X_Installer/Resources/release.zip") (tr1-build-win-installer)
#!/bin/sh
git checkout "tools/installer/TR1X_Installer/Resources/release.zip"
exe_name=TR1X-$(tools/get_version 1)-Installer.exe
cp tools/installer/out/TR1X_Installer.exe "${exe_name}"
echo "Created ${exe_name}"
tr2-image-linux force="1": (_docker_build "tools/tr2/docker/game-linux/Dockerfile" "rrdash/tr2x-linux" force)
tr2-image-win force="1": (_docker_build "tools/tr2/docker/game-win/Dockerfile" "rrdash/tr2x" force)
tr2-image-win-config force="1": (_docker_build "tools/tr2/docker/config/Dockerfile" "rrdash/tr2x-config" force)
tr2-image-win-installer force="1": (_docker_build "tools/tr2/docker/installer/Dockerfile" "rrdash/tr2x-installer" force)
tr2-push-image-linux: (tr2-image-linux "0") (_docker_push "rrdash/tr2x-linux")
tr2-push-image-win: (tr2-image-win "0") (_docker_push "rrdash/tr2x")
tr2-build-linux target='debug': (tr2-image-linux "0") (_docker_run "-e" "TARGET="+target "rrdash/tr2x-linux")
tr2-build-win target='debug': (tr2-image-win "0") (_docker_run "-e" "TARGET="+target "rrdash/tr2x")
tr2-build-win-config: (tr2-image-win-config "0") (_docker_run "rrdash/tr2x-config")
tr2-build-win-installer: (tr2-image-win-installer "0") (_docker_run "rrdash/tr2x-installer")
tr2-package-linux target='release': (tr2-build-linux target) (_docker_run "rrdash/tr2x-linux" "package")
tr2-package-win target='release': (tr2-build-win target) (_docker_run "rrdash/tr2x" "package")
tr2-package-win-all target='release': (tr2-build-win target) (tr2-build-win-config) (_docker_run "rrdash/tr2x" "package")
tr2-package-win-installer target='release': (tr2-build-win target) (tr2-build-win-config) (_docker_run "rrdash/tr2x" "package" "-o" "tools/installer/TR2X_Installer/Resources/release.zip") (tr2-build-win-installer)
#!/bin/sh
git checkout "tools/installer/TR2X_Installer/Resources/release.zip"
exe_name=TR2X-$(tools/get_version 1)-Installer.exe
cp tools/installer/out/TR2X_Installer.exe "${exe_name}"
echo "Created ${exe_name}"
import "justfile.tr1"
import "justfile.tr2"
output-release-name tr_version:
tools/output_release_name {{tr_version}}
@ -99,10 +63,13 @@ clean:
-find tools/ -type f \( -ipath '*/out/*' -or -ipath '*/bin/*' -or -ipath '*/obj/*' \) -delete
-find . -mindepth 1 -empty -type d -delete
[group('lint')]
lint-imports:
tools/sort_imports
[group('lint')]
lint-format:
pre-commit run -a
[group('lint')]
lint: (lint-imports) (lint-format)

27
justfile.tr1 Normal file
View file

@ -0,0 +1,27 @@
[group('tr1')]
tr1-build-linux target='debug': (image-linux "0") (_docker_run "rrdash/trx-linux" "build" "--tr-version" "1" "--target" target)
[group('tr1')]
tr1-build-win target='debug': (image-win "0") (_docker_run "rrdash/trx-win" "build" "--tr-version" "1" "--target" target)
[group('tr1')]
tr1-build-win-config: (image-win-config "0") (_docker_run "rrdash/trx-config" "1")
[group('tr1')]
tr1-build-win-installer: (image-win-installer "0") (_docker_run "rrdash/trx-installer" "1")
[group('tr1')]
tr1-package-linux target='release': (tr1-build-linux target) (_docker_run "rrdash/trx-linux" "package" "--tr-version" "1")
[group('tr1')]
tr1-package-win target='release': (tr1-build-win target) (_docker_run "rrdash/trx-win" "package" "--tr-version" "1")
[group('tr1')]
tr1-package-win-all target='release': (tr1-build-win target) (tr1-build-win-config) (_docker_run "rrdash/trx-win" "package" "--tr-version" "1")
[group('tr1')]
tr1-package-win-installer target='release': \
(tr1-build-win target) \
(tr1-build-win-config) \
(_docker_run "rrdash/trx-win" "package" "--tr-version" "1" "-o" "tools/installer/TR1X_Installer/Resources/release.zip") \
(tr1-build-win-installer)
#!/bin/sh
git checkout "tools/installer/TR1X_Installer/Resources/release.zip"
exe_name=TR1X-$(tools/get_version 1)-Installer.exe
cp tools/installer/out/TR1X_Installer.exe "${exe_name}"
echo "Created ${exe_name}"

25
justfile.tr2 Normal file
View file

@ -0,0 +1,25 @@
[group('tr2')]
tr2-build-linux target='debug': (image-linux "0") (_docker_run "rrdash/trx-linux" "build" "--tr-version" "2" "--target" target)
[group('tr2')]
tr2-build-win target='debug': (image-win "0") (_docker_run "rrdash/trx-win" "build" "--tr-version" "2" "--target" target)
[group('tr2')]
tr2-build-win-config: (image-win-config "0") (_docker_run "rrdash/trx-config" "2")
[group('tr2')]
tr2-build-win-installer: (image-win-installer "0") (_docker_run "rrdash/trx-installer" "2")
[group('tr2')]
tr2-package-linux target='release': (tr2-build-linux target) (_docker_run "rrdash/trx-linux" "package" "--tr-version" "2")
[group('tr2')]
tr2-package-win target='release': (tr2-build-win target) (_docker_run "rrdash/trx-win" "package" "--tr-version" "2")
[group('tr2')]
tr2-package-win-all target='release': (tr2-build-win target) (tr2-build-win-config) (_docker_run "rrdash/trx-win" "package" "--tr-version" "2")
[group('tr2')]
tr2-package-win-installer target='release': \
(tr2-build-win target) \
(tr2-build-win-config) \
(_docker_run "rrdash/trx-win" "package" "--tr-version" "2" "-o" "tools/installer/TR2X_Installer/Resources/release.zip") (tr2-build-win-installer)
#!/bin/sh
git checkout "tools/installer/TR2X_Installer/Resources/release.zip"
exe_name=TR2X-$(tools/get_version 1)-Installer.exe
cp tools/installer/out/TR2X_Installer.exe "${exe_name}"
echo "Created ${exe_name}"

View file

@ -1,139 +0,0 @@
import argparse
import os
from dataclasses import dataclass
from pathlib import Path
from subprocess import check_call, run
from typing import Any
from shared.packaging import create_zip
from shared.versioning import generate_version
@dataclass
class Options:
version: int
platform: str
compile_args: list[str]
release_zip_files: list[tuple[Path, str]]
strip_tool = "strip"
upx_tool = "upx"
target = os.environ.get("TARGET", "debug")
compressable_exes: list[Path] | None = None
@property
def ship_dir(self) -> Path:
return Path(f"/app/data/tr{self.version}/ship/")
@property
def build_root(self) -> Path:
return Path(f"/app/build/tr{self.version}/{self.platform}/")
@property
def build_target(self) -> str:
return f"src/tr{self.version}"
@property
def release_zip_filename_fmt(self) -> str:
platform = self.platform
if platform == "win":
platform = "windows"
return f"TR{self.version}X-{{version}}-{platform.title()}.zip"
def compress_exe(options: Options, path: Path) -> None:
if run([options.upx_tool, "-t", str(path)]).returncode != 0:
check_call([options.strip_tool, str(path)])
check_call([options.upx_tool, str(path)])
class BaseCommand:
name: str = NotImplemented
help: str = NotImplemented
def decorate_parser(self, parser: argparse.ArgumentParser) -> None:
pass
def run(self, args: argparse.Namespace) -> None:
raise NotImplementedError("not implemented")
class CompileCommand(BaseCommand):
name = "compile"
def run(self, args: argparse.Namespace, options: Options) -> None:
pkg_config_path = os.environ.get("PKG_CONFIG_PATH")
if not (options.build_root / "build.ninja").exists():
command = [
"meson",
"setup",
"--buildtype",
options.target,
*options.compile_args,
options.build_root,
options.build_target,
]
if pkg_config_path:
command.extend(["--pkg-config-path", pkg_config_path])
check_call(command)
check_call(["meson", "compile"], cwd=options.build_root)
if options.target == "release":
for exe_path in options.compressable_exes:
compress_exe(options, exe_path)
class PackageCommand(BaseCommand):
name = "package"
def decorate_parser(self, parser: argparse.ArgumentParser) -> None:
parser.add_argument("-o", "--output", type=Path)
def run(self, args: argparse.Namespace, options: Options) -> None:
if args.output:
zip_path = args.output
else:
zip_path = Path(
options.release_zip_filename_fmt.format(
version=generate_version(options.version)
)
)
source_files = [
*[
(path, path.relative_to(options.ship_dir))
for path in options.ship_dir.rglob("*")
if path.is_file()
],
*options.release_zip_files,
]
create_zip(zip_path, source_files)
print(f"Created {zip_path}")
def parse_args(commands: dict[str, BaseCommand]) -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Docker entrypoint")
subparsers = parser.add_subparsers(dest="action", help="Subcommands")
parser.set_defaults(action="compile", command=commands["compile"])
for command in commands.values():
subparser = subparsers.add_parser(command.name, help=command.help)
command.decorate_parser(subparser)
subparser.set_defaults(command=command)
result = parser.parse_args()
# if not hasattr(result, "command"):
# args.action = "compile"
# args.command = CompileCommand
return result
def run_script(**kwargs: Any) -> None:
commands = {
command_cls.name: command_cls()
for command_cls in BaseCommand.__subclasses__()
}
args = parse_args(commands)
options = Options(**kwargs)
args.command.run(args, options)

View file

@ -2,4 +2,4 @@ FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
ENV HOME /app
WORKDIR /app
ENTRYPOINT ["/app/tools/tr2/docker/installer/entrypoint.sh"]
ENTRYPOINT ["/app/tools/shared/docker/config/entrypoint.sh"]

View file

@ -2,6 +2,12 @@
set -x
set -e
if [[ -z "$1" || ( "$1" != "1" && "$1" != "2" ) ]]; then
echo "Error: You must supply '1' or '2' as an argument to decide which game to build."
exit 1
fi
TR_VERSION=$1
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
echo $HOME
shopt -s globstar
@ -13,7 +19,7 @@ dotnet restore -p:EnableWindowsTargeting=true
dotnet publish -c Release -p:EnableWindowsTargeting=true
# Build the main executable
cd /app/tools/tr1/config/
cd /app/tools/tr${TR_VERSION}/config/
rm -rf **/bin **/obj **/out/*
dotnet restore
dotnet publish -c Release -o out

View file

@ -1,9 +1,9 @@
# TR2X building toolchain for Linux.
# TRX building toolchain for Linux.
#
# This is a multi-stage Docker image. It is designed to keep the final image
# size low. Each stage builds an external dependency. The final stage takes the
# artifacts (binaries, includes etc.) from previous stages and installs all the
# tools necessary to build TR2X.
# tools necessary to build TRX.
FROM ubuntu:latest AS base
@ -121,7 +121,7 @@ RUN sed -i "s/Cflags: .*/\\0 -DGLEW_STATIC /" /ext/lib/pkgconfig/glew.pc
# TR2X
# TRX
FROM base
# set the build dir - actual files are mounted with a Docker volume
@ -159,4 +159,4 @@ COPY --from=pcre2 /ext/ /ext/
COPY --from=glew /ext/ /ext/
ENV PYTHONPATH=/app/tools/
ENTRYPOINT ["/app/tools/tr2/docker/game-linux/entrypoint.sh"]
ENTRYPOINT ["/app/tools/shared/docker/game-linux/entrypoint.sh"]

View file

@ -0,0 +1,4 @@
#!/usr/bin/env python3
from shared.docker.game_entrypoint import main
main(platform="linux")

View file

@ -183,4 +183,4 @@ ENV PKG_CONFIG_LIBDIR=/ext/lib/
ENV PKG_CONFIG_PATH=/ext/lib/pkgconfig/
ENV C_INCLUDE_PATH=/ext/include/
ENV PYTHONPATH=/app/tools/
ENTRYPOINT ["/app/tools/tr1/docker/game-win/entrypoint.sh"]
ENTRYPOINT ["/app/tools/shared/docker/game-win/entrypoint.sh"]

View file

@ -0,0 +1,4 @@
#!/usr/bin/env python3
from shared.docker.game_entrypoint import main
main(platform="win")

View file

@ -0,0 +1,210 @@
import argparse
import os
from dataclasses import dataclass, fields
from pathlib import Path
from subprocess import check_call, run
from typing import Any, Self
from shared.packaging import create_zip
from shared.versioning import generate_version
@dataclass
class BaseOptions:
platform: str
tr_version: int
@property
def build_root(self) -> Path:
return Path(f"/app/build/tr{self.tr_version}/{self.platform}/")
@property
def version(self) -> str:
return generate_version(self.tr_version)
@classmethod
def from_args(cls, args: argparse.Namespace) -> Self:
cls_fields = [field.name for field in fields(cls)]
filtered_args = vars(args)
filtered_args = {
k: v for k, v in filtered_args.items() if k in cls_fields
}
return cls(**filtered_args)
@dataclass
class PackageOptions(BaseOptions):
@property
def release_zip_filename(self) -> Path:
platform = self.platform
if platform == "win":
platform = "windows"
return Path(
f"TR{self.tr_version}X-{self.version}-{platform.title()}.zip"
)
@property
def ship_dir(self) -> Path:
return Path(f"/app/data/tr{self.tr_version}/ship/")
@property
def release_zip_files(self) -> list[tuple[Path, str]]:
if self.platform == "linux":
return [
(
self.build_root / f"TR{self.tr_version}X",
"TR{self.tr_version}X",
)
]
elif self.platform == "win":
return [
(
self.build_root / f"TR{self.tr_version}X.exe",
f"TR{self.tr_version}X.exe",
),
(
Path(
f"/app/tools/tr{self.tr_version}/config/out/TR{self.tr_version}X_ConfigTool.exe"
),
f"TR{self.tr_version}X_ConfigTool.exe",
),
]
return []
@dataclass
class BuildOptions(BaseOptions):
target: str
strip_tool = "strip"
upx_tool = "upx"
@property
def build_args(self) -> list[str]:
if self.platform == "win":
return [
"--cross",
"/app/tools/shared/docker/game-win/meson_linux_mingw32.txt",
]
return []
@property
def compressable_exes(self) -> list[Path]:
if self.platform == "linux":
return [self.build_root / f"TR{self.tr_version}X"]
elif self.platform == "win":
return [self.build_root / f"TR{self.tr_version}X.exe"]
return []
@property
def build_target(self) -> Path:
return Path(f"src/tr{self.tr_version}")
def compress_exe(options: BuildOptions, path: Path) -> None:
if run([options.upx_tool, "-t", str(path)]).returncode != 0:
check_call([options.strip_tool, str(path)])
check_call([options.upx_tool, str(path)])
class BaseCommand:
name: str = NotImplemented
help: str = NotImplemented
def decorate_parser(self, parser: argparse.ArgumentParser) -> None:
pass
def run(self, args: argparse.Namespace) -> None:
raise NotImplementedError("not implemented")
class BuildCommand(BaseCommand):
name = "build"
def decorate_parser(self, parser: argparse.ArgumentParser) -> None:
parser.add_argument("--platform")
parser.add_argument("--tr-version", type=int, required=True)
parser.add_argument(
"--target",
choices=["debug", "release", "debugoptim"],
required=True,
)
def run(self, args: argparse.Namespace) -> None:
options = BuildOptions.from_args(args)
pkg_config_path = os.environ.get("PKG_CONFIG_PATH")
if not (options.build_root / "build.ninja").exists():
command: list[str | Path] = [
"meson",
"setup",
"--buildtype",
options.target,
*options.build_args,
options.build_root,
options.build_target,
]
if pkg_config_path:
command.extend(["--pkg-config-path", pkg_config_path])
check_call(command)
check_call(["meson", "compile"], cwd=options.build_root)
if options.target == "release":
for exe_path in options.compressable_exes:
compress_exe(options, exe_path)
class PackageCommand(BaseCommand):
name = "package"
def decorate_parser(self, parser: argparse.ArgumentParser) -> None:
parser.add_argument("--tr-version", type=int, required=True)
parser.add_argument("-o", "--output", type=Path)
def run(self, args: argparse.Namespace) -> None:
options = PackageOptions.from_args(args)
if args.output:
zip_path = args.output
else:
zip_path = options.release_zip_filename
source_files = [
*[
(path, str(path.relative_to(options.ship_dir)))
for path in options.ship_dir.rglob("*")
if path.is_file()
],
*options.release_zip_files,
]
create_zip(zip_path, source_files)
print(f"Created {zip_path}")
def parse_args(
commands: dict[str, BaseCommand], **kwargs
) -> argparse.Namespace:
parser = argparse.ArgumentParser(description="Docker entrypoint")
subparsers = parser.add_subparsers(dest="action", help="Subcommands")
parser.set_defaults(action="build", command=commands["build"])
parser.set_defaults(**kwargs)
for command in commands.values():
subparser = subparsers.add_parser(command.name, help=command.help)
command.decorate_parser(subparser)
subparser.set_defaults(command=command)
subparser.set_defaults(**kwargs)
result = parser.parse_args()
return result
def main(**kwargs: Any) -> None:
commands = {
command_cls.name: command_cls()
for command_cls in BaseCommand.__subclasses__()
}
args = parse_args(commands, **kwargs)
args.command.run(args)

View file

@ -2,4 +2,4 @@ FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
ENV HOME /app
WORKDIR /app
ENTRYPOINT ["/app/tools/tr1/docker/config/entrypoint.sh"]
ENTRYPOINT ["/app/tools/shared/docker/installer/entrypoint.sh"]

View file

@ -0,0 +1,18 @@
#!/bin/bash
set -x
set -e
if [[ -z "$1" || ( "$1" != "1" && "$1" != "2" ) ]]; then
echo "Error: You must supply '1' or '2' as an argument to decide which game to build."
exit 1
fi
TR_VERSION=$1
cd /app/tools/installer/
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
shopt -s globstar
rm -rf **/bin **/obj **/out/*
dotnet restore
dotnet publish TR${TR_VERSION}X_Installer -c Release -o out

View file

@ -1,162 +0,0 @@
# TR1X building toolchain for Linux.
#
# This is a multi-stage Docker image. It is designed to keep the final image
# size low. Each stage builds an external dependency. The final stage takes the
# artifacts (binaries, includes etc.) from previous stages and installs all the
# tools necessary to build TR1X.
FROM ubuntu:latest AS base
# don't prompt during potential installation/update of tzinfo
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Europe/Warsaw
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \
git \
make
# pcre2
FROM base AS pcre2
RUN apt-get install -y git gcc autoconf libtool
RUN git clone https://github.com/PCRE2Project/pcre2
RUN cd pcre2 \
&& autoreconf -fi \
&& ./configure \
--prefix=/ext/ \
&& make -j 4 \
&& make install
# libbacktrace
FROM base AS backtrace
RUN apt-get install -y git gcc autoconf libtool
RUN git clone https://github.com/LostArtefacts/libbacktrace/
RUN cd libbacktrace \
&& autoreconf -fi \
&& ./configure \
--prefix=/ext/ \
&& make -j 4 \
&& make install
# libav
FROM base AS libav
RUN apt-get install -y \
nasm \
gcc \
zlib1g-dev
RUN git clone \
--depth 1 \
--branch "n7.1" \
https://github.com/FFmpeg/FFmpeg
COPY ./tools/ffmpeg_flags.txt /tmp/ffmpeg_flags.txt
RUN cd FFmpeg \
&& ./configure \
--arch=x86 \
--prefix=/ext/ \
--enable-static \
--disable-shared \
$(cat /tmp/ffmpeg_flags.txt) \
&& make -j 4 \
&& make install
# SDL
FROM base AS sdl
RUN git clone https://github.com/libsdl-org/SDL -b SDL2
RUN apt-get install -y \
libgl1-mesa-dev \
libglu1-mesa-dev \
libpulse-dev \
libxkbcommon-dev \
libwayland-client0 \
libwayland-cursor0 \
libwayland-dev \
libwayland-egl1 \
automake \
gcc \
libxrandr-dev \
libxext-dev
RUN cd SDL \
&& aclocal -I acinclude \
&& autoconf \
&& mkdir sdl_build \
&& cd sdl_build \
&& ../configure \
--prefix=/ext/ \
--enable-video-x11-xrandr \
--enable-shared \
--enable-static \
&& make -j 4 \
&& make install
# GLEW
FROM base AS glew
RUN git clone https://github.com/nigels-com/glew.git
RUN apt-get install -y \
build-essential \
libxmu-dev \
libxi-dev \
libgl-dev \
python3
RUN cd glew/auto \
&& PYTHON=python3 make
RUN mkdir -p /ext/lib \
&& export \
GLEW_NO_GLU=-DGLEW_NO_GLU \
GLEW_DEST=/ext \
&& cd glew \
&& make \
&& make install
RUN sed -i "s/Cflags: .*/\\0 -DGLEW_STATIC /" /ext/lib/pkgconfig/glew.pc
# TR1X
FROM base
# set the build dir - actual files are mounted with a Docker volume
RUN mkdir /app
WORKDIR /app
# package dependencies
RUN apt-get install -y \
zlib1g-dev \
libgl1-mesa-dev
# tooling dependencies
# configure pkgconfig manually
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=967969
ENV PKG_CONFIG_LIBDIR=/ext/lib/
ENV PKG_CONFIG_PATH=/ext/lib/pkgconfig/
RUN apt-get install -y \
pkg-config \
git \
python3-pip \
&& python3 -m pip install --break-system-packages \
pyjson5 \
meson \
ninja
# Regular dependencies
RUN apt-get install -y \
upx \
uthash-dev
# manually built dependencies
COPY --from=libav /ext/ /ext/
COPY --from=sdl /ext/ /ext/
COPY --from=backtrace /ext/ /ext/
COPY --from=pcre2 /ext/ /ext/
COPY --from=glew /ext/ /ext/
ENV PYTHONPATH=/app/tools/
ENTRYPOINT ["/app/tools/tr1/docker/game-linux/entrypoint.sh"]

View file

@ -1,16 +0,0 @@
#!/usr/bin/env python3
from pathlib import Path
from shared.cli.game_docker_entrypoint import run_script
run_script(
version=1,
platform="linux",
compile_args=[],
release_zip_files=[
(Path("/app/build/tr1/linux/TR1X"), "TR1X"),
],
compressable_exes=[
Path("/app/build/tr1/linux/TR1X"),
],
)

View file

@ -1,23 +0,0 @@
#!/usr/bin/env python3
from pathlib import Path
from shared.cli.game_docker_entrypoint import run_script
run_script(
version=1,
platform="win",
compile_args=[
"--cross",
"/app/tools/tr1/docker/game-win/meson_linux_mingw32.txt",
],
release_zip_files=[
(Path("/app/build/tr1/win/TR1X.exe"), "TR1X.exe"),
(
Path("/app/tools/tr1/config/out/TR1X_ConfigTool.exe"),
"TR1X_ConfigTool.exe",
),
],
compressable_exes=[
Path("/app/build/tr1/win/TR1X.exe"),
],
)

View file

@ -1,5 +0,0 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
ENV HOME /app
WORKDIR /app
ENTRYPOINT ["/app/tools/tr1/docker/installer/entrypoint.sh"]

View file

@ -1,12 +0,0 @@
#!/bin/bash
set -x
set -e
cd /app/tools/installer/
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
shopt -s globstar
rm -rf **/bin **/obj **/out/*
dotnet restore
dotnet publish TR1X_Installer -c Release -o out

View file

@ -1,5 +0,0 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
ENV HOME /app
WORKDIR /app
ENTRYPOINT ["/app/tools/tr2/docker/config/entrypoint.sh"]

View file

@ -1,19 +0,0 @@
#!/bin/bash
set -x
set -e
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
echo $HOME
shopt -s globstar
# Build the common lib DLL
cd /app/tools/config/
rm -rf **/bin **/obj
dotnet restore -p:EnableWindowsTargeting=true
dotnet publish -c Release -p:EnableWindowsTargeting=true
# Build the main executable
cd /app/tools/tr2/config/
rm -rf **/bin **/obj **/out/*
dotnet restore
dotnet publish -c Release -o out

View file

@ -1,16 +0,0 @@
#!/usr/bin/env python3
from pathlib import Path
from shared.cli.game_docker_entrypoint import run_script
run_script(
version=2,
platform="linux",
compile_args=[],
release_zip_files=[
(Path("/app/build/tr2/linux/TR2X"), "TR2X"),
],
compressable_exes=[
Path("/app/build/tr2/linux/TR2X"),
],
)

View file

@ -1,169 +0,0 @@
# TR2X building toolchain.
#
# This is a multi-stage Docker image. It is designed to keep the final image
# size low. Each stage builds an external dependency. The final stage takes the
# artifacts (binaries, includes etc.) from previous stages and installs all the
# tools necessary to build TR2X.
# MinGW
FROM ubuntu:latest AS mingw
# don't prompt during potential installation/update of tzinfo
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Europe/Warsaw
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y \
gcc-mingw-w64-i686 \
g++-mingw-w64-i686 \
git \
make
# pcre
FROM mingw AS pcre2
RUN git clone https://github.com/PCRE2Project/pcre2
RUN apt-get -y install libtool
RUN cd pcre2 \
&& autoreconf -fi \
&& ./configure \
--host=i686-w64-mingw32 \
--prefix=/ext/ \
&& make -j 4 \
&& make install
# zlib
FROM mingw AS zlib
RUN git clone https://github.com/madler/zlib --branch=v1.3.1
RUN cd zlib \
&& make -f win32/Makefile.gcc \
SHARED_MODE=1 \
BINARY_PATH=/ext/bin \
INCLUDE_PATH=/ext/include \
LIBRARY_PATH=/ext/lib \
PREFIX=i686-w64-mingw32- \
-j 4 install
# libav
FROM mingw AS libav
RUN apt-get install -y \
nasm
RUN git clone \
--depth 1 \
--branch "n7.1" \
https://github.com/FFmpeg/FFmpeg
COPY --from=zlib /ext/ /usr/i686-w64-mingw32/
COPY ./tools/ffmpeg_flags.txt /tmp/ffmpeg_flags.txt
RUN cd FFmpeg \
&& ./configure \
--arch=x86 \
--target-os=mingw32 \
--cross-prefix=i686-w64-mingw32- \
--prefix=/ext/ \
--cc=i686-w64-mingw32-gcc \
--cxx=i686-w64-mingw32-g++ \
--host-cc=i686-w64-mingw32-gcc \
--strip=i686-w64-mingw32-strip \
--pkg-config=i686-w64-mingw32-pkg-config \
--enable-static \
--disable-shared \
$(cat /tmp/ffmpeg_flags.txt) \
&& make -j 4 \
&& make install
# SDL
FROM mingw AS sdl
RUN git clone https://github.com/libsdl-org/SDL -b SDL2
RUN apt-get install -y automake
RUN cd SDL \
&& aclocal -I acinclude \
&& autoconf \
&& mkdir build \
&& cd build \
&& ../configure \
--host=i686-w64-mingw32 \
--build=i686-pc-mingw32 \
--prefix=/ext/ \
--enable-shared \
--enable-static \
&& make -j 4 \
&& make install
# uthash
FROM mingw AS uthash
RUN mkdir /ext/
WORKDIR /tmp/
RUN apt-get install -y wget xz-utils
RUN wget https://github.com/troydhanson/uthash/archive/v2.3.0.tar.gz
RUN tar -xvf v2.3.0.tar.gz
RUN cp -rL uthash-2.3.0/* /ext/
# GLEW
FROM mingw as glew
RUN git clone https://github.com/nigels-com/glew.git
RUN apt-get install -y \
build-essential \
libxmu-dev \
libxi-dev \
libgl-dev \
python3
RUN cd glew/auto \
&& PYTHON=python3 make
RUN mkdir -p /ext/lib \
&& export \
SYSTEM=linux-mingw32 \
GLEW_NO_GLU=-DGLEW_NO_GLU \
GLEW_DEST=/ext \
&& cd glew \
&& make \
&& make install
RUN sed -i "s/Cflags: .*/\\0 -DGLEW_STATIC/" /ext/lib/pkgconfig/glew.pc
# TR2X
FROM mingw
# set the build dir - actual files are mounted with a Docker volume
RUN mkdir /app
WORKDIR /app
# system dependencies
# configure pkgconfig manually
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=967969
RUN apt-get install -y \
mingw-w64-tools \
pkg-config \
upx \
python3-pip \
&& python3 -m pip install --break-system-packages \
pyjson5 \
meson \
ninja
COPY --from=pcre2 /ext/ /ext/
COPY --from=zlib /ext/ /ext/
COPY --from=libav /ext/ /ext/
COPY --from=sdl /ext/ /ext/
COPY --from=uthash /ext/ /ext/
COPY --from=glew /ext/ /ext/
ENV PKG_CONFIG_LIBDIR=/ext/lib/
ENV PKG_CONFIG_PATH=/ext/lib/pkgconfig/
ENV C_INCLUDE_PATH=/ext/include/
ENV PYTHONPATH=/app/tools/
ENTRYPOINT ["/app/tools/tr2/docker/game-win/entrypoint.sh"]

View file

@ -1,23 +0,0 @@
#!/usr/bin/env python3
from pathlib import Path
from shared.cli.game_docker_entrypoint import run_script
run_script(
version=2,
platform="win",
compile_args=[
"--cross",
"/app/tools/tr2/docker/game-win/meson_linux_mingw32.txt",
],
release_zip_files=[
(Path("/app/build/tr2/win/TR2X.exe"), "TR2X.exe"),
(
Path("/app/tools/tr2/config/out/TR2X_ConfigTool.exe"),
"TR2X_ConfigTool.exe",
),
],
compressable_exes=[
Path("/app/build/tr2/win/TR2X.exe"),
],
)

View file

@ -1,19 +0,0 @@
[binaries]
c = '/usr/bin/i686-w64-mingw32-gcc'
cpp = '/usr/bin/i686-w64-mingw32-g++'
objc = '/usr/bin/i686-w64-mingw32-gcc'
ar = '/usr/bin/i686-w64-mingw32-ar'
strip = '/usr/bin/i686-w64-mingw32-strip'
pkg-config = '/usr/bin/i686-w64-mingw32-pkg-config'
windres = '/usr/bin/i686-w64-mingw32-windres'
exe_wrapper = 'wine'
ld = '/usr/bin/i686-w64-mingw32-ld'
[properties]
skip_sanity_check = true
[host_machine]
system = 'windows'
cpu_family = 'x86'
cpu = 'i686'
endian = 'little'

View file

@ -1,12 +0,0 @@
#!/bin/bash
set -x
set -e
cd /app/tools/installer/
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
shopt -s globstar
rm -rf **/bin **/obj **/out/*
dotnet restore
dotnet publish TR2X_Installer -c Release -o out