@ECHO OFF :: Unpack Arguments set release=0 for %%a in (%*) do set "%%a=1" set BUILD_DIR=build :: Clean directory IF EXIST %BUILD_DIR% rmdir %BUILD_DIR%\ /S /Q mkdir %BUILD_DIR% set MSVC=1 set CLANG=0 set C_COMPILER=cl set C_LINKER=link if %MSVC% EQU 1 ( if %CLANG% EQU 1 ( set C_COMPILER=clang-cl set C_LINKER=lld-link ) ) else ( set CLANG=1 set C_COMPILER=clang set C_LINKER=lld-link ) if %MSVC% EQU 1 ( REM set C_FLAGS=/DHASHMAP /nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:c17 /c /Tc set C_FLAGS=/nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:c17 /c /Tc set DEBUG_C_FLAGS=/DDEBUG /Od set RELEASE_C_FLAGS=/DNDEBUG /O2 set DEBUG_L_FLAGS=/DEBUG ) else ( set C_FLAGS=-fno-builtin -nostdlib -mno-stack-arg-probe --target=x86_64-pc-windows-msvc -Wall -Werror -pedantic -I include -std=c23 -Wno-msvc-not-found -Wno-microsoft-anon-tag -Wno-gnu-binary-literal -g -O0 -c set DEBUG_C_FLAGS=-DDEBUG -g -O0 set RELEASE_C_FLAGS=-DNDEBUG -O2 ) if %RELEASE% EQU 0 ( set C_FLAGS=%DEBUG_C_FLAGS% %C_FLAGS% set L_FLAGS=%DEBUG_L_FLAGS% %L_FLAGS% set SHADERS_C_FLAGS = -O0 -g %SHADERS_C_FLAGS% ) else ( set C_FLAGS=%RELEASE_C_FLAGS% %C_FLAGS% set SHADERS_C_FLAGS=-O %SHADERS_C_FLAGS% ) set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x500000,500000 /DEBUG set src=main utils events module parser pdb hashmap stack_walk disasm loader :: DBG :: Compile if %MSVC% EQU 1 ( (for %%s in (%src%) do ( call set OBJS=%%OBJS%% %BUILD_DIR%\%%s.obj echo %C_COMPILER% /Fd:%BUILD_DIR%\%%s.pdb %C_FLAGS% src\%%s.c %C_COMPILER% /Fd:%BUILD_DIR%\%%s.pdb %C_FLAGS% src\%%s.c )) ) else ( (for %%s in (%src%) do ( call set OBJS=%%OBJS%% %BUILD_DIR%\%%s.obj echo %C_COMPILER% -o %BUILD_DIR%\%%s.obj %C_FLAGS% src\%%s.c %C_COMPILER% -o %BUILD_DIR%\%%s.obj %C_FLAGS% src\%%s.c )) ) :: Link echo %C_LINKER% %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %OBJS% %C_LINKER% %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %OBJS% :: Test program set SRC_FILE=test :: Compile if %MSVC% EQU 1 ( %C_COMPILER% /Fd:%BUILD_DIR%\%SRC_FILE%.pdb %C_FLAGS% src/%SRC_FILE%.c ) else ( %C_COMPILER% -o %BUILD_DIR%\%SRC_FILE%.obj %C_FLAGS% src/%SRC_FILE%.c ) :: Link %C_LINKER% %L_FLAGS% %BUILD_DIR%\%SRC_FILE%.obj /OUT:%BUILD_DIR%\%SRC_FILE%.exe