[Android] ayysir:
This thread is meant for kernel devs or people who wants to begin building kernels for their first time.

There is a bit of a learning curve to this though, you need to known Linux functions and have android environment setup

This is a UBUNTU script saved as a shell script for any version of UBUNTU

Start off script with executable script definitions

#!/bin/bash

This next part is important and ultimately optional however it makes coding the script crazy easier

I call these definitions (likely not what they are technically but, it's my interpretation) to enable shortcoding commands which makes the script look cleaner

These can be named whatever you want btw

Kerneldir - is the directory where your kernel files are kept and this is the main place where you build your kernel

Packagedir - is your work environment, this is where your boot.img will be copied to, extra files, updater-script to be later packaged into a zip folder

INITRAMFS_SOURCE - is where the ramdisk should be placed in folder form [Click Here for how to split ramdisk and zimage from boot.img]

Meta - where the updater script is kept so it can be packaged for my kernel to be able to flashed

ARCH - Must stay as this definition as it is needed for compile to become successful

CROSS_COMPILE - Toolchain command, make sure your kernel supports linaro 4.6 and later. Or default to CM's 4.4.3 toolchain. Must stay as this definition as it is needed for compile to become successful

export KERNELDIR=/home/ayysir/android/kernel/ASDK
export INITRAMFS_DEST=$KERNELDIR/kernel/usr/initramfs
export PACKAGEDIR=/home/ayysir/android/kernel/asdk_out
export INITRAMFS_SOURCE=/home/ayysir/android/kernel
export Meta=/home/ayysir/android/kernel/Ayysir/META-INF
export Drivers=/home/ayysir/android/kernel/Ayysir/Drivers
export App=/home/ayysir/android/kernel/Ayysir/app
export exfat=/home/ayysir/android/kernel/Ayysir/exfat_modules
export ARCH=arm
export CROSS_COMPILE=/home/ayysir/android/kernel/toolchains/android-toolchain-4.7/bin/arm-eabi-

This part are mostly setup commands to clean out workspace deleting previous compile remnants. This is where definitions we made above comes in handy.

The echo commands are like description commands, used for many situations but for our purpose, it tells the user what is currently happening in the script

Assuming you have knowledge about kernel deving so I don't have to hold your hand in describing things

Below commands vary depending on dev as they have their own defconfig setup for their specific device replace my asdk_defconfig with

this is is for configuring what to include the compile build

UPDATE:

OPTIONAL:

# Colorize and add text parameters
red=$(tput setaf 1) # red
grn=$(tput setaf 2) # green
cya=$(tput setaf 6) # cyan
txtbld=$(tput bold) # Bold
bldred=${txtbld}$(tput setaf 1) # red
bldgrn=${txtbld}$(tput setaf 2) # green
bldblu=${txtbld}$(tput setaf 4) # blue
bldcya=${txtbld}$(tput setaf 6) # cyan
txtrst=$(tput sgr0) # Reset

Above Codes Colorize and add text parameters.. it makes it look cleaner and more concise on what is happening in the terminal

the echo "" adds a space in between lines, just so it looks clean and does not jumble things

so here are some example on how to implement this: [Below]

echo -e "${bldcya} Making Kernel ${txtrst}"
make asdk_defconfig

echo""

echo -e "${bldcya} Clean Environment ${txtrst}"
make menuconfig

echo "Remove old Package Files"
rm -rf $PACKAGEDIR/*

echo "Setup Package Directory"
mkdir -p $PACKAGEDIR/system/lib/modules

echo "Setup App Directory"
mkdir -p $PACKAGEDIR/data/app

echo "Remove old zImage"
rm $PACKAGEDIR/zImage

echo "Remove old ramdisk"
rm $INITRAMFS_SOURCE/ramdisk.img.gz

echo "Clean Environment"
cd $KERNELDIR
make clean

echo "Make the kernel"
make asdk_defconfig

echo "Clean Environment"
make menuconfig

Before we get to this important section you need two files put into your /bin folder, mkbootfs and mkbootimg Click Here to download these files.

Then you need to cp these files to bin folder [put the files in home folder]

sudo cp ~/mkbootfs /bin
sudo cp ~/mkbootimg /bin
cd /bin
sudo chmod +x mkbootfs
sudo chmod +x mkbootimg

Now we are ready for next section

Make -j[num] command tells system how much things can be compiled at once, it's dependent on your system (number of processors] so i cay default to -j4

You also notice the script coding wrapped around the make command, this is what I setup to create compile log for compile session just incase you need to go back to review errors or debug some things

script -q ~/Compile.log -c "
make -j12 "

Below command searches for modules in zimage file and copies the modules files to workplace modules folder for packaging

cp -a $(find . -name *.ko -print |grep -v initramfs) $PACKAGEDIR/system/lib/modules/

Like I stated before you should of have already split the boot.img file and extracted ramdisk to a ramdisk folder. Below command uses mkbootfs to compress that folder into a .gz formatted file.

Below part is a bit tricky, because it is dependent on device to device basis.

first the code below moves ramdisk to workfolder

Then it cd's to the package folder and uses mkbootimg command to combine zimage and ramdisk together to make a boot.img

What is tricky is the command mkbootimg uses to determine space for the boot.img to be compiled in

The best way to determine the page size, base, & ramdiskaddr is either use the previous tools that you used to split a already compile boot.img commands and it spits out a file info run down or use DSIXDA ANDROID KITCHEN and using it's advanced options to determine boot.img info. Again I am not going to hold your hand on this one since you should research before trying this build script.

Note: many boot.img's use cmdline option in creation

echo "Make boot.img"
cp $INITRAMFS_SOURCE/ramdisk.img.gz $PACKAGEDIR
cd $PACKAGEDIR
mkbootimg --cmdline 'console = null androidboot.hardware=qcom user_debug=31 zcache' --kernel $PACKAGEDIR/zImage --ramdisk $PACKAGEDIR/ramdisk.img.gz --base 0x80200000 --pagesize 2048 --ramdiskaddr 0x81500000 --output $PACKAGEDIR/boot.img

echo "Packaging Ramdisk"
cd $INITRAMFS_SOURCE/
mkbootfs ./ASDK-ramdisk | gzip > ramdisk.img.gz

echo "Compiling"
script -q ~/Compile.log -c "
make -j12 "

echo "Copy modules to Package"
cp -a $(find . -name *.ko -print |grep -v initramfs) $PACKAGEDIR/system/lib/modules/
cp $Drivers/* $PACKAGEDIR/system/lib/

echo "Copy zImage to Package"
cp $KERNELDIR/arch/arm/boot/zImage $PACKAGEDIR/zImage

echo "Packaging Ramdisk"
cd $INITRAMFS_SOURCE/
mkbootfs ./ASDK-ramdisk | gzip > ramdisk.img.gz

echo "Make boot.img"
cp $INITRAMFS_SOURCE/ramdisk.img.gz $PACKAGEDIR
cd $PACKAGEDIR
mkbootimg --cmdline 'console = null androidboot.hardware=qcom user_debug=31 zcache' --kernel $PACKAGEDIR/zImage --ramdisk $PACKAGEDIR/ramdisk.img.gz --base 0x80200000 --pagesize 2048 --ramdiskaddr 0x81500000 --output $PACKAGEDIR/boot.img

This is where you add files you want packaged into your zip folder

*Remember add new definitions every time you add a new directory to the mix and have them cp all the files to workfolder

export curdate=`date "+%m-%d-%Y"`

This sets definition to zip to auto-generate dates to date your builds so it takes the work out of renaming the zip file [Your welcome lol]

zip -r ../ASDK-AOSP-4.2-$curdate.zip

set a name to your build and add $curdate.zip to enable auto dating zip

echo "Import of META-INF"
cp -R $Meta $PACKAGEDIR

echo "Import Voltage Control"
cp $App/* $PACKAGEDIR/data/app

echo "Importing Exfat fix"
cp $exfat/* $PACKAGEDIR/system/lib/modules

export curdate=`date "+%m-%d-%Y"`
cp ~/Compile.log ~/android/Compile-$curdate.log
rm ~/Compile.log
cd $PACKAGEDIR
rm ramdisk.img.gz
rm zImage
rm ../ASDK-AOSP-4.2*.zip\
rm -R .fr-7q5stU
zip -r ../ASDK-AOSP-4.2-$curdate.zip .

read -p "Press ENTER to Exit"

UPDATE:

Not to confuse anyone, Below is based off my new build script I use. PLEASE DO NOT COPY WORD FOR WORD, CODE BY CODE JUST USE IT AS REFERENCE. IF YOUR NOT SMART ENOUGH TO GET WHAT I AM DOING THEN DONT TRY BUILDING KERNELS LOL

if [ -e $KERNELDIR/arch/arm/boot/zImage ]; then
echo -e "${bldred} Copy modules to Package ${txtrst}"
cp -a $(find . -name *.ko -print |grep -v initramfs) $PACKAGEDIR/system/lib/modules/

echo ""

echo -e "${bldred} Copy zImage to Package ${txtrst}"
cp $KERNELDIR/arch/arm/boot/zImage $PACKAGEDIR/zImage

echo ""

echo -e "${bldred} Ramdisk Readying.. ${txtrst}"
cp $KERNELDIR/mkbootfs $INITRAMFS_SOURCE
cd $INITRAMFS_SOURCE/
./mkbootfs ASDK-krait | gzip > ramdisk.krait.gz
rm mkbootfs

echo ""

echo -e "${bldred} Making Boot.img.. ${txtrst}"
cp $KERNELDIR/mkbootimg $PACKAGEDIR
cp $INITRAMFS_SOURCE/ramdisk.krait.gz $PACKAGEDIR
cd $PACKAGEDIR
./mkbootimg --cmdline 'console = null androidboot.hardware=qcom user_debug=31 zcache' --kernel $PACKAGEDIR/zImage --ramdisk $PACKAGEDIR/ramdisk.krait.gz --base 0x80200000 --pagesize 2048 --ramdiskaddr 0x81500000 --output $PACKAGEDIR/boot.img
rm mkbootimg

echo ""

export curdate=`date "+%m-%d-%Y"`
cp ~/Compile.log ~/android/compile_logs/Success-Krait-$curdate.log
rm ~/Compile.log
cd $PACKAGEDIR
rm ramdisk.krait.gz
rm zImage
rm ../../ASDK-AOSP-3.4.x-*.zip
rm ../ramdisk.krait.gz
rm ../zImage
zip -r ../ASDK-AOSP-3.4.x-$curdate-EXP.zip .
mv ../ASDK-AOSP-3.4.x-$curdate-EXP.zip ~/android/kernel

echo "ASDK HOT OFF THE PRESS"

else
echo "KERNEL DID NOT BUILD! no zImage exist"
export curdate=`date "+%m-%d-%Y"`
cp ~/Compile.log ~/android/compile_logs/Failed-Krait-$curdate.log
fi;

exit 0

Now before you get mind blown Let me explain the update above:

chmod +x your script [make sure you save it as blahblah.sh] and boom your done

CLICK HERE TO SEE MY FULL SCRIPT THAT I USE FOR MY GS3 KERNEL BUILDS [NEEDS REVISING THOUGH]

IF YOU HAVE ANY QUESTIONS LEAVE IT IN THE COMMENTS OR PM ME

IF YOU LIKED MY HOW-TO AND WOULD LIKE TO DONATE TO HELP ME DEV FOR MORE DEVICES [APPRECIATED BUT DONATION NOT REQUIRED] CLICK HERE