forked from BoatPeopleBRTIK/build-artik
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuild_kernel.sh
executable file
·193 lines (163 loc) · 5.1 KB
/
build_kernel.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#!/bin/bash
set -e
KERNEL_RELEASE=
BUILD_KERNEL_HEADERS=false
package_check()
{
command -v $1 >/dev/null 2>&1 || { echo >&2 "${1} not installed. Aborting."; exit 1; }
}
print_usage()
{
echo "-h/--help Show help options"
echo "-b [TARGET_BOARD] Target board ex) -b artik710|artik530|artik5|artik10"
echo "--kernel-headers Generate kernel headers tarball"
exit 0
}
parse_options()
{
for opt in "$@"
do
case "$opt" in
-h|--help)
print_usage
shift ;;
-b)
TARGET_BOARD="$2"
shift ;;
--kernel-headers)
BUILD_KERNEL_HEADERS=true
shift ;;
esac
done
}
build()
{
make distclean
make $KERNEL_DEFCONFIG
make $KERNEL_IMAGE -j$JOBS EXTRAVERSION="-$BUILD_VERSION"
make $BUILD_DTB EXTRAVERSION="-$BUILD_VERSION"
make modules EXTRAVERSION="-$BUILD_VERSION" -j$JOBS
}
build_modules()
{
KERNEL_RELEASE=$(cat include/config/kernel.release 2> /dev/null)
OBJCOPY=${CROSS_COMPILE}objcopy
tmpdir=$TARGET_DIR/modules
mkdir -p $tmpdir
make modules_install INSTALL_MOD_PATH=$TARGET_DIR/modules
rm -f $tmpdir/lib/modules/$KERNEL_RELEASE/build
rm -f $tmpdir/lib/modules/$KERNEL_RELEASE/source
rm -fr $tmpdir/lib/firmware
dbg_dir=$TARGET_DIR/modules_debug
mkdir -p $dbg_dir
for module in $(find $tmpdir/lib/modules/ -name *.ko -printf '%P\n'); do
module=lib/modules/$module
mkdir -p $(dirname $dbg_dir/usr/lib/debug/$module)
# only keep debug symbols in the debug file
$OBJCOPY --only-keep-debug $tmpdir/$module $dbg_dir/usr/lib/debug/$module
# strip original module from debug symbols
$OBJCOPY --strip-debug $tmpdir/$module
# then add a link to those
$OBJCOPY --add-gnu-debuglink=$dbg_dir/usr/lib/debug/$module $tmpdir/$module
done
blocksize=4096
reserved=0
if [ "${VERIFIED_BOOT}" = "true" ]; then
# if verified boot, reserve blocks for hashtree
# 66 blocks covers volumes exactly up to 32Mbytes
reserved=$((66 * $blocksize))
fi
modulefs_size=$((${MODULE_SIZE} * 1024 * 1024 - $reserved))
make_ext4fs -b $blocksize -L modules \
-l $modulefs_size ${TARGET_DIR}/modules.img \
${TARGET_DIR}/modules/lib/modules/
# append hashtree at the end of the ext4 volume
if [ "${VERIFIED_BOOT}" = "true" ]; then
veritysetup \
--no-superblock \
--data-block-size=$blocksize \
--data-blocks=$(($modulefs_size / $blocksize)) \
--hash-offset=$(($modulefs_size)) \
format ${TARGET_DIR}/modules.img ${TARGET_DIR}/modules.img | \
tee ${TARGET_DIR}/modules.img.verity
# adjust the size of modules.img to ${MODULE_SIZE}Mbytes
fallocate -l $((${MODULE_SIZE} * 1024 * 1024)) \
${TARGET_DIR}/modules.img
fi
}
build_kernel_header()
{
kernel_headers_dir=$TARGET_DIR/kernel_headers
[ -d "$kernel_headers_dir" ] || rm -rf $kernel_headers_dir
hdrsrcfiles_list=$TARGET_DIR/hdrsrcfiles
hdrobjfiles_list=$TARGET_DIR/hdrobjfiles
# Build kernel header package
find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$hdrsrcfiles_list"
find arch/$ARCH/include include scripts -type f >> "$hdrsrcfiles_list"
find arch/$ARCH -name module.lds -o -name Kbuild.platforms -o -name Platform >> "$hdrsrcfiles_list"
find $(find arch/$ARCH -name include -o -name scripts -type d) -type f >> "$hdrsrcfiles_list"
find arch/$ARCH/include Module.symvers include scripts -type f >> "$hdrobjfiles_list"
destdir=$kernel_headers_dir/usr/src/linux-headers-$KERNEL_RELEASE
mkdir -p "$destdir"
tar -c -f - -T - < "$hdrsrcfiles_list" | (cd $destdir; tar -xf -)
tar -c -f - -T - < "$hdrobjfiles_list" | (cd $destdir; tar -xf -)
cp .config $destdir/.config # copy .config manually to be where it's expected to be
mkdir -p "$kernel_headers_dir/lib/modules/$KERNEL_RELEASE/"
ln -sf "/usr/src/linux-headers-$KERNEL_RELEASE" "$kernel_headers_dir/lib/modules/$KERNEL_RELEASE/build"
rm -f "$hdrsrcfiles_list" "$hdrobjfiles_list"
}
install_output()
{
tmpdir=$TARGET_DIR/modules
dbg_dir=$TARGET_DIR/modules_debug
kernel_headers_dir=$TARGET_DIR/kernel_headers
cp arch/$ARCH/boot/$KERNEL_IMAGE $TARGET_DIR
cp $DTB_PREFIX_DIR/$KERNEL_DTB $TARGET_DIR
cp vmlinux $TARGET_DIR
if [ "$OVERLAY" == "true" ]; then
mkdir -p $TARGET_DIR/overlays
cp $DTB_PREFIX_DIR/$KERNEL_DTBO $TARGET_DIR/overlays
fi
pushd $tmpdir
tar zcf $TARGET_DIR/linux-${TARGET_BOARD}-modules-${KERNEL_RELEASE}.tar.gz *
popd
rm -fr $tmpdir
pushd $dbg_dir
tar zcf $TARGET_DIR/linux-${TARGET_BOARD}-modules-${KERNEL_RELEASE}-dbg.tar.gz *
popd
rm -fr $dbg_dir
if $BUILD_KERNEL_HEADERS; then
pushd $kernel_headers_dir
tar zcf $TARGET_DIR/linux-${TARGET_BOARD}-kernel-headers-${KERNEL_RELEASE}.tar.gz *
popd
rm -fr $kernel_headers_dir
fi
}
gen_version_info()
{
if [ -e $TARGET_DIR/artik_release ]; then
sed -i "s/_KERNEL=.*/_KERNEL=${KERNEL_RELEASE}/" $TARGET_DIR/artik_release
fi
}
trap 'error ${LINENO} ${?}' ERR
parse_options "$@"
SCRIPT_DIR=`dirname "$(readlink -f "$0")"`
if [ "$TARGET_BOARD" == "" ]; then
print_usage
else
if [ "$KERNEL_DIR" == "" ]; then
. $SCRIPT_DIR/config/$TARGET_BOARD.cfg
fi
fi
test -d $TARGET_DIR || mkdir -p $TARGET_DIR
pushd $KERNEL_DIR
package_check ${CROSS_COMPILE}gcc
package_check make_ext4fs
build
build_modules
if $BUILD_KERNEL_HEADERS; then
build_kernel_header
fi
install_output
gen_version_info
popd