blob: 78fc5d3882e34771ebc959c1afde3eaa3e13b3f1 (
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
#!/bin/sh
set -eu
cd "$(dirname "$0")"
platform=native
mode=release
objdir=obj
modules=
developer=0
usage()
{
echo "usage: build.sh [-d] [-D] [-p platform] [-m module,...] [-o objdir] [target ...]"
echo "modules: font toml tile pack ui debug assets image audio mic model 2d platformer rpg 3d sector world"
echo "platforms: native linux bsd windows"
echo "targets: all run clean tools pack examples"
exit 1
}
while getopts dDm:o:p: opt; do
case $opt in
d) mode=debug ;;
D) developer=1 ;;
m) modules="$modules $(echo "$OPTARG" | tr ',' ' ')" ;;
o) objdir=$OPTARG ;;
p) platform=$OPTARG ;;
*) usage ;;
esac
done
shift $((OPTIND - 1))
if [ "$platform" = native ]; then
case $(uname -s) in
Linux) platform=linux ;;
MINGW*|MSYS*|CYGWIN*) platform=windows ;;
*) platform=bsd ;;
esac
fi
EXE=
DEFS=
case $platform in
linux|bsd)
LDLIBS="-lX11 -lXext -lXrandr -lm"
DEFS="-D_POSIX_C_SOURCE=200809L"
;;
windows)
CC=${CC:-x86_64-w64-mingw32-gcc}
LDLIBS="-lgdi32 -lm"
EXE=.exe
;;
*)
echo "build.sh: unknown platform '$platform'" >&2
usage
;;
esac
if [ $mode = debug ]; then
MODEFLAGS="-g -O1 -DKON_DEBUG"
developer=1
else
MODEFLAGS="-O2 -DNDEBUG"
fi
[ $developer = 1 ] && MODEFLAGS="$MODEFLAGS -DKON_DEVELOPER"
MODOBJS=
addobj()
{
case " $MODOBJS " in
*" $objdir/$1.o "*) ;;
*) MODOBJS="$MODOBJS $objdir/$1.o" ;;
esac
}
for m in $modules; do
DEFS="$DEFS -DKON_MODULE_$(echo "$m" | tr 'a-z' 'A-Z')"
case $m in
font|toml|tile|pack|ui|debug|2d|platformer|rpg|3d|sector|world) addobj "kon$m" ;;
assets) addobj konassets ;;
model) addobj konmodel; addobj konassets ;;
image) addobj stb_image ;;
audio|mic)
addobj miniaudio
addobj "kon$m"
case $platform in
linux) LDLIBS="$LDLIBS -lpthread -ldl" ;;
bsd) LDLIBS="$LDLIBS -lpthread" ;;
esac
;;
*) echo "build.sh: unknown module '$m'" >&2; usage ;;
esac
done
need()
{
case " $DEFS " in
*" -DKON_MODULE_$(echo "$1" | tr 'a-z' 'A-Z') "*) ;;
*) DEFS="$DEFS -DKON_MODULE_$(echo "$1" | tr 'a-z' 'A-Z')" ;;
esac
addobj "kon$1"
}
# modules that use other modules
case " $modules " in *" debug "*) need font; need assets ;; esac
case " $modules " in *" ui "*) need font ;; esac
case " $modules " in *" world "*) need 3d; need sector; need tile ;; esac
case " $modules " in *" platformer "*|*" rpg "*) need tile ;; esac
case " $modules " in *" 3d "*) need tile ;; esac
case " $modules " in *" model "*) need assets ;; esac
case " $DEFS " in *" -DKON_MODULE_ASSETS "*) need pack ;; esac
# the 3D renderer is only compiled when a module that draws in 3D is picked
case " $DEFS " in
*" -DKON_MODULE_3D "*|*" -DKON_MODULE_MODEL "*|*" -DKON_MODULE_SECTOR "*) DEFS="$DEFS -DKONSOFREN_3D" ;;
esac
case " $modules " in
*" debug "*) [ $developer = 1 ] || echo "note: debug module does nothing without -d or -D" ;;
esac
OBJDIR=$objdir
export CC EXE LDLIBS MODEFLAGS DEFS OBJDIR MODOBJS
mkdir -p "$OBJDIR"
flags="$MODEFLAGS $DEFS $LDLIBS $MODOBJS ${CC:-cc}"
if [ "$(cat "$OBJDIR/.flags" 2>/dev/null)" != "$flags" ]; then
rm -f "$OBJDIR"/*.o
echo "$flags" > "$OBJDIR/.flags"
fi
echo "===> platform $platform, $mode build, modules:${modules:- none}"
exec ${MAKE:-make} ${*:-all}
|