xref: /openbsd-src/gnu/llvm/lldb/scripts/lldb-test-qemu/setup.sh (revision be691f3bb6417f04a68938fadbcaee2d5795e764)
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