@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=1 set COMPILER_CLANG=1 REM TODO: Handle compiler executable as well set MSVC_C_FLAGS=/nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:clatest /c /Tc set CLANG_C_FLAGS=-fno-builtin -nostdlib -mno-stack-arg-probe -std=c23 -c -Wall -Wextra -Werror -Wno-pre-c23-compat -Wno-reserved-identifier -Wno-declaration-after-statement -ferror-limit=0 :: -Weverything set L_FLAGS=/WX /SUBSYSTEM:CONSOLE /NODEFAULTLIB /stack:0x100000,0x100000 if %release%==0 ( set MSVC_C_FLAGS=/Od %MSVC_C_FLAGS% set CLANG_C_FLAGS=-g -O0 %CLANG_C_FLAGS% set L_FLAGS=/DEBUG %L_FLAGS% ) :compilation :: DBG :: Compile if %COMPILER_MSVC% EQU 1 ( echo cl.exe /Fd:%BUILD_DIR%\main.pdb %MSVC_C_FLAGS% src\main.c cl.exe /Fd:%BUILD_DIR%\main.pdb %MSVC_C_FLAGS% src\main.c ) else ( if %COMPILER_CLANG% EQU 1 ( REM clang-cl -fno-builtin /Fd:%BUILD_DIR%\main.pdb %CLANG_C_FLAGS% src\main.c echo clang %CLANG_C_FLAGS% -o %BUILD_DIR%\main.obj src\main.c clang %CLANG_C_FLAGS% -o %BUILD_DIR%\main.obj src\main.c ) ) :: Link if %COMPILER_MSVC% EQU 1 ( link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %BUILD_DIR%\main.obj kernel32.lib ) else ( if %COMPILER_CLANG% EQU 1 ( :: lld-link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %BUILD_DIR%\main.obj kernel32.lib link %L_FLAGS% /OUT:%BUILD_DIR%\main.exe %BUILD_DIR%\main.obj kernel32.lib mscrt.lib ) ) :: Test program :: Compile set C_FLAGS=/nologo /W4 /WX /Zi /GS- /GR- /Gs1000000000 /Fo:%BUILD_DIR%\ /Iinclude /Isrc /std:clatest /c /Tp if %release%==0 ( set C_FLAGS=/Od %C_FLAGS% ) 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