Build kernel (KSN) & WIFI A16 for LineageOS 23.0 with vendor module disables #18
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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" | |
| 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 .. | |
| - name: Set up ccache | |
| uses: hendrikmuhs/ccache-action@v1.2 | |
| - name: Cleanup space | |
| run: | | |
| sudo rm -rf /opt/ghc || true | |
| sudo rm -rf "/usr/local/share/boost" || true | |
| sudo rm -rf /usr/share/dotnet || true | |
| sudo rm -rf "$AGENT_TOOLSDIRECTORY" || true | |
| - 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: 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 - | |
| # Patch A: arch/arm64/mm/hugetlbpage.c (declare ptep, guard huge_pmd_share) - pattern-based, idempotent | |
| - name: Apply hugetlbpage fix patch | |
| working-directory: kernel | |
| run: | | |
| set -euo pipefail | |
| if ! grep -q 'pte_t \*ptep' arch/arm64/mm/hugetlbpage.c; then | |
| sed -i '/pte_t \*pte = NULL;/a \ pte_t *ptep = NULL;' arch/arm64/mm/hugetlbpage.c || true | |
| fi | |
| sed -i 's/ptep = huge_pmd_share(mm, vma, addr, pud);/if (!ptep) ptep = huge_pmd_share(mm, vma, addr, pud);/' arch/arm64/mm/hugetlbpage.c || true | |
| # Patch B: mm/huge_memory.c try_to_unmap signature shim (add NULL 3rd arg) | |
| - name: Apply huge_memory try_to_unmap signature patch | |
| working-directory: kernel | |
| run: | | |
| set -euo pipefail | |
| sed -i 's/try_to_unmap(page, ttu_flags);/try_to_unmap(page, ttu_flags, NULL);/g' mm/huge_memory.c || true | |
| # Patch C: fs/proc/task_mmu.c fix split_huge_pmd arg order (vma, addr, pmd) -> (vma, pmd, addr) | |
| - name: Fix split_huge_pmd call order | |
| working-directory: kernel | |
| run: | | |
| set -euo pipefail | |
| sed -Ei 's/split_huge_pmd\(([[:space:]]*)vma([[:space:]]*),([[:space:]]*)addr([[:space:]]*),([[:space:]]*)pmd([[:space:]]*)\);/split_huge_pmd(vma, pmd, addr);/g' fs/proc/task_mmu.c || true | |
| # Patch D: mm/khugepaged.c remove obsolete mm->nr_ptes usage (neutralize line to avoid API skew) | |
| - name: Neutralize mm->nr_ptes in khugepaged | |
| working-directory: kernel | |
| run: | | |
| set -euo pipefail | |
| sed -i 's/atomic_long_dec(&mm->nr_ptes);/\/\* compat: mm->nr_ptes removed in this tree \*\/ do {} while (0);/' mm/khugepaged.c || true | |
| # 1) Seed .config into O=out | |
| - name: Prepare kernel output directory (defconfig) | |
| working-directory: kernel | |
| run: | | |
| set -euo pipefail | |
| export PATH=/usr/lib/llvm-18/bin:$PATH | |
| export HOSTCC=clang-18 | |
| export HOSTCXX=clang++-18 | |
| mkdir -p out | |
| make O=out ARCH=arm64 ${KERNEL_DEFCONFIG} | |
| # 2) Non-interactive finalize + hard enforcement (disable ACPI/THP/KSM/BTRFS/TASKSTATS/NFS; NR_CPUS=8; gzip) | |
| - name: Finalize kernel config (non-interactive + enforce) | |
| working-directory: kernel | |
| run: | | |
| set -euo pipefail | |
| export PATH=/usr/lib/llvm-18/bin:$PATH | |
| # Preseed all critical toggles to avoid Kconfig prompts and API skews | |
| cat > ../ci.defaults <<'EOF' | |
| CONFIG_QTI_GVM=n | |
| CONFIG_NR_CPUS=8 | |
| # MM/hugepage opt-outs | |
| CONFIG_HUGETLB_PAGE=n | |
| CONFIG_HUGETLBFS=n | |
| CONFIG_TRANSPARENT_HUGEPAGE=n | |
| CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=n | |
| CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=n | |
| CONFIG_KSM=n | |
| # Filesystems we don't need on Android | |
| CONFIG_BTRFS_FS=n | |
| CONFIG_BTRFS_FS_POSIX_ACL=n | |
| CONFIG_TASKSTATS=n | |
| CONFIG_TASK_DELAY_ACCT=n | |
| CONFIG_TASK_XACCT=n | |
| CONFIG_TASK_IO_ACCOUNTING=n | |
| CONFIG_NFS_FS=n | |
| CONFIG_NFS_V4=n | |
| CONFIG_LOCKD=n | |
| CONFIG_SUNRPC=n | |
| # ACPI should be off on DT-based Android devices (sm8150) | |
| CONFIG_ACPI=n | |
| CONFIG_ACPI_APEI=n | |
| CONFIG_ACPI_APD=n | |
| CONFIG_ACPI_LPSS=n | |
| CONFIG_ACPI_PCI_SLOT=n | |
| CONFIG_ACPI_PCI_ROOT=n | |
| # General setup/prevent prompts | |
| CONFIG_COMPILE_TEST=n | |
| CONFIG_LOCALVERSION="" | |
| CONFIG_LOCALVERSION_AUTO=y | |
| CONFIG_KERNEL_GZIP=y | |
| CONFIG_KERNEL_BZIP2=n | |
| CONFIG_KERNEL_LZMA=n | |
| CONFIG_KERNEL_XZ=n | |
| CONFIG_KERNEL_LZO=n | |
| CONFIG_KERNEL_LZ4=n | |
| CONFIG_CROSS_COMPILE="aarch64-linux-gnu-" | |
| EOF | |
| # Resolve all new symbols non-interactively | |
| make O=out ARCH=arm64 olddefconfig KCONFIG_ALLCONFIG=../ci.defaults | |
| # Enforce again (handle vendor flips); scripts/config if present, sed fallback otherwise | |
| if [ -x scripts/config ]; then | |
| ./scripts/config --file out/.config \ | |
| --disable CONFIG_QTI_GVM --set-val CONFIG_NR_CPUS 8 \ | |
| --disable CONFIG_HUGETLB_PAGE --disable CONFIG_HUGETLBFS \ | |
| --disable CONFIG_TRANSPARENT_HUGEPAGE --disable CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS --disable CONFIG_TRANSPARENT_HUGEPAGE_MADVISE \ | |
| --disable CONFIG_KSM \ | |
| --disable CONFIG_BTRFS_FS --disable CONFIG_BTRFS_FS_POSIX_ACL \ | |
| --disable CONFIG_TASKSTATS --disable CONFIG_TASK_DELAY_ACCT --disable CONFIG_TASK_XACCT --disable CONFIG_TASK_IO_ACCOUNTING \ | |
| --disable CONFIG_NFS_FS --disable CONFIG_NFS_V4 --disable CONFIG_LOCKD --disable CONFIG_SUNRPC \ | |
| --disable CONFIG_ACPI --disable CONFIG_ACPI_APEI --disable CONFIG_ACPI_APD --disable CONFIG_ACPI_LPSS --disable CONFIG_ACPI_PCI_SLOT --disable CONFIG_ACPI_PCI_ROOT \ | |
| --disable CONFIG_COMPILE_TEST \ | |
| --set-str CONFIG_LOCALVERSION "" --enable CONFIG_LOCALVERSION_AUTO \ | |
| --enable CONFIG_KERNEL_GZIP \ | |
| --disable CONFIG_KERNEL_BZIP2 --disable CONFIG_KERNEL_LZMA --disable CONFIG_KERNEL_XZ --disable CONFIG_KERNEL_LZO --disable CONFIG_KERNEL_LZ4 || true | |
| fi | |
| # Sed fallback to ensure nothing slips through | |
| sed -i 's/^CONFIG_BTRFS_FS=m/CONFIG_BTRFS_FS=n/' out/.config | |
| for s in CONFIG_BTRFS_FS_POSIX_ACL CONFIG_TASKSTATS CONFIG_TASK_DELAY_ACCT CONFIG_TASK_XACCT CONFIG_TASK_IO_ACCOUNTING \ | |
| CONFIG_NFS_FS CONFIG_NFS_V4 CONFIG_LOCKD CONFIG_SUNRPC \ | |
| CONFIG_HUGETLB_PAGE CONFIG_HUGETLBFS CONFIG_TRANSPARENT_HUGEPAGE CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS CONFIG_TRANSPARENT_HUGEPAGE_MADVISE CONFIG_KSM \ | |
| CONFIG_ACPI CONFIG_ACPI_APEI CONFIG_ACPI_APD CONFIG_ACPI_LPSS CONFIG_ACPI_PCI_SLOT CONFIG_ACPI_PCI_ROOT CONFIG_COMPILE_TEST; do | |
| sed -i "s/^${s}=.*/${s}=n/" out/.config | |
| done | |
| sed -i 's/^# CONFIG_NR_CPUS is not set$/CONFIG_NR_CPUS=8/' out/.config | |
| sed -i 's/^CONFIG_NR_CPUS=.*/CONFIG_NR_CPUS=8/' out/.config | |
| sed -i 's/^CONFIG_KERNEL_GZIP=.*/CONFIG_KERNEL_GZIP=y/' out/.config | |
| for c in CONFIG_KERNEL_BZIP2 CONFIG_KERNEL_LZMA CONFIG_KERNEL_XZ CONFIG_KERNEL_LZO CONFIG_KERNEL_LZ4; do | |
| sed -i "s/^${c}=.*/${c}=n/" out/.config | |
| done | |
| if ! grep -q '^CONFIG_CROSS_COMPILE=' out/.config; then | |
| echo 'CONFIG_CROSS_COMPILE="aarch64-linux-gnu-"' >> out/.config | |
| else | |
| sed -i 's/^CONFIG_CROSS_COMPILE=.*/CONFIG_CROSS_COMPILE="aarch64-linux-gnu-"/' out/.config | |
| fi | |
| # Re-resolve dependencies and write auto.conf | |
| make O=out ARCH=arm64 olddefconfig | |
| echo "==== Key config lines ====" | |
| egrep -E '^(CONFIG_ACPI|CONFIG_NR_CPUS|CONFIG_HUGETLB_PAGE|CONFIG_TRANSPARENT_HUGEPAGE|CONFIG_BTRFS_FS|CONFIG_TASKSTATS|CONFIG_NFS_FS|CONFIG_KERNEL_GZIP)=' out/.config || true | |
| # 3) After finalize, build scripts/headers | |
| - name: Prepare scripts and headers | |
| working-directory: ./kernel | |
| run: | | |
| set -euo pipefail | |
| 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 -euo pipefail | |
| export PATH=/usr/lib/llvm-18/bin:$PATH | |
| export LD_LIBRARY_PATH="/usr/lib/llvm-18/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" | |
| export DTC_EXT=dtc | |
| export HOSTCC=clang-18 | |
| export HOSTCXX=clang++-18 | |
| # Final non-interactive settle | |
| make O=out ARCH=arm64 olddefconfig | |
| # Verify critical toggles (fail fast if vendor flipped anything back) | |
| if ! grep -q '^CONFIG_NR_CPUS=8' out/.config; then | |
| echo "Error: NR_CPUS not set to 8"; exit 1 | |
| fi | |
| for s in CONFIG_BTRFS_FS CONFIG_TASKSTATS CONFIG_TRANSPARENT_HUGEPAGE CONFIG_NFS_FS CONFIG_ACPI; do | |
| if grep -q "^${s}=[my]" out/.config; then | |
| echo "Error: ${s} still enabled"; exit 1 | |
| fi | |
| done | |
| 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)" | |
| test -f out/arch/arm64/boot/Image | |
| cp out/arch/arm64/boot/Image ../AnyKernel3 | |
| - name: Run simple verification on build output | |
| working-directory: kernel | |
| run: | | |
| set -euo pipefail | |
| 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: | | |
| set -euo pipefail | |
| export PATH=/usr/lib/llvm-18/bin:$PATH | |
| export LD_LIBRARY_PATH="/usr/lib/llvm-18/lib${LD_LIBRARY_PATH:+:$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: | | |
| 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 | |
| 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 | |
| if-no-files-found: warn | |
| - 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 |