aboutsummaryrefslogtreecommitdiff
path: root/build.bat
blob: 1b8e58dcc092f591dc34392229b33ed671ece4ed (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
@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

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"
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