mirror of
https://github.com/Dichgrem/GKI-build.git
synced 2025-12-16 13:42:00 -05:00
fix:build.sh
This commit is contained in:
143
build.sh
143
build.sh
@@ -1,49 +1,116 @@
|
|||||||
#!/bin/bash
|
#!/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')" # 青色
|
||||||
|
|
||||||
starttime=$(date +'%Y-%m-%d %H:%M:%S')
|
# 内核源码根目录(当前工作目录)
|
||||||
|
export KERNEL_DIR=$(pwd)
|
||||||
|
|
||||||
|
# LTO(Link 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 ARCH=arm64
|
||||||
export SUBARCH=arm64
|
export SUBARCH=arm64
|
||||||
export KCONFIG_CONFIG=$PWD/myconfig
|
|
||||||
|
|
||||||
# 设置工具链路径变量
|
# 仅使用 Clang 编译所需配置
|
||||||
export CLANG_PATH=~/kernel/toolchains/clang-21/bin
|
export LLVM=1
|
||||||
export PATH=$CLANG_PATH:$PATH
|
export BUILD_INITRAMFS=1
|
||||||
|
|
||||||
# 清理构建目录
|
# 编译线程数(可通过参数覆盖),默认 32 线程
|
||||||
rm -rf out && mkdir -p out
|
# 使用示例:./build.sh 8
|
||||||
|
TH_COUNT=32
|
||||||
|
|
||||||
# 生成默认 config
|
# 编译所需基础参数
|
||||||
make O=out KCONFIG_CONFIG=$KCONFIG_CONFIG olddefconfig
|
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"
|
||||||
|
|
||||||
# 编译内核
|
# 最终编译参数:多线程 + 基础参数
|
||||||
make -j$(nproc) O=out \
|
export BUILD_ARGS="-j${TH_COUNT} ${DEF_ARGS}"
|
||||||
LLVM=1 \
|
|
||||||
LTO=thin \
|
|
||||||
WERROR=0 \
|
|
||||||
KBUILD_NO_WERROR=1 \
|
|
||||||
CC=clang \
|
|
||||||
AR=llvm-ar \
|
|
||||||
LD=ld.lld \
|
|
||||||
NM=llvm-nm \
|
|
||||||
OBJCOPY=llvm-objcopy \
|
|
||||||
OBJDUMP=llvm-objdump \
|
|
||||||
STRIP=llvm-strip \
|
|
||||||
HOSTCC=clang \
|
|
||||||
HOSTCXX=clang++ \
|
|
||||||
CROSS_COMPILE= \
|
|
||||||
CROSS_COMPILE_ARM32=arm-linux-androideabi- \
|
|
||||||
KCFLAGS="--target=aarch64-linux-gnu -O3 -pipe -Wno-error" \
|
|
||||||
KCPPFLAGS="-DCONFIG_CC_OPTIMIZE_FOR_PERFORMANCE" \
|
|
||||||
HOSTCFLAGS="-O3 -pipe -Wno-error" \
|
|
||||||
HOSTCXXFLAGS="-O3 -pipe -Wno-error" \
|
|
||||||
2>&1 | tee out/error.log
|
|
||||||
|
|
||||||
tail -n 100 out/error.log
|
echo "=============== Make defconfig ==============="
|
||||||
ls -la out/arch/arm64/boot/
|
# 生成 defconfig 配置文件
|
||||||
ls -la out/vmlinux
|
make ${DEF_ARGS} ${KERNEL_DEFCONFIG}
|
||||||
|
# 如果 make defconfig 失败则退出
|
||||||
|
if [[ "0" != "$?" ]]; then
|
||||||
|
echo -e ">>> ${R}make defconfig error, 出错!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# 记录结束时间
|
# 处理 LTO 配置(仅支持 none/thin/full 三种模式)
|
||||||
endtime=$(date +'%Y-%m-%d %H:%M:%S')
|
if [ "${LTO}" = "none" -o "${LTO}" = "thin" -o "${LTO}" = "full" ]; then
|
||||||
echo "Build started at: $starttime"
|
echo "========================================================"
|
||||||
echo "Build finished at: $endtime"
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user