ooot/setup.py

121 lines
4.4 KiB
Python
Executable File

#!/usr/bin/env python3
import argparse
import os
from pathlib import Path
import shutil
import subprocess
import sys
import re
from tools.oot import *
def clean():
# Clean build environment
print("Cleaning build environment")
# Build list of paths (files and folders) to delete
paths = []
# Assets
paths.append(Path('assets/'))
paths.append(Path('build/'))
# GlideN64
paths.append(Path('GLideN64/projects/msvc/build'))
paths.extend(Path('external/Win32/').glob('*GLide*'))
paths.extend(Path('external/Win32/').glob('osal*'))
# ooot
paths.append(Path('vs/Debug/'))
# Delete files and folders
for path in paths:
if path.exists() == False:
continue
elif path.is_dir():
shutil.rmtree(path)
else:
os.remove(path)
def build():
print("Starting asset extraction and parsing")
# sys.executable points to python executable
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'tqdm'])
subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'libyaz0'])
subprocess.check_call([sys.executable, str('tools/fixbaserom.py'), buildRom()])
subprocess.check_call([sys.executable, str('tools/extract_baserom.py'), buildRom()])
subprocess.check_call([sys.executable, str('tools/extract_assets.py'), buildRom()])
subprocess.check_call([sys.executable, str('tools/extract_z64_variables.py'), buildRom()])
subprocess.check_call([sys.executable, str('tools/convert_assets.py'), buildRom()])
mkdir(assetPath('text'))
subprocess.check_call([sys.executable, str('tools/msgenc.py'), str(romPath('text/charmap.txt')), str(assetPath('text/message_data.h')), str(assetPath('text/message_data.enc.h')), buildRom()])
subprocess.check_call([sys.executable, str('tools/msgenc.py'), str(romPath('text/charmap.txt')), str(assetPath('text/message_data_staff.h')), str(assetPath('text/message_data_staff.enc.h')), buildRom()])
subprocess.check_call([sys.executable, str('tools/extract_missing_assets.py'), buildRom()])
subprocess.check_call([sys.executable, str('tools/create_luts.py'), buildRom()])
subprocess.check_call([sys.executable, str('tools/fix_mtx.py'), buildRom()])
print("Finished asset extraction and parsing")
def main():
# Command Line Interface
parser = argparse.ArgumentParser(description="Setup")
parser.add_argument("-c", "--clean", help="Cleans environment before asset extraction", action="store_true", default=False)
parser.add_argument("-p", "--props-only", help="Only sets project properties / options (does not extract assets)", action="store_true", default=False)
parser.add_argument("-co", "--clean-only", help="Cleans environment without asset extraction", action="store_true", default=False)
parser.add_argument("-b", "--buildRom", choices=validBuildOptions(), help="build rom config ex: EUR_MQD")
parser.add_argument("-f", "--framerate", choices=['20', '25', '30', '40', '60', '120', '240'], help="game framerate", default='20')
parser.add_argument("-m", "--enable-mouse", help="Enables mouse controls", action="store_true", default=True)
parser.add_argument("--refresh-configs", help="Refreshes rom config files (do not use)", action="store_true", default=False)
parser.add_argument("-o", "--organize-roms", help="Renames and moves roms to their proper location", action="store_true", default=False)
parser.add_argument("-s", "--skip-organize-roms", help="Skip organizing roms", action="store_true", default=False)
args = parser.parse_args()
if args.refresh_configs:
calcRomHashes()
exit(0)
if args.organize_roms:
organizeRoms()
exit(0)
if not args.props_only and not args.skip_organize_roms:
organizeRoms()
if args.buildRom:
setBuildRom(args.buildRom)
else:
setBuildRom(findBuildRom())
with open('vs/oot.props.src', 'r') as f:
buffer = f.read()
buffer = buffer.replace('#BUILD_ROM#', buildRom())
defines = []
defines.append('ENABLE_%sFPS' % args.framerate)
if args.enable_mouse:
defines.append('ENABLE_MOUSE')
if buildRom().lower()[-1] != 'd':
defines.append('RETAIL')
defines.append(re.sub(r'[^A-Z0-9_]+', '', buildRom()))
defines.append('NATIVE')
#buffer = re.sub(r'<PreprocessorDefinitions>.*</PreprocessorDefinitions>', r'<PreprocessorDefinitions>%s</PreprocessorDefinitions>' % ';'.join(defines), buffer)
buffer = buffer.replace('#DEFINES#', ';'.join(defines))
with open('vs/oot.props', 'w') as f:
f.write(buffer)
if not args.props_only:
if args.clean == True:
clean()
build()
elif args.clean_only == True:
clean()
else:
build()
if __name__ == "__main__":
main()