mirror of
https://github.com/LostArtefacts/TRX.git
synced 2025-04-28 04:37:58 +03:00
build: merge Docker images
This commit is contained in:
parent
e048bad1b6
commit
3f76e74ed5
28 changed files with 278 additions and 682 deletions
14
.github/workflows/build_docker.yml
vendored
14
.github/workflows/build_docker.yml
vendored
|
@ -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 }}
|
||||
|
|
8
justfile
8
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"
|
||||
|
||||
|
|
30
justfile.tr1
30
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"
|
||||
|
|
30
justfile.tr2
30
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
|
||||
|
|
|
@ -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)
|
|
@ -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"]
|
|
@ -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
|
|
@ -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"]
|
4
tools/shared/docker/game-linux/entrypoint.sh
Executable file
4
tools/shared/docker/game-linux/entrypoint.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env python3
|
||||
from shared.docker.game_entrypoint import main
|
||||
|
||||
main(platform="linux")
|
|
@ -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"]
|
4
tools/shared/docker/game-win/entrypoint.sh
Executable file
4
tools/shared/docker/game-win/entrypoint.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env python3
|
||||
from shared.docker.game_entrypoint import main
|
||||
|
||||
main(platform="win")
|
210
tools/shared/docker/game_entrypoint.py
Normal file
210
tools/shared/docker/game_entrypoint.py
Normal 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)
|
|
@ -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"]
|
18
tools/shared/docker/installer/entrypoint.sh
Executable file
18
tools/shared/docker/installer/entrypoint.sh
Executable 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
|
|
@ -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"]
|
|
@ -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"),
|
||||
],
|
||||
)
|
|
@ -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"),
|
||||
],
|
||||
)
|
|
@ -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"]
|
|
@ -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
|
|
@ -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"]
|
|
@ -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
|
|
@ -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"),
|
||||
],
|
||||
)
|
|
@ -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"]
|
|
@ -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"),
|
||||
],
|
||||
)
|
|
@ -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'
|
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue