2626 runs-on : ubuntu-latest
2727 permissions :
2828 contents : write
29- env :
30- KERNEL_DIR : ${{ github.workspace }}/android-kernel
31- OUT_DIR : ${{ github.workspace }}/android-kernel/out
3229
3330 steps :
3431 - name : Checkout build repo
@@ -51,34 +48,52 @@ jobs:
5148
5249 - name : Clone kernel source
5350 run : |
54- echo "Cloning ${{ github.event.inputs.kernel_source }} @ ${{ github.event.inputs.kernel_branch }}"
51+ KERNEL_DIR="$GITHUB_WORKSPACE/android-kernel"
52+ echo "Cloning into $KERNEL_DIR"
5553 git clone --depth=1 \
5654 -b ${{ github.event.inputs.kernel_branch }} \
5755 ${{ github.event.inputs.kernel_source }} \
58- ${{ env.KERNEL_DIR }}
59- ls ${{ env.KERNEL_DIR }}/
56+ "$KERNEL_DIR"
57+ echo "KERNEL_DIR=$KERNEL_DIR" >> $GITHUB_ENV
58+ echo "OUT_DIR=$KERNEL_DIR/out" >> $GITHUB_ENV
59+ ls "$KERNEL_DIR/"
6060
6161 - name : Fix kernel script permissions
6262 run : |
63- echo "Fixing execute permissions on kernel scripts..."
64- find ${{ env.KERNEL_DIR }}/scripts -type f -name "*.sh" -exec chmod +x {} \;
65- chmod +x ${{ env.KERNEL_DIR }}/scripts/clang-android.sh 2>/dev/null || true
66- chmod +x ${{ env.KERNEL_DIR }}/scripts/gcc-version.sh 2>/dev/null || true
67- chmod +x ${{ env.KERNEL_DIR }}/scripts/clang-version.sh 2>/dev/null || true
68- chmod +x ${{ env.KERNEL_DIR }}/scripts/lld-version.sh 2>/dev/null || true
69- chmod +x ${{ env.KERNEL_DIR }}/scripts/gcc-plugin.sh 2>/dev/null || true
70- chmod +x ${{ env.KERNEL_DIR }}/scripts/link-vmlinux.sh 2>/dev/null || true
71- chmod +x ${{ env.KERNEL_DIR }}/scripts/mkcompile_h 2>/dev/null || true
72- find ${{ env.KERNEL_DIR }}/scripts -type f ! -name "*.c" ! -name "*.h" ! -name "*.py" -exec chmod +x {} \;
63+ find "$KERNEL_DIR/scripts" -type f \( -name "*.sh" -o -name "gcc-version*" -o -name "clang-*" -o -name "lld-*" -o -name "gcc-plugin*" -o -name "link-vmlinux*" -o -name "mkcompile_h" \) -exec chmod +x {} \;
64+ find "$KERNEL_DIR/scripts" -type f ! -name "*.c" ! -name "*.h" ! -name "*.py" ! -name "*.txt" ! -name "Makefile" -exec chmod +x {} \;
7365 echo "Script permissions fixed."
7466
67+ - name : Patch Mali GPU Kconfig
68+ run : |
69+ # Samsung Exynos kernels ship a Mali GPU Kconfig that uses
70+ # 'depends on' with a shell-expansion syntax unsupported by
71+ # the host kconfig parser, causing "syntax error" at lines 27-29.
72+ # Fix: comment out the two broken 'depends on' lines.
73+ MALI_KCONFIG="$KERNEL_DIR/drivers/gpu/arm/Kconfig"
74+ if [ -f "$MALI_KCONFIG" ]; then
75+ echo "Patching $MALI_KCONFIG"
76+ # Replace lines that call shell commands inside 'depends on' with a safe stub
77+ sed -i 's/^\(\s*depends on\s*\$(shell.*\)/# \1/' "$MALI_KCONFIG"
78+ # Also handle bare shell() calls in source lines
79+ sed -i '/^source.*\$(shell/d' "$MALI_KCONFIG"
80+ echo "Mali Kconfig patched."
81+ else
82+ echo "Mali Kconfig not found at expected path, searching..."
83+ find "$KERNEL_DIR/drivers/gpu" -name "Kconfig" | xargs grep -l 'shell' 2>/dev/null | while read f; do
84+ sed -i 's/^\(\s*depends on\s*\$(shell.*\)/# \1/' "$f"
85+ sed -i '/^source.*\$(shell/d' "$f"
86+ echo "Patched: $f"
87+ done
88+ fi
89+
7590 - name : Detect kernel version
7691 id : kver
7792 run : |
78- VER=$(grep "^VERSION =" ${{ env. KERNEL_DIR }} /Makefile | awk '{print $3}')
79- PATCH=$(grep "^PATCHLEVEL =" ${{ env. KERNEL_DIR }} /Makefile | awk '{print $3}')
80- SUB=$(grep "^SUBLEVEL =" ${{ env. KERNEL_DIR }} /Makefile | awk '{print $3}')
81- echo "Detected kernel version: $VER.$PATCH.$SUB"
93+ VER=$(grep "^VERSION =" "$ KERNEL_DIR/Makefile" | awk '{print $3}')
94+ PATCH=$(grep "^PATCHLEVEL =" "$ KERNEL_DIR/Makefile" | awk '{print $3}')
95+ SUB=$(grep "^SUBLEVEL =" "$ KERNEL_DIR/Makefile" | awk '{print $3}')
96+ echo "Kernel version: $VER.$PATCH.$SUB"
8297 echo "version=$VER.$PATCH.$SUB" >> $GITHUB_OUTPUT
8398 echo "major=$VER.$PATCH" >> $GITHUB_OUTPUT
8499
97112
98113 - name : Integrate KernelSU
99114 run : |
100- cd ${{ env. KERNEL_DIR }}
115+ cd "$ KERNEL_DIR"
101116 KSU_TAG="${{ steps.ksu_info.outputs.ksu_version }}"
102117 curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -s "$KSU_TAG"
103118 head -5 KernelSU/kernel/Makefile 2>/dev/null || head -5 drivers/kernelsu/Makefile 2>/dev/null
@@ -121,22 +136,22 @@ jobs:
121136
122137 - name : Configure kernel
123138 run : |
124- cd ${{ env. KERNEL_DIR }}
139+ cd "$ KERNEL_DIR"
125140 export PATH=$HOME/toolchain/clang/bin:$PATH
126141
127142 DEFCONFIG=$(find arch/arm64/configs -name "*a04s*" -o -name "*a04*defconfig" 2>/dev/null | head -1 | xargs -r basename)
128143 [ -z "$DEFCONFIG" ] && DEFCONFIG="a04_defconfig"
129144 echo "Using defconfig: $DEFCONFIG"
130145 echo "DEFCONFIG=$DEFCONFIG" >> $GITHUB_ENV
131146
132- make O=${{ env. OUT_DIR }} ARCH=arm64 CC=clang \
147+ make O="$ OUT_DIR" ARCH=arm64 CC=clang \
133148 CLANG_TRIPLE=aarch64-linux-gnu- \
134149 CROSS_COMPILE=aarch64-linux-gnu- \
135150 "$DEFCONFIG"
136151
137- sed -i 's/CONFIG_WERROR=y/CONFIG_WERROR=n/g' ${{ env. OUT_DIR }} /.config
152+ sed -i 's/CONFIG_WERROR=y/CONFIG_WERROR=n/g' "$ OUT_DIR/.config"
138153
139- scripts/config --file ${{ env. OUT_DIR }} /.config \
154+ scripts/config --file "$ OUT_DIR/.config" \
140155 -e CONFIG_KSU \
141156 -e CONFIG_KPROBES \
142157 -e CONFIG_HAVE_KPROBES \
@@ -145,11 +160,11 @@ jobs:
145160 -e CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE \
146161 -d CONFIG_KSU_DEBUG
147162
148- scripts/config --file ${{ env. OUT_DIR }} /.config \
163+ scripts/config --file "$ OUT_DIR/.config" \
149164 --set-str CONFIG_LOCALVERSION "-KSU-${{ steps.ksu_info.outputs.ksu_version }}" \
150165 --disable CONFIG_LOCALVERSION_AUTO
151166
152- scripts/config --file ${{ env. OUT_DIR }} /.config \
167+ scripts/config --file "$ OUT_DIR/.config" \
153168 --disable CONFIG_DEBUG_INFO \
154169 --disable CONFIG_DEBUG_INFO_SPLIT \
155170 --disable CONFIG_DEBUG_INFO_REDUCED \
@@ -159,17 +174,17 @@ jobs:
159174 --enable CONFIG_STRIP_ASM_SYMS \
160175 --enable CONFIG_CC_OPTIMIZE_FOR_SIZE
161176
162- make O=${{ env. OUT_DIR }} ARCH=arm64 CC=clang \
177+ make O="$ OUT_DIR" ARCH=arm64 CC=clang \
163178 CLANG_TRIPLE=aarch64-linux-gnu- \
164179 CROSS_COMPILE=aarch64-linux-gnu- \
165180 olddefconfig
166181
167182 - name : Compile kernel
168183 run : |
169- cd ${{ env. KERNEL_DIR }}
184+ cd "$ KERNEL_DIR"
170185 export PATH=$HOME/toolchain/clang/bin:$PATH
171186
172- make -j$(nproc --all) O=${{ env. OUT_DIR }} ARCH=arm64 \
187+ make -j$(nproc --all) O="$ OUT_DIR" ARCH=arm64 \
173188 CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm \
174189 OBJCOPY=llvm-objcopy STRIP=llvm-strip \
175190 LLVM=1 LLVM_IAS=1 \
@@ -179,19 +194,19 @@ jobs:
179194 KCFLAGS="-w" \
180195 Image dtbs 2>&1 | tee $GITHUB_WORKSPACE/compile.log
181196
182- if [ ! -f ${{ env. OUT_DIR }} /arch/arm64/boot/Image ]; then
197+ if [ ! -f "$ OUT_DIR/arch/arm64/boot/Image" ]; then
183198 echo "::error::Build failed - kernel Image not found!"
184199 exit 1
185200 fi
186- echo "Build successful! Size: $(du -h ${{ env. OUT_DIR }} /arch/arm64/boot/Image | cut -f1)"
201+ echo "Build successful! Size: $(du -h $OUT_DIR/arch/arm64/boot/Image | cut -f1)"
187202
188203 - name : Collect DTBs
189204 run : |
190- find ${{ env. OUT_DIR }} /arch/arm64/boot/dts -name "*.dtb" 2>/dev/null \
191- | sort | xargs cat > ${{ env. OUT_DIR }} /arch/arm64/boot/dtb.img 2>/dev/null || true
192- if [ -s ${{ env. OUT_DIR }} /arch/arm64/boot/dtb.img ]; then
205+ find "$ OUT_DIR/arch/arm64/boot/dts" -name "*.dtb" 2>/dev/null \
206+ | sort | xargs cat > "$ OUT_DIR/arch/arm64/boot/dtb.img" 2>/dev/null || true
207+ if [ -s "$ OUT_DIR/arch/arm64/boot/dtb.img" ]; then
193208 echo "HAS_DTB=true" >> $GITHUB_ENV
194- echo "DTB size: $(du -h ${{ env. OUT_DIR }} /arch/arm64/boot/dtb.img | cut -f1)"
209+ echo "DTB size: $(du -h $OUT_DIR/arch/arm64/boot/dtb.img | cut -f1)"
195210 else
196211 echo "HAS_DTB=false" >> $GITHUB_ENV
197212 echo "No DTBs found."
@@ -201,53 +216,53 @@ jobs:
201216 run : |
202217 mkdir -p $GITHUB_WORKSPACE/ak3out
203218 python3 - <<'PYEOF'
204- import os
205- lines = [
206- "# AnyKernel3 Ramdisk Mod Script\n",
207- "# Samsung Galaxy A04s (SM-A047F) + KernelSU\n",
208- "properties() { '\n",
209- "kernel.string=Samsung A04s KernelSU Kernel\n",
210- "do.devicecheck=1\n",
211- "do.modules=0\n",
212- "do.systemless=1\n",
213- "do.cleanup=1\n",
214- "do.cleanuponabort=1\n",
215- "device.name1=a04s\n",
216- "device.name2=a047f\n",
217- "device.name3=SM-A047F\n",
218- "device.name4=a047fxxu\n",
219- "device.name5=a047x\n",
220- "supported.versions=12-14\n",
221- "supported.patchlevels=\n",
222- "'; }\n",
223- "block=auto;\n",
224- "is_slot_device=0;\n",
225- "ramdisk_compression=auto;\n",
226- "patch_vbmeta_flag=auto;\n",
227- ". tools/ak3-core.sh;\n",
228- "split_boot;\n",
229- "if [ -f \"$AKHOME/dtb.img\" ]; then\n",
230- " flash_dtb;\n",
231- "fi\n",
232- "flash_boot;\n",
233- ]
234- out = os.path.join(os.environ['GITHUB_WORKSPACE'], 'ak3out', 'anykernel.sh')
235- with open(out, 'w') as f:
236- f.writelines(lines)
237- print(f'Written: {out}')
238- PYEOF
219+ import os
220+ lines = [
221+ " # AnyKernel3 Ramdisk Mod Script\n " ,
222+ " # Samsung Galaxy A04s (SM-A047F) + KernelSU\n " ,
223+ " properties() { '\n " ,
224+ " kernel.string=Samsung A04s KernelSU Kernel\n " ,
225+ " do.devicecheck=1\n " ,
226+ " do.modules=0\n " ,
227+ " do.systemless=1\n " ,
228+ " do.cleanup=1\n " ,
229+ " do.cleanuponabort=1\n " ,
230+ " device.name1=a04s\n " ,
231+ " device.name2=a047f\n " ,
232+ " device.name3=SM-A047F\n " ,
233+ " device.name4=a047fxxu\n " ,
234+ " device.name5=a047x\n " ,
235+ " supported.versions=12-14\n " ,
236+ " supported.patchlevels=\n " ,
237+ " '; }\n " ,
238+ " block=auto;\n " ,
239+ " is_slot_device=0;\n " ,
240+ " ramdisk_compression=auto;\n " ,
241+ " patch_vbmeta_flag=auto;\n " ,
242+ " . tools/ak3-core.sh;\n " ,
243+ " split_boot;\n " ,
244+ " if [ -f \" $AKHOME/dtb.img\" ]; then\n " ,
245+ " flash_dtb;\n " ,
246+ " fi\n " ,
247+ " flash_boot;\n " ,
248+ ]
249+ out = os.path.join(os.environ['GITHUB_WORKSPACE'], 'ak3out', 'anykernel.sh')
250+ with open(out, 'w') as f :
251+ f.writelines(lines)
252+ print(f'Written : {out}')
253+ PYEOF
239254
240255 - name : Package with AnyKernel3
241256 run : |
242257 git clone --depth=1 https://github.com/osm0sis/AnyKernel3 $GITHUB_WORKSPACE/AnyKernel3
243258 cd $GITHUB_WORKSPACE/AnyKernel3
244259 rm -rf .git .github *.md
245260
246- cp ${{ env. OUT_DIR }} /arch/arm64/boot/Image ./
261+ cp "$ OUT_DIR/arch/arm64/boot/Image" ./
247262 cp $GITHUB_WORKSPACE/ak3out/anykernel.sh ./
248263
249264 if [ "$HAS_DTB" = "true" ]; then
250- cp ${{ env. OUT_DIR }} /arch/arm64/boot/dtb.img ./
265+ cp "$ OUT_DIR/arch/arm64/boot/dtb.img" ./
251266 echo "DTB included."
252267 fi
253268
@@ -260,8 +275,8 @@ jobs:
260275
261276 - name : Verify zip contents
262277 run : |
263- unzip -l "$GITHUB_WORKSPACE/${{ env. ZIP_NAME }} "
264- unzip -l "$GITHUB_WORKSPACE/${{ env. ZIP_NAME }} " | grep -q "Image" \
278+ unzip -l "$GITHUB_WORKSPACE/$ZIP_NAME"
279+ unzip -l "$GITHUB_WORKSPACE/$ZIP_NAME" | grep -q "Image" \
265280 && echo "Image present - OK" \
266281 || { echo "::error::Image missing from zip!"; exit 1; }
267282
0 commit comments