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
|