summaryrefslogtreecommitdiff
path: root/build.sh
blob: ef06df50bc0e3776be9b0310d8adc6babd028fc2 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#!/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 sound model 2d fx particles picture script battle party save stage textbox 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"
	# the BSDs keep X11 out of the default paths
	case $(uname -s) in
	NetBSD) x11=/usr/X11R7 ;;
	OpenBSD) x11=/usr/X11R6 ;;
	FreeBSD|DragonFly) x11=/usr/local ;;
	*) x11= ;;
	esac
	if [ -n "$x11" ]; then
		DEFS="$DEFS -I$x11/include"
		LDLIBS="-L$x11/lib -Wl,-R$x11/lib $LDLIBS"
	fi
	;;
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
}

case " $modules " in
*" sound "*)
	case " $modules " in
	*" audio "*) ;;
	*) modules="$modules audio" ;;
	esac
	;;
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|fx|particles|picture|sound|script|battle|party|save|stage|textbox|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"
		# ogg only works when ext/stb_vorbis.c is there
		if [ "$m" = audio ] && [ -f ext/stb_vorbis.c ]; then
			DEFS="$DEFS -DKON_VORBIS"
			addobj stb_vorbis
		fi
		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 *" stage "*|*" fx "*|*" picture "*) need 2d ;; esac
case " $modules " in *" textbox "*) need 2d; need font ;; esac
case " $modules " in *" 3d "*) need tile ;; esac
case " $modules " in *" model "*) need assets ;; esac
case " $modules " in *" party "*) need battle; need save ;; 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}