* Add wrapper code from dtk

* Add build.yml

* Ci fix

* Ci fix

* Ci fix

* Ci fix

* Ci fix
This commit is contained in:
punpckhdq authored and GitHub committed 2026-01-03 00:47:17 +00:00
1 parent 3df3e671df
commit bf807ef2be
3 files changed
+117 -2

No files matched your search

+63
View File
@@ -0,0 +1,63 @@
name: Build
on:
push:
pull_request:
jobs:
build:
# Just the dtk ci without versions (for now)
# This is a *private* build container.
# See docs/github_actions.md for more information.
container: ghcr.io/punpckhdq/halo-build:main
runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
# Checkout the repository
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive
# Set Git config
- name: Git config
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
# Normalize file mod times
- name: Restore timestamps
run: |
uv run https://raw.githubusercontent.com/MestreLion/git-tools/refs/tags/v2022.12/git-restore-mtime \
--merge --commit-time
# Copy the original files to the workspace
- name: Prepare
run: cp -a /orig/* .
# Restore cached files
- name: Cache build
uses: actions/cache@v4
with:
path: |
build
.ninja_deps
.ninja_log
key: ${{ runner.os }}-${{ github.sha }}
restore-keys: ${{ runner.os }}-
# Build the project
- name: Build
run: |
python configure.py
ninja all_source progress build/report.json
# Upload progress report
- name: Upload report
uses: actions/upload-artifact@v4
with:
name: report
path: build/report.json
+12 -1
View File
@@ -27,6 +27,7 @@ from tools.project_x86 import (
SolutionConfig,
calculate_progress,
generate_build,
is_windows,
)
import os
# arguments
@@ -56,6 +57,13 @@ parser.add_argument(
type=Path,
help="path to ninja binary (optional)",
)
if not is_windows():
parser.add_argument(
"--wrapper",
metavar="BINARY",
type=Path,
help="path to wibo or wine (optional)",
)
args = parser.parse_args()
@@ -105,10 +113,13 @@ sln.baserom = build_config["baserom"]
sln.objdiff_path = args.objdiff
sln.csplit_path = args.csplit
sln.ninja_path = args.ninja
if not is_windows():
sln.wrapper = args.wrapper
# Tool versions
sln.objdiff_tag = "v3.3.1"
sln.csplit_tag = "v0.0.1"
sln.csplit_tag = "v0.0.2"
sln.wibo_tag = "1.0.0"
sln.projects = []
for build_project in build_config["projects"]:
+42 -1
View File
@@ -113,6 +113,8 @@ class SolutionConfig:
self.csplit_path: Optional[Path] = None # If None, download
self.objdiff_tag: Optional[str] = None # Git tag
self.objdiff_path: Optional[Path] = None # If None, download
self.wibo_tag: Optional[str] = None # Git tag
self.wrapper: Optional[Path] = None # If None, download wibo on Linux
# Project config
self.baserom: Optional[Path] = None
@@ -148,6 +150,26 @@ class SolutionConfig:
for proj in self.projects:
proj.validate()
# Gets the wrapper to use for compiler commands, if set.
def compiler_wrapper(self) -> Optional[Path]:
wrapper = self.wrapper
if self.use_wibo():
wrapper = self.build_dir / "tools" / "wibo"
if not is_windows() and wrapper is None:
wrapper = Path("wine")
return wrapper
# Determines whether or not to use wibo as the compiler wrapper.
def use_wibo(self) -> bool:
return (
self.wibo_tag is not None
and (sys.platform == "linux" or sys.platform == "darwin")
and platform.machine() in ("i386", "x86_64", "aarch64", "arm64")
and self.wrapper is None
)
def is_windows() -> bool:
return os.name == "nt"
@@ -226,6 +248,24 @@ def generate_build_ninja(sln: SolutionConfig) -> None:
else:
sys.exit("SolutionConfig.csplit_tag missing")
wrapper = sln.compiler_wrapper()
if wrapper is not None and sln.use_wibo():
n.build(
outputs=wrapper,
rule="download_tool",
implicit=download_tool,
variables={
"tool": "wibo",
"tag": sln.wibo_tag,
},
)
wrapper_implicit: Optional[Path] = None
if wrapper is not None and (wrapper.exists() or sln.use_wibo()):
wrapper_implicit = wrapper
wrapper_cmd = f"{wrapper} " if wrapper else ""
n.newline()
###
@@ -244,7 +284,7 @@ def generate_build_ninja(sln: SolutionConfig) -> None:
###
n.rule(
name="cl",
command="xbox/bin/vc7/CL.Exe /nologo /c $cflags /Fo$out $in",
command=f"{wrapper_cmd}xbox/bin/vc7/CL.Exe /nologo /c $cflags /Fo$out $in",
description="CL $out",
)
n.newline()
@@ -274,6 +314,7 @@ def generate_build_ninja(sln: SolutionConfig) -> None:
rule="cl",
variables={"cflags": cflags},
inputs=obj.file_path,
implicit=wrapper_implicit
)
base_object_targets.extend(proj_base_object_targets)
n.build(