summaryrefslogtreecommitdiff
path: root/build.sh
blob: 34fc37d8e292b6e0de99767a5049863e33341970 (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
#!/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 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|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 *" 3d "*) need tile ;; esac
case " $modules " in *" model "*) need assets ;; esac
case " $DEFS " in *" -DKON_MODULE_ASSETS "*) need pack ;; 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}