@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 set COMPILER_MSVC=0 set COMPILER_CLANG=1 REM TODO: Handle compiler executable as well if %COMPILER_MSVC%==1 ( set COMPILER=cl set C_FLAGS=/nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:clatest /c /Tc set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x100000,0x100000 if "%release%"=="0" ( set C_FLAGS=/Od %C_FLAGS% ) ) else ( if %COMPILER_CLANG%==1 ( set COMPILER=clang set C_FLAGS=-fno-builtin -nostdlib -mno-stack-arg-probe -std=c23 -c set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x100000,0x100000 if "%release%"=="0" ( set C_FLAGS=-g -O0 %C_FLAGS% set L_FLAGS=/DEBUG %L_FLAGS% ) ) ) :compilation :: DBG :: Compile REM cl.exe /Fd:%BUILD_DIR%\main.pdb %C_FLAGS% src\main.c REM clang-cl -fno-builtin /Fd:%BUILD_DIR%\main.pdb %C_FLAGS% src\main.c start %COMPILER% %C_FLAGS% -o %BUILD_DIR%\main.obj src\main.c /wait /b :: Link lld-link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %BUILD_DIR%\main.obj kernel32.lib :: Test program :: Compile :: cl.exe %C_FLAGS% test\main.c /Fd:%BUILD_DIR%\test.pdb /Fo:%BUILD_DIR%\test.obj clang -fno-builtin -g -O0 -nostdlib -mno-stack-arg-probe -std=c23 -c -o %BUILD_DIR%\test.obj test\main.c