#!/usr/bin/env bash set -e arch=x86_64 extra_targets='' gem5=false j="$(($(nproc) - 2))" post_script_args='' qemu_sdl='--enable-sdl --with-sdlabi=2.0' x11=false v=0 while getopts 'a:gj:lp:qSt:v' OPT; do case "$OPT" in a) arch="$OPTARG" ;; g) gem5=true ;; j) j="$OPTARG" ;; l) extra_targets="$extra_args linux-reconfigure" ;; p) post_script_args="$OPTARG" ;; q) extra_targets="$extra_args host-qemu-reconfigure" ;; S) qemu_sdl='' ;; t) extra_targets="$extra_args $OPTARG" ;; x) x11=true ;; v) v=1 ;; esac done shift $(($OPTIND - 1)) case "$arch" in x86_64) defconfig=qemu_x86_64_defconfig ;; arm) if "$gem5"; then # Ideally we should use a custom clean config here. # But let's just use this one as a starting point for now. defconfig=qemu_arm_versatile_defconfig post_script_args="$post_script_args -n" else # qemu_arm_vexpress_defconfig required a newer QEMU than 2.0.0 on a Ubuntu host. # so let's stick to versatile for now. defconfig=qemu_arm_versatile_defconfig fi ;; aarch64) defconfig=qemu_aarch64_virt_defconfig ;; mips64) defconfig=qemu_mips64r6_malta_defconfig ;; esac arch_dir="$arch" if "$gem5"; then arch_dir="${arch}-gem5" fi cd kernel_module ./make-host.sh -j "$j" clean cd ../buildroot for p in $(find '../buildroot_patches/' -maxdepth 1 -name '*.patch' -print); do patch -N -r - -p 1 <"$p" || : done outdir="output.${arch_dir}~" make O="$outdir" BR2_EXTERNAL="$(pwd)/../kernel_module:$(pwd)/../gem5" "$defconfig" # TODO Can't get rid of this for now. # http://stackoverflow.com/questions/44078245/is-it-possible-to-use-config-fragments-with-buildroots-config cat ../buildroot_config_fragment >> "${outdir}/.config" if "$gem5"; then echo "\ BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"../kernel_config_${arch_dir}\" " >> "${outdir}/.config" else echo "\ BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES=\"../kernel_config_fragment\" " >> "${outdir}/.config" fi if "$x11"; then cat ../buildroot_config_fragment_x11 >> "${outdir}/.config" fi if ! "$gem5"; then cat ../buildroot_config_fragment_qemu >> "${outdir}/.config" fi if [ "$arch" = 'mips64' ]; then # Workaround for: # http://lists.busybox.net/pipermail/buildroot/2017-August/201053.html sed -Ei 's/^BR2_PACKAGE_LINUX_TOOLS_GPIO/BR2_PACKAGE_LINUX_TOOLS_GPIO=n/' "${outdir}/.config" fi make O="$outdir" olddefconfig # HOST_QEMU_OPTS is a hack that happens to work because the QEMU package luckly uses += at all times. # It shouldn't be necessary in the first place: https://bugs.busybox.net/show_bug.cgi?id=9936 # # Even if were an autotools package, there is no general way currently to pass extra configs to it: # https://stackoverflow.com/questions/44341188/how-to-pass-extra-custom-configure-autotools-options-to-a-buildroot-package/44341225#44341225 time \ env \ -u LD_LIBRARY_PATH \ make \ O="$outdir" \ BR2_JLEVEL="$j" \ BR2_PACKAGE_GEM5="$("$gem5" && echo y || echo n)" \ BR2_ROOTFS_POST_SCRIPT_ARGS="$post_script_args" \ HOST_QEMU_OPTS="--enable-debug --extra-cflags='-DDEBUG_PL061=1' --enable-trace-backends=simple $qemu_sdl" \ V="$v" \ kernel_module-rebuild \ $extra_targets \ all \ ; cd .. if "$gem5"; then ./build-gem5 -a "$arch" fi