mirror of
https://github.com/LostArtefacts/TRX.git
synced 2025-04-28 20:58:07 +03:00
tr1: release 4.9
This commit is contained in:
commit
e88764f280
28 changed files with 317 additions and 682 deletions
14
.github/workflows/build_docker.yml
vendored
14
.github/workflows/build_docker.yml
vendored
|
@ -10,14 +10,8 @@ jobs:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- game_version: tr1
|
- platform: win
|
||||||
platform: win
|
- platform: linux
|
||||||
- game_version: tr1
|
|
||||||
platform: linux
|
|
||||||
- game_version: tr2
|
|
||||||
platform: win
|
|
||||||
- game_version: tr2
|
|
||||||
platform: linux
|
|
||||||
steps:
|
steps:
|
||||||
- name: Login to Docker Hub
|
- name: Login to Docker Hub
|
||||||
uses: docker/login-action@v1
|
uses: docker/login-action@v1
|
||||||
|
@ -35,5 +29,5 @@ jobs:
|
||||||
|
|
||||||
- name: Build Docker image (${{ matrix.platform }})
|
- name: Build Docker image (${{ matrix.platform }})
|
||||||
run: |
|
run: |
|
||||||
just ${{ matrix.game_version }}-image-${{ matrix.platform }}
|
just image-${{ matrix.platform }}
|
||||||
just ${{ matrix.game_version }}-push-image-${{ matrix.platform }}
|
just push-image-${{ matrix.platform }}
|
||||||
|
|
55
justfile
55
justfile
|
@ -38,52 +38,16 @@ _docker_run *args:
|
||||||
-v {{CWD}}:/app/ \
|
-v {{CWD}}:/app/ \
|
||||||
{{args}}
|
{{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)
|
push-image-linux: (image-linux "0") (_docker_push "rrdash/trx-linux")
|
||||||
tr1-image-win force="1": (_docker_build "tools/tr1/docker/game-win/Dockerfile" "rrdash/tr1x" force)
|
push-image-win: (image-win "0") (_docker_push "rrdash/trx-win")
|
||||||
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)
|
|
||||||
|
|
||||||
tr1-push-image-linux: (tr1-image-linux "0") (_docker_push "rrdash/tr1x-linux")
|
import "justfile.tr1"
|
||||||
tr1-push-image-win: (tr1-image-win "0") (_docker_push "rrdash/tr1x")
|
import "justfile.tr2"
|
||||||
|
|
||||||
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}"
|
|
||||||
|
|
||||||
output-release-name tr_version:
|
output-release-name tr_version:
|
||||||
tools/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 tools/ -type f \( -ipath '*/out/*' -or -ipath '*/bin/*' -or -ipath '*/obj/*' \) -delete
|
||||||
-find . -mindepth 1 -empty -type d -delete
|
-find . -mindepth 1 -empty -type d -delete
|
||||||
|
|
||||||
|
[group('lint')]
|
||||||
lint-imports:
|
lint-imports:
|
||||||
tools/sort_imports
|
tools/sort_imports
|
||||||
|
|
||||||
|
[group('lint')]
|
||||||
lint-format:
|
lint-format:
|
||||||
pre-commit run -a
|
pre-commit run -a
|
||||||
|
|
||||||
|
[group('lint')]
|
||||||
lint: (lint-imports) (lint-format)
|
lint: (lint-imports) (lint-format)
|
||||||
|
|
27
justfile.tr1
Normal file
27
justfile.tr1
Normal 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
25
justfile.tr2
Normal 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}"
|
|
@ -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
|
ENV HOME /app
|
||||||
WORKDIR /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 -x
|
||||||
set -e
|
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"
|
export DOTNET_CLI_HOME="/tmp/DOTNET_CLI_HOME"
|
||||||
echo $HOME
|
echo $HOME
|
||||||
shopt -s globstar
|
shopt -s globstar
|
||||||
|
@ -13,7 +19,7 @@ dotnet restore -p:EnableWindowsTargeting=true
|
||||||
dotnet publish -c Release -p:EnableWindowsTargeting=true
|
dotnet publish -c Release -p:EnableWindowsTargeting=true
|
||||||
|
|
||||||
# Build the main executable
|
# Build the main executable
|
||||||
cd /app/tools/tr1/config/
|
cd /app/tools/tr${TR_VERSION}/config/
|
||||||
rm -rf **/bin **/obj **/out/*
|
rm -rf **/bin **/obj **/out/*
|
||||||
dotnet restore
|
dotnet restore
|
||||||
dotnet publish -c Release -o out
|
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
|
# 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
|
# size low. Each stage builds an external dependency. The final stage takes the
|
||||||
# artifacts (binaries, includes etc.) from previous stages and installs all 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
|
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
|
FROM base
|
||||||
|
|
||||||
# set the build dir - actual files are mounted with a Docker volume
|
# 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/
|
COPY --from=glew /ext/ /ext/
|
||||||
|
|
||||||
ENV PYTHONPATH=/app/tools/
|
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 PKG_CONFIG_PATH=/ext/lib/pkgconfig/
|
||||||
ENV C_INCLUDE_PATH=/ext/include/
|
ENV C_INCLUDE_PATH=/ext/include/
|
||||||
ENV PYTHONPATH=/app/tools/
|
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
|
ENV HOME /app
|
||||||
WORKDIR /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