@echo off 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 "log_dir=log\" set "warn=/wd4244 /wd5105 /wd4127" set "cdefines=/D _CRT_SECURE_NO_WARNINGS /D _WINSOCK_DEPRECATED_NO_WARNINGS /D _UNICODE /D UNICODE" set "cflags=/nologo /std:c11 /utf-8 /W4 /WX- /diagnostics:column /TC /Zi /fp:fast" set "link_conf=/INCREMENTAL:NO" 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 exist %log_dir% ( rmdir /s /q %log_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% ) if not exist %log_dir% ( mkdir %log_dir% ) if "%1"=="Release" ( goto release ) if "%1"=="release" ( goto release ) if "%1"=="rel" ( goto release ) if "%1"=="Sanitize" ( goto sanitize ) if "%1"=="asan" ( goto sanitize ) if "%1"=="san" ( goto sanitize ) if "%1"=="deps" ( goto deps ) goto debug :deps pushd deps pushd zlib-1.3.1 if exist "build" ( rmdir /s /q "build" ) mkdir "build" :: https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2017%202022.html cmake -B build -G "Visual Studio 17 2022" -A x64 cmake --build build --config Debug --parallel 8 cmake --build build --config Release --parallel 8 popd popd goto end :sanitize set "flag=/D DEBUG /MTd /fsanitize=address /Od /Gs /MP" set config_name="asan" goto build :release set "flag=/D NDEBUG /MT /Ox /GS- /MP /cgthreads8 /GL" set config_name="rel" goto build :debug set "flag=/D DEBUG /MTd /Od /GS /MP" set config_name="deb" goto build :build %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 deps\zlib-1.3.1 /I deps\zlib-1.3.1\build /I %src_dir% /c %src_dir%cynic.c /Fo%obj_dir%cynic.obj /Fd%obj_dir%cynic.pdb %cdefines% %cc% %cflags% %warn% %flag% /I %src_dir% /c %src_dir%disgrace.c /Fo%obj_dir%disgrace.obj /Fd%obj_dir%disgrace.pdb %cdefines% %ar% /nologo /OUT:lib\ungrateful.lib %obj_dir%ungrateful.obj %ar% /nologo /OUT:lib\disgrace.lib %obj_dir%disgrace.obj if %config_name%=="rel" ( %ar% /nologo /OUT:lib\cynic.lib %obj_dir%cynic.obj .\deps\zlib-1.3.1\build\Release\zlib.lib copy ".\deps\zlib-1.3.1\build\Release\zlib.dll" "%bin_dir%zlib.dll" 1>nul ) else ( %ar% /nologo /OUT:lib\cynic.lib %obj_dir%cynic.obj .\deps\zlib-1.3.1\build\Debug\zlibd.lib copy ".\deps\zlib-1.3.1\build\Debug\zlibd.dll" "%bin_dir%zlibd.dll" 1>nul ) for %%f in ("%src_dir%*.h") do ( copy "%%f" "%inc_dir%%%~nxf" 1>nul ) set "link_param=/link %link_conf% %lib_dir%ungrateful.lib" for %%f in ("tests\un\*.c") do ( start "Compile %%f" /B %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir%%%~nf.obj /Fd%bin_dir%%%~nf.pdb /Fe%bin_dir%%%~nf.exe %link_param% > %log_dir%\log_%%~nxf.txt 2>&1 ) set "link_param=/link %link_conf% %lib_dir%ungrateful.lib %lib_dir%cynic.lib" for %%f in ("tests\cyn\*.c") do ( start "Compile %%f" /B %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir%%%~nf.obj /Fd%bin_dir%%%~nf.pdb /Fe%bin_dir%%%~nf.exe %link_param% > %log_dir%\log_%%~nxf.txt 2>&1 ) set "link_param=/link %link_conf% %lib_dir%ungrateful.lib %lib_dir%cynic.lib %lib_dir%disgrace.lib" for %%f in ("tests\d\*.c") do ( start "Compile %%f" /B %cc% %cflags% %warn% %flag% %cdefines% %%f /I%inc_dir% /Fo%obj_dir%%%~nf.obj /Fd%bin_dir%%%~nf.pdb /Fe%bin_dir%%%~nf.exe %link_param% > %log_dir%\log_%%~nxf.txt 2>&1 ) :wait tasklist | find "%cc%.exe" > nul if %errorlevel% == 0 ( timeout /t 0 > nul goto wait ) echo Logs: for %%f in ("%log_dir%*.txt") do ( type %%f ) echo: for %%f in ("%bin_dir%*.exe") do ( echo [ RUN ] %%f %%f if !errorlevel! == 0 ( echo [ DONE ] echo: ) else ( echo [ FAIL ] echo: ) ) :end echo: echo Done! endlocal