forked from mayuresh2543/misc_scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathkernel.sh
More file actions
executable file
Β·213 lines (171 loc) Β· 8.43 KB
/
kernel.sh
File metadata and controls
executable file
Β·213 lines (171 loc) Β· 8.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
#!/usr/bin/env bash
#
# πͺ¨ Stone Kernel Build Script β Modular & Styled
# Original: @enamulhasanabid β Revamped by @mayuresh2543
# Modified to utilize ~/SOURCE_KERNEL_COMPONENTS caching
set -euo pipefail
# βββββββββββββββ π¨ COLOR CODES βββββββββββββββ
RED='\e[1;31m'; GREEN='\e[1;32m'; YELLOW='\e[1;33m'; BLUE='\e[1;34m'; GRAY='\e[1;30m'; BOLD='\e[1m'; RESET='\e[0m'
# βββββββββββββββ π’ LOGGING HELPERS βββββββββββββββ
info() { echo -e "${BLUE}[INFO]${RESET} $*"; }
warn() { echo -e "${YELLOW}[WARN]${RESET} $*"; }
error() { echo -e "${RED}[ERROR]${RESET} $*" >&2; exit 1; }
start_stage() { STAGE_START=$(date +%s); }
stage_time() { echo -e " ${GRAY}($(($(date +%s) - STAGE_START))s)${RESET}"; }
block_start() { echo -e "\n${GREEN}${BOLD}π· $*${RESET}"; echo -e "${GRAY}ββββββββββββββββββββββββββββββββββββββββββββ${RESET}"; }
block_end() { echo -e "${GRAY}ββββββββββββββββββββββββββββββββββββββββββββ${RESET}\n"; }
# βββββββββββββββ βοΈ DEFAULT CONFIGURATION βββββββββββββββ
SCRIPT_DIR="$(pwd)"
SOURCE_BASE="$HOME/SOURCE_KERNEL_COMPONENTS"
OUTPUT_DIR="$SCRIPT_DIR/out"
CLANG_DIR="$SCRIPT_DIR/clang"
ANYKERNEL_DIR="$SCRIPT_DIR/AnyKernel3"
ZIP_NAME="Chaos-stone-$(date +%Y%m%d-%H%M).zip"
CLANG_REPO="greenforce-project/greenforce_clang"
CLANG_BRANCH="main"
ANYKERNEL3_GIT="https://github.com/mayuresh2543/AnyKernel3.git"
ANYKERNEL3_BRANCH="stone"
export KBUILD_BUILD_USER="android-build"
export KBUILD_BUILD_HOST="localhost"
export SOURCE_DATE_EPOCH=$(date +%s)
export BUILD_REPRODUCIBLE=1
TOTAL_CORES=$(nproc)
DEFAULT_JOBS=$(( TOTAL_CORES > 1 ? (TOTAL_CORES * 8 / 10) : 1 ))
JOBS="$DEFAULT_JOBS"
START_TIME=$(date +%s)
# Ensure the main source directory exists
mkdir -p "$SOURCE_BASE"
# βββββββββββββββ π§βπ» USER INPUT βββββββββββββββ
read_input() {
block_start "π§βπ» USER INPUT"
echo -e "${BOLD}π οΈ Stone Kernel Build Configuration${RESET}\n"
read -rp "Kernel repository URL: " KERNEL_REPO
[[ -z "$KERNEL_REPO" ]] && error "Kernel repo URL is required."
read -rp "Kernel branch (e.g., 15.0): " KERNEL_BRANCH
[[ -z "$KERNEL_BRANCH" ]] && error "Kernel branch is required."
read -rp "Kernel directory name (e.g., my_kernel): " KERNEL_DIR_NAME
[[ -z "$KERNEL_DIR_NAME" ]] && error "Kernel directory name is required."
read -rp "Kernel defconfig name (e.g., stone): " DEFCONFIG
[[ -z "$DEFCONFIG" ]] && error "Defconfig is required."
[[ "$DEFCONFIG" == *"_defconfig" ]] || DEFCONFIG="${DEFCONFIG}_defconfig"
echo ""
echo "Detected $TOTAL_CORES threads on this system."
echo "Default threads for compilation: $DEFAULT_JOBS (80% of total)"
read -rp "Enter number of threads to use [default: $DEFAULT_JOBS]: " USER_JOBS
if [[ "$USER_JOBS" =~ ^[0-9]+$ ]] && (( USER_JOBS >= 1 )); then
JOBS="$USER_JOBS"
fi
KERNEL_DIR="$SCRIPT_DIR/$KERNEL_DIR_NAME"
block_end
}
# βββββββββββββββ π BUILD OVERVIEW βββββββββββββββ
show_summary() {
block_start "π BUILD OVERVIEW"
info "Source Base Dir : $SOURCE_BASE"
info "Kernel Repository : $KERNEL_REPO"
info "Kernel Branch : $KERNEL_BRANCH"
info "Kernel Directory : $KERNEL_DIR"
info "Defconfig : $DEFCONFIG"
info "Clang Repo : $CLANG_REPO"
info "Clang Branch : $CLANG_BRANCH"
info "AnyKernel3 Repo : $ANYKERNEL3_GIT"
info "AnyKernel3 Branch : $ANYKERNEL3_BRANCH"
info "Output Directory : $OUTPUT_DIR"
info "ZIP Output Name : $ZIP_NAME"
info "Cores Used : $JOBS / $TOTAL_CORES"
block_end
read -rp "π Proceed with build? (y/N): " ans
[[ "$ans" =~ ^[Yy]$ ]] || error "Build cancelled."
}
# βββββββββββββββ π¦ COMPONENT PREPARATION βββββββββββββββ
prepare_components() {
block_start "π¦ PREPARING COMPONENTS"
start_stage
info "Cleaning up current working directory components..."
rm -rf "$OUTPUT_DIR" "$CLANG_DIR" "$ANYKERNEL_DIR" "$KERNEL_DIR"
mkdir -p "$OUTPUT_DIR"
# --- 1. CLANG ---
if [ ! -d "$SOURCE_BASE/clang/bin" ]; then
info "Clang not found in SOURCE_BASE. Downloading..."
mkdir -p "$SOURCE_BASE/clang"
cd "$SOURCE_BASE/clang"
wget -q "https://raw.githubusercontent.com/$CLANG_REPO/$CLANG_BRANCH/get_latest_url.sh"
[ -f "get_latest_url.sh" ] || error "Failed to download get_latest_url.sh"
source get_latest_url.sh; rm -rf get_latest_url.sh
[ -z "${LATEST_URL:-}" ] && error "LATEST_URL not set by script."
info "Downloading Clang from $LATEST_URL"
wget -q "$LATEST_URL" -O "Clang.tar.gz"
[ -f "Clang.tar.gz" ] || error "Failed to download Clang tarball."
tar -xf Clang.tar.gz
rm -f Clang.tar.gz
else
info "Clang found in SOURCE_BASE. Skipping download."
fi
info "Copying Clang to working directory..."
cp -r "$SOURCE_BASE/clang" "$CLANG_DIR"
# Verify Clang Paths
export PATH="$CLANG_DIR/bin:$PATH"
for b in clang ld.lld llvm-ar llvm-nm llvm-strip llvm-objcopy llvm-objdump; do
[ -x "$CLANG_DIR/bin/$b" ] || error "$b not found in Clang toolchain ($CLANG_DIR/bin/$b)."
done
# --- 2. KERNEL SOURCE ---
cd "$SCRIPT_DIR"
if [ ! -d "$SOURCE_BASE/$KERNEL_DIR_NAME" ]; then
info "Kernel source '$KERNEL_DIR_NAME' not found in SOURCE_BASE. Cloning..."
git clone --depth=1 -b "$KERNEL_BRANCH" "$KERNEL_REPO" "$SOURCE_BASE/$KERNEL_DIR_NAME"
else
info "Kernel source '$KERNEL_DIR_NAME' found in SOURCE_BASE. Skipping clone."
fi
info "Copying Kernel source to working directory..."
cp -r "$SOURCE_BASE/$KERNEL_DIR_NAME" "$KERNEL_DIR"
# --- 3. ANYKERNEL3 ---
if [ ! -d "$SOURCE_BASE/AnyKernel3" ]; then
info "AnyKernel3 not found in SOURCE_BASE. Cloning..."
git clone --depth=1 "$ANYKERNEL3_GIT" -b "$ANYKERNEL3_BRANCH" "$SOURCE_BASE/AnyKernel3"
else
info "AnyKernel3 found in SOURCE_BASE. Skipping clone."
fi
info "Copying AnyKernel3 to working directory..."
cp -r "$SOURCE_BASE/AnyKernel3" "$ANYKERNEL_DIR"
info "Component preparation complete"$(stage_time); block_end
}
# βββββββββββββββ π§ͺ BUILD PROCESS βββββββββββββββ
build_kernel() {
block_start "π§΅ KERNEL COMPILATION"
start_stage
cd "$KERNEL_DIR"
export ARCH=arm64 SUBARCH=arm64 LLVM=1 LLVM_IAS=1 \
CC=clang LD=ld.lld AR=llvm-ar NM=llvm-nm STRIP=llvm-strip \
OBJCOPY=llvm-objcopy OBJDUMP=llvm-objdump \
CLANG_TRIPLE="aarch64-linux-gnu-" CROSS_COMPILE="aarch64-linux-gnu-"
make O="$OUTPUT_DIR" distclean mrproper
make O="$OUTPUT_DIR" "$DEFCONFIG"
make O="$OUTPUT_DIR" -j"$JOBS" LOCALVERSION= KBUILD_BUILD_USER="$KBUILD_BUILD_USER" KBUILD_BUILD_HOST="$KBUILD_BUILD_HOST"
IMAGE="$OUTPUT_DIR/arch/arm64/boot/Image"
[ -f "$IMAGE" ] || error "Kernel image not found."
info "Kernel compiled"$(stage_time); block_end
block_start "π¦ CREATE FLASHABLE ZIP"
start_stage
[ -f "$IMAGE" ] || error "Kernel Image not found after build (path: $IMAGE)"
cp "$IMAGE" "$ANYKERNEL_DIR"/
cd "$ANYKERNEL_DIR"
zip -r9 "../$ZIP_NAME" * -x '*.git*' '*.md' '*.placeholder'
info "ZIP packaged"$(stage_time); block_end
block_start "π COMPLETION"
BUILD_DURATION=$(( $(date +%s) - START_TIME ))
echo -e "${GREEN}${BOLD}π Build Completed Successfully!${RESET}"
echo -e "${GRAY}ββββββββββββββββββββββββββββββββββββββββββββ${RESET}"
echo -e "π¦ ${BOLD}Flashable ZIP ${RESET}: $ZIP_NAME"
echo -e "π ${BOLD}Location ${RESET}: $SCRIPT_DIR/$ZIP_NAME"
echo -e "βοΈ ${BOLD}Cores Utilized ${RESET}: $JOBS"
echo -e "β±οΈ ${BOLD}Build Duration ${RESET}: ${BUILD_DURATION}s"
echo -e "${GRAY}ββββββββββββββββββββββββββββββββββββββββββββ${RESET}\n"
}
# βββββββββββββββ π MAIN βββββββββββββββ
LOG_FILE="$SCRIPT_DIR/build_$(date +%Y%m%d-%H%M).log"
exec > >(tee -a "$LOG_FILE") 2>&1
info "Logging all script output to: $LOG_FILE"
read_input
show_summary
prepare_components
build_kernel