mm/tools/dmadata_dependencies.py
Zach Banks 23d63852de
Use decompiled overlays when building ROM (#121)
* Restore padding in ObjVisiblock struct

* Copy overlays out of compiled `code.elf` to put into the ROM

This is just a "tempory fix"

It seems like the built code/assets in `code.elf` should not be copied
into `build/baserom/...` (over the original ROM's files) but instead
into a `build/decomp/...` tree or similar.

`dmadata_table.txt` would also need to be updated to read from the
correct location.

* Use dmadata_table.txt to generate build rules

`makerom_files.txt` & `makerom_uncompressed_files.txt` contained a lot
of the same data in `dmadata_table.txt`, so I added a small python
script to generate this information into `build/`

Segments are no longer dumped out of `code.elf` into `build/baserom/``,
instead they are put in `build/binary/`.

`linker_scripts/dmadata_script.txt` was checked in, but generated by
`dmadata.py`. I deleted it / moved it to `build/dmadata_script.txt.pre`.

I also introduced some sentinel files (`dep`). I ended up needing these
to make incremental builds work smoothly? (Without them, there were a
lot of steps that were getting re-triggered on every build.) If this
style isn't welcome, I can try to fiddle with the Makefile more to try
to avoid having them?

* Restore padding in BgLbfshot struct

* Touch sentinel file before command; rm on failure

* Restore padding in ObjKepnKoya struct

* Ensure asm/ directories exist before disasm steps

* Clean up Makefile rules

* Set default goal; silent objcopy; fix code_script path

* Fix ovl_En_Ginko_Man, ovl_Obj_Lightswitch merge

ovl_En_Encount2 still needs work to bring back to matching

* Fix ovl_En_Encount2 merge
2021-05-10 18:24:59 -04:00

57 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python3
# Generate a .d file with Makefile variables from the dmadata_table.txt file
import os, struct, sys, ast, argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--yaz0-path", required=False, help="path to `yaz0` tool")
parser.add_argument(
"--dmadata-table",
type=argparse.FileType("r"),
help="dmadata_table.txt input file",
)
parser.add_argument(
"--output-deps", type=argparse.FileType("w"), help="romfiles.d output file"
)
args = parser.parse_args()
dmadata_table = ast.literal_eval(args.dmadata_table.read())
rom_files = []
for base_file, comp_file, _, _ in dmadata_table:
if base_file == "":
assert comp_file == ""
continue
# TODO: Unsure if it's better to emit these rules here, or use a set of
# prefix rules in the Makefile.
if args.yaz0_path is not None and comp_file.endswith(".yaz0"):
# Add a rule for generating the compressed `.yaz0` file
# from the uncompressed file
args.output_deps.write(f"{comp_file}: {base_file}\n")
args.output_deps.write(f"\t{args.yaz0_path} $< $@\n")
args.output_deps.write("\n")
if comp_file == "":
comp_file = base_file
rom_files.append((base_file, comp_file))
args.dmadata_table.close()
# Define lists of files for using in other rules
uncompressed_files, compressed_files = zip(*rom_files)
for var_name, filenames in (
("UNCOMPRESSED_ROM_FILES", uncompressed_files),
("ROM_FILES", compressed_files),
):
args.output_deps.write(f"{var_name} := \\\n")
for filename in filenames:
args.output_deps.write(f" {filename} \\\n")
args.output_deps.write("\n\n")
args.output_deps.close()
if __name__ == "__main__":
main()