diff --git a/.github/workflows/build_docker.yml b/.github/workflows/build_docker.yml index cf165e8da..b6ff87ffa 100644 --- a/.github/workflows/build_docker.yml +++ b/.github/workflows/build_docker.yml @@ -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 }} diff --git a/justfile b/justfile index 5a6c3f744..007f4dede 100644 --- a/justfile +++ b/justfile @@ -38,6 +38,14 @@ _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) + +push-image-linux: (image-linux "0") (_docker_push "rrdash/trx-linux") +push-image-win: (image-win "0") (_docker_push "rrdash/trx-win") + import "justfile.tr1" import "justfile.tr2" diff --git a/justfile.tr1 b/justfile.tr1 index ae1428562..a0f58d403 100644 --- a/justfile.tr1 +++ b/justfile.tr1 @@ -1,38 +1,24 @@ [group('tr1')] -tr1-image-linux force="1": (_docker_build "tools/tr1/docker/game-linux/Dockerfile" "rrdash/tr1x-linux" force) +tr1-build-linux target='debug': (image-linux "0") (_docker_run "rrdash/trx-linux" "build" "--tr-version" "1" "--target" target) [group('tr1')] -tr1-image-win force="1": (_docker_build "tools/tr1/docker/game-win/Dockerfile" "rrdash/tr1x" force) +tr1-build-win target='debug': (image-win "0") (_docker_run "rrdash/trx-win" "build" "--tr-version" "1" "--target" target) [group('tr1')] -tr1-image-win-config force="1": (_docker_build "tools/tr1/docker/config/Dockerfile" "rrdash/tr1x-config" force) +tr1-build-win-config: (image-win-config "0") (_docker_run "rrdash/trx-config" "1") [group('tr1')] -tr1-image-win-installer force="1": (_docker_build "tools/tr1/docker/installer/Dockerfile" "rrdash/tr1x-installer" force) +tr1-build-win-installer: (image-win-installer "0") (_docker_run "rrdash/trx-installer" "1") [group('tr1')] -tr1-push-image-linux: (tr1-image-linux "0") (_docker_push "rrdash/tr1x-linux") +tr1-package-linux target='release': (tr1-build-linux target) (_docker_run "rrdash/trx-linux" "package" "--tr-version" "1") [group('tr1')] -tr1-push-image-win: (tr1-image-win "0") (_docker_push "rrdash/tr1x") - +tr1-package-win target='release': (tr1-build-win target) (_docker_run "rrdash/trx-win" "package" "--tr-version" "1") [group('tr1')] -tr1-build-linux target='debug': (tr1-image-linux "0") (_docker_run "-e" "TARGET="+target "rrdash/tr1x-linux") -[group('tr1')] -tr1-build-win target='debug': (tr1-image-win "0") (_docker_run "-e" "TARGET="+target "rrdash/tr1x") -[group('tr1')] -tr1-build-win-config: (tr1-image-win-config "0") (_docker_run "rrdash/tr1x-config") -[group('tr1')] -tr1-build-win-installer: (tr1-image-win-installer "0") (_docker_run "rrdash/tr1x-installer") - -[group('tr1')] -tr1-package-linux target='release': (tr1-build-linux target) (_docker_run "rrdash/tr1x-linux" "package") -[group('tr1')] -tr1-package-win target='release': (tr1-build-win target) (_docker_run "rrdash/tr1x" "package") -[group('tr1')] -tr1-package-win-all target='release': (tr1-build-win target) (tr1-build-win-config) (_docker_run "rrdash/tr1x" "package") +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/tr1x" "package" "-o" "tools/installer/TR1X_Installer/Resources/release.zip") \ + (_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" diff --git a/justfile.tr2 b/justfile.tr2 index 7f040f5a7..a7907cba2 100644 --- a/justfile.tr2 +++ b/justfile.tr2 @@ -1,37 +1,23 @@ [group('tr2')] -tr2-image-linux force="1": (_docker_build "tools/tr2/docker/game-linux/Dockerfile" "rrdash/tr2x-linux" force) +tr2-build-linux target='debug': (image-linux "0") (_docker_run "rrdash/trx-linux" "build" "--tr-version" "2" "--target" target) [group('tr2')] -tr2-image-win force="1": (_docker_build "tools/tr2/docker/game-win/Dockerfile" "rrdash/tr2x" force) +tr2-build-win target='debug': (image-win "0") (_docker_run "rrdash/trx-win" "build" "--tr-version" "2" "--target" target) [group('tr2')] -tr2-image-win-config force="1": (_docker_build "tools/tr2/docker/config/Dockerfile" "rrdash/tr2x-config" force) +tr2-build-win-config: (image-win-config "0") (_docker_run "rrdash/trx-config" "2") [group('tr2')] -tr2-image-win-installer force="1": (_docker_build "tools/tr2/docker/installer/Dockerfile" "rrdash/tr2x-installer" force) +tr2-build-win-installer: (image-win-installer "0") (_docker_run "rrdash/trx-installer" "2") [group('tr2')] -tr2-push-image-linux: (tr2-image-linux "0") (_docker_push "rrdash/tr2x-linux") +tr2-package-linux target='release': (tr2-build-linux target) (_docker_run "rrdash/trx-linux" "package" "--tr-version" "2") [group('tr2')] -tr2-push-image-win: (tr2-image-win "0") (_docker_push "rrdash/tr2x") - +tr2-package-win target='release': (tr2-build-win target) (_docker_run "rrdash/trx-win" "package" "--tr-version" "2") [group('tr2')] -tr2-build-linux target='debug': (tr2-image-linux "0") (_docker_run "-e" "TARGET="+target "rrdash/tr2x-linux") -[group('tr2')] -tr2-build-win target='debug': (tr2-image-win "0") (_docker_run "-e" "TARGET="+target "rrdash/tr2x") -[group('tr2')] -tr2-build-win-config: (tr2-image-win-config "0") (_docker_run "rrdash/tr2x-config") -[group('tr2')] -tr2-build-win-installer: (tr2-image-win-installer "0") (_docker_run "rrdash/tr2x-installer") - -[group('tr2')] -tr2-package-linux target='release': (tr2-build-linux target) (_docker_run "rrdash/tr2x-linux" "package") -[group('tr2')] -tr2-package-win target='release': (tr2-build-win target) (_docker_run "rrdash/tr2x" "package") -[group('tr2')] -tr2-package-win-all target='release': (tr2-build-win target) (tr2-build-win-config) (_docker_run "rrdash/tr2x" "package") +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/tr2x" "package" "-o" "tools/installer/TR2X_Installer/Resources/release.zip") (tr2-build-win-installer) + (_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 diff --git a/tools/shared/cli/game_docker_entrypoint.py b/tools/shared/cli/game_docker_entrypoint.py deleted file mode 100644 index 76b38c8a1..000000000 --- a/tools/shared/cli/game_docker_entrypoint.py +++ /dev/null @@ -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) diff --git a/tools/shared/cli/__init__.py b/tools/shared/docker/__init__.py similarity index 100% rename from tools/shared/cli/__init__.py rename to tools/shared/docker/__init__.py diff --git a/tools/tr2/docker/installer/Dockerfile b/tools/shared/docker/config/Dockerfile similarity index 56% rename from tools/tr2/docker/installer/Dockerfile rename to tools/shared/docker/config/Dockerfile index 3f61c77f7..aa624cdc8 100644 --- a/tools/tr2/docker/installer/Dockerfile +++ b/tools/shared/docker/config/Dockerfile @@ -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"] diff --git a/tools/tr1/docker/config/entrypoint.sh b/tools/shared/docker/config/entrypoint.sh similarity index 64% rename from tools/tr1/docker/config/entrypoint.sh rename to tools/shared/docker/config/entrypoint.sh index 42cf78b6f..3adc4f1a3 100755 --- a/tools/tr1/docker/config/entrypoint.sh +++ b/tools/shared/docker/config/entrypoint.sh @@ -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 diff --git a/tools/tr2/docker/game-linux/Dockerfile b/tools/shared/docker/game-linux/Dockerfile similarity index 96% rename from tools/tr2/docker/game-linux/Dockerfile rename to tools/shared/docker/game-linux/Dockerfile index 745343fb6..ab8e65b40 100644 --- a/tools/tr2/docker/game-linux/Dockerfile +++ b/tools/shared/docker/game-linux/Dockerfile @@ -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"] diff --git a/tools/shared/docker/game-linux/entrypoint.sh b/tools/shared/docker/game-linux/entrypoint.sh new file mode 100755 index 000000000..8059a1402 --- /dev/null +++ b/tools/shared/docker/game-linux/entrypoint.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 +from shared.docker.game_entrypoint import main + +main(platform="linux") diff --git a/tools/tr1/docker/game-win/Dockerfile b/tools/shared/docker/game-win/Dockerfile similarity index 98% rename from tools/tr1/docker/game-win/Dockerfile rename to tools/shared/docker/game-win/Dockerfile index 2d91de504..65854410a 100644 --- a/tools/tr1/docker/game-win/Dockerfile +++ b/tools/shared/docker/game-win/Dockerfile @@ -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"] diff --git a/tools/shared/docker/game-win/entrypoint.sh b/tools/shared/docker/game-win/entrypoint.sh new file mode 100755 index 000000000..4ea78a52a --- /dev/null +++ b/tools/shared/docker/game-win/entrypoint.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env python3 +from shared.docker.game_entrypoint import main + +main(platform="win") diff --git a/tools/tr1/docker/game-win/meson_linux_mingw32.txt b/tools/shared/docker/game-win/meson_linux_mingw32.txt similarity index 100% rename from tools/tr1/docker/game-win/meson_linux_mingw32.txt rename to tools/shared/docker/game-win/meson_linux_mingw32.txt diff --git a/tools/shared/docker/game_entrypoint.py b/tools/shared/docker/game_entrypoint.py new file mode 100644 index 000000000..949c9ff3f --- /dev/null +++ b/tools/shared/docker/game_entrypoint.py @@ -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) diff --git a/tools/tr1/docker/config/Dockerfile b/tools/shared/docker/installer/Dockerfile similarity index 55% rename from tools/tr1/docker/config/Dockerfile rename to tools/shared/docker/installer/Dockerfile index 61ca890bb..093e9514b 100644 --- a/tools/tr1/docker/config/Dockerfile +++ b/tools/shared/docker/installer/Dockerfile @@ -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"] diff --git a/tools/shared/docker/installer/entrypoint.sh b/tools/shared/docker/installer/entrypoint.sh new file mode 100755 index 000000000..56ada8697 --- /dev/null +++ b/tools/shared/docker/installer/entrypoint.sh @@ -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 diff --git a/tools/tr1/docker/game-linux/Dockerfile b/tools/tr1/docker/game-linux/Dockerfile deleted file mode 100644 index 887ab10f1..000000000 --- a/tools/tr1/docker/game-linux/Dockerfile +++ /dev/null @@ -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"] diff --git a/tools/tr1/docker/game-linux/entrypoint.sh b/tools/tr1/docker/game-linux/entrypoint.sh deleted file mode 100755 index ca4da0764..000000000 --- a/tools/tr1/docker/game-linux/entrypoint.sh +++ /dev/null @@ -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"), - ], -) diff --git a/tools/tr1/docker/game-win/entrypoint.sh b/tools/tr1/docker/game-win/entrypoint.sh deleted file mode 100755 index d5b5ef3f9..000000000 --- a/tools/tr1/docker/game-win/entrypoint.sh +++ /dev/null @@ -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"), - ], -) diff --git a/tools/tr1/docker/installer/Dockerfile b/tools/tr1/docker/installer/Dockerfile deleted file mode 100644 index ea3a8afa4..000000000 --- a/tools/tr1/docker/installer/Dockerfile +++ /dev/null @@ -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"] diff --git a/tools/tr1/docker/installer/entrypoint.sh b/tools/tr1/docker/installer/entrypoint.sh deleted file mode 100755 index 45126b19f..000000000 --- a/tools/tr1/docker/installer/entrypoint.sh +++ /dev/null @@ -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 diff --git a/tools/tr2/docker/config/Dockerfile b/tools/tr2/docker/config/Dockerfile deleted file mode 100644 index 7e074954c..000000000 --- a/tools/tr2/docker/config/Dockerfile +++ /dev/null @@ -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"] diff --git a/tools/tr2/docker/config/entrypoint.sh b/tools/tr2/docker/config/entrypoint.sh deleted file mode 100755 index 4d18d4e91..000000000 --- a/tools/tr2/docker/config/entrypoint.sh +++ /dev/null @@ -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 diff --git a/tools/tr2/docker/game-linux/entrypoint.sh b/tools/tr2/docker/game-linux/entrypoint.sh deleted file mode 100755 index 374d7dd7f..000000000 --- a/tools/tr2/docker/game-linux/entrypoint.sh +++ /dev/null @@ -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"), - ], -) diff --git a/tools/tr2/docker/game-win/Dockerfile b/tools/tr2/docker/game-win/Dockerfile deleted file mode 100644 index 7821b4db2..000000000 --- a/tools/tr2/docker/game-win/Dockerfile +++ /dev/null @@ -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"] diff --git a/tools/tr2/docker/game-win/entrypoint.sh b/tools/tr2/docker/game-win/entrypoint.sh deleted file mode 100755 index 6d1f448d9..000000000 --- a/tools/tr2/docker/game-win/entrypoint.sh +++ /dev/null @@ -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"), - ], -) diff --git a/tools/tr2/docker/game-win/meson_linux_mingw32.txt b/tools/tr2/docker/game-win/meson_linux_mingw32.txt deleted file mode 100644 index 45e7a7980..000000000 --- a/tools/tr2/docker/game-win/meson_linux_mingw32.txt +++ /dev/null @@ -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' diff --git a/tools/tr2/docker/installer/entrypoint.sh b/tools/tr2/docker/installer/entrypoint.sh deleted file mode 100755 index bc8362382..000000000 --- a/tools/tr2/docker/installer/entrypoint.sh +++ /dev/null @@ -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