summaryrefslogtreecommitdiff
path: root/miniany/build.sh
blob: 7944eaf5e02f62fdbb04cb5af8c88d0d1ed77bf7 (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
#!/bin/bash

BINARY=${1:-cc}
COMPILER=${2:-gcc}
MODE=${3:-freestanding}
LEVEL=${4:-d}

DEBUG=0

declare -a MODULES
MODULES+=("libc-${MODE}.c")
MODULES+=("$BINARY.c")

case "${COMPILER}" in
	gcc)
		CFLAGS="-m32 -march=i386 -Wall -pedantic -Werror -std=c89 -x c"
		;;
	clang)
		CFLAGS="-m32 -march=i386 -Werror -Wall -pedantic -std=c89 -x c"
		;;
	pcc)
		CFLAGS="-march=i386 -Werror -Wall -std=c89 -x c"
		;;
	tcc)
		CFLAGS="-m32 -march=i386 -Werror -Wall -std=c89"
		;;
	*)
		echo "ERROR: Unknown compiler '${COMPILER}' (use gcc, clang, pcc or tcc)" 1>&2
		exit 1
		;;
esac

case "${COMPILER}:${LEVEL}" in
	*:0|*:1|*:2|*:3|*:s)
		CFLAGS+=" -O${LEVEL}"
		;;
	pcc:d)
		CFLAGS+=" -g -O0"
		DEBUG=1
		;;
	*:d)
		CFLAGS+=" -g -Og"
		DEBUG=1
		;;
	*)
		echo "ERROR: Unknown compilation level '${LEVEL}' (use one of 0123s for -O<n>, or d for '-Og -g' and debugging)" 1>&2
		exit 1
		;;
esac

case "${MODE}" in
	freestanding)
		CFLAGS+=" -D__FREESTANDING__"
		;;
	hosted)
		CFLAGS+=" -D__HOSTED__"
		;;
	*)
		echo "ERROR: Unknown environment '${MODE}' (use 'freestanding' or 'hosted')" 1>&2
		exit 1
		;;
esac

case "${COMPILER}:${MODE}" in
	gcc:freestanding)
		CFLAGS+=" -ffreestanding -fno-stack-protector -nostdlib -emain -fno-omit-frame-pointer"
		;;
	clang:freestanding)
		CFLAGS+=" -ffreestanding -fno-stack-protector -nostdlib -Wl,-emain -fno-omit-frame-pointer"
		;;
	pcc:freestanding)
		CFLAGS+=" -ffreestanding -nostdlib -Wl,-emain"
		;;
	tcc:freestanding)
		CFLAGS+=" -fno-bultin -nostdlib"
		MODULES+=("_start-stub.c")
		;;
	pcc:hosted)
		CFLAGS+=" -Wl,-emain"
		;;
esac

case "${COMPILER}:${MODE}" in
	*:hosted)
		CFLAGS+=" -lbsd"
		;;
esac

echo "${COMPILER} ${CFLAGS} -o ${BINARY} ${MODULES[@]}"
if [ "${DEBUG}" = 1 ]; then
	cat ${MODULES[@]} > "${BINARY}_tmp.c"
	${COMPILER} ${CFLAGS} -o ${BINARY} "${BINARY}_tmp.c"
else
	cat ${MODULES[@]} | ${COMPILER} ${CFLAGS} -o ${BINARY} -
fi