Files
GKI-build/.github/workflows/build-gki-kernel.yml
2025-06-28 22:24:22 +08:00

237 lines
8.6 KiB
YAML
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.
name: Build Android OnePlus SM8650 Kernel
on:
workflow_dispatch:
jobs:
build-kernel:
runs-on: ubuntu-latest
env:
ARCH: arm64
SUBARCH: arm64
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install dependencies and update GCC
run: |
sudo apt-get update
sudo apt-get install -y \
bc bison build-essential cpio curl flex \
git libncurses-dev libssl-dev \
libelf-dev lzop python3 unzip xz-utils \
zstd rsync ca-certificates wget \
pahole dwarves
# 安装更新的GCC以满足内核版本要求
sudo apt-get install -y gcc-9 g++-9
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90
# 验证GCC版本
gcc --version
- name: Setup directory structure
run: |
# 创建与本地一致的目录结构
mkdir -p $GITHUB_WORKSPACE/kernel/toolchains
mkdir -p $GITHUB_WORKSPACE/kernel/source
mkdir -p $GITHUB_WORKSPACE/kernel/anykernel3
echo "=== Created directory structure ==="
ls -la $GITHUB_WORKSPACE/kernel/
- name: Setup toolchains
run: |
cd $GITHUB_WORKSPACE/kernel
echo "=== 下载 ARM GCC 工具链 ==="
# 下载ARM GCC工具链
git clone --depth=1 \
https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9.git \
./toolchains/gcc-arm-4.9
echo "=== 下载 Clang 工具链 ==="
# 创建 Clang 目录
mkdir -p ./toolchains/clang-14
# 下载 Clang 工具链
cd toolchains
wget -q https://github.com/ZyCromerZ/Clang/releases/download/14.0.6-20240212-release/Clang-14.0.6-20240212.tar.gz
# 检查下载是否成功
if [ ! -f "Clang-14.0.6-20240212.tar.gz" ]; then
echo "Error: Clang 工具链下载失败"
exit 1
fi
echo "=== 解压 Clang 工具链 ==="
# 解压到 clang-14 目录
tar -xzf Clang-14.0.6-20240212.tar.gz -C clang-14
# 检查解压后的目录结构
echo "=== 检查解压后的目录结构 ==="
ls -la clang-14/
# 如果存在嵌套目录,需要调整
if [ -d "clang-14/Clang-14.0.6-20240212" ]; then
echo "检测到嵌套目录,正在调整..."
mv clang-14/Clang-14.0.6-20240212/* clang-14/
rmdir clang-14/Clang-14.0.6-20240212
fi
# 清理下载的压缩包
rm -f Clang-14.0.6-20240212.tar.gz
# 返回 kernel 目录
cd $GITHUB_WORKSPACE/kernel
echo "=== 验证工具链二进制文件 ==="
# 验证关键工具存在
echo "检查 Clang 二进制文件..."
if [ -f "./toolchains/clang-14/bin/clang" ]; then
echo "✓ clang 存在"
ls -la ./toolchains/clang-14/bin/clang
else
echo "✗ clang 不存在,检查目录结构:"
find ./toolchains/clang-14 -name "clang" -type f 2>/dev/null || echo "未找到 clang 二进制文件"
exit 1
fi
echo "检查 aarch64-linux-gnu 工具..."
if ls ./toolchains/clang-14/bin/aarch64-linux-gnu-* 1> /dev/null 2>&1; then
echo "✓ aarch64-linux-gnu 工具存在"
ls -la ./toolchains/clang-14/bin/aarch64-linux-gnu-* | head -3
else
echo "✗ aarch64-linux-gnu 工具不存在"
fi
echo "检查 LLVM 工具..."
if ls ./toolchains/clang-14/bin/llvm-* 1> /dev/null 2>&1; then
echo "✓ LLVM 工具存在"
ls -la ./toolchains/clang-14/bin/llvm-* | head -3
else
echo "✗ LLVM 工具不存在"
fi
echo "检查 ARM GCC 工具..."
if ls ./toolchains/gcc-arm-4.9/bin/arm-linux-androideabi-* 1> /dev/null 2>&1; then
echo "✓ ARM GCC 工具存在"
ls -la ./toolchains/gcc-arm-4.9/bin/arm-linux-androideabi-* | head -3
else
echo "✗ ARM GCC 工具不存在"
fi
echo "=== 最终目录结构 ==="
echo "kernel/"
ls -la ./
echo "kernel/toolchains/"
ls -la ./toolchains/
echo "工具链设置完成 ==="
- name: Clone kernel source
run: |
cd $GITHUB_WORKSPACE/kernel
git clone --depth=1 \
https://github.com/crdroidandroid/android_kernel_oneplus_sm8650.git \
./source/android_kernel_oneplus_sm8650
echo "=== 内核源码目录结构 ==="
echo "kernel/source/"
ls -la ./source/
- name: Copy config to kernel source
run: |
cd $GITHUB_WORKSPACE/kernel
if [ -f "$GITHUB_WORKSPACE/config" ]; then
cp $GITHUB_WORKSPACE/config ./source/android_kernel_oneplus_sm8650/myconfig
echo "Custom config copied"
else
echo "Error: config file not found!"
exit 1
fi
- name: Build kernel
run: |
cd $GITHUB_WORKSPACE/kernel/source/android_kernel_oneplus_sm8650
# 记录开始时间
starttime=$(date +'%Y-%m-%d %H:%M:%S')
echo "Build started at: $starttime"
# 设置环境变量(与你本地脚本完全一致)
export ARCH=arm64
export SUBARCH=arm64
export KCONFIG_CONFIG=$PWD/myconfig
# 设置工具链路径变量(使用相对路径匹配你的本地环境)
CLANG_PATH=$GITHUB_WORKSPACE/kernel/toolchains/clang-14/bin
GCC_ARM_PATH=$GITHUB_WORKSPACE/kernel/toolchains/gcc-arm-4.9/bin
# 验证所有必需的工具
echo "=== Verifying required tools ==="
$CLANG_PATH/clang --version | head -2
$CLANG_PATH/aarch64-linux-gnu-gcc --version | head -1 || echo "aarch64-linux-gnu-gcc not found"
$GCC_ARM_PATH/arm-linux-androideabi-gcc --version | head -1
test -f $CLANG_PATH/ld.lld && echo "ld.lld found" || echo "ld.lld not found"
gcc --version | head -1
echo "================================"
# 清理构建目录
rm -rf out
mkdir -p out
# 生成默认 config与你本地脚本完全一致
make O=out KCONFIG_CONFIG=$KCONFIG_CONFIG olddefconfig
# 编译内核(与你本地脚本完全一致的参数)
make -j$(nproc) O=out WERROR=0 \
KCFLAGS="-Wno-error=frame-larger-than=" \
NM=$CLANG_PATH/llvm-nm \
OBJCOPY=$CLANG_PATH/llvm-objcopy \
LD=$CLANG_PATH/ld.lld \
CROSS_COMPILE=$CLANG_PATH/aarch64-linux-gnu- \
CROSS_COMPILE_ARM32=$GCC_ARM_PATH/arm-linux-androideabi- \
CC=$CLANG_PATH/clang \
AR=$CLANG_PATH/llvm-ar \
OBJDUMP=$CLANG_PATH/llvm-objdump \
STRIP=$CLANG_PATH/llvm-strip \
2>&1 | tee out/error.log
# 记录结束时间
endtime=$(date +'%Y-%m-%d %H:%M:%S')
echo "Build finished at: $endtime"
- name: Check build results
run: |
cd $GITHUB_WORKSPACE/kernel/source/android_kernel_oneplus_sm8650
echo "=== Build Results ==="
if [ -f "out/arch/arm64/boot/Image" ]; then
echo "✅ Kernel build successful!"
ls -la out/arch/arm64/boot/
echo "Image size: $(du -h out/arch/arm64/boot/Image)"
# 检查是否有DTB文件
if ls out/arch/arm64/boot/dts/*/*.dtb 2>/dev/null; then
echo "DTB files found:"
ls -la out/arch/arm64/boot/dts/*/*.dtb | head -5
fi
else
echo "❌ Kernel build failed!"
echo "=== Last 100 lines of error log ==="
tail -100 out/error.log
echo "=== Error summary ==="
grep -i "error\|failed\|stop" out/error.log | tail -10
exit 1
fi
- name: Upload build artifacts
uses: actions/upload-artifact@v4
if: always()
with:
name: kernel-build-${{ github.run_number }}
path: |
kernel/source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/Image*
kernel/source/android_kernel_oneplus_sm8650/out/arch/arm64/boot/dts/*/*.dtb
kernel/source/android_kernel_oneplus_sm8650/out/error.log
kernel/source/android_kernel_oneplus_sm8650/out/.config