blob: 6aef3cd71488eac11d872833799115fb55a3ab7e [file] [log] [blame]
#!/bin/bash
# Build kernel for use with Eureka.
exec_name=$0
set -o errtrace
trap 'echo Fatal error: script ${exec_name} aborting at line $LINENO, command \"$BASH_COMMAND\" returned $?; exit 1' ERR
deterministic_build=false
if [[ "$1" == "-d" ]]; then
deterministic_build=true
shift
fi
# Set variables for deterministic kernel builds
# These correspond to linux-3.8/scripts/mkcompile_h
if [[ "$deterministic_build" == true ]]; then
export KBUILD_BUILD_VERSION=0
export KBUILD_BUILD_TIMESTAMP="$(git log -1 --format=%cd) ($(git rev-parse HEAD | head -c 8))"
export KBUILD_BUILD_USER=user
export KBUILD_BUILD_HOST=host
else
# Add git hash to date. This corresponds to scripts/mkcompile_h
# This shows up in /proc/version
export KBUILD_BUILD_TIMESTAMP="$(date) ($(git rev-parse HEAD | head -c 8))"
fi
arch=arm
cross_compile=armv7a-cros-linux-gnueabihf-
cpu_num=$(grep -c processor /proc/cpuinfo)
function usage(){
echo "Usage: ${exec_name} [-d] [anchovy] [salami] [pepperoni] [chorizo] [pineapple] [mushroom] [caprica]"
echo
echo "-d : Build a deterministicly. Use git revision and timestamp and"
echo " generic user and host for /proc/version"
}
function run_kernel_make(){
echo "***** building $5 *****"
CROSS_COMPILE=$1 make -j$2 ARCH=$3 $4 CONFIG_DEBUG_SECTION_MISMATCH=y
echo "***** completed building $5 *****"
}
function run_perf_make(){
echo "***** building perf *****"
LDFLAGS='-static-libgcc -static-libstdc++' \
CROSS_COMPILE=$1 ARCH=$2 NO_DWARF=1 make -j$3
echo "***** completed building perf *****"
}
function build_kernel(){
local kernel_path=$(readlink -f $1)
local product=$2
local dts=$3
pushd $kernel_path
# Clean kernel
run_kernel_make $cross_compile $cpu_num $arch clean
# Build kernel config
run_kernel_make $cross_compile $cpu_num $arch ${product}_defconfig
# Verify kernel config
diff .config arch/arm/configs/${product}_defconfig
run_kernel_make $cross_compile $cpu_num $arch zImage-dtb.${dts}
# Give specific names to output files.
local out_path="arch/arm/boot/"
mv $out_path/zImage-dtb.${dts} $out_path/zImage-dtb.${dts}.${product}
popd
}
function build_dtb(){
local kernel_path=$(readlink -f $1)
local dtb_file=$2
pushd $kernel_path
# Build device tree blob
run_kernel_make $cross_compile $cpu_num $arch $dtb_file
popd
}
function build_perf(){
local kernel_path=$(readlink -f $1)
pushd ${kernel_path}/tools/perf
run_perf_make $cross_compile $arch $cpu_num
popd
}
function create_kernel_pkg(){
local kernel_path=$(readlink -f $1)
local pkg_dir=$(mktemp -d)
local wd=$(pwd)
for f in ${copy_file_list[@]}
do
s=${f%%:*}
d=${f##*:}
mkdir -p `dirname $pkg_dir/$d`
echo "cp $kernel_path/$s $pkg_dir/$d"
cp $kernel_path/$s $pkg_dir/$d
done
(cd $pkg_dir; tar zcvf $wd/kernel.tgz *)
rm -fr $pkg_dir
}
if (( $# < 1 ))
then
usage
exit 2
fi
# List of files to be copied to the output tarball.
declare -a copy_file_list=()
readonly kernel_dir=.
for product in $* ; do
case $product in
anchovy)
dts=berlin2cd-dongle
build_kernel ${kernel_dir} ${product} ${dts}
copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
copy_file_list+=(tools/perf/perf:${product}/prebuilt/sdk/bin/perf)
;;
salami)
# Generate A0 device tree blob.
a0_dts=berlin2cdp-a0-dongle
a0_dtb=${a0_dts}.dtb
build_kernel ${kernel_dir} ${product} ${a0_dts}
build_dtb ${kernel_dir} ${a0_dtb}
copy_file_list+=(arch/arm/boot/zImage-dtb.${a0_dts}.${product}:${product}/prebuilt/kernel/zImage)
copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
copy_file_list+=(tools/perf/perf:${product}/prebuilt/sdk/bin/perf)
for board in lexx-b3 lexx-b4 ; do
copy_file_list+=(arch/arm/boot/dts/${a0_dtb}:salami/prebuilt/kernel/${board}.dtb)
done
;;
chorizo)
a0_dts=berlin2cdp-a0-dongle
a0_dtb=${a0_dts}.dtb
build_kernel ${kernel_dir} ${product} ${a0_dts}
build_dtb ${kernel_dir} ${a0_dtb}
copy_file_list+=(arch/arm/boot/zImage-dtb.${a0_dts}.${product}:${product}/prebuilt/kernel/zImage)
copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
for board in earth-b1 earth-b2 earth-b3 earth-b4 ; do
copy_file_list+=(arch/arm/boot/dts/${a0_dtb}:${product}/prebuilt/kernel/${board}.dtb)
done
;;
pepperoni)
dts=berlin2cdp-a0-hendrix
dtb=${dts}.dtb
build_kernel ${kernel_dir} ${product} ${dts}
build_dtb ${kernel_dir} ${dtb}
copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
copy_file_list+=(tools/perf/perf:${product}/prebuilt/sdk/bin/perf)
for board in hendrix-b1 hendrix-b3 hendrix-b4 ; do
copy_file_list+=(arch/arm/boot/dts/${dtb}:${product}/prebuilt/kernel/${board}.dtb)
done
;;
pineapple)
dts=berlin2cdp-a0-chirp
dtb=${dts}.dtb
build_kernel ${kernel_dir} ${product} ${dts}
build_dtb ${kernel_dir} ${dtb}
copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
for board in chirp-b1 chirp-b3 chirp-b4 ; do
copy_file_list+=(arch/arm/boot/dts/${dtb}:${product}/prebuilt/kernel/${board}.dtb)
done
;;
mushroom)
dts=berlin2cdp-a0-joplin
dtb=${dts}.dtb
build_kernel ${kernel_dir} ${product} ${dts}
build_dtb ${kernel_dir} ${dtb}
copy_file_list+=(arch/arm/boot/zImage-dtb.${dts}.${product}:${product}/prebuilt/kernel/zImage)
copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
for board in joplin-b1 joplin-b3 joplin-b4 ; do
copy_file_list+=(arch/arm/boot/dts/${dtb}:${product}/prebuilt/kernel/${board}.dtb)
done
;;
caprica)
a0_dts=berlin2cdp-a0-caprica
a0_dtb=${a0_dts}.dtb
build_kernel ${kernel_dir} ${product} ${a0_dts}
build_dtb ${kernel_dir} ${a0_dtb}
copy_file_list+=(arch/arm/boot/zImage-dtb.${a0_dts}.${product}:${product}/prebuilt/kernel/zImage)
copy_file_list+=(COPYING:${product}/prebuilt/kernel/COPYING)
for board in caprica-b1 caprica-b2 caprica-b3 caprica-b4 ; do
copy_file_list+=(arch/arm/boot/dts/${a0_dtb}:${product}/prebuilt/kernel/${board}.dtb)
done
;;
*)
echo "unknown product: $product"
exit 1
esac
done
# Build the perf tool
build_perf ${kernel_dir}
# Create a kernel package for all products
create_kernel_pkg $kernel_dir