@echo off :: /GS - is sequrity check for buffer overruns. :: /Oi - generate intrinsic functions (aka inline intrinsic). :: /O1 /O2 - minimize size, minimize speed. :: /Ox - subset of /O2, doesnt include. :: /GL - whole program optimizations. :: /LTCG - link time codegen. it is linker option. :: /cgthreads1 8 - how much thread cl.exe can use. :: /F {0} - sets stack size. :: outputs :: /Fa{path} - asm file path. :: /Fd{path} - pdb file path. :: /Fe{path} - exe file path. :: /Fo{path} - obj file path. :: /MT - defines _MT. uses LIBCMT.lib to resolve runtime symbols. :: /MTd - defines _MT _DEBUG, uses LIBCMT.lib. :: /MD - defines _MT _DLL. uses MSVCRT.lib. :: /MDd - defines _MT _DLL _DEBUG. uses MSVCRT.lib. :: /LD - implies /MT unless specified /MD. :: /LDd - ... setlocal setlocal enabledelayedexpansion set "cc=cl.exe" set "ar=lib.exe" set "bin_dir=bin\" set "src_dir=src\" set "obj_dir=obj\" set "inc_dir=include\" set "lib_dir=lib\" set "warn=/wd4244 /wd5105" set "cdefines=/D _CRT_SECURE_NO_WARNINGS /D _UNICODE /D UNICODE" set "cflags=/nologo /std:c11 /utf-8 /W4 /WX- /diagnostics:column /TC /Zi /fp:fast" :: :: ------------ :: set "flag=/D DEBUG /MTd /Od /GS /MP" set "_flag=/D NDEBUG /MT /Ox /GS- /MP /cgthreads8 /GL" :: :: ------------ :: if exist %bin_dir% ( rmdir /s /q %bin_dir% ) if exist %obj_dir% ( rmdir /s /q %obj_dir% ) if exist %inc_dir% ( rmdir /s /q %inc_dir% ) if exist %lib_dir% ( rmdir /s /q %lib_dir% ) if not exist %bin_dir% ( mkdir %bin_dir% ) if not exist %obj_dir% ( mkdir %obj_dir% ) if not exist %inc_dir% ( mkdir %inc_dir% ) if not exist %lib_dir% ( mkdir %lib_dir% ) %cc% %cflags% %warn% %flag% /c %src_dir%ungrateful.c /Fo%obj_dir%ungrateful.obj /Fd%obj_dir%ungrateful.pdb %cdefines% %cc% %cflags% %warn% %flag% /I %src_dir% /c %src_dir%cynic.c /Fo%obj_dir%cynic.obj /Fd%obj_dir%cynic.pdb %cdefines% %ar% /nologo /OUT:lib\ungrateful.lib %obj_dir%ungrateful.obj %ar% /nologo /OUT:lib\cynic.lib %obj_dir%cynic.obj for %%f in ("%src_dir%*.h") do ( copy "%%f" "%inc_dir%%%~nxf" 1>nul ) echo: set "link_param=/link %lib_dir%ungrateful.lib" for %%f in ("tests\un\*.c") do ( %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir% /Fd%bin_dir% /Fe%bin_dir% %link_param% ) set "link_param=/link %lib_dir%ungrateful.lib %lib_dir%cynic.lib" for %%f in ("tests\cyn\*.c") do ( %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir% /Fd%bin_dir% /Fe%bin_dir% %link_param% ) echo: for %%f in ("%bin_dir%*.exe") do ( %%f if !errorlevel! == 0 ( echo [DONE] %%f ) else ( echo [FAIL] %%f ) ) echo: echo Done! endlocal