mirror of
https://github.com/encounter/dtk-template.git
synced 2025-07-04 20:26:04 +00:00
parent
bb558596e3
commit
2e907657cc
@ -37,23 +37,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
python configure.py --map --version ${{ matrix.version }} \
|
python configure.py --map --version ${{ matrix.version }} \
|
||||||
--binutils /binutils --compilers /compilers
|
--binutils /binutils --compilers /compilers
|
||||||
ninja all_source build/${{ matrix.version }}/progress.json \
|
ninja all_source progress build/${{ matrix.version }}/report.json
|
||||||
build/${{ matrix.version }}/report.json
|
|
||||||
|
|
||||||
# Upload progress if we're on the main branch
|
|
||||||
- name: Upload progress
|
|
||||||
# If you're using a different branch, change this to match
|
|
||||||
if: github.ref == 'refs/heads/main'
|
|
||||||
continue-on-error: true
|
|
||||||
env:
|
|
||||||
# Replace with your project slug
|
|
||||||
PROGRESS_SLUG: prime
|
|
||||||
# Set the API key in your repository secrets
|
|
||||||
PROGRESS_API_KEY: ${{ secrets.PROGRESS_API_KEY }}
|
|
||||||
run: |
|
|
||||||
python tools/upload_progress.py -b https://progress.decomp.club/ \
|
|
||||||
-p $PROGRESS_SLUG -v ${{ matrix.version }} \
|
|
||||||
build/${{ matrix.version }}/progress.json
|
|
||||||
|
|
||||||
# Upload map files
|
# Upload map files
|
||||||
- name: Upload map
|
- name: Upload map
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
Some Game
|
Some Game
|
||||||
[![Build Status]][actions] ![Progress] ![DOL Progress] ![RELs Progress] [![Discord Badge]][discord]
|
[![Build Status]][actions] [![Code Progress]][progress] [![Data Progress]][progress] [![Discord Badge]][discord]
|
||||||
=============
|
=============
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -7,24 +7,13 @@ Replace with your repository's URL.
|
|||||||
-->
|
-->
|
||||||
[Build Status]: https://github.com/zeldaret/tww/actions/workflows/build.yml/badge.svg
|
[Build Status]: https://github.com/zeldaret/tww/actions/workflows/build.yml/badge.svg
|
||||||
[actions]: https://github.com/zeldaret/tww/actions/workflows/build.yml
|
[actions]: https://github.com/zeldaret/tww/actions/workflows/build.yml
|
||||||
<!---
|
|
||||||
Code progress URL:
|
|
||||||
https://progress.decomp.club/data/[project]/[version]/all/?mode=shield&measure=code
|
|
||||||
URL encoded then appended to: https://img.shields.io/endpoint?label=Code&url=
|
|
||||||
-->
|
|
||||||
[Progress]: https://img.shields.io/endpoint?label=Code&url=https%3A%2F%2Fprogress.decomp.club%2Fdata%2Ftww%2FGZLE01%2Fall%2F%3Fmode%3Dshield%26measure%3Dcode
|
|
||||||
<!---
|
|
||||||
DOL progress URL:
|
|
||||||
https://progress.decomp.club/data/[project]/[version]/dol/?mode=shield&measure=code
|
|
||||||
URL encoded then appended to: https://img.shields.io/endpoint?label=DOL&url=
|
|
||||||
-->
|
|
||||||
[DOL Progress]: https://img.shields.io/endpoint?label=DOL&url=https%3A%2F%2Fprogress.decomp.club%2Fdata%2Ftww%2FGZLE01%2Fdol%2F%3Fmode%3Dshield%26measure%3Dcode
|
|
||||||
<!--
|
<!--
|
||||||
REL progress URL:
|
decomp.dev progress badges
|
||||||
https://progress.decomp.club/data/[project]/[version]/modules/?mode=shield&measure=code
|
See https://decomp.dev/api for an API overview.
|
||||||
URL encoded then appended to: https://img.shields.io/endpoint?label=RELs&url=
|
|
||||||
-->
|
-->
|
||||||
[RELs Progress]: https://img.shields.io/endpoint?label=RELs&url=https%3A%2F%2Fprogress.decomp.club%2Fdata%2Ftww%2FGZLE01%2Fmodules%2F%3Fmode%3Dshield%26measure%3Dcode
|
[Code Progress]: https://decomp.dev/zeldaret/tww.svg?mode=shield&measure=code&label=Code
|
||||||
|
[Data Progress]: https://decomp.dev/zeldaret/tww.svg?mode=shield&measure=data&label=Data
|
||||||
|
[progress]: https://decomp.dev/zeldaret/tww
|
||||||
<!--
|
<!--
|
||||||
Replace with your Discord server's ID and invite URL.
|
Replace with your Discord server's ID and invite URL.
|
||||||
-->
|
-->
|
||||||
|
23
README.md
23
README.md
@ -25,27 +25,12 @@ References
|
|||||||
- [Discord: GC/Wii Decompilation](https://discord.gg/hKx3FJJgrV) (Come to `#dtk` for help!)
|
- [Discord: GC/Wii Decompilation](https://discord.gg/hKx3FJJgrV) (Come to `#dtk` for help!)
|
||||||
- [objdiff](https://github.com/encounter/objdiff) (Local diffing tool)
|
- [objdiff](https://github.com/encounter/objdiff) (Local diffing tool)
|
||||||
- [decomp.me](https://decomp.me) (Collaborate on matches)
|
- [decomp.me](https://decomp.me) (Collaborate on matches)
|
||||||
- [frogress](https://github.com/decompals/frogress) (Decompilation progress API)
|
- [decomp.dev](https://decomp.dev) (Decompilation progress hub and API)
|
||||||
- [wibo](https://github.com/decompals/wibo) (Minimal Win32 wrapper for Linux)
|
- [wibo](https://github.com/decompals/wibo) (Minimal Win32 wrapper for Linux)
|
||||||
- [sjiswrap](https://github.com/encounter/sjiswrap) (UTF-8 to Shift JIS wrapper)
|
- [sjiswrap](https://github.com/encounter/sjiswrap) (UTF-8 to Shift JIS wrapper)
|
||||||
|
|
||||||
Projects using this structure:
|
Nearly all active GC/Wii decompilation projects use this structure, and will be useful
|
||||||
|
for reference. A list of active GC/Wii projects can be found on [decomp.dev](https://decomp.dev).
|
||||||
- [zeldaret/tww](https://github.com/zeldaret/tww)
|
|
||||||
- [zeldaret/oot-gc](https://github.com/zeldaret/oot-gc)
|
|
||||||
- [zeldaret/ss](https://github.com/zeldaret/ss)
|
|
||||||
- [PrimeDecomp/prime](https://github.com/PrimeDecomp/prime)
|
|
||||||
- [PrimeDecomp/echoes](https://github.com/PrimeDecomp/echoes)
|
|
||||||
- [DarkRTA/rb3](https://github.com/DarkRTA/rb3)
|
|
||||||
- [doldecomp/melee](https://github.com/doldecomp/melee)
|
|
||||||
- [doldecomp/sadx](https://github.com/doldecomp/sadx)
|
|
||||||
- [InputEvelution/wp](https://github.com/InputEvelution/wp)
|
|
||||||
- [NWPlayer123/AnimalCrossing-dtk](https://github.com/NWPlayer123/AnimalCrossing-dtk)
|
|
||||||
- [Rainchus/marioparty4](https://github.com/Rainchus/marioparty4)
|
|
||||||
- [Rainchus/ttyd_dtk](https://github.com/Rainchus/ttyd_dtk)
|
|
||||||
- [Sage-of-Mirrors/zmansion](https://github.com/Sage-of-Mirrors/zmansion)
|
|
||||||
- [bfbbdecomp/bfbb](https://github.com/bfbbdecomp/bfbb)
|
|
||||||
- [EstexNT/rhf-dtk](https://github.com/EstexNT/rhf-dtk)
|
|
||||||
|
|
||||||
Features
|
Features
|
||||||
--------
|
--------
|
||||||
@ -56,7 +41,7 @@ Features
|
|||||||
- Feature-rich analyzer: Many time-consuming tasks are automated, allowing you to focus on the decompilation itself. See [Analyzer features](https://github.com/encounter/decomp-toolkit#analyzer-features).
|
- Feature-rich analyzer: Many time-consuming tasks are automated, allowing you to focus on the decompilation itself. See [Analyzer features](https://github.com/encounter/decomp-toolkit#analyzer-features).
|
||||||
- REL support: RELs each have their own `symbols.txt` and `splits.txt`, and will automatically be built and linked against the main binary.
|
- REL support: RELs each have their own `symbols.txt` and `splits.txt`, and will automatically be built and linked against the main binary.
|
||||||
- No manual assembly: decomp-toolkit handles splitting the DOL into relocatable objects based on the configuration. No game assets are committed to the repository.
|
- No manual assembly: decomp-toolkit handles splitting the DOL into relocatable objects based on the configuration. No game assets are committed to the repository.
|
||||||
- Progress calculation and upload script for [frogress](https://github.com/decompals/frogress).
|
- Progress calculation and integration with [decomp.dev](https://decomp.dev).
|
||||||
- Integration with [objdiff](https://github.com/encounter/objdiff) for a diffing workflow.
|
- Integration with [objdiff](https://github.com/encounter/objdiff) for a diffing workflow.
|
||||||
- CI workflow template for GitHub Actions.
|
- CI workflow template for GitHub Actions.
|
||||||
|
|
||||||
|
@ -158,7 +158,6 @@ config.asflags = [
|
|||||||
"-I include",
|
"-I include",
|
||||||
f"-I build/{config.version}/include",
|
f"-I build/{config.version}/include",
|
||||||
f"--defsym BUILD_VERSION={version_num}",
|
f"--defsym BUILD_VERSION={version_num}",
|
||||||
f"--defsym VERSION_{config.version}",
|
|
||||||
]
|
]
|
||||||
config.ldflags = [
|
config.ldflags = [
|
||||||
"-fp hardware",
|
"-fp hardware",
|
||||||
@ -307,7 +306,7 @@ if args.mode == "configure":
|
|||||||
# Write build.ninja and objdiff.json
|
# Write build.ninja and objdiff.json
|
||||||
generate_build(config)
|
generate_build(config)
|
||||||
elif args.mode == "progress":
|
elif args.mode == "progress":
|
||||||
# Print progress and write progress.json
|
# Print progress information
|
||||||
calculate_progress(config)
|
calculate_progress(config)
|
||||||
else:
|
else:
|
||||||
sys.exit("Unknown mode: " + args.mode)
|
sys.exit("Unknown mode: " + args.mode)
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
This repository includes [.github.example/workflows/build.yml](/.github.example/workflows/build.yml) as an example CI workflow. To use it for your project, follow the setup instructions below.
|
This repository includes [.github.example/workflows/build.yml](/.github.example/workflows/build.yml) as an example CI workflow. To use it for your project, follow the setup instructions below.
|
||||||
|
|
||||||
- [Build Repository](#build-repository)
|
- [Build Repository](#build-repository)
|
||||||
- [Progress](#progress)
|
|
||||||
- [Workflow](#workflow)
|
- [Workflow](#workflow)
|
||||||
|
- [decomp.dev](#decompdev)
|
||||||
|
|
||||||
## Build Repository
|
## Build Repository
|
||||||
|
|
||||||
@ -25,18 +25,6 @@ This repository will be used to build and store the CI build container.
|
|||||||
4. Under "Manage Actions access", add your project's main repository with the "Read" role:
|
4. Under "Manage Actions access", add your project's main repository with the "Read" role:
|
||||||

|

|
||||||
|
|
||||||
## Progress
|
|
||||||
|
|
||||||
1. In the [GC/Wii Decompilation Discord](https://discord.gg/hKx3FJJgrV), visit `#frogress` and request an API key for your project.
|
|
||||||
Please provide the following:
|
|
||||||
- Project name
|
|
||||||
- Repository URL
|
|
||||||
- Game ID(s)
|
|
||||||
- Whether the game has RELs
|
|
||||||
|
|
||||||
2. On GitHub, visit your repo's `/settings/secrets/actions/new` and add a new secret with the name `PROGRESS_API_KEY`:
|
|
||||||

|
|
||||||
|
|
||||||
## Workflow
|
## Workflow
|
||||||
|
|
||||||
1. Rename `.github.example` to `.github`.
|
1. Rename `.github.example` to `.github`.
|
||||||
@ -45,8 +33,14 @@ This repository will be used to build and store the CI build container.
|
|||||||
|
|
||||||
3. In `build.yml`, replace `GAMEID` with your game's ID. (Or list of IDs, for multi-version support.)
|
3. In `build.yml`, replace `GAMEID` with your game's ID. (Or list of IDs, for multi-version support.)
|
||||||
|
|
||||||
4. In `build.yml`, update `PROGRESS_SLUG` to match the project name on [frogress](#progress).
|
4. Commit and push the changes to your repository.
|
||||||
|
|
||||||
5. Commit and push the changes to your repository.
|
If everything is set up correctly, the workflow will build all versions on every push or pull request.
|
||||||
|
|
||||||
If everything is set up correctly, the workflow will build all versions on every push or pull request, and upload progress on pushes the `main` branch.
|
## decomp.dev
|
||||||
|
|
||||||
|
Once the build workflow is running on the main branch, you can add your game to <https://decomp.dev>.
|
||||||
|
|
||||||
|
Visit <https://decomp.dev/manage/new>, select your GitHub repository and fill out the required fields.
|
||||||
|
|
||||||
|
If you have questions or issues, try asking in the [GC/Wii Decompilation Discord](https://discord.gg/hKx3FJJgrV) #decomp.dev channel.
|
||||||
|
@ -196,9 +196,8 @@ class ProjectConfig:
|
|||||||
None # Callback to add/remove/reorder units within a module
|
None # Callback to add/remove/reorder units within a module
|
||||||
)
|
)
|
||||||
|
|
||||||
# Progress output, progress.json and report.json config
|
# Progress output and report.json config
|
||||||
self.progress = True # Enable report.json generation and CLI progress output
|
self.progress = True # Enable report.json generation and CLI progress output
|
||||||
self.progress_all: bool = True # Include combined "all" category
|
|
||||||
self.progress_modules: bool = True # Include combined "modules" category
|
self.progress_modules: bool = True # Include combined "modules" category
|
||||||
self.progress_each_module: bool = (
|
self.progress_each_module: bool = (
|
||||||
False # Include individual modules, disable for large numbers of modules
|
False # Include individual modules, disable for large numbers of modules
|
||||||
@ -431,7 +430,6 @@ def generate_build_ninja(
|
|||||||
n.comment("Tooling")
|
n.comment("Tooling")
|
||||||
|
|
||||||
build_path = config.out_path()
|
build_path = config.out_path()
|
||||||
progress_path = build_path / "progress.json"
|
|
||||||
report_path = build_path / "report.json"
|
report_path = build_path / "report.json"
|
||||||
build_tools_path = config.build_dir / "tools"
|
build_tools_path = config.build_dir / "tools"
|
||||||
download_tool = config.tools_dir / "download_tool.py"
|
download_tool = config.tools_dir / "download_tool.py"
|
||||||
@ -1188,7 +1186,7 @@ def generate_build_ninja(
|
|||||||
description="PROGRESS",
|
description="PROGRESS",
|
||||||
)
|
)
|
||||||
n.build(
|
n.build(
|
||||||
outputs=progress_path,
|
outputs="progress",
|
||||||
rule="progress",
|
rule="progress",
|
||||||
implicit=[
|
implicit=[
|
||||||
ok_path,
|
ok_path,
|
||||||
@ -1385,7 +1383,7 @@ def generate_build_ninja(
|
|||||||
if config.non_matching:
|
if config.non_matching:
|
||||||
n.default(link_outputs)
|
n.default(link_outputs)
|
||||||
elif config.progress:
|
elif config.progress:
|
||||||
n.default(progress_path)
|
n.default("progress")
|
||||||
else:
|
else:
|
||||||
n.default(ok_path)
|
n.default(ok_path)
|
||||||
else:
|
else:
|
||||||
@ -1825,7 +1823,7 @@ def generate_compile_commands(
|
|||||||
json.dump(clangd_config, w, indent=2, default=default_format)
|
json.dump(clangd_config, w, indent=2, default=default_format)
|
||||||
|
|
||||||
|
|
||||||
# Calculate, print and write progress to progress.json
|
# Print progress information from objdiff report
|
||||||
def calculate_progress(config: ProjectConfig) -> None:
|
def calculate_progress(config: ProjectConfig) -> None:
|
||||||
config.validate()
|
config.validate()
|
||||||
out_path = config.out_path()
|
out_path = config.out_path()
|
||||||
@ -1917,35 +1915,3 @@ def calculate_progress(config: ProjectConfig) -> None:
|
|||||||
if summary_file:
|
if summary_file:
|
||||||
summary_file.write("```\n")
|
summary_file.write("```\n")
|
||||||
summary_file.close()
|
summary_file.close()
|
||||||
|
|
||||||
# Generate and write progress.json
|
|
||||||
progress_json: Dict[str, Any] = {}
|
|
||||||
|
|
||||||
def add_category(id: str, measures: Dict[str, Any]) -> None:
|
|
||||||
progress_json[id] = {
|
|
||||||
"code": measures.get("complete_code", 0),
|
|
||||||
"code/total": measures.get("total_code", 0),
|
|
||||||
"data": measures.get("complete_data", 0),
|
|
||||||
"data/total": measures.get("total_data", 0),
|
|
||||||
"matched_code": measures.get("matched_code", 0),
|
|
||||||
"matched_code/total": measures.get("total_code", 0),
|
|
||||||
"matched_data": measures.get("matched_data", 0),
|
|
||||||
"matched_data/total": measures.get("total_data", 0),
|
|
||||||
"matched_functions": measures.get("matched_functions", 0),
|
|
||||||
"matched_functions/total": measures.get("total_functions", 0),
|
|
||||||
"fuzzy_match": int(measures.get("fuzzy_match_percent", 0) * 100),
|
|
||||||
"fuzzy_match/total": 10000,
|
|
||||||
"units": measures.get("complete_units", 0),
|
|
||||||
"units/total": measures.get("total_units", 0),
|
|
||||||
}
|
|
||||||
|
|
||||||
if config.progress_all:
|
|
||||||
add_category("all", report_data["measures"])
|
|
||||||
else:
|
|
||||||
# Support for old behavior where "dol" was the main category
|
|
||||||
add_category("dol", report_data["measures"])
|
|
||||||
for category in report_data.get("categories", []):
|
|
||||||
add_category(category["id"], category["measures"])
|
|
||||||
|
|
||||||
with open(out_path / "progress.json", "w", encoding="utf-8") as w:
|
|
||||||
json.dump(progress_json, w, indent=2)
|
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
###
|
|
||||||
# Uploads progress information to https://github.com/decompals/frogress.
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# python3 tools/upload_progress.py -b https://progress.decomp.club/ -p [project] -v [version] build/[version]/progress.json
|
|
||||||
#
|
|
||||||
# If changes are made, please submit a PR to
|
|
||||||
# https://github.com/encounter/dtk-template
|
|
||||||
###
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import json
|
|
||||||
import os
|
|
||||||
import requests
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def get_git_commit_timestamp() -> int:
|
|
||||||
return int(
|
|
||||||
subprocess.check_output(["git", "show", "-s", "--format=%ct"])
|
|
||||||
.decode("ascii")
|
|
||||||
.rstrip()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def get_git_commit_sha() -> str:
|
|
||||||
return subprocess.check_output(["git", "rev-parse", "HEAD"]).decode("ascii").strip()
|
|
||||||
|
|
||||||
|
|
||||||
def generate_url(args: argparse.Namespace) -> str:
|
|
||||||
url_components = [args.base_url.rstrip("/"), "data"]
|
|
||||||
|
|
||||||
for arg in [args.project, args.version]:
|
|
||||||
if arg != "":
|
|
||||||
url_components.append(arg)
|
|
||||||
|
|
||||||
return str.join("/", url_components) + "/"
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = argparse.ArgumentParser(description="Upload progress information.")
|
|
||||||
parser.add_argument("-b", "--base_url", help="API base URL", required=True)
|
|
||||||
parser.add_argument("-a", "--api_key", help="API key (env var PROGRESS_API_KEY)")
|
|
||||||
parser.add_argument("-p", "--project", help="Project slug", required=True)
|
|
||||||
parser.add_argument("-v", "--version", help="Version slug", required=True)
|
|
||||||
parser.add_argument("input", help="Progress JSON input")
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
api_key = args.api_key or os.environ.get("PROGRESS_API_KEY")
|
|
||||||
if not api_key:
|
|
||||||
raise KeyError("API key required")
|
|
||||||
url = generate_url(args)
|
|
||||||
|
|
||||||
entries = []
|
|
||||||
with open(args.input, "r") as f:
|
|
||||||
data = json.load(f)
|
|
||||||
entries.append(
|
|
||||||
{
|
|
||||||
"timestamp": get_git_commit_timestamp(),
|
|
||||||
"git_hash": get_git_commit_sha(),
|
|
||||||
"categories": data,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
print("Publishing entry to", url)
|
|
||||||
json.dump(entries[0], sys.stdout, indent=4)
|
|
||||||
print()
|
|
||||||
r = requests.post(
|
|
||||||
url,
|
|
||||||
json={
|
|
||||||
"api_key": api_key,
|
|
||||||
"entries": entries,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
r.raise_for_status()
|
|
||||||
print("Done!")
|
|
Loading…
x
Reference in New Issue
Block a user