-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprep.sh
executable file
·93 lines (86 loc) · 2.71 KB
/
prep.sh
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
#! /bin/bash
# Paths
SOURCE_PATHS_C="src/*.c crosslibc/*.c crosslibc/printf/printf.c"
SOURCE_PATHS_CXX="src/*.cpp crosslibc/*.cpp"
SOURCE_PATHS_ASM="src/*.s"
INCLUDE_PATHS="include include/compat nolibc crosslibc crosslibc/STL /usr/include/efi /usr/include/efi/x86_64 /usr/include/efi/protocol"
# Config
ARCH="x86_64" # Warning: Also specified in Makefile_cst
COMPILER="gcc"
COMPILER_FLAGS="-DEFI_FUNCTION_WRAPPER -DLINUX_UEFI_USE_INTERNAL_INTS -DCLIBC_NO_MEMCPY -DCLIBC_NO_MEMSET -DCLIBC_NO_LL_HEAP -mno-red-zone -fno-stack-protector -fpic -fshort-wchar -Wno-builtin-declaration-mismatch"
COMPILER_FLAGS_CXX="-fno-rtti -nostdinc++"
ASSEMBLER="nasm"
ASSEMBLER_FLAGS=""
ASSEMBLER_TARGET="elf64"
LINKER="ld"
LINKER_FLAGS="-znocombreloc -T /usr/lib/elf_${ARCH}_efi.lds -shared -Bsymbolic -L /usr/lib /usr/lib/crt0-efi-${ARCH}.o -lefi -lgnuefi -nostdlib"
LINKER_TARGET="elf_x86_64"
# Library functions
function file_continue {
test -f "$1" || echo continue
}
function getoutfile {
echo obj/"$(basename "${1%.*}")-"${1##*.}"".o
}
function makeentry_init {
srcfile="$1"
outfile="$(getoutfile $srcfile)"
outfiles+=("$outfile")
echo " - ${srcfile} produces ${outfile}..." > /dev/stderr
}
# Templates
function makeentry_cfile {
makeentry_init "$1"
echo "
${outfile}: ${srcfile}
${COMPILER} ${COMPILER_FLAGS} ${COMPILER_INCLUEDIRS} -c ${srcfile} -o ${outfile}"
}
function makeentry_cppfile {
makeentry_init "$1"
echo "
${outfile}: ${srcfile}
${COMPILER} -std=c++17 ${COMPILER_FLAGS} ${COMPILER_FLAGS_CXX} ${COMPILER_INCLUEDIRS} -c ${srcfile} -o ${outfile}"
}
function makeentry_sfile {
makeentry_init "$1"
echo "
${outfile}: ${srcfile}
${ASSEMBLER} ${ASSEMBLER_FLAGS} -f ${ASSEMBLER_TARGET} ${srcfile} -o ${outfile}"
}
function makeentry_misc {
echo "all: link"
echo "compile: ${outfiles[@]}"
echo "link: compile
${LINKER} -o bin/$proj_name -m ${LINKER_TARGET} ${outfiles[@]} ${LINKER_FLAGS}"
echo "clean:
rm -f ${outfiles[@]} bin/$proj_name"
echo ""
}
# Create variables
declare -a outfiles
proj_name="efitest"
# Prepare structure
mkdir -p obj bin
# Generate Makefile
for path in $INCLUDE_PATHS; do
COMPILER_INCLUEDIRS="$COMPILER_INCLUEDIRS -I${path} "
done
for filename in $SOURCE_PATHS_C; do
$(file_continue "$filename")
makeentry_cfile "$filename" >> Makefile_body
done
for filename in $SOURCE_PATHS_CXX; do
$(file_continue "$filename")
makeentry_cppfile "$filename" >> Makefile_body
done
for filename in $SOURCE_PATHS_ASM; do
$(file_continue "$filename")
makeentry_sfile "$filename" >> Makefile_body
done
makeentry_misc > Makefile
cat Makefile_body >> Makefile
if [ -f "Makefile_cst" ] ; then
echo >> Makefile
cat Makefile_cst >> Makefile
fi
rm -f Makefile_body