aboutsummaryrefslogtreecommitdiff
path: root/build.bat
blob: 60f096fab3109a976d90b59d6fa79d5de6b76e60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
@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 "%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 )

goto debug

:sanitize
set "flag=/D DEBUG /MTd /fsanitize=address /Od /Gs /MP"
goto build

:release
set "flag=/D NDEBUG /MT /Ox /GS- /MP /cgthreads8 /GL"
goto build

:debug
set "flag=/D DEBUG /MTd /Od /GS /MP"
goto build

:build

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% )

%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%
%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\cynic.lib %obj_dir%cynic.obj
%ar% /nologo /OUT:lib\disgrace.lib %obj_dir%disgrace.obj

for %%f in ("%src_dir%*.h") do (
    copy "%%f" "%inc_dir%%%~nxf" 1>nul 
)

echo:

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 (
    %%f

    if !errorlevel! == 0 (
        echo [DONE] %%f
    ) else (
        echo [FAIL] %%f
    )
)

echo:
echo Done!
endlocal