1*be691f3bSpatrick#!/bin/bash 2*be691f3bSpatrick 3*be691f3bSpatrickprint_usage() { 4*be691f3bSpatrick echo "Usage: $(basename $0) [options]" 5*be691f3bSpatrick echo -e "Builds QEMU and Linux kernel from source.\n" 6*be691f3bSpatrick echo -e " --help\t\t\tDisplay this information." 7*be691f3bSpatrick echo -e " --kernel {arm|arm64}\t\tBuild Linux kernel for the architecture." 8*be691f3bSpatrick echo -e " --qemu\t\t\tBuild QEMU from source." 9*be691f3bSpatrick echo -e " --clean\t\t\tRemove qemu.git and linux.git directories in current directory." 10*be691f3bSpatrick exit "$1" 11*be691f3bSpatrick} 12*be691f3bSpatrick 13*be691f3bSpatrickupdate_repositories() { 14*be691f3bSpatrick echo -e "\nUpdating apt repositories. " 15*be691f3bSpatrick echo -e "\nPress 'y' to continue or any other key to exit..." 16*be691f3bSpatrick read -s -n 1 user_input 17*be691f3bSpatrick if [[ $user_input == 'Y' ]] || [[ $user_input == 'y' ]]; then 18*be691f3bSpatrick sudo apt update 19*be691f3bSpatrick else 20*be691f3bSpatrick exit 21*be691f3bSpatrick fi 22*be691f3bSpatrick} 23*be691f3bSpatrick 24*be691f3bSpatrickcheck_dir_exists() { 25*be691f3bSpatrick user_input= 26*be691f3bSpatrick if [ -d "$1" ]; then 27*be691f3bSpatrick echo -e "\n$1 already exists in working directory and will not be updated." 28*be691f3bSpatrick echo -e "\nPress 'y' to continue or any other key to exit..." 29*be691f3bSpatrick read -s -n 1 user_input 30*be691f3bSpatrick if [[ $user_input != 'Y' ]] && [[ $user_input != 'y' ]]; then 31*be691f3bSpatrick exit 32*be691f3bSpatrick fi 33*be691f3bSpatrick fi 34*be691f3bSpatrick} 35*be691f3bSpatrick 36*be691f3bSpatrickinvalid_arg() { 37*be691f3bSpatrick echo "ERROR: Unrecognized argument: $1" >&2 38*be691f3bSpatrick print_usage 1 39*be691f3bSpatrick} 40*be691f3bSpatrick 41*be691f3bSpatrickbuild_qemu() { 42*be691f3bSpatrick echo "Installing QEMU build dependencies ..." 43*be691f3bSpatrick sudo apt install git python3-dev libsdl1.2-dev build-essential libpixman-1-dev 44*be691f3bSpatrick 45*be691f3bSpatrick # Checkout source code 46*be691f3bSpatrick check_dir_exists "qemu.git" 47*be691f3bSpatrick if [ ! -d "qemu.git" ]; then 48*be691f3bSpatrick git clone --depth 1 git://git.qemu.org/qemu.git qemu.git 49*be691f3bSpatrick fi 50*be691f3bSpatrick 51*be691f3bSpatrick cd qemu.git 52*be691f3bSpatrick # We are going to build QEMU Arm and AArch64 system mode emulation. 53*be691f3bSpatrick # ./configure --help emits a list of other possible targets supported by QEMU. 54*be691f3bSpatrick ./configure --target-list=arm-softmmu,aarch64-softmmu 55*be691f3bSpatrick make -j`getconf _NPROCESSORS_ONLN` 56*be691f3bSpatrick} 57*be691f3bSpatrick 58*be691f3bSpatrickbuild_linux() { 59*be691f3bSpatrick echo "Installing Linux kernel build dependencies ..." 60*be691f3bSpatrick sudo apt install git bison flex build-essential libssl-dev bc 61*be691f3bSpatrick 62*be691f3bSpatrick check_dir_exists "linux.git" 63*be691f3bSpatrick 64*be691f3bSpatrick if [ ! -d "linux.git" ]; then 65*be691f3bSpatrick git clone --depth 1 \ 66*be691f3bSpatrick https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux.git 67*be691f3bSpatrick fi 68*be691f3bSpatrick 69*be691f3bSpatrick cd linux.git 70*be691f3bSpatrick make mrproper 71*be691f3bSpatrick 72*be691f3bSpatrick if [[ "$1" == "arm" ]]; then 73*be691f3bSpatrick echo "Installing gcc-arm-linux-gnueabihf ..." 74*be691f3bSpatrick sudo apt install gcc-arm-linux-gnueabihf 75*be691f3bSpatrick 76*be691f3bSpatrick # Configure kernel_branch=master arch=arm config=vexpress_defconfig 77*be691f3bSpatrick make O=../linux.build/arm ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \ 78*be691f3bSpatrick vexpress_defconfig 79*be691f3bSpatrick 80*be691f3bSpatrick # Trigger Arm kernel build 81*be691f3bSpatrick make -j`getconf _NPROCESSORS_ONLN` O=../linux.build/arm ARCH=arm \ 82*be691f3bSpatrick CROSS_COMPILE=arm-linux-gnueabihf- 83*be691f3bSpatrick elif [[ "$1" == "arm64" ]]; then 84*be691f3bSpatrick echo "Installing gcc-aarch64-linux-gnu ..." 85*be691f3bSpatrick sudo apt install gcc-aarch64-linux-gnu 86*be691f3bSpatrick 87*be691f3bSpatrick # Configure kernel_branch=master arch=arm64 config=defconfig 88*be691f3bSpatrick make O=../linux.build/arm64 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ 89*be691f3bSpatrick defconfig 90*be691f3bSpatrick 91*be691f3bSpatrick # Trigger AArch64 kernel build 92*be691f3bSpatrick make -j`getconf _NPROCESSORS_ONLN` O=../linux.build/arm64 ARCH=arm64 \ 93*be691f3bSpatrick CROSS_COMPILE=aarch64-linux-gnu- 94*be691f3bSpatrick else 95*be691f3bSpatrick echo "ERROR: Unrecognized architecture: $1" >&2 96*be691f3bSpatrick print_usage 1 97*be691f3bSpatrick exit 98*be691f3bSpatrick fi 99*be691f3bSpatrick} 100*be691f3bSpatrick 101*be691f3bSpatrickclean() { 102*be691f3bSpatrick if [ -d "linux.git" ]; then 103*be691f3bSpatrick echo "Removing linux.git ..." 104*be691f3bSpatrick rm -rf linux.git 105*be691f3bSpatrick fi 106*be691f3bSpatrick 107*be691f3bSpatrick if [ -d "linux.build" ]; then 108*be691f3bSpatrick echo "Removing linux.build ..." 109*be691f3bSpatrick rm -rf linux.build 110*be691f3bSpatrick fi 111*be691f3bSpatrick 112*be691f3bSpatrick if [ -d "qemu.git" ]; then 113*be691f3bSpatrick echo "Removing qemu.git ..." 114*be691f3bSpatrick rm -rf qemu.git 115*be691f3bSpatrick fi 116*be691f3bSpatrick 117*be691f3bSpatrick exit 118*be691f3bSpatrick} 119*be691f3bSpatrick 120*be691f3bSpatrick# Parse options 121*be691f3bSpatrickwhile [[ $# -gt 0 ]]; do 122*be691f3bSpatrick case "${END_OF_OPT}${1}" in 123*be691f3bSpatrick -h|--help) print_usage 0 ;; 124*be691f3bSpatrick -k|--kernel) 125*be691f3bSpatrick if [ "$2" == "arm64" ] || [ "$2" == "arm" ]; then 126*be691f3bSpatrick KERNEL_ARCH=$2 127*be691f3bSpatrick else 128*be691f3bSpatrick invalid_arg "$2" 129*be691f3bSpatrick fi 130*be691f3bSpatrick shift;; 131*be691f3bSpatrick -q|--qemu) 132*be691f3bSpatrick QEMU=1;; 133*be691f3bSpatrick -c|--clean) clean ;; 134*be691f3bSpatrick *) invalid_arg "$1" ;; 135*be691f3bSpatrick esac 136*be691f3bSpatrick shift 137*be691f3bSpatrickdone 138*be691f3bSpatrick 139*be691f3bSpatrickupdate_repositories 140*be691f3bSpatrick 141*be691f3bSpatrickif [ "$KERNEL_ARCH" != "" ]; then 142*be691f3bSpatrick pushd . 143*be691f3bSpatrick build_linux $KERNEL_ARCH 144*be691f3bSpatrick popd 145*be691f3bSpatrickfi 146*be691f3bSpatrick 147*be691f3bSpatrickif [[ $QEMU -eq 1 ]]; then 148*be691f3bSpatrick pushd . 149*be691f3bSpatrick build_qemu 150*be691f3bSpatrick popd 151*be691f3bSpatrickfi 152