Files
GKI-build/build.sh
2025-09-10 12:03:24 +08:00

117 lines
3.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 设置终端颜色变量(红、绿、黄、白、青)
R="$(printf '\033[1;31m')" # 红色
G="$(printf '\033[1;32m')" # 绿色
Y="$(printf '\033[1;33m')" # 黄色
W="$(printf '\033[1;37m')" # 白色
C="$(printf '\033[1;36m')" # 青色
# 内核源码根目录(当前工作目录)
export KERNEL_DIR=$(pwd)
# LTOLink Time Optimization模式可由外部传入none / thin / full
export LTO=${LTO}
# 内核 defconfig 文件(默认配置文件)
export KERNEL_DEFCONFIG=config_defconfig
# 编译输出目录,避免污染源码目录
export OUT=out
# 工具链路径(根据环境自行调整)
export CLANG_PATH=/home/dich/kernel/clang-r487747c
export GCC64_PATH=/home/dich/kernel/aarch64-linux-android-4.9
export GCC32_PATH=/home/dich/kernel/arm-linux-androideabi-4.9
# 添加 Clang 工具链到 PATH
export PATH=${CLANG_PATH}/bin:${PATH}
# 指定目标架构
export ARCH=arm64
export SUBARCH=arm64
# 仅使用 Clang 编译所需配置
export LLVM=1
export BUILD_INITRAMFS=1
# 编译线程数(可通过参数覆盖),默认 32 线程
# 使用示例:./build.sh 8
TH_COUNT=32
# 编译所需基础参数
export DEF_ARGS="O=${OUT} \
ARCH=${ARCH} \
CROSS_COMPILE=aarch64-linux-gnu- \
CROSS_COMPILE_COMPAT=arm-linux-gnueabi- \
CC=${CLANG_PATH}/bin/clang \
AR=${CLANG_PATH}/bin/llvm-ar \
NM=${CLANG_PATH}/bin/llvm-nm \
LD=${CLANG_PATH}/bin/ld.lld \
HOSTCC=${CLANG_PATH}/bin/clang \
HOSTCXX=${CLANG_PATH}/bin/clang++ \
OBJCOPY=${CLANG_PATH}/bin/llvm-objcopy \
OBJDUMP=${CLANG_PATH}/bin/llvm-objdump \
READELF=${CLANG_PATH}/bin/llvm-readelf \
OBJSIZE=${CLANG_PATH}/bin/llvm-size \
STRIP=${CLANG_PATH}/bin/llvm-strip \
LLVM_IAS=1 \
LLVM=1"
# 最终编译参数:多线程 + 基础参数
export BUILD_ARGS="-j${TH_COUNT} ${DEF_ARGS}"
echo "=============== Make defconfig ==============="
# 生成 defconfig 配置文件
make ${DEF_ARGS} ${KERNEL_DEFCONFIG}
# 如果 make defconfig 失败则退出
if [[ "0" != "$?" ]]; then
echo -e ">>> ${R}make defconfig error, 出错!"
exit 1
fi
# 处理 LTO 配置(仅支持 none/thin/full 三种模式)
if [ "${LTO}" = "none" -o "${LTO}" = "thin" -o "${LTO}" = "full" ]; then
echo "========================================================"
echo " Modifying LTO mode to '${LTO}'"
set -x # 打印执行的命令,便于调试
if [ "${LTO}" = "none" ]; then
${KERNEL_DIR}/scripts/config --file ${OUT}/.config \
-d LTO_CLANG \
-e LTO_NONE \
-d LTO_CLANG_THIN \
-d LTO_CLANG_FULL \
-d THINLTO
elif [ "${LTO}" = "thin" ]; then
# thin LTO 模式(某些内核可能不支持)
${KERNEL_DIR}/scripts/config --file ${OUT}/.config \
-e LTO_CLANG \
-d LTO_NONE \
-e LTO_CLANG_THIN \
-d LTO_CLANG_FULL \
-e THINLTO
elif [ "${LTO}" = "full" ]; then
# full LTO 模式
${KERNEL_DIR}/scripts/config --file ${OUT}/.config \
-e LTO_CLANG \
-d LTO_NONE \
-d LTO_CLANG_THIN \
-e LTO_CLANG_FULL \
-d THINLTO
fi
set +x # 关闭命令打印
elif [ -n "${LTO}" ]; then
echo "LTO= 必须是 'none', 'thin' 或 'full' 之一。"
exit 1
fi
echo "=============== Make Kernel ==============="
# 开始编译内核
make ${BUILD_ARGS}
if [[ "0" != "$?" ]]; then
echo ">>> ${R}build kernel error, 构建失败!"
exit 1
fi
echo ">>> ${G}build Kernel 成功"
exit 0