Skip to content

Commit 6c2a15b

Browse files
authored
Create build_kernel.sh
1 parent 7251fe7 commit 6c2a15b

1 file changed

Lines changed: 142 additions & 0 deletions

File tree

build_kernel.sh

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#!/usr/bin/env bash
2+
# ==============================================================================
3+
# Высокопроизводительный конвейер сборки ядра Android с использованием Proton Clang
4+
# Архитектура: AArch64 | Оптимизации: LTO, PGO, Polly
5+
# ==============================================================================
6+
7+
# Завершение работы при возникновении неперехваченных ошибок
8+
set -e
9+
10+
# Инициализация переменных директорий
11+
WORKSPACE_DIR="$(pwd)"
12+
KERNEL_DIR="${WORKSPACE_DIR}/kernel_source"
13+
TOOLCHAIN_DIR="${WORKSPACE_DIR}/proton-clang"
14+
ANYKERNEL_DIR="${WORKSPACE_DIR}/AnyKernel3"
15+
OUT_DIR="${KERNEL_DIR}/out"
16+
17+
# Параметры конфигурации целевого ядра
18+
ARCH="arm64"
19+
DEFCONFIG="vendor/xiaomi/sm8250_defconfig" # Пример для платформы Snapdragon 865
20+
KERNEL_VERSION="5.4-Proton-SuSFS"
21+
TIMESTAMP="$(date +"%Y%m%d_%H%M")"
22+
CORES="$(nproc --all)"
23+
24+
echo "[1/6] Клонирование репозиториев и инструментария..."
25+
# Поверхностное клонирование Proton Clang для минимизации сетевого трафика
26+
if; then
27+
git clone --depth=1 https://github.com/kdrag0n/proton-clang.git "${TOOLCHAIN_DIR}"
28+
fi
29+
30+
# Клонирование шаблонного упаковщика AnyKernel3
31+
if; then
32+
git clone --depth=1 https://github.com/osm0sis/AnyKernel3.git "${ANYKERNEL_DIR}"
33+
fi
34+
35+
# Предполагается, что исходный код ядра уже находится в директории kernel_source
36+
if; then
37+
echo "Ошибка: Директория исходного кода ядра (${KERNEL_DIR}) не обнаружена."
38+
exit 1
39+
fi
40+
41+
echo "[2/6] Экспорт переменных окружения (Kbuild Compiler Directives)..."
42+
# Добавление путей бинарников LLVM в системную среду
43+
export PATH="${TOOLCHAIN_DIR}/bin:${PATH}"
44+
45+
# Определение префиксов для кросс-компиляции
46+
# CLANG_TRIPLE не требуется, так как Proton Clang содержит собственные конфигурации
47+
export CC="clang"
48+
export CROSS_COMPILE="aarch64-linux-gnu-"
49+
export CROSS_COMPILE_COMPAT="arm-linux-gnueabi-" # Для vDSO на ядрах 4.19+
50+
export CROSS_COMPILE_ARM32="arm-linux-gnueabi-" # Обратная совместимость
51+
52+
echo "[3/6] Лексическая очистка и патчинг исходного кода (Clang strict semantics)..."
53+
cd "${KERNEL_DIR}"
54+
55+
# 3.1. Устранение Undefined Behavior: "division by zero is undefined" в mman.h
56+
# Clang версии 12+ обрывает компиляцию при нахождении макросов с 1/0
57+
if grep -q "1 / 0" include/uapi/asm-generic/mman.h 2>/dev/null; then
58+
echo " -> Патчинг asm-generic/mman.h..."
59+
sed -i 's|1 / 0|0|g' include/uapi/asm-generic/mman.h
60+
sed -i 's|1 / 0|0|g' arch/arm64/include/uapi/asm/mman.h 2>/dev/null |
61+
62+
| true
63+
fi
64+
65+
# 3.2. Восстановление синтаксиса KABI после внедрения патчей SuSFS
66+
# Автоматические утилиты слияния часто оставляют '>>>>>>> replacement' в файле mount.h,
67+
# если поля susfs_mnt_id_backup конфликтуют с модификациями производителя (например, Xiaomi).
68+
if [ -f "include/linux/mount.h" ]; then
69+
echo " -> Валидация синтаксиса include/linux/mount.h..."
70+
# Удаление невалидных строковых маркеров конфликта git/wiggle
71+
sed -i '/>>>>>>> replacement/d' include/linux/mount.h 2>/dev/null |
72+
73+
| true
74+
sed -i '/======/d' include/linux/mount.h 2>/dev/null |
75+
76+
| true
77+
# Адаптация резервных полей ANDROID_KABI_USE
78+
sed -i '/ANDROID_KABI_USE(4, u64 susfs_mnt_id_backup);/d' include/linux/mount.h 2>/dev/null |
79+
80+
| true
81+
fi
82+
83+
# 3.3. Включение модуля SuSFS в сборочный граф, если он был скопирован
84+
if grep -q "susfs.c" fs/Makefile 2>/dev/null |
85+
86+
| [ -f "fs/susfs.c" ]; then
87+
if! grep -q "susfs.o" fs/Makefile; then
88+
echo "obj-y += susfs.o" >> fs/Makefile
89+
fi
90+
fi
91+
92+
echo "[4/6] Инициализация конфигурации Kbuild..."
93+
# Полная очистка дерева исходников и артефактов старых сборок
94+
make O="${OUT_DIR}" ARCH="${ARCH}" mrproper
95+
96+
# Создание файла.config на основе конфигурации производителя
97+
make O="${OUT_DIR}" ARCH="${ARCH}" CC="${CC}" \
98+
CROSS_COMPILE="${CROSS_COMPILE}" \
99+
CROSS_COMPILE_COMPAT="${CROSS_COMPILE_COMPAT}" \
100+
LLVM=1 LLVM_IAS=1 \
101+
"${DEFCONFIG}"
102+
103+
echo "[5/6] Старт многопоточной компиляции (LLVM/LTO)..."
104+
# Вызов системы сборки с полным делегированием полномочий LLVM инструментарию
105+
# LLVM=1 активирует ld.lld, llvm-ar, llvm-objcopy
106+
# LLVM_IAS=1 активирует встроенный ассемблер Clang
107+
make -j"${CORES}" O="${OUT_DIR}" ARCH="${ARCH}" CC="${CC}" \
108+
CROSS_COMPILE="${CROSS_COMPILE}" \
109+
CROSS_COMPILE_COMPAT="${CROSS_COMPILE_COMPAT}" \
110+
CROSS_COMPILE_ARM32="${CROSS_COMPILE_ARM32}" \
111+
LLVM=1 LLVM_IAS=1
112+
113+
# Проверка наличия собранного ядра
114+
COMPILED_IMAGE="${OUT_DIR}/arch/arm64/boot/Image"
115+
if; then
116+
echo "Критическая ошибка: Файл Image не сгенерирован. Изучите логи компилятора."
117+
exit 1
118+
fi
119+
echo "Успех: Бинарный файл ядра успешно создан."
120+
121+
echo "[6/6] Упаковка ядра в формат AnyKernel3..."
122+
cd "${WORKSPACE_DIR}"
123+
rm -rf "${ANYKERNEL_DIR}/Image" "${ANYKERNEL_DIR}/Image.gz" "${ANYKERNEL_DIR}/dtb" "${ANYKERNEL_DIR}/dtbo.img"
124+
125+
# Интеграция бинарных артефактов в шаблон упаковщика
126+
cp "${COMPILED_IMAGE}" "${ANYKERNEL_DIR}/"
127+
cp "${KERNEL_DIR}/out/arch/arm64/boot/dtbo.img" "${ANYKERNEL_DIR}/" 2>/dev/null |
128+
129+
| true
130+
# Поиск и перенос всех собранных файлов Device Tree Blob (dtb)
131+
find "${KERNEL_DIR}/out/arch/arm64/boot/dts/vendor/" -name "*.dtb" -exec cp {} "${ANYKERNEL_DIR}/dtb/" \; 2>/dev/null |
132+
133+
| true
134+
135+
cd "${ANYKERNEL_DIR}"
136+
ZIP_FILENAME="${KERNEL_VERSION}-${TIMESTAMP}.zip"
137+
zip -r9 "${ZIP_FILENAME}" * -x.git README.md *placeholder
138+
139+
mv "${ZIP_FILENAME}" "${WORKSPACE_DIR}/"
140+
echo "================================================="
141+
echo " Building finished. File: ${ZIP_FILENAME} "
142+
echo "================================================="

0 commit comments

Comments
 (0)