Script: support build 32bit android kernel without build.sh [1/1]
PD#SWPL-126348
Problem:
build.sh file will remove in the future kernel version. we can not use
it to build with 32bit
Solution:
support build 32bit android kernel with clang of gcc
Verify:
local
Change-Id: I0774fc57aaac2555b8ddc99c74997204ba6763a9
Signed-off-by: Dezhen Wang <dezhen.wang@amlogic.com>
diff --git a/amlogic_utils.sh b/amlogic_utils.sh
index b6f84b1..b7091dd 100644
--- a/amlogic_utils.sh
+++ b/amlogic_utils.sh
@@ -207,10 +207,12 @@
rm ${temp_file}
}
-
export -f prepare_module_build
function extra_cmds() {
+ echo "========================================================"
+ echo " Running extra build command(s):"
+
if [[ ${AUTO_ADD_EXT_SYMBOLS} -eq "1" ]]; then
for ext_module in ${EXT_MODULES}; do
sed -i "/# auto add KBUILD_EXTRA_SYMBOLS start/,/# auto add KBUILD_EXTRA_SYMBOLS end/d" ${ext_module}/Makefile
@@ -313,7 +315,6 @@
find ${module_path} -type f -name "*.ko" -exec cp {} ${DIST_DIR} \;
done
}
-
export -f extra_cmds
function bazel_extra_cmds() {
@@ -1230,7 +1231,6 @@
exit
fi
}
-
export -f build_part_of_kernel
function export_env_variable () {
@@ -1244,7 +1244,6 @@
echo FULL_KERNEL_VERSION=${FULL_KERNEL_VERSION} BAZEL=${BAZEL}
echo MENUCONFIG=${MENUCONFIG} BASICCONFIG=${BASICCONFIG} IMAGE=${IMAGE} MODULES=${MODULES} DTB_BUILD=${DTB_BUILD}
}
-
export -f export_env_variable
function handle_input_parameters () {
@@ -1380,7 +1379,6 @@
esac
done
}
-
export -f handle_input_parameters
function set_default_parameters () {
@@ -1460,7 +1458,6 @@
OUT_DIR_SUFFIX=
fi
}
-
export -f set_default_parameters
function auto_patch_to_common_dir () {
@@ -1476,11 +1473,8 @@
exit
fi
}
-
export -f auto_patch_to_common_dir
-
-# the follow functions are used for smarthome
function handle_input_parameters_for_smarthome () {
VA=
ARGS=()
@@ -1571,7 +1565,7 @@
OUTDIR=${ROOT_DIR}/out/kernel-5.15-64
elif [[ $ARCH == arm ]]; then
OUTDIR=${ROOT_DIR}/out/kernel-5.15-32
- tool_args+=("LOADADDR=0x208000")
+ tool_args+=("LOADADDR=0x108000")
elif [[ $ARCH == riscv ]]; then
OUTDIR=${ROOT_DIR}/out/riscv-kernel-5.15-64
fi
@@ -1623,13 +1617,12 @@
set -x
make ARCH=${ARCH} -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${DEFCONFIG}
make ARCH=${ARCH} -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} savedefconfig
- rm ${KERNEL_DIR}/arch/${ARCH}/configs/${DEFCONFIG}
+ rm ${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/arch/${ARCH}/configs/${DEFCONFIG}
cp -f ${OUT_DIR}/defconfig ${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/arch/${ARCH}/configs/${DEFCONFIG}
set +x
exit
fi
}
-
export -f savedefconfig_cmd_for_smarthome
function only_build_dtb_for_smarthome () {
@@ -1641,7 +1634,6 @@
exit
fi
}
-
export -f only_build_dtb_for_smarthome
function make_menuconfig_cmd_for_smarthome () {
@@ -1653,7 +1645,6 @@
exit
fi
}
-
export -f make_menuconfig_cmd_for_smarthome
function build_kernel_for_different_cpu_architecture () {
@@ -1665,7 +1656,6 @@
make ARCH=arm64 -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} modules -j12 &&
make ARCH=arm64 -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} INSTALL_MOD_PATH=${MODULES_STAGING_DIR} INSTALL_MOD_STRIP=1 modules_install -j12 &&
make ARCH=arm64 -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} dtbs -j12 || exit
- rm ${ROOT_DIR}/${KERNEL_DIR}/arch/arm64/configs/${DEFCONFIG}
elif [[ $ARCH == arm ]]; then
make ARCH=arm -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} ${DEFCONFIG}
make ARCH=arm -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} headers_install &&
@@ -1673,7 +1663,6 @@
make ARCH=arm -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} modules -j12 &&
make ARCH=arm -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} INSTALL_MOD_PATH=${MODULES_STAGING_DIR} INSTALL_MOD_STRIP=1 modules_install -j12 &&
make ARCH=arm -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} dtbs -j12 || exit
- rm ${ROOT_DIR}/${KERNEL_DIR}/arch/arm/configs/${DEFCONFIG}
elif [[ $ARCH == riscv ]]; then
make ARCH=riscv -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} ${DEFCONFIG}
make ARCH=riscv -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} headers_install &&
@@ -1681,7 +1670,6 @@
make ARCH=riscv -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} modules -j12 &&
make ARCH=riscv -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} INSTALL_MOD_PATH=${MODULES_STAGING_DIR} modules_install -j12 &&
make ARCH=riscv -C ${ROOT_DIR}/${KERNEL_DIR} O=${OUT_DIR} ${TOOL_ARGS} dtbs -j12 || exit
- rm ${ROOT_DIR}/${KERNEL_DIR}/arch/riscv/configs/${DEFCONFIG}
fi
cp ${OUT_DIR}/arch/${ARCH}/boot/Image* ${DIST_DIR}
cp ${OUT_DIR}/arch/${ARCH}/boot/uImage* ${DIST_DIR}
@@ -1689,7 +1677,6 @@
cp ${OUT_DIR}/vmlinux ${DIST_DIR}
set +x
}
-
export -f build_kernel_for_different_cpu_architecture
function build_ext_modules() {
@@ -1709,10 +1696,24 @@
set +x
done
}
-
export -f build_ext_modules
function copy_modules_and_rebuild_rootfs_for_smarthome () {
+
+ copy_modules_files_to_dist_dir
+
+ if [ -f ${ROOT_DIR}/${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/rootfs_base.cpio.gz.uboot ]; then
+ echo "========================================================"
+ echo "Rebuild rootfs in order to install modules!"
+ rebuild_rootfs ${ARCH}
+ echo "Build success!"
+ else
+ echo "There's no file ${ROOT_DIR}/${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/rootfs_base.cpio.gz.uboot, so don't rebuild rootfs!"
+ fi
+}
+export -f copy_modules_and_rebuild_rootfs_for_smarthome
+
+function copy_modules_files_to_dist_dir () {
MODULES=$(find ${MODULES_STAGING_DIR} -type f -name "*.ko")
if [ -n "${MODULES}" ]; then
if [ -n "${IN_KERNEL_MODULES}" -o -n "${EXT_MODULES}" -o -n "${EXT_MODULES_MAKEFILE}" ]; then
@@ -1726,15 +1727,245 @@
tar --transform="s,.*/,," -czf ${DIST_DIR}/${MODULES_ARCHIVE} ${MODULES[@]}
fi
fi
-
- if [ -f ${ROOT_DIR}/${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/rootfs_base.cpio.gz.uboot ]; then
- echo "Rebuild rootfs in order to install modules!"
- rebuild_rootfs ${ARCH}
- echo "Build success!"
- else
- echo "There's no file ${ROOT_DIR}/${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/rootfs_base.cpio.gz.uboot, so don't rebuild rootfs!"
- fi
fi
}
+export -f copy_modules_files_to_dist_dir
-export -f copy_modules_and_rebuild_rootfs_for_smarthome
+function copy_files_to_dist_dir () {
+ echo "========================================================"
+ echo " Copying files"
+ for FILE in ${FILES}; do
+ if [ -f ${OUT_DIR}/${FILE} ]; then
+ echo " $FILE"
+ cp -p ${OUT_DIR}/${FILE} ${DIST_DIR}/
+ elif [[ "${FILE}" =~ \.dtb|\.dtbo ]] && \
+ [ -n "${DTS_EXT_DIR}" ] && [ -f "${OUT_DIR}/${DTS_EXT_DIR}/${FILE}" ] ; then
+ # DTS_EXT_DIR is recalculated before to be relative to KERNEL_DIR
+ echo " $FILE"
+ cp -p "${OUT_DIR}/${DTS_EXT_DIR}/${FILE}" "${DIST_DIR}/"
+ else
+ echo " $FILE is not a file, skipping"
+ fi
+ done
+}
+export -f copy_files_to_dist_dir
+
+function make_dtbo() {
+ if [[ -n "${BUILD_DTBO_IMG}" ]]; then
+ echo "========================================================"
+ echo " Creating dtbo image at ${DIST_DIR}/dtbo.img"
+ (
+ cd ${OUT_DIR}
+ mkdtimg create "${DIST_DIR}"/dtbo.img ${MKDTIMG_FLAGS} ${MKDTIMG_DTBOS}
+ )
+ fi
+}
+export -f make_dtbo
+
+function installing_UAPI_kernel_headers () {
+ if [ -z "${SKIP_CP_KERNEL_HDR}" ]; then
+ echo "========================================================"
+ echo " Installing UAPI kernel headers:"
+ mkdir -p "${KERNEL_UAPI_HEADERS_DIR}/usr"
+ make -C ${OUT_DIR} O=${OUT_DIR} ${TOOL_ARGS} \
+ INSTALL_HDR_PATH="${KERNEL_UAPI_HEADERS_DIR}/usr" "${MAKE_ARGS[@]}" \
+ headers_install
+ # The kernel makefiles create files named ..install.cmd and .install which
+ # are only side products. We don't want those. Let's delete them.
+ find ${KERNEL_UAPI_HEADERS_DIR} \( -name ..install.cmd -o -name .install \) -exec rm '{}' +
+ KERNEL_UAPI_HEADERS_TAR=${DIST_DIR}/kernel-uapi-headers.tar.gz
+ echo " Copying kernel UAPI headers to ${KERNEL_UAPI_HEADERS_TAR}"
+ tar -czf ${KERNEL_UAPI_HEADERS_TAR} --directory=${KERNEL_UAPI_HEADERS_DIR} usr/
+ fi
+}
+export -f installing_UAPI_kernel_headers
+
+function copy_kernel_headers_to_compress () {
+ if [ -z "${SKIP_CP_KERNEL_HDR}" ] ; then
+ echo "========================================================"
+ KERNEL_HEADERS_TAR=${DIST_DIR}/kernel-headers.tar.gz
+ echo " Copying kernel headers to ${KERNEL_HEADERS_TAR}"
+ pushd $ROOT_DIR/$KERNEL_DIR
+ find arch include $OUT_DIR -name *.h -print0 \
+ | tar -czf $KERNEL_HEADERS_TAR \
+ --absolute-names \
+ --dereference \
+ --transform "s,.*$OUT_DIR,," \
+ --transform "s,^,kernel-headers/," \
+ --null -T -
+ popd
+ fi
+}
+export -f copy_kernel_headers_to_compress
+
+function set_default_parameters_for_32bit () {
+ tool_args=()
+ prebuilts_paths=(
+ CLANG_PREBUILT_BIN
+ CLANGTOOLS_PREBUILT_BIN
+ RUST_PREBUILT_BIN
+ LZ4_PREBUILTS_BIN
+ DTC_PREBUILTS_BIN
+ LIBUFDT_PREBUILTS_BIN
+ BUILDTOOLS_PREBUILT_BIN
+ )
+ echo CC_CLANG=$CC_CLANG
+ if [[ $CC_CLANG -eq "1" ]]; then
+ source ${ROOT_DIR}/${KERNEL_DIR}/build.config.common
+ if [[ -n "${LLVM}" ]]; then
+ tool_args+=("LLVM=1")
+ # Reset a bunch of variables that the kernel's top level Makefile does, just
+ # in case someone tries to use these binaries in this script such as in
+ # initramfs generation below.
+ HOSTCC=clang
+ HOSTCXX=clang++
+ CC=clang
+ LD=ld.lld
+ AR=llvm-ar
+ NM=llvm-nm
+ OBJCOPY=llvm-objcopy
+ OBJDUMP=llvm-objdump
+ OBJSIZE=llvm-size
+ READELF=llvm-readelf
+ STRIP=llvm-strip
+ else
+ if [ -n "${HOSTCC}" ]; then
+ tool_args+=("HOSTCC=${HOSTCC}")
+ fi
+
+ if [ -n "${CC}" ]; then
+ tool_args+=("CC=${CC}")
+ if [ -z "${HOSTCC}" ]; then
+ tool_args+=("HOSTCC=${CC}")
+ fi
+ fi
+
+ if [ -n "${LD}" ]; then
+ tool_args+=("LD=${LD}" "HOSTLD=${LD}")
+ fi
+
+ if [ -n "${NM}" ]; then
+ tool_args+=("NM=${NM}")
+ fi
+
+ if [ -n "${OBJCOPY}" ]; then
+ tool_args+=("OBJCOPY=${OBJCOPY}")
+ fi
+ fi
+
+ if [ -n "${DTC}" ]; then
+ tool_args+=("DTC=${DTC}")
+ fi
+ for prebuilt_bin in "${prebuilts_paths[@]}"; do
+ prebuilt_bin=\${${prebuilt_bin}}
+ eval prebuilt_bin="${prebuilt_bin}"
+ if [ -n "${prebuilt_bin}" ]; then
+ PATH=${PATH//"${ROOT_DIR}\/${prebuilt_bin}:"}
+ PATH=${ROOT_DIR}/${prebuilt_bin}:${PATH} # add the clang tool to env PATH
+ fi
+ done
+ export PATH
+ elif [[ -n $CROSS_COMPILE_TOOL ]]; then
+ export CROSS_COMPILE=${CROSS_COMPILE_TOOL}
+ fi
+
+ # Have host compiler use LLD and compiler-rt.
+ LLD_COMPILER_RT="-fuse-ld=lld --rtlib=compiler-rt"
+ if [[ -n "${NDK_TRIPLE}" ]]; then
+ NDK_DIR=${ROOT_DIR}/prebuilts/ndk-r23
+
+ if [[ ! -d "${NDK_DIR}" ]]; then
+ # Kleaf/Bazel will checkout the ndk to a different directory than
+ # build.sh.
+ NDK_DIR=${ROOT_DIR}/external/prebuilt_ndk
+ if [[ ! -d "${NDK_DIR}" ]]; then
+ echo "ERROR: NDK_TRIPLE set, but unable to find prebuilts/ndk." 1>&2
+ echo "Did you forget to checkout prebuilts/ndk?" 1>&2
+ exit 1
+ fi
+ fi
+ USERCFLAGS="--target=${NDK_TRIPLE} "
+ USERCFLAGS+="--sysroot=${NDK_DIR}/toolchains/llvm/prebuilt/linux-x86_64/sysroot "
+ # Some kernel headers trigger -Wunused-function for unused static functions
+ # with clang; GCC does not warn about unused static inline functions. The
+ # kernel sets __attribute__((maybe_unused)) on such functions when W=1 is
+ # not set.
+ USERCFLAGS+="-Wno-unused-function "
+ # To help debug these flags, consider commenting back in the following, and
+ # add `echo $@ > /tmp/log.txt` and `2>>/tmp/log.txt` to the invocation of $@
+ # in scripts/cc-can-link.sh.
+ #USERCFLAGS+=" -Wl,--verbose -v"
+ # We need to set -fuse-ld=lld for Android's build env since AOSP LLVM's
+ # clang is not configured to use LLD by default, and BFD has been
+ # intentionally removed. This way CC_CAN_LINK can properly link the test in
+ # scripts/cc-can-link.sh.
+ USERLDFLAGS="${LLD_COMPILER_RT} "
+ USERLDFLAGS+="--target=${NDK_TRIPLE} "
+ else
+ USERCFLAGS="--sysroot=/dev/null"
+ fi
+
+ #setting_the_default_output_dir
+ export COMMON_OUT_DIR=$(readlink -m ${OUT_DIR:-${ROOT_DIR}/out${OUT_DIR_SUFFIX}/${BRANCH}})
+ export OUT_DIR=$(readlink -m ${COMMON_OUT_DIR}/${KERNEL_DIR})
+ export DIST_DIR=$(readlink -m ${DIST_DIR:-${COMMON_OUT_DIR}/dist})
+ export UNSTRIPPED_DIR=${DIST_DIR}/unstripped
+ export UNSTRIPPED_MODULES_ARCHIVE=unstripped_modules.tar.gz
+ export MODULES_ARCHIVE=modules.tar.gz
+ export MODULES_STAGING_DIR=$(readlink -m ${COMMON_OUT_DIR}/staging)
+ export MODULES_PRIVATE_DIR=$(readlink -m ${COMMON_OUT_DIR}/private)
+ export KERNEL_UAPI_HEADERS_DIR=$(readlink -m ${COMMON_OUT_DIR}/kernel_uapi_headers)
+ export INITRAMFS_STAGING_DIR=${MODULES_STAGING_DIR}/initramfs_staging
+ export SYSTEM_DLKM_STAGING_DIR=${MODULES_STAGING_DIR}/system_dlkm_staging
+ export VENDOR_DLKM_STAGING_DIR=${MODULES_STAGING_DIR}/vendor_dlkm_staging
+ export MKBOOTIMG_STAGING_DIR="${MODULES_STAGING_DIR}/mkbootimg_staging"
+ export OUT_AMLOGIC_DIR=$(readlink -m ${COMMON_OUT_DIR}/amlogic)
+
+ tool_args+=("LOADADDR=0x108000")
+ tool_args+=("DEPMOD=depmod")
+ TOOL_ARGS="${tool_args[@]}"
+
+ mkdir -p ${OUT_DIR}
+ if [ "${SKIP_RM_OUTDIR}" != "1" ] ; then
+ rm -rf ${COMMON_OUT_DIR}
+ fi
+
+ source ${ROOT_DIR}/build/kernel/build_utils.sh
+
+ DTS_EXT_DIR=${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/arch/${ARCH}/boot/dts/amlogic
+ DTS_EXT_DIR=$(rel_path ${ROOT_DIR}/${DTS_EXT_DIR} ${KERNEL_DIR})
+ export dtstree=${DTS_EXT_DIR}
+ export DTC_INCLUDE=${ROOT_DIR}/${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/include
+
+ EXT_MODULES="
+ ${EXT_MODULES}
+ "
+
+ EXT_MODULES_CONFIG="
+ ${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/scripts/amlogic/ext_modules_config
+ "
+
+ EXT_MODULES_PATH="
+ ${KERNEL_DIR}/${COMMON_DRIVERS_DIR}/scripts/amlogic/ext_modules_path
+ "
+
+ POST_KERNEL_BUILD_CMDS="prepare_module_build"
+ EXTRA_CMDS="extra_cmds"
+
+ IN_KERNEL_MODULES=1
+}
+export -f set_default_parameters_for_32bit
+
+function generating_test_mappings_zip () {
+ echo "========================================================"
+ echo " Generating test_mappings.zip"
+ TEST_MAPPING_FILES=${OUT_DIR}/test_mapping_files.txt
+ find ${ROOT_DIR} -name TEST_MAPPING \
+ -not -path "${ROOT_DIR}/\.git*" \
+ -not -path "${ROOT_DIR}/\.repo*" \
+ -not -path "${ROOT_DIR}/out*" \
+ > ${TEST_MAPPING_FILES}
+ soong_zip -o ${DIST_DIR}/test_mappings.zip -C ${ROOT_DIR} -l ${TEST_MAPPING_FILES}
+}
+export -f generating_test_mappings_zip
+