@echo off setlocal setlocal EnableDelayedExpansion cd /D "%~dp0" :: --- Unpack Arguments ------------------------------------------------------- for %%a in (%*) do set "%%a=1" if not "%msvc%"=="1" if not "%clang%"=="1" set msvc=1 if not "%release%"=="1" set debug=1 if "%debug%"=="1" set release=0 && echo [debug] if "%release%"=="1" set debug=0 && echo [release] if "%msvc%"=="1" set clang=0 && echo [msvc] if "%clang%"=="1" set msvc=0 && echo [clang] if "%deploy%"=="1" echo [deploy] :: --- Unpack Command Line Build Mix-ins -------------------------------------- set auto_compile_flags= set auto_link_flags= if "%telemetry%"=="1" set auto_compile_flags=%auto_compile_flags% -DBUILD_TELEMETRY=1 && echo [telemetry] if "%asan%"=="1" set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan] :: --- Mix Git Commit ID ------------------------------------------------------ git rev-parse --is-inside-work-tree >nul 2>&1 && set in_git_tree=1 if "%in_git_tree%"=="1" ( for /f %%i in ('call git describe --always --dirty') do set auto_compile_flags=%auto_compile_flags% -DBUILD_GIT_HASH=\"%%i\" for /f %%i in ('call git rev-parse HEAD') do set auto_compile_flags=%auto_compile_flags% -DBUILD_GIT_HASH_FULL=\"%%i\" ) :: --- [MSVC] Compile/Link Line Definitions ----------------------------------- set cl_common= /I..\code\ /I..\local\ /nologo /FC /Z7 set cl_debug= call cl /Od /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% set cl_release= call cl /O2 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags% set cl_link= /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% %auto_link_flags% set cl_out= /out: :: --- [Clang] Compile/Link Line Definitions ---------------------------------- set clang_common= -g -I..\code\ -I..\local\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -ferror-limit=10000 set clang_common_n64= --target=mips-unknown-elf -mcpu=mips3 -mabi=32 -EB -mno-abicalls -fno-pic -ffreestanding -nostdlib -fno-builtin -G 0 -fno-unroll-loops -DN64=1 set clang_debug= call clang -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% set clang_release= call clang -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% set clang_debug_n64= call clang -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags% %clang_common_n64% -c set clang_release_n64= call clang -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags% %clang_common_n64% -c set clang_link= -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% %auto_link_flags% set clang_out= -o :: --- [LLD] Link Line Definitions set lld_link_common= set lld_link_common_n64= -T "../code/n64/n64.ld" set lld_link= call ld.lld %lld_link_common% %auto_link_flags% set lld_link_n64= call ld.lld %lld_link_common% %lld_link_common_n64% %auto_link_flags% :: --- Choose Compile/Link Lines ---------------------------------------------- if "%msvc%"=="1" set compile_debug=%cl_debug% if "%msvc%"=="1" set compile_release=%cl_release% if "%msvc%"=="1" set compile_link=%cl_link% if "%msvc%"=="1" set out=%cl_out% if "%clang%"=="1" set compile_debug=%clang_debug% if "%clang%"=="1" set compile_release=%clang_release% if "%clang%"=="1" set compile_link=%clang_link% if "%clang%"=="1" set out=%clang_out% if "%debug%"=="1" set compile=%compile_debug% if "%release%"=="1" set compile=%compile_release% if "%debug%"=="1" set compile_n64=%clang_debug_n64% if "%release%"=="1" set compile_n64=%clang_release_n64% set link_n64= %lld_link_n64% set out_n64= %clang_out% set romify_n64= n64tool -t "^!n64_rom_name^!" -o "^!n64_rom_name^!.z64" --align 256 "^!n64_rom_name^!.elf" :: --- Per-Build Settings ----------------------------------------------------- set link_dll=-DLL if "%msvc%"=="1" set only_compile=-c if "%clang%"=="1" set only_compile=/c if "%msvc%"=="1" set EHsc=/EHsc if "%clang%"=="1" set EHsc= if "%msvc%"=="1" set no_aslr=/DYNAMICBASE:NO if "%clang%"=="1" set no_aslr=-Wl,/DYNAMICBASE:NO if "%msvc%"=="1" set rc=call rc if "%clang%"=="1" set rc=call llvm-rc :: --- Prep Directories ------------------------------------------------------- if not exist build mkdir build if not exist local mkdir local :: --- Build n64tool ---------------------------------------------------------- pushd build if "%n64tool%"=="1" if exist n64tool.exe del n64tool.exe if not exist n64tool.exe ( %clang_debug% ..\code\third_party\n64tool\n64tool.c %clang_link% %clang_out% n64tool.exe ) popd :: --- Build Targets ---------------------------------------------------------- pushd build if "%n64_test%"=="1" ( set didbuild=1 set "n64_rom_name=n64_test" %compile_n64% ..\code\n64_test\n64_test.c %link_n64% n64_test.o %out_n64% !n64_rom_name!.elf %romify_n64% ) popd :: --- Deploy To N64 ---------------------------------------------------------- if "%deploy%"=="1" if not "%n64_rom_name%"=="" ( pushd build ..\tools\sc64deployer upload %n64_rom_name%.z64 popd )