-
Notifications
You must be signed in to change notification settings - Fork 152
/
Copy pathlinux_build_toolchain.sh
executable file
·146 lines (115 loc) · 3.25 KB
/
linux_build_toolchain.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
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/env bash
# Script to mimic how CI is building individual toolchain.
# Default is to use current directory as the working directory.
# SDK is under ${WORKING_ROOT_DIR}/sdk-ng/
# Build directory is ${WORKING_ROOT_DIR}/build-workspace/
WORKING_ROOT_DIR="${PWD}"
SDK_DIR="${WORKING_ROOT_DIR}/sdk-ng"
BUILD_DIR="${WORKING_ROOT_DIR}/build-workspace"
function usage()
{
echo "Usage: $0 -c <config file name> [-s SDK directory] [-o Build directory] [-h]"
echo ""
echo "Arguments:"
echo ""
echo " -c Name of config file (without extension .config)"
echo ""
echo " -s SDK directory. Optional."
echo " Default is ${SDK_DIR}"
echo ""
echo " -o Build directory, for building artifacts and final output. Optional."
echo " Default is ${BUILD_DIR}"
echo ""
echo " -h This help."
echo ""
}
while getopts "hc:s:o:" ARGS; do
case ${ARGS} in
h)
usage
exit 1
;;
c)
CONFIG_FILE_NAME="${OPTARG}"
;;
s)
SDK_DIR="${OPTARG}"
;;
o)
BUILD_DIR="${OPTARG}"
;;
*)
echo "Unknown arguments: $1"
exit 1
;;
esac
done
if [[ "${CONFIG_FILE_NAME}" == "" ]]; then
usage
exit 1
fi
# These variables are the same as the CI script.
export GITHUB_WORKSPACE="${SDK_DIR}"
export WORKSPACE="${BUILD_DIR}"
export CT_PREFIX="${WORKSPACE}"/output
export CT_NG="${WORKSPACE}"/crosstool-ng/bin/ct-ng
TOOLCHAIN_OUTPUT_DIR="${WORKSPACE}"/output/${CONFIG_FILE_NAME}
echo "SDK directory: ${GITHUB_WORKSPACE}"
echo "Build directory: ${WORKSPACE}"
SDK_CONFIG_FILE="${GITHUB_WORKSPACE}/configs/${CONFIG_FILE_NAME}.config"
if [[ ! -f "${SDK_CONFIG_FILE}" ]]; then
echo "ERROR: ${SDK_CONFIG_FILE} does not exist!"
exit 1
fi
echo "Build config file: ${SDK_CONFIG_FILE}"
echo "Toolchain output directory: ${TOOLCHAIN_OUTPUT_DIR}"
if [[ ! -x "${WORKSPACE}/crosstool-ng/bin/ct-ng" ]]; then
echo "========== Building ct-ng =========="
# Create build directory
pushd "${WORKSPACE}" || exit 1
mkdir -p crosstool-ng-build
cd crosstool-ng-build || exit 1
# Bootstrap crosstool-ng
pushd "${GITHUB_WORKSPACE}"/crosstool-ng || exit 1
./bootstrap
popd || exit 1
# Build and install crosstool-ng
"${GITHUB_WORKSPACE}"/crosstool-ng/configure --prefix="${WORKSPACE}"/crosstool-ng
make
make install
popd || exit 1
${CT_NG} version
fi
echo "========== Building Toolchain for ${CONFIG_FILE_NAME} =========="
BUILD_DIR="${WORKSPACE}"/build-${CONFIG_FILE_NAME}
pushd "${WORKSPACE}" || exit 1
mkdir -p "${BUILD_DIR}"
pushd "${BUILD_DIR}" || exit 1
cat "${GITHUB_WORKSPACE}"/configs/common.config "${SDK_CONFIG_FILE}" > .config
cat << 'EOF' >> .config
CT_SHOW_CT_VERSION=n
CT_LOCAL_TARBALLS_DIR="${WORKSPACE}/sources"
CT_OVERLAY_LOCATION="${GITHUB_WORKSPACE}/overlays"
CT_LOG_PROGRESS_BAR=n
CT_LOG_EXTRA=y
CT_LOG_LEVEL_MAX="EXTRA"
CT_GDB_CROSS_PYTHON=y
CT_GDB_CROSS_PYTHON_VARIANT=y
CT_GDB_CROSS_PYTHON_BINARY="python3.12"
CT_EXPERIMENTAL=y
CT_ALLOW_BUILD_AS_ROOT=y
CT_ALLOW_BUILD_AS_ROOT_SURE=y
EOF
"${CT_NG}" savedefconfig DEFCONFIG=build.config
"${CT_NG}" distclean
"${CT_NG}" defconfig DEFCONFIG=build.config
"${CT_NG}" build
chmod -R u+w "${TOOLCHAIN_OUTPUT_DIR}"
pushd "${TOOLCHAIN_OUTPUT_DIR}" || exit 1
rm -rf newlib-nano
rm -f build.log.bz2
popd || exit 1
popd || exit 1
popd || exit 1
echo "========== Done =========="
echo "Toolchain is available under: ${TOOLCHAIN_OUTPUT_DIR}"