| #!/bin/bash |
| |
| print_usage() { |
| echo "Usage: $(basename $0) [options]" |
| echo -e "Builds QEMU and Linux kernel from source.\n" |
| echo -e " --help\t\t\tDisplay this information." |
| echo -e " --kernel {arm|arm64}\t\tBuild Linux kernel for the architecture." |
| echo -e " --qemu\t\t\tBuild QEMU from source." |
| echo -e " --clean\t\t\tRemove qemu.git and linux.git directories in current directory." |
| exit "$1" |
| } |
| |
| update_repositories() { |
| echo -e "\nUpdating apt repositories. " |
| echo -e "\nPress 'y' to continue or any other key to exit..." |
| read -s -n 1 user_input |
| if [[ $user_input == 'Y' ]] || [[ $user_input == 'y' ]]; then |
| sudo apt update |
| else |
| exit |
| fi |
| } |
| |
| check_dir_exists() { |
| user_input= |
| if [ -d "$1" ]; then |
| echo -e "\n$1 already exists in working directory and will not be updated." |
| echo -e "\nPress 'y' to continue or any other key to exit..." |
| read -s -n 1 user_input |
| if [[ $user_input != 'Y' ]] && [[ $user_input != 'y' ]]; then |
| exit |
| fi |
| fi |
| } |
| |
| invalid_arg() { |
| echo "ERROR: Unrecognized argument: $1" >&2 |
| print_usage 1 |
| } |
| |
| build_qemu() { |
| echo "Installing QEMU build dependencies ..." |
| sudo apt install git python3-dev libsdl1.2-dev build-essential libpixman-1-dev |
| |
| # Checkout source code |
| check_dir_exists "qemu.git" |
| if [ ! -d "qemu.git" ]; then |
| git clone --depth 1 git://git.qemu.org/qemu.git qemu.git |
| fi |
| |
| cd qemu.git |
| # We are going to build QEMU Arm and AArch64 system mode emulation. |
| # ./configure --help emits a list of other possible targets supported by QEMU. |
| ./configure --target-list=arm-softmmu,aarch64-softmmu |
| make -j`getconf _NPROCESSORS_ONLN` |
| } |
| |
| build_linux() { |
| echo "Installing Linux kernel build dependencies ..." |
| sudo apt install git bison flex build-essential libssl-dev bc |
| |
| check_dir_exists "linux.git" |
| |
| if [ ! -d "linux.git" ]; then |
| git clone --depth 1 \ |
| https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git linux.git |
| fi |
| |
| cd linux.git |
| make mrproper |
| |
| if [[ "$1" == "arm" ]]; then |
| echo "Installing gcc-arm-linux-gnueabihf ..." |
| sudo apt install gcc-arm-linux-gnueabihf |
| |
| # Configure kernel_branch=master arch=arm config=vexpress_defconfig |
| make O=../linux.build/arm ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- \ |
| vexpress_defconfig |
| |
| # Trigger Arm kernel build |
| make -j`getconf _NPROCESSORS_ONLN` O=../linux.build/arm ARCH=arm \ |
| CROSS_COMPILE=arm-linux-gnueabihf- |
| elif [[ "$1" == "arm64" ]]; then |
| echo "Installing gcc-aarch64-linux-gnu ..." |
| sudo apt install gcc-aarch64-linux-gnu |
| |
| # Configure kernel_branch=master arch=arm64 config=defconfig |
| make O=../linux.build/arm64 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ |
| defconfig |
| |
| # Trigger AArch64 kernel build |
| make -j`getconf _NPROCESSORS_ONLN` O=../linux.build/arm64 ARCH=arm64 \ |
| CROSS_COMPILE=aarch64-linux-gnu- |
| else |
| echo "ERROR: Unrecognized architecture: $1" >&2 |
| print_usage 1 |
| exit |
| fi |
| } |
| |
| clean() { |
| if [ -d "linux.git" ]; then |
| echo "Removing linux.git ..." |
| rm -rf linux.git |
| fi |
| |
| if [ -d "linux.build" ]; then |
| echo "Removing linux.build ..." |
| rm -rf linux.build |
| fi |
| |
| if [ -d "qemu.git" ]; then |
| echo "Removing qemu.git ..." |
| rm -rf qemu.git |
| fi |
| |
| exit |
| } |
| |
| # Parse options |
| while [[ $# -gt 0 ]]; do |
| case "${END_OF_OPT}${1}" in |
| -h|--help) print_usage 0 ;; |
| -k|--kernel) |
| if [ "$2" == "arm64" ] || [ "$2" == "arm" ]; then |
| KERNEL_ARCH=$2 |
| else |
| invalid_arg "$2" |
| fi |
| shift;; |
| -q|--qemu) |
| QEMU=1;; |
| -c|--clean) clean ;; |
| *) invalid_arg "$1" ;; |
| esac |
| shift |
| done |
| |
| update_repositories |
| |
| if [ "$KERNEL_ARCH" != "" ]; then |
| pushd . |
| build_linux $KERNEL_ARCH |
| popd |
| fi |
| |
| if [[ $QEMU -eq 1 ]]; then |
| pushd . |
| build_qemu |
| popd |
| fi |