mirror of
https://github.com/zeldaret/ph
synced 2026-05-24 07:10:52 -04:00
89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
import argparse
|
|
from pathlib import Path
|
|
import os
|
|
import json
|
|
|
|
parser = argparse.ArgumentParser(description='Generates objdiff.json for configuring objdiff')
|
|
parser.add_argument('region', help='Game region, defaults to EUR', default='EUR')
|
|
|
|
args = parser.parse_args()
|
|
|
|
tools_dir = Path(os.path.dirname(os.path.realpath(__file__)))
|
|
root_dir = tools_dir.parent
|
|
config_path = root_dir / 'objdiff.json'
|
|
src_dir = root_dir / 'src'
|
|
asm_dir = root_dir / 'asm'
|
|
|
|
|
|
def find_asm_path(src_path: Path) -> Path | None:
|
|
first_dir = src_path.parents[-2]
|
|
subdirs = src_path.relative_to(first_dir)
|
|
if first_dir.name == 'Main':
|
|
asm_dir = 'main'
|
|
elif first_dir.name == 'ITCM':
|
|
asm_dir = 'itcm'
|
|
elif first_dir.name == 'DTCM':
|
|
asm_dir = 'dtcm'
|
|
else:
|
|
try: ov_num = int(first_dir.name[:2], 10)
|
|
except: return None
|
|
asm_dir = f'ov{ov_num:02d}'
|
|
|
|
file_name, _ = src_path.name.rsplit('.', 1)
|
|
asm_file = file_name + '.s'
|
|
asm_path: Path = asm_dir / subdirs.parent / asm_file
|
|
return asm_path
|
|
|
|
|
|
def get_build_path(path: Path, extension='.o') -> Path:
|
|
region = args.region.lower()
|
|
return Path('build') / region / path.parent / (path.name + extension)
|
|
|
|
|
|
config = dict()
|
|
config["custom_make"] = "make"
|
|
config["custom_args"] = [
|
|
"-B",
|
|
f"REGION={args.region}"
|
|
]
|
|
config["build_target"] = True
|
|
config["watch_patterns"] = [
|
|
"*.c",
|
|
"*.cpp",
|
|
"*.h",
|
|
"*.hpp",
|
|
"*.s"
|
|
]
|
|
config["objects"] = []
|
|
|
|
for (root, dirs, files) in os.walk(src_dir):
|
|
for file in files:
|
|
if not file.endswith('.cpp') and not file.endswith('.c'): continue
|
|
src_path = Path(f'{root}/{file}')
|
|
src_path = src_path.relative_to(src_dir)
|
|
asm_path = find_asm_path(src_path)
|
|
src_path = 'src' / src_path
|
|
|
|
if asm_path: asm_path = 'asm' / asm_path
|
|
|
|
name, _ = str(src_path).rsplit('.', 1)
|
|
|
|
obj = dict()
|
|
obj["name"] = name
|
|
if asm_path.exists(): obj["target_path"] = str(get_build_path(asm_path))
|
|
obj["base_path"] = str(get_build_path(src_path))
|
|
obj["reverse_fn_order"] = False
|
|
|
|
scratch = dict()
|
|
scratch["platform"] = "nds_arm9"
|
|
scratch["compiler"] = "mwcc_30_131"
|
|
scratch["ctx_path"] = str(get_build_path(src_path, '.ctx'))
|
|
scratch["build_ctx"] = True
|
|
|
|
obj["scratch"] = scratch
|
|
|
|
config["objects"].append(obj)
|
|
|
|
with open(config_path, 'w') as f:
|
|
f.write(json.dumps(config, indent=4))
|