blob: 516dbbe1d85b4863e2d062afccdd0b7b25bb4727 [file] [log] [blame]
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -07001#!/bin/bash -xE
2
Prakruthi Deepak Heraguf334c122020-07-13 20:36:22 -07003# Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -07004# Not a Contribution.
5#
6# Copyright (C) 2019 The Android Open Source Project
7#
8# Licensed under the Apache License, Version 2.0 (the "License");
9# you may not use this file except in compliance with the License.
10# You may obtain a copy of the License at
11#
12# http://www.apache.org/licenses/LICENSE-2.0
13#
14# Unless required by applicable law or agreed to in writing, software
15# distributed under the License is distributed on an "AS IS" BASIS,
16# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17# See the License for the specific language governing permissions and
18# limitations under the License.
19
20# Usage:
21# build/build.sh <make options>*
22#
23# The kernel is built in ${COMMON_OUT_DIR}/${KERNEL_DIR}.
24
25set -e
26
27export ROOT_DIR=$(readlink -f $(dirname $0)/../../..)
28export MAKE_ARGS=$@
29export COMMON_OUT_DIR=$(readlink -m ${OUT_DIR:-${ROOT_DIR}/out/${BRANCH}})
30export OUT_DIR=$(readlink -m ${COMMON_OUT_DIR})
31export MODULES_STAGING_DIR=$(readlink -m ${COMMON_OUT_DIR}/staging)
32export KERNEL_PREBUILT_DIR=$(readlink -m ${KERNEL_DIR}/../ship_prebuilt)
33export MODULES_PRIVATE_DIR=$(readlink -m ${COMMON_OUT_DIR}/private)
34export DIST_DIR=$(readlink -m ${DIST_DIR:-${COMMON_OUT_DIR}/dist})
Raghavendra Rao Anantaebec6142020-04-03 19:55:31 -070035export UNSTRIPPED_DIR=${ROOT_DIR}/${KERNEL_MODULES_OUT}/unstripped
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -070036export CLANG_TRIPLE CROSS_COMPILE CROSS_COMPILE_ARM32 ARCH SUBARCH
37
38#Setting up for build
39PREBUILT_KERNEL_IMAGE=$(basename ${TARGET_PREBUILT_INT_KERNEL})
40IMAGE_FILE_PATH=arch/${ARCH}/boot
41KERNEL_GEN_HEADERS=include
42ARCH_GEN_HEADERS=arch/${ARCH}/include
43ARCH_GEN_HEADERS_LOC=arch/${ARCH}
44KERNEL_SCRIPTS=scripts
45FILES="
46vmlinux
47System.map
48"
49PRIMARY_KERN_BINS=${KERNEL_PREBUILT_DIR}/primary_kernel
50SECONDARY_KERN_BINS=${KERNEL_PREBUILT_DIR}/secondary_kernel
51KERN_SHA1_LOC=${KERNEL_PREBUILT_DIR}/kernel_sha1.txt
52
53#defconfig
54make_defconfig()
55{
56 if [ -z "${SKIP_DEFCONFIG}" ] ; then
57 echo "======================"
58 echo "Building defconfig"
59 set -x
60 (cd ${KERNEL_DIR} && \
Jeevan Shriram10862162020-01-22 13:23:11 -080061 ${MAKE_PATH}make O=${OUT_DIR} ${MAKE_ARGS} HOSTCFLAGS="${TARGET_INCLUDES}" HOSTLDFLAGS="${TARGET_LINCLUDES}" ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} ${DEFCONFIG})
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -070062 set +x
63 fi
64}
65
66#Install headers
67headers_install()
68{
69 echo "======================"
70 echo "Installing kernel headers"
71 set -x
72 (cd ${OUT_DIR} && \
Jeevan Shriram10862162020-01-22 13:23:11 -080073 ${MAKE_PATH}make HOSTCFLAGS="${TARGET_INCLUDES}" HOSTLDFLAGS="${TARGET_LINCLUDES}" ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} O=${OUT_DIR} ${CC_ARG} ${MAKE_ARGS} headers_install)
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -070074 set +x
75}
76
77# Building Kernel
78build_kernel()
79{
80 echo "======================"
81 echo "Building kernel"
82 set -x
Shadab Naseemd5867d52021-03-23 20:57:38 +053083 if [ -f "${ROOT_DIR}/prebuilts/build-tools/linux-x86/bin/toybox" ]; then
84 NCORES=$(${ROOT_DIR}/prebuilts/build-tools/linux-x86/bin/toybox nproc)
85 else
86 NCORES=8
87 fi
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -070088 (cd ${OUT_DIR} && \
liquan.zhou8d1798f2023-05-22 19:45:10 +080089 ${MAKE_PATH}make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} HOSTCFLAGS="${TARGET_INCLUDES}" HOSTLDFLAGS="${TARGET_LINCLUDES}" O=${OUT_DIR} ${CC_ARG} ${MAKE_ARGS} -j${NCORES})
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -070090 set +x
91}
92
93# Modules Install
94modules_install()
95{
96 echo "======================"
97 echo "Installing kernel modules"
98 rm -rf ${MODULES_STAGING_DIR}
99 mkdir -p ${MODULES_STAGING_DIR}
100 set -x
101 (cd ${OUT_DIR} && \
Jeevan Shriram10862162020-01-22 13:23:11 -0800102 ${MAKE_PATH}make O=${OUT_DIR} ${CC_ARG} INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=${MODULES_STAGING_DIR} ${MAKE_ARGS} modules_install)
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700103 set +x
104}
105
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800106
107archive_kernel_modules()
108{
109 echo "======================"
110 pushd ${KERNEL_MODULES_OUT}
111
112 # Zip the vendor-ramdisk kernel modules
113 FINAL_RAMDISK_KERNEL_MODULES=""
114 for MODULE in ${VENDOR_RAMDISK_KERNEL_MODULES}; do
115 if [ -f "${MODULE}" ]; then
116 FINAL_RAMDISK_KERNEL_MODULES="${FINAL_RAMDISK_KERNEL_MODULES} ${MODULE}"
117 fi
118 done
119
120 echo "Archiving vendor ramdisk kernel modules: "
121 echo ${FINAL_RAMDISK_KERNEL_MODULES}
122
123 if [ ! -z "${FINAL_RAMDISK_KERNEL_MODULES}" ]; then
124 zip -rq ${VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE} ${FINAL_RAMDISK_KERNEL_MODULES}
125 fi
126
127 # Filter-out the modules in vendor-ramdisk and zip the vendor kernel modules
128 VENDOR_KERNEL_MODULES=`ls *.ko`
129 for MODULE in ${FINAL_RAMDISK_KERNEL_MODULES}; do
130 VENDOR_KERNEL_MODULES=`echo ${VENDOR_KERNEL_MODULES} | sed "s/${MODULE}//g"`
131 done
132
133 echo "Archiving vendor kernel modules: "
134 echo ${VENDOR_KERNEL_MODULES}
135
Prakruthi Deepak Heraguf334c122020-07-13 20:36:22 -0700136 # Also package the modules.blocklist file
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800137 set -x
Prakruthi Deepak Heraguf334c122020-07-13 20:36:22 -0700138 BLOCKLIST_FILE=""
139 if [ -f "modules.blocklist" ]; then
140 BLOCKLIST_FILE="modules.blocklist"
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800141 fi
142
Prakruthi Deepak Heraguf334c122020-07-13 20:36:22 -0700143 zip -rq ${VENDOR_KERNEL_MODULES_ARCHIVE} ${VENDOR_KERNEL_MODULES} ${BLOCKLIST_FILE}
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800144 set +x
145
146 popd
147}
148
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700149copy_modules_to_prebuilt()
150{
151 PREBUILT_OUT=$1
152
Raghavendra Rao Ananta822f8202020-03-12 22:56:37 -0700153 # Clean the DLKM directory to remove stale modules
Raghavendra Rao Ananta163986e2020-07-28 15:19:41 -0700154 rm -rf ${KERNEL_MODULES_OUT}/*.ko
155 rm -rf ${KERNEL_MODULES_OUT}/*.zip
Raghavendra Rao Ananta822f8202020-03-12 22:56:37 -0700156
157 mkdir -p ${KERNEL_MODULES_OUT}
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700158
159 MODULES=$(find ${MODULES_STAGING_DIR} -type f -name "*.ko")
160 if [ -n "${MODULES}" ]; then
161 echo "======================"
162 echo " Copying modules files"
163 for FILE in ${MODULES}; do
164 echo "${FILE#${KERNEL_MODULES_OUT}/}"
165 cp -p ${FILE} ${KERNEL_MODULES_OUT}
166
167 # Copy for prebuilt
168 if [ ! -e ${PREBUILT_OUT}/${KERNEL_MODULES_OUT} ]; then
169 mkdir -p ${PREBUILT_OUT}/${KERNEL_MODULES_OUT}
170 fi
171 cp -p ${FILE} ${PREBUILT_OUT}/${KERNEL_MODULES_OUT}
172 done
173 fi
174
175 echo "Copying module signing certificate into prebuilt"
176 if [[ ! -e ${PREBUILT_OUT}/certs ]]; then
177 mkdir -p ${PREBUILT_OUT}/certs
178 fi
179 cp -p ${OUT_DIR}/certs/*.* ${PREBUILT_OUT}/certs/
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800180
Prakruthi Deepak Heraguf334c122020-07-13 20:36:22 -0700181 # Copy the modules.blocklist file
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800182 set -x
Prakruthi Deepak Heraguf334c122020-07-13 20:36:22 -0700183 BLOCKLIST_FILE=${PWD}/device/qcom/kernelscripts/modules_blocklist/modules.blocklist.${TARGET_PRODUCT}
184 if [ -f "${BLOCKLIST_FILE}" ]; then
185 cp ${BLOCKLIST_FILE} ${KERNEL_MODULES_OUT}/modules.blocklist
Prakruthi Deepak Heragu9451cdc2020-07-13 21:55:22 -0700186 sed -i -e '/blocklist/ s/-/_/g' ${KERNEL_MODULES_OUT}/modules.blocklist
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800187 fi
188 set +x
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700189}
190
191copy_all_to_prebuilt()
192{
193 PREBUILT_OUT=$1
194 echo ${PREBUILT_OUT}
195
196 if [[ ! -e ${PREBUILT_OUT} ]]; then
197 mkdir -p ${PREBUILT_OUT}
198 fi
199
200 copy_modules_to_prebuilt ${PREBUILT_OUT}
201
202 #copy necessary files from the out directory
203 echo "============="
204 echo "Copying files to prebuilt"
205 for FILE in ${FILES}; do
206 if [ -f ${OUT_DIR}/${FILE} ]; then
207 # Copy for prebuilt
208 echo "$FILE ${PREBUILT_OUT}"
209 cp -p ${OUT_DIR}/${FILE} ${PREBUILT_OUT}/
210 echo $FILE copied to ${PREBUILT_OUT}
211 else
212 echo "$FILE does not exist, skipping"
213 fi
214 done
215
216 #copy kernel image
217 echo "============="
218 echo "Copying kernel image to prebuilt"
219 if [ ! -e ${PREBUILT_OUT}/${IMAGE_FILE_PATH} ]; then
220 mkdir -p ${PREBUILT_OUT}/${IMAGE_FILE_PATH}
221 fi
222 cp -p ${OUT_DIR}/${IMAGE_FILE_PATH}/${PREBUILT_KERNEL_IMAGE} ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/${PREBUILT_KERNEL_IMAGE}
223
224 #copy dtbo images to prebuilt
225 echo "============="
226 echo "Copying target dtb/dtbo files to prebuilt"
android-t2243da0e2022-11-12 15:56:00 +0800227 if [ ! -e ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT} ]; then
228 mkdir -p ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700229 fi
android-t2243da0e2022-11-12 15:56:00 +0800230 cp -p -r ${OUT_DIR}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/*.dtb ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700231
android-t2243da0e2022-11-12 15:56:00 +0800232 if [ -f ${OUT_DIR}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/*.dtbo ]; then
233 cp -p -r ${OUT_DIR}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/*.dtbo ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700234 fi
235
236 #copy arch generated headers
237 echo "============="
238 echo "Copying arch-specific generated headers to prebuilt"
239 cp -p -r ${OUT_DIR}/${ARCH_GEN_HEADERS} ${PREBUILT_OUT}/${ARCH_GEN_HEADERS_LOC}
240
241 #copy kernel generated headers
242 echo "============="
243 echo "Copying kernel generated headers to prebuilt"
244 cp -p -r ${OUT_DIR}/${KERNEL_GEN_HEADERS} ${PREBUILT_OUT}
245
246 #copy userspace facing headers
247 echo "============"
248 echo "Copying userspace headers to prebuilt"
249 mkdir -p ${PREBUILT_OUT}/usr
250 cp -p -r ${KERNEL_HEADERS_INSTALL}/include ${PREBUILT_OUT}/usr
251
252 #copy kernel scripts
253 echo "============"
254 echo "Copying kernel scripts to prebuilt"
255 cp -p -r ${OUT_DIR}/${KERNEL_SCRIPTS} ${PREBUILT_OUT}
256}
257
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700258copy_from_prebuilt()
259{
260 PREBUILT_OUT=$1
261 cd ${ROOT_DIR}
262
263 if [ ! -e ${OUT_DIR} ]; then
264 mkdir -p ${OUT_DIR}
265 fi
266
267 #Copy userspace headers
268 echo "============"
269 echo "Copying userspace headers from prebuilt"
270 mkdir -p ${KERNEL_HEADERS_INSTALL}
271 cp -p -r ${PREBUILT_OUT}/usr/include ${ROOT_DIR}/${KERNEL_HEADERS_INSTALL}
272
273 #Copy files, such as System.map, vmlinux, etc
274 echo "============"
275 echo "Copying kernel files from prebuilt"
276 cd ${PREBUILT_OUT}
277 for FILE in ${FILES}; do
278 if [ -f ${PREBUILT_OUT}/$FILE ]; then
279 # Copy for prebuilt
280 echo " $FILE ${PREBUILT_OUT}"
281 echo ${PREBUILT_OUT}/${FILE}
282 cp -p ${PREBUILT_OUT}/${FILE} ${OUT_DIR}/
283 echo $FILE copied to ${PREBUILT_OUT}
284 else
285 echo "$FILE does not exist, skipping"
286 fi
287 done
288
289 #copy kernel image
290 echo "============"
291 echo "Copying kernel image from prebuilt"
292 if [ ! -e ${OUT_DIR}/${IMAGE_FILE_PATH} ]; then
293 mkdir -p ${OUT_DIR}/${IMAGE_FILE_PATH}
294 fi
295 cp -p ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/${PREBUILT_KERNEL_IMAGE} ${OUT_DIR}/${IMAGE_FILE_PATH}/${PREBUILT_KERNEL_IMAGE}
296
297 #copy dtbo images from prebuilt
298 echo "============="
299 echo "Copying dtb/dtbo files from prebuilt"
android-t2243da0e2022-11-12 15:56:00 +0800300 if [ ! -e ${OUT_DIR}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT} ]; then
301 mkdir -p ${OUT_DIR}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700302 fi
android-t2243da0e2022-11-12 15:56:00 +0800303 cp -p -r ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/*.dtb ${OUT_DIR}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/
304 cp -p -r ${PREBUILT_OUT}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/*.dtbo ${OUT_DIR}/${IMAGE_FILE_PATH}/dts/vendor/${TARGET_PRODUCT}/
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700305
306 #copy arch generated headers, and kernel generated headers
307 echo "============"
308 echo "Copying arch-specific generated headers from prebuilt"
309 cp -p -r ${PREBUILT_OUT}/${ARCH_GEN_HEADERS} ${OUT_DIR}/${ARCH_GEN_HEADERS_LOC}
310 echo "============"
311 echo "Copying kernel generated headers from prebuilt"
312 cp -p -r ${PREBUILT_OUT}/${KERNEL_GEN_HEADERS} ${OUT_DIR}
313
314 #copy modules
315 echo "============"
316 echo "Copying kernel modules from prebuilt"
317 cd ${ROOT_DIR}
318 MODULES=$(find ${PREBUILT_OUT} -type f -name "*.ko")
319 if [ ! -e ${KERNEL_MODULES_OUT} ]; then
320 mkdir -p ${KERNEL_MODULES_OUT}
321 fi
322 for FILE in ${MODULES}; do
323 echo "Copy ${FILE#${KERNEL_MODULES_OUT}/}"
324 cp -p ${FILE} ${KERNEL_MODULES_OUT}
325 done
326
327 #copy scripts directory
328 echo "============"
329 echo "Copying kernel scripts from prebuilt"
330 cp -p -r ${PREBUILT_OUT}/${KERNEL_SCRIPTS} ${OUT_DIR}
331
332 echo "Copying sign certificates from prebuilt"
333 if [[ ! -e ${OUT_DIR}/certs ]]; then
334 mkdir -p ${OUT_DIR}/certs
335 fi
336 cp -p -r ${PREBUILT_OUT}/certs ${OUT_DIR}
337
338}
339
Raghavendra Rao Anantaebec6142020-04-03 19:55:31 -0700340save_unstripped_modules()
341{
342 echo "======================"
343 echo "Creating a copy of unstripped modules"
344 rm -rf ${UNSTRIPPED_DIR}
345 mkdir -p ${UNSTRIPPED_DIR}
346
347 set -x
348
349 (cd ${OUT_DIR} && \
350 ${MAKE_PATH}make O=${OUT_DIR} ${CC_ARG} INSTALL_MOD_PATH=${UNSTRIPPED_DIR} ${MAKE_ARGS} modules_install)
351
352 MODULES=$(find ${UNSTRIPPED_DIR} -type f -name "*.ko")
353 for MODULE in ${MODULES}; do
Prakruthi Deepak Heragu4609a472020-04-15 12:53:36 -0700354 # Replace all hyphens in module name with underscores
355 MODULE_NAME=$(basename ${MODULE})
356 CORRECTED_NAME=$(echo "${MODULE_NAME//-/$'_'}")
Raghavendra Rao Anantaebec6142020-04-03 19:55:31 -0700357 cp -p ${MODULE} ${UNSTRIPPED_DIR}
Prakruthi Deepak Heragu4609a472020-04-15 12:53:36 -0700358 # Rename all modules with hyphens to names wth underscores
359 # As t32 expects module names with underscores to match
360 # symbols of the modules actually loaded, rename and save
361 # modules in unstripped folder for debugging
362 if [ ${MODULE_NAME} != ${CORRECTED_NAME} ]; then
363 mv ${UNSTRIPPED_DIR}/${MODULE_NAME} ${UNSTRIPPED_DIR}/${CORRECTED_NAME}
364 fi
Raghavendra Rao Anantaebec6142020-04-03 19:55:31 -0700365 done
366
367 # Remove the /lib/modules/$(uname -r) hierarchy
368 rm -rf ${UNSTRIPPED_DIR}/lib
369
370 set +x
371}
372
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700373#script starts executing here
374if [ -n "${CC}" ]; then
375 CC_ARG="CC=${CC}"
376fi
377
378#choose between secondary and primary kernel image
379if [[ ${DEFCONFIG} == *"perf_defconfig" ]]; then
380 KERNEL_BINS=${SECONDARY_KERN_BINS}
381else
382 KERNEL_BINS=${PRIMARY_KERN_BINS}
383fi
384
385#use prebuilts if we want to use them, and they are available
386if [ ! -z ${USE_PREBUILT_KERNEL} ] && [ -d ${KERNEL_BINS} ]; then
387 make_defconfig
388 copy_from_prebuilt ${KERNEL_BINS}
389 exit 0
390fi
391
392#use kernel source for building
Raghavendra Rao Ananta66e09432020-05-31 18:14:05 -0700393if [ "${HEADERS_INSTALL}" -ne "0" ]; then
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700394 make_defconfig
395 headers_install
396else
Yogesh Lal883cc452021-01-18 20:17:11 -0800397 make_defconfig
398 headers_install
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700399 build_kernel
400 modules_install
401 copy_all_to_prebuilt ${KERNEL_BINS}
Raghavendra Rao Ananta5b25c802019-11-13 22:11:15 -0800402 archive_kernel_modules
Raghavendra Rao Anantaebec6142020-04-03 19:55:31 -0700403 save_unstripped_modules
Raghavendra Rao Ananta233f7082019-09-18 16:50:26 -0700404fi
405
406exit 0