#!/bin/bash set -e if [[ -f ${HOME}/.randomscripts.rc ]]; then source ${HOME}/.randomscripts.rc else TOP=${TOP:-"${HOME}/random-scripts-artifacts"} fi mkdir -p ${TOP} NUM_CPUS=${NUM_CPUS:-"$(getconf _NPROCESSORS_ONLN)"} FIT_NAME="kernel kernel_dtb" KDIR=${KDIR:-$(pwd)} clean_build=0 build_deb_packages=0 #ARCH=arm64 git_describe=$(git describe --long) KERNEL_VERSION="linux-mainline" usage() { echo -e "$0's help text" echo -e " -a ARCH, specify the architecture to build, default: arm64" echo -e " -c, cleanup output and staging dir before building, default: 0" echo -e " -d CONFIG_URL, specify a url to a config file," echo -e " default: ${CONFIG_URL}" echo -e " -k KERNEL_VERSION, kernel version that you want to build, default: linux-mainline" echo -e " KERNEL_VERSION's to choose from:" echo -e " linux-mainline," echo -e " linux-next," echo -e " linux-stable-4.14," echo -e " ..." echo -e " -i defconfig, defconfig to build in the src tree" echo -e " -m MACHINE, add machine name" echo -e " -p, build deb packages" echo -e " -h, prints out this help" } while getopts "a:cd:hk:i:m:p" arg; do case $arg in a) ARCH="$OPTARG" ;; c) clean_build=1 ;; d) CONFIG_URL="$OPTARG" ;; k) KERNEL_VERSION="$OPTARG" ;; i) DEFCONFIG_FILENAME="$OPTARG" ;; m) MACHINE="$OPTARG" ;; p) build_deb_packages=1 ;; h|*) usage exit 0 ;; esac done case ${MACHINE} in am57xx-evm) ARCH=arm CONFIG_URL=${CONFIG_URL:-"http://snapshots.linaro.org/openembedded/lkft/morty/${MACHINE}/rpb/${KERNEL_VERSION}/latest/config"} image_name=zImage dtb_name="am57xx-beagle-x15" ;; hikey) ARCH=arm64 CONFIG_URL=${CONFIG_URL:-"http://snapshots.linaro.org/openembedded/lkft/morty/${MACHINE}/rpb/${KERNEL_VERSION}/latest/config"} image_name=Image dtb_name="hi6220-hikey" ;; *) usage exit 1 ;; esac OUTPUT=${OUTPUT:-"${TOP}/build_output/${ARCH}/${git_describe}"} STAGING=${STAGING:-"${TOP}/staging/${ARCH}/${git_describe}"} if [ $(grep -c "^WHAT IS LINUX" README) -ne 1 ] && [ $(grep -c "^Linux kernel" README) -ne 1 ]; then echo -e "ERROR: Need to run this script $(basename $0)," echo -e " from a kernel repository" echo "" usage exit 1 fi case $ARCH in arm) CROSS_COMPILE=${CROSS_COMPILE:-arm-linux-gnueabihf-} ;; arm64) CROSS_COMPILE=${CROSS_COMPILE:-aarch64-linux-gnu-} ;; *) esac if [[ $clean_build -eq 1 ]]; then echo "Cleaning up output and staging dir before building!" rm -rf ${OUTPUT} rm -rf ${STAGING} fi if [[ -z ${DEFCONFIG_FILENAME} ]]; then curl -sSL -o .config ${CONFIG_URL} yes '' |make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} oldconfig rm .config else make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} ${DEFCONFIG_FILENAME} fi make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} if [[ -d arch/${ARCH}/boot/dts ]]; then make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} INSTALL_DTBS_PATH=${STAGING}/dtbs dtbs_install for file in $(find ${STAGING}/dtbs -type f -name '*.dtb') ; do if [[ ! $(basename ${file}) =~ ${git_describe}.dtb ]]; then new_file=$(printf '%s\n' "${file%.dtb}-${git_describe}.dtb"); mv ${file} ${new_file} fi done fi if [[ $(grep CONFIG_MODULES=y ${OUTPUT}/.config) ]]; then make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} INSTALL_MOD_PATH=${STAGING} modules_install pushd ${STAGING} tar -zcf modules-$(basename ${STAGING}).tar.gz lib/ popd fi cp -f ${OUTPUT}/.config ${STAGING}/kernel-${git_describe}.config make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} Image cp -f ${OUTPUT}/arch/${ARCH}/boot/${image_name} ${STAGING}/${image_name}-${git_describe} cp -f $(find ${STAGING} -type f -name "*${dtb_name}-${git_describe}.dtb") ${STAGING}/ if [[ $build_deb_packages -eq 1 ]]; then make -j ${NUM_CPUS} CROSS_COMPILE=${CROSS_COMPILE} ARCH=${ARCH} KDIR=${KDIR} O=${OUTPUT} bindeb-pkg mv -f ${OUTPUT}/../*$(basename ${OUTPUT} |awk -F'-' '{print $1-$2}')*.* ${STAGING} fi ## vim: set sw=4 sts=4 et foldmethod=syntax : ##