Skip to content

Build kernel (KSN) & WIFI A16 for LineageOS 23.0 with vendor module disables #3

Build kernel (KSN) & WIFI A16 for LineageOS 23.0 with vendor module disables

Build kernel (KSN) & WIFI A16 for LineageOS 23.0 with vendor module disables #3

Workflow file for this run

name: Build kernel (KSN) & WIFI A16
on:
workflow_dispatch:
inputs:
kernel_source_url:
description: 'URL of the kernel source repository'
required: true
default: 'https://github.com/LineageOS/android_kernel_oneplus_sm8150'
kernel_branch:
description: 'Branch of the kernel source'
required: true
default: 'lineage-22.1'
kernel_defconfig:
description: 'defconfig file to use'
required: true
default: 'lineage_sm8150_defconfig'
output_name:
description: 'Name of the output.zip'
required: false
default: 'OP7_KSN_wifi'
push:
branches:
- oneplus/OOS_SM8150_11.0
pull_request:
branches:
- oneplus/OOS_SM8150_11.0
jobs:
build:
runs-on: ubuntu-latest
env:
CCACHE_COMPILERCHECK: "%compiler% -dumpmachine; %compiler% -dumpversion"
CCACHE_NOHASHDIR: "true"
CCACHE_MAXSIZE: "2G"
CCACHE_HARDLINK: "true"
# Use LLVM toolchain with Ubuntu cross-binutils; O=out matches Copilot’s layout.
KERNEL_CMDLINE: "ARCH=arm64 LLVM=1 LLVM_IAS=1 O=out CROSS_COMPILE=aarch64-linux-gnu- CROSS_COMPILE_ARM32=arm-linux-gnueabi- CLANG_TRIPLE=aarch64-linux-gnu-"
KERNEL_DEFCONFIG: ${{ github.event.inputs.kernel_defconfig || 'lineage_sm8150_defconfig' }}
KERNEL_SOURCE_URL: ${{ github.event.inputs.kernel_source_url || 'https://github.com/LineageOS/android_kernel_oneplus_sm8150' }}
KERNEL_BRANCH: ${{ github.event.inputs.kernel_branch || 'lineage-22.1' }}
OUTPUT_ZIP_NAME: ${{ github.event.inputs.output_name || 'OP7_KSN_wifi' }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Checkout Kernel Source
run: |
git clone --depth=1 --branch "${KERNEL_BRANCH}" "${KERNEL_SOURCE_URL}" kernel
cd kernel
git submodule update --init --recursive
cd ..
env:
KERNEL_SOURCE_URL: ${{ env.KERNEL_SOURCE_URL }}
KERNEL_BRANCH: ${{ env.KERNEL_BRANCH }}
- name: Set up ccache
uses: hendrikmuhs/ccache-action@v1.2
- name: Cleanup space
run: |
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf /usr/share/dotnet
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- name: Install dependencies (LLVM 18 + cross-binutils)
run: |
sudo apt-get update -y
sudo apt-get install -y \
clang-18 llvm-18 lld-18 \
gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi \
binutils-aarch64-linux-gnu binutils \
make python3 libssl-dev build-essential bc bison flex unzip \
ca-certificates xz-utils mkbootimg cpio device-tree-compiler git git-lfs
git clone https://github.com/khalidaboelmagd/AnyKernel3
rm -rf AnyKernel3/.git
- name: Remove unnecessary files
run: |
sudo rm -rf /opt/ghc
sudo rm -rf "/usr/local/share/boost"
sudo rm -rf /usr/share/dotnet
sudo rm -rf "$AGENT_TOOLSDIRECTORY"
- name: Get Version
id: get_version
run: |
cd kernel
git fetch --unshallow || true
COUNT=$(git rev-list --count HEAD)
echo "VERSION=$(expr ${COUNT:-0} + 10200)" >> $GITHUB_OUTPUT
cd ..
- name: KernelSU-Next setup
working-directory: ./kernel
run: |
export PATH=/usr/lib/llvm-18/bin:$PATH
curl -LSs "https://raw.githubusercontent.com/KernelSU-Next/KernelSU-Next/next/kernel/setup.sh" | bash -
# Copilot: create O=out defconfig for a clean base
- name: Prepare kernel output directory (defconfig)
working-directory: kernel
run: |
set -e
export PATH=/usr/lib/llvm-18/bin:$PATH
export HOSTCC=clang-18
export HOSTCXX=clang++-18
make O=out $KERNEL_DEFCONFIG
# Copilot: adjust config non-interactively, then olddefconfig to accept defaults for any new symbols
- name: Fix kernel config for CI (no source changes)
working-directory: kernel
run: |
set -e
export PATH=/usr/lib/llvm-18/bin:$PATH
OUT_CONFIG=out/.config
if [ ! -f "$OUT_CONFIG" ]; then
echo "No $OUT_CONFIG found, generating defconfig"
make O=out $KERNEL_DEFCONFIG
fi
if [ -x scripts/config ]; then
echo "Using scripts/config to update config"
./scripts/config --file "$OUT_CONFIG" --set-val CONFIG_NR_CPUS 64 || true
./scripts/config --file "$OUT_CONFIG" --disable CONFIG_HUGETLB_PAGE || true
./scripts/config --file "$OUT_CONFIG" --disable CONFIG_HUGETLBFS || true
else
echo "scripts/config not found, editing $OUT_CONFIG directly"
sed -i '/^CONFIG_NR_CPUS=/d' "$OUT_CONFIG" || true
echo 'CONFIG_NR_CPUS=64' >> "$OUT_CONFIG"
sed -i '/^CONFIG_HUGETLB_PAGE=/d' "$OUT_CONFIG" || true
echo 'CONFIG_HUGETLB_PAGE=n' >> "$OUT_CONFIG"
sed -i '/^CONFIG_HUGETLBFS=/d' "$OUT_CONFIG" || true
echo 'CONFIG_HUGETLBFS=n' >> "$OUT_CONFIG"
fi
# Critical: resolve any new symbols without prompts
make O=out olddefconfig
echo "==== Effective kernel config adjustments ===="
grep -E '^CONFIG_NR_CPUS=|^CONFIG_HUGETLB' out/.config || true
- name: Prepare scripts and headers
working-directory: ./kernel
run: |
export PATH=/usr/lib/llvm-18/bin:$PATH
export HOSTCC=clang-18
export HOSTCXX=clang++-18
make $KERNEL_CMDLINE scripts CC="ccache clang-18"
make $KERNEL_CMDLINE prepare CC="ccache clang-18"
- name: Build kernel
working-directory: kernel
env:
KBUILD_OUTPUT: out
run: |
set -e
export PATH=/usr/lib/llvm-18/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib/llvm-18/lib:$LD_LIBRARY_PATH
export DTC_EXT=dtc
export HOSTCC=clang-18
export HOSTCXX=clang++-18
# Ensure no interactive Kconfig runs before build
make O=out olddefconfig
make $KERNEL_CMDLINE CC="ccache clang-18" LD="ld.lld-18" AR="llvm-ar-18" NM="llvm-nm-18" OBJCOPY="llvm-objcopy-18" OBJDUMP="llvm-objdump-18" STRIP="llvm-strip-18" -j"$(nproc)"
cp out/arch/arm64/boot/Image ../AnyKernel3
- name: Run simple verification on build output
working-directory: kernel
run: |
set -e
if [ -d out ]; then
echo "Build output exists:"
ls -lah out | sed -n '1,200p'
else
echo "No build output directory found"
exit 1
fi
- name: Build Wi-Fi Module (qca_cld3)
working-directory: ./kernel
run: |
export PATH=/usr/lib/llvm-18/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib/llvm-18/lib:$LD_LIBRARY_PATH
export HOSTCC=clang-18
export HOSTCXX=clang++-18
make $KERNEL_CMDLINE modules_prepare CC="ccache clang-18"
make $KERNEL_CMDLINE CC="ccache clang-18" LD="ld.lld-18" AR="llvm-ar-18" NM="llvm-nm-18" OBJCOPY="llvm-objcopy-18" OBJDUMP="llvm-objdump-18" STRIP="llvm-strip-18" -j"$(nproc)" M=drivers/staging/qcacld-3.0 modules
sudo mkdir -p ../modules/vendor/lib/modules
sudo find out/drivers/staging/qcacld-3.0 -name "*.ko" -exec cp -v {} ../modules/vendor/lib/modules/ \;
sudo chown -R "$(id -u)":"$(id -g)" ../modules
- name: Package Kernel
run: |
echo "Packaging kernel from: $(pwd)"
ls -la AnyKernel3/ || true
cd AnyKernel3
zip -r ../${{ env.OUTPUT_ZIP_NAME }}.zip *
cd ..
- name: Package Wi-Fi Module
run: |
if [ ! -d "modules/vendor/lib/modules" ] || ! ls modules/vendor/lib/modules/*.ko >/dev/null 2>&1; then
echo "Error: No Wi-Fi modules found to package!"
exit 1
fi
echo "Packaging modules from: $(pwd)/modules"
ls -la modules/vendor/lib/modules/
cd modules
zip -r ../${{ env.OUTPUT_ZIP_NAME }}-modules.zip *
cd ..
- name: Upload kernel build artifacts
uses: actions/upload-artifact@v4
with:
name: kernel-out
path: kernel/out
- name: Upload zips
uses: actions/upload-artifact@v4
with:
name: outputs
path: |
${{ env.OUTPUT_ZIP_NAME }}.zip
${{ env.OUTPUT_ZIP_NAME }}-modules.zip
if-no-files-found: error
- name: Upload logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: kernel-build-logs
path: kernel/out