123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #!/usr/bin/env bash
- set -eu
- arch=x86_64
- configure=true
- config_fragments=buildroot_config_fragment
- extra_make_args=''
- gem5=false
- j="$(($(nproc) - 2))"
- post_script_args=''
- qemu_sdl='--enable-sdl --with-sdlabi=2.0'
- v=0
- while getopts 'a:Cgj:i:klp:qS:v' OPT; do
- case "$OPT" in
- a)
- arch="$OPTARG"
- ;;
- 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"
- ;;
- 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_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"../kernel_config_${arch_dir}\"
- BR2_PACKAGE_GEM5=y
- " >> "${config_file}"
- else
- printf "\
- BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES=\"../kernel_config_fragment\"
- " >> "${config_file}"
- 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
- make O="$out_dir" olddefconfig
- fi
- cd "${root_dir}/kernel_module"
- ./make-host.sh -j "$j" clean
- 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"
- if "$gem5"; then
- cd "${root_dir}"
- ./build-gem5 -a "$arch"
- fi
|