Quest/configure.py

176 lines
6.6 KiB
Python

import ninja_syntax
import os
import sys
dir_path = 'src/'
asm_path = 'asm/'
assets_path = 'assets/'
optO2_files = ['seqpgetstate.c']
optO1_files = [
'aigetlen.c', 'pfssearchfile.c', 'pfsreadwritefile.c',
'pfsfreeblocks.c', 'pfsfilestate.c', 'pfsdeletefile.c',
'pfsallocatefile.c', 'pfsnumfiles.c', 'pfsgetstatus.c',
'contpfs.c', 'leodiskinit.c', 'controller.c',
'initialize.c', 'createthread.c', 'startthread.c',
'createmesgqueue.c', 'visetevent.c', 'pfsisplug.c',
'pfschecker.c', 'sptaskyielded.c', 'sptask.c',
'viblack.c', 'viswapbuf.c', 'vigetcurrframebuf.c',
'vimgr.c', 'seteventmesg.c', "recvmesg.c", "sendmesg.c",
"visetmode.c", "visetspecial.c", "virtualtophysical.c",
"gettime.c", "pfsinitpak.c", "contramread.c", "controller.c"
]
optg0_files = ['DA68F0.c']
c_files = []
for root, dirs, files in os.walk(dir_path):
for file in files:
if file.endswith('.c'):
c_files.append(os.path.join(root, file))
s_files = []
for root, dirs, files in os.walk(asm_path):
for file in files:
if file.endswith('.s'):
s_files.append(os.path.join(root, file))
bin_files = []
for root, dirs, files in os.walk(assets_path):
for file in files:
if file.endswith('.bin'):
bin_files.append(os.path.join(root, file))
def append_extension(filename, extension='.o'):
return filename + extension
ia4_files = []
for root, dirs, files in os.walk(assets_path):
for file in files:
if file.endswith('ia4.png'):
ia4_files.append(os.path.join(root, file))
rgba16_files = []
for root, dirs, files in os.walk(assets_path):
for file in files:
if file.endswith('rgba16.png'):
rgba16_files.append(os.path.join(root, file))
j_files = []
j_files.extend([f.replace('.png', '.j') for f in rgba16_files])
# Combine the lists and change file extensions
o_files = []
for file in c_files + s_files + bin_files + ia4_files + rgba16_files:
if 'asm/nonmatchings/' not in file:
o_files.append("build/" + append_extension(file))
header = (
"AS = mips-linux-gnu-as\n"
"CPP = cpp\n"
"LD = mips-linux-gnu-ld\n"
"OBJDUMP = mips-linux-gnu-objdump\n"
"OBJCOPY = mips-linux-gnu-objcopy\n"
"OBJCOPYFLAGS = -O binary\n"
"PYTHON = python3\n"
"cflags = -G 0 -Xfullwarn -Xcpluscomm -signed -nostdinc -non_shared -Wab,-r4300_mul -D_LANGUAGE_C -D_FINALROM -DF3DEX_GBI -DWIN32 -woff 649,838\n"
"include_cflags = -I . -I include -I include/2.0I -I include/2.0I/PR\n"
"ido_cc = tools/ido_5.3/usr/lib/cc\n"
"mips_version = -mips2 -o32\n"
"DEFINES = -D_LANGUAGE_C -DF3DEX_GBI -DNDEBUG\n"
"CFLAGS = -woff 649,838,513 $include_cflags\n"
"ASM_PROC = python3 tools/asm-processor/build.py\n"
"ASM_PROC_FLAGS = --input-enc=utf-8 --output-enc=euc-jp\n"
"ASFLAGS = -EB -mtune=vr4300 -march=vr4300 -mabi=32 -Iinclude -Isrc\n"
"XGCC = mips-linux-gnu-gcc\n"
"IMG_CONVERT = tools/image_converter.py\n"
"MAKE_EXPECTED = tools/make_expected.py\n"
"LD_SCRIPT = quest64.ld\n"
"LDFLAGS = -T $LD_SCRIPT -Map build/quest64.us.map -T undefined_syms_auto.txt -T undefined_funcs_auto.txt -T undefined_syms.us.txt --no-check-sections\n"
)
# Create a Ninja build file object
with open('build.ninja', 'w') as file:
file.write(f'{header}')
ninja_file = ninja_syntax.Writer(open('build.ninja', 'a'))
#has -g3
ninja_file.rule('main_cc',
command = '$ASM_PROC $ASM_PROC_FLAGS $ido_cc -- $AS $ASFLAGS -- -c -32 $cflags $DEFINES $CFLAGS -O2 -g3 $mips_version -o $out $in',
description = 'Compiling -O2 .c file' )
#doesn't have -g3
ninja_file.rule('O2g0_cc',
command = '$ASM_PROC $ASM_PROC_FLAGS $ido_cc -- $AS $ASFLAGS -- -c -32 $cflags $DEFINES $CFLAGS -O2 -g0 $mips_version -o $out $in',
description = 'Compiling -O2 -g0 .c file')
ninja_file.rule('O2_cc',
command = '$ASM_PROC $ASM_PROC_FLAGS $ido_cc -- $AS $ASFLAGS -- -c -32 $cflags $DEFINES $CFLAGS -O2 $mips_version -o $out $in',
description = 'Compiling -O2 .c file' )
ninja_file.rule('O1_cc',
command = '$ASM_PROC $ASM_PROC_FLAGS $ido_cc -- $AS $ASFLAGS -- -c -32 $cflags $DEFINES $CFLAGS -O1 $mips_version -o $out $in',
description = 'Compiling -O1 .c file' )
ninja_file.rule('s_file',
command = 'iconv --from UTF-8 --to EUC-JP $in | $AS $ASFLAGS -o $out',
description = 'Assembling .s file' )
ninja_file.rule('bin_file',
command = '$LD -r -b binary -o $out $in')
ninja_file.rule('make_elf',
command = '$LD $LDFLAGS -o $out',
description = 'Linking ELF')
ninja_file.rule('make_z64',
command = '($OBJCOPY -O binary $in $out) && (sha1sum -c quest64.us.sha1)',
description = 'Making z64')
ninja_file.rule('make_expected',
command = '(cp $in $out) && (python3 ./$MAKE_EXPECTED $in)')
ninja_file.rule('ia4_build',
command = "python3 ./$IMG_CONVERT ia4 $in $out",
description = "Converting ia4")
ninja_file.rule('rgba16_convert',
command = "(python3 ./$IMG_CONVERT rgba16 $in $out)",
description = "Converting rgba16")
ninja_file.rule('rgba16_build',
command = "($LD -r -b binary -o $out $in)",
description = "Converting rgba16")
print (c_files)
for c_file in c_files:
if os.path.basename(c_file) in optO2_files:
ninja_file.build("build/" + append_extension(c_file), "O2_cc", c_file)
elif os.path.basename(c_file) in optO1_files:
ninja_file.build("build/" + append_extension(c_file), "O1_cc", c_file)
elif os.path.basename(c_file) in optg0_files:
ninja_file.build("build/" + append_extension(c_file), "O2g0_cc", c_file)
else:
ninja_file.build("build/" + append_extension(c_file), "main_cc", c_file)
for s_file in s_files:
if "asm/nonmatchings" in s_file:
continue
ninja_file.build("build/" + append_extension(s_file), "s_file", s_file)
for bin_file in bin_files:
ninja_file.build("build/" + append_extension(bin_file), "bin_file", bin_file)
for rgba16_file in rgba16_files:
ninja_file.build("build/" + append_extension(rgba16_file, '.j'), "rgba16_convert", rgba16_file)
#j files are png images converted using image_converter.py
for j_file in j_files:
ninja_file.build("build/" + os.path.splitext(j_file)[0] + ".png.o", "rgba16_build", "build/" + os.path.splitext(j_file)[0] + ".png.j")
ninja_file.build("build/quest64.us.elf", "make_elf ", o_files)
ninja_file.build("build/quest64.us.z64", "make_z64 ", "build/quest64.us.elf")
ninja_file.build("build/quest64.us.ok", "make_expected ", "build/quest64.us.z64")
print ("build.ninja generated")
ninja_file.close()