152 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
#!/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
 |