#!/usr/bin/env bash set -eu arch=x86_64 rm -f buildroot_config_fragment_cli touch buildroot_config_fragment_cli configure=true config_fragments='buildroot_config_fragment buildroot_config_fragment_cli' extra_make_args='' gem5=false j="$(($(nproc) - 2))" linux_kernel_custom_config_file='' post_script_args='' qemu_sdl='--enable-sdl --with-sdlabi=2.0' v=0 while getopts 'a:c:Cgj:i:kK:lp:qS:v' OPT; do case "$OPT" in a) arch="$OPTARG" ;; c) echo "$OPTARG" >> buildroot_config_fragment_cli ;; C) configure=false ;; g) gem5=true ;; j) j="$OPTARG" ;; i) config_fragments="$config_fragments $OPTARG" ;; k) extra_make_args="$extra_make_args kernel_module-reconfigure" ;; K) linux_kernel_custom_config_file="$OPTARG" ;; l) extra_make_args="$extra_make_args linux-reconfigure" ;; p) post_script_args="$OPTARG" ;; q) extra_make_args="$extra_make_args host-qemu-reconfigure" ;; S) qemu_sdl='' ;; v) v=1 ;; esac done shift $(($OPTIND - 1)) extra_make_args="$extra_make_args $@" case "$arch" in x86_64) defconfig=qemu_x86_64_defconfig ;; arm) defconfig=qemu_arm_versatile_defconfig ;; aarch64) defconfig=qemu_aarch64_virt_defconfig ;; mips64) defconfig=qemu_mips64r6_malta_defconfig ;; esac arch_dir="$arch" if "$gem5"; then arch_dir="${arch}-gem5" # Networking was not working, so disable it to speed things up. post_script_args="$post_script_args -n" else config_fragments="$config_fragments buildroot_config_fragment_qemu" fi root_dir="$(pwd)" buildroot_dir="${root_dir}/buildroot" out_dir="${buildroot_dir}/output.${arch_dir}~" config_file="${out_dir}/.config" if "$configure"; then cd "${buildroot_dir}" for p in $(find "${root_dir}/buildroot_patches/" -maxdepth 1 -name '*.patch' -print); do patch -N -r - -p 1 <"$p" || : done make O="$out_dir" BR2_EXTERNAL="${root_dir}/kernel_module:${root_dir}/gem5:${root_dir}/parsec-benchmark" "$defconfig" # TODO Can't get rid of these for now. # http://stackoverflow.com/questions/44078245/is-it-possible-to-use-config-fragments-with-buildroots-config for config_fragment in $config_fragments; do cat "../$config_fragment" >> "${config_file}" done printf " BR2_JLEVEL=$j BR2_ROOTFS_POST_SCRIPT_ARGS=\"$post_script_args\" " >> "${config_file}" if "$gem5"; then printf "BR2_PACKAGE_GEM5=y\n" >> "${config_file}" if [ -z "$linux_kernel_custom_config_file" ]; then printf "BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"../kernel_config_${arch_dir}\"\n" >> "${config_file}" fi else if [ -z "$linux_kernel_custom_config_file" ]; then printf "BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES=\"../kernel_config_fragment\"\n" >> "${config_file}" fi 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/' "${config_file}" fi if [ -n "$linux_kernel_custom_config_file" ]; then # TODO why is this needed. Otherwise kernel .config does not change, even though Buildroot # .config did due to -K. even if we are running linux-kernel-reconfigure! # But doing this forces launches the kernel's reconfigure. Annoying. # https://stackoverflow.com/questions/49260466/why-is-it-that-if-i-change-br2-linux-kernel-custom-config-file-and-run-linux-rec rm -f "${out_dir}/build/linux-custom/.config" printf "BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"../${linux_kernel_custom_config_file}\"\n" >> "${config_file}" fi make O="$out_dir" olddefconfig fi cd "${root_dir}/kernel_module" ./make-host.sh -j "$j" clean mkdir -p "${root_dir}/9p" cd "${buildroot_dir}" # 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 # # BR2_ options may be given on the command line here, and they do have direct "define" effects. # But this is generally bad, as it skips the Kconfig mechanism, e.g. it does not set defaults properly. cmd="time \ env \ -u LD_LIBRARY_PATH \ make \ O='$out_dir' \ HOST_QEMU_OPTS='--enable-debug --extra-cflags=-DDEBUG_PL061=1 --enable-trace-backends=simple $qemu_sdl' \ V='$v' \ $extra_make_args \ all \ " echo "$cmd" | tee "${root_dir}/build.log" eval "$cmd"