#! /bin/bash # shellcheck disable=SC2154 # Script For Building Android arm64 Kernel # # Copyright (c) 2018-2021 Panchajanya1999 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # set -e #Kernel building script # Function to show an informational message msg() { echo echo -e "\e[1;32m$*\e[0m" echo } err() { echo -e "\e[1;41m$*\e[0m" exit 1 } cdir() { cd "$1" 2>/dev/null || \ err "The directory $1 doesn't exists !" } ##------------------------------------------------------## ##----------Basic Informations, COMPULSORY--------------## # The defult directory where the kernel should be placed KERNEL_DIR="$(pwd)" BASEDIR="$(basename "$KERNEL_DIR")" # The name of the Kernel, to name the ZIP ZIPNAME="DragonHeart" # Version number of kernel VERSION=$version # Build Author # Take care, it should be a universal and most probably, case-sensitive AUTHOR="cyberknight777" # Architecture ARCH=arm64 # The name of the device for which the kernel is built MODEL="OnePlus 7 Series" # The codename of the device DEVICE="op7" # The defconfig which should be used. Get it from config.gz from # your device or check source DEFCONFIG=dragonheart_defconfig # Specify compiler. # 'clang' or 'gcc' COMPILER=gcc # Clean source prior building. 1 is NO(default) | 0 is YES INCREMENTAL=1 # Push ZIP to Telegram. 1 is YES | 0 is NO(default) PTTG=1 if [ $PTTG = 1 ] then # Set Telegram Chat ID CHATID="-1001361882613" fi # Generate a full DEFCONFIG prior building. 1 is YES | 0 is NO(default) DEF_REG=0 # Files/artifacts FILES=Image # Build dtbo.img (select this only if your source has support to building dtbo.img) # 1 is YES | 0 is NO(default) BUILD_DTBO=1 # Sign the zipfile # 1 is YES | 0 is NO SIGN=1 if [ $SIGN = 1 ] then #Check for java if command -v java > /dev/null 2>&1; then SIGN=1 else SIGN=0 fi fi # Silence the compilation # 1 is YES(default) | 0 is NO SILENCE=0 # Debug purpose. Send logs on every successfull builds # 1 is YES | 0 is NO(default) LOG_DEBUG=0 ##------------------------------------------------------## ##---------Do Not Touch Anything Beyond This------------## # Check if we are using a dedicated CI ( Continuous Integration ), and # set KBUILD_BUILD_VERSION and KBUILD_BUILD_HOST and CI_BRANCH ## Set defaults first DISTRO=$(source /etc/os-release && echo ${NAME}) KBUILD_BUILD_HOST=$(uname -a | awk '{print $2}') CI_BRANCH=$(git rev-parse --abbrev-ref HEAD) TERM=xterm export KBUILD_BUILD_HOST CI_BRANCH TERM ## Check for CI if [ "$CI" ] then if [ "$CIRCLECI" ] then export KBUILD_BUILD_VERSION=$CIRCLE_BUILD_NUM export KBUILD_BUILD_HOST="CircleCI" export CI_BRANCH=$CIRCLE_BRANCH fi if [ "$DRONE" ] then export KBUILD_BUILD_VERSION=$DRONE_BUILD_NUMBER export KBUILD_BUILD_HOST=$DRONE_SYSTEM_HOST export CI_BRANCH=$DRONE_BRANCH export BASEDIR=$DRONE_REPO_NAME # overriding export SERVER_URL="${DRONE_SYSTEM_PROTO}://${DRONE_SYSTEM_HOSTNAME}/${AUTHOR}/${BASEDIR}/${KBUILD_BUILD_VERSION}" else echo "Not presetting Build Version" fi fi #Check Kernel Version KERVER=$(make kernelversion) # Set a commit head COMMIT_HEAD=$(git log --oneline -1) # Set Date DATE=$(TZ=GMT-8 date +"%Y%m%d-%H%M") #Now Its time for other stuffs like cloning, exporting, etc clone() { echo " " if [ $COMPILER = "gcc" ] then msg "|| Cloning GCC 12.0.0 baremetal ||" wget -O 64.zip https://github.com/mvaisakh/gcc-arm64/archive/1a4410a4cf49c78ab83197fdad1d2621760bdc73.zip;unzip 64.zip;mv gcc-arm64-1a4410a4cf49c78ab83197fdad1d2621760bdc73 gcc64 wget -O 32.zip https://github.com/mvaisakh/gcc-arm/archive/c8b46a6ab60d998b5efa1d5fb6aa34af35a95bad.zip;unzip 32.zip;mv gcc-arm-c8b46a6ab60d998b5efa1d5fb6aa34af35a95bad gcc32 GCC64_DIR=$KERNEL_DIR/gcc64 GCC32_DIR=$KERNEL_DIR/gcc32 fi if [ $COMPILER = "clang" ] then msg "|| Cloning Clang-13 ||" git clone --depth=1 https://github.com/kdrag0n/proton-clang.git clang-llvm # Toolchain Directory defaults to clang-llvm TC_DIR=$KERNEL_DIR/clang-llvm fi msg "|| Cloning Anykernel ||" git clone --depth 1 --no-single-branch https://github.com/"$AUTHOR"/AnyKernel3.git -b op7 msg "|| Cloning libufdt ||" git clone https://android.googlesource.com/platform/system/libufdt "$KERNEL_DIR"/scripts/ufdt/libufdt } ##------------------------------------------------------## exports() { KBUILD_BUILD_USER=$AUTHOR SUBARCH=$ARCH if [ $COMPILER = "clang" ] then KBUILD_COMPILER_STRING=$("$TC_DIR"/bin/clang --version | head -n 1 | perl -pe 's/\(http.*?\)//gs' | sed -e 's/ */ /g' -e 's/[[:space:]]*$//') PATH=$TC_DIR/bin/:$PATH elif [ $COMPILER = "gcc" ] then KBUILD_COMPILER_STRING=$("$GCC64_DIR"/bin/aarch64-elf-gcc --version | head -n 1) PATH=$GCC64_DIR/bin/:$GCC32_DIR/bin/:/usr/bin:$PATH fi BOT_MSG_URL="https://api.telegram.org/bot$token/sendMessage" BOT_BUILD_URL="https://api.telegram.org/bot$token/sendDocument" PROCS=$(nproc --all) export KBUILD_BUILD_USER ARCH SUBARCH PATH \ KBUILD_COMPILER_STRING BOT_MSG_URL \ BOT_BUILD_URL PROCS } ##---------------------------------------------------------## tg_post_msg() { curl -s -X POST "$BOT_MSG_URL" -d chat_id="$CHATID" \ -d "disable_web_page_preview=true" \ -d "parse_mode=html" \ -d text="$1" } ##----------------------------------------------------------------## tg_post_build() { #Post MD5Checksum alongwith for easeness MD5CHECK=$(md5sum "$1" | cut -d' ' -f1) #Show the Checksum alongwith caption curl --progress-bar -F document=@"$1" "$BOT_BUILD_URL" \ -F chat_id="$CHATID" \ -F "disable_web_page_preview=true" \ -F "parse_mode=html" \ -F caption="$2 | MD5 Checksum : $MD5CHECK" } ##----------------------------------------------------------## build_kernel() { if [ $INCREMENTAL = 0 ] then msg "|| Cleaning Sources ||" make clean && make mrproper && rm -rf out fi if [ "$PTTG" = 1 ] then tg_post_msg "$KBUILD_BUILD_VERSION CI Build Triggered%0ADocker OS: $DISTRO%0AKernel Version : $KERVER%0ADate : $(TZ=GMT-8 date)%0ADevice : $MODEL [$DEVICE]%0APipeline Host : $KBUILD_BUILD_HOST%0AHost Core Count : $PROCS%0ACompiler Used : $KBUILD_COMPILER_STRING%0ABranch : $CI_BRANCH%0ATop Commit : $COMMIT_HEAD%0ALink" fi make O=out $DEFCONFIG if [ $DEF_REG = 1 ] then cp .config arch/arm64/configs/$DEFCONFIG git add arch/arm64/configs/$DEFCONFIG git commit -m "$DEFCONFIG: Regenerate This is an auto-generated commit" fi BUILD_START=$(date +"%s") if [ $COMPILER = "clang" ] then MAKE+=( CROSS_COMPILE=aarch64-linux-gnu- \ CROSS_COMPILE_ARM32=arm-linux-gnueabi- \ CC=clang \ AR=llvm-ar \ OBJDUMP=llvm-objdump \ STRIP=llvm-strip ) elif [ $COMPILER = "gcc" ] then MAKE+=( CROSS_COMPILE_ARM32=arm-eabi- \ CROSS_COMPILE=aarch64-elf- LD=aarch64-elf-ld.lld AR=llvm-ar NM=llvm-nm OBJCOPY=llvm-objcopy ) fi if [ $SILENCE = "1" ] then MAKE+=( -s ) fi msg "|| Started Compilation ||" make -j"$PROCS" O=out \ "${MAKE[@]}" 2>&1 | tee error.log BUILD_END=$(date +"%s") DIFF=$((BUILD_END - BUILD_START)) if [ -f "$KERNEL_DIR"/out/arch/arm64/boot/$FILES ] then msg "|| Kernel successfully compiled ||" if [ $BUILD_DTBO = 1 ] then msg "|| Building DTBO ||" tg_post_msg "Building DTBO.." make -j"$PROCS" O=out \ "${MAKE[@]}" 2>&1 dtbo.img dtb.img | tee dtbo.log fi gen_zip else if [ "$PTTG" = 1 ] then tg_post_build "error.log" "Build failed to compile after $((DIFF / 60)) minute(s) and $((DIFF % 60)) seconds" fi fi } ##--------------------------------------------------------------## gen_zip() { msg "|| Zipping into a flashable zip ||" mv "$KERNEL_DIR"/out/arch/arm64/boot/$FILES AnyKernel3/$FILES if [ $BUILD_DTBO = 1 ] then mv "$KERNEL_DIR"/out/arch/arm64/boot/dtbo.img AnyKernel3/dtbo.img mv "$KERNEL_DIR"/out/arch/arm64/boot/dtb.img AnyKernel3/dtb.img fi cdir AnyKernel3 zip -r $ZIPNAME-$DEVICE-$VERSION . -x ".git*" -x "README.md" -x "*.zip" ## Prepare a final zip variable ZIP_FINAL="$ZIPNAME-$DEVICE-$VERSION" if [ $SIGN = 1 ] then ## Sign the zip before sending it to telegram if [ "$PTTG" = 1 ] then msg "|| Signing Zip ||" tg_post_msg "Signing Zip file with AOSP keys.." fi curl -sLo zipsigner-3.0.jar https://raw.githubusercontent.com/baalajimaestro/AnyKernel2/master/zipsigner-3.0.jar java -jar zipsigner-3.0.jar "$ZIP_FINAL".zip "$ZIP_FINAL"-signed.zip ZIP_FINAL="$ZIP_FINAL-signed" fi if [ "$PTTG" = 1 ] then tg_post_build "$ZIP_FINAL.zip" "Build took : $((DIFF / 60)) minute(s) and $((DIFF % 60)) second(s)" fi cd .. } clone exports build_kernel if [ $LOG_DEBUG = "1" ] then tg_post_build "error.log" "$CHATID" "Debug Mode Logs" fi ##----------------*****-----------------------------##