#!/usr/bin/env bash set -eu . common set -- ${cli_build:-} "$@" rm -f br2_cli.gitignore touch br2_cli.gitignore configure=true config_fragments=br2 extra_make_args= gem5=false j="$(nproc)" linux_reconfigure=false linux_kernel_custom_config_file= post_script_args= qemu_sdl='--enable-sdl --with-sdlabi=2.0' v=0 while getopts 'a:B:b:CGgj:hIiK:klp:qSv' OPT; do case "$OPT" in a) arch="$OPTARG" ;; b) config_fragments="$config_fragments $OPTARG" ;; B) echo "$OPTARG" >> br2_cli.gitignore ;; C) configure=false ;; G) extra_make_args="${extra_make_args} gem5-reconfigure \\ " gem5=true ;; g) gem5=true ;; h) cat build-usage.adoc 1>&2 exit ;; I) echo " BR2_TARGET_ROOTFS_CPIO=n BR2_TARGET_ROOTFS_EXT2=n BR2_TARGET_ROOTFS_INITRAMFS=y " >> br2_cli.gitignore ;; i) echo " BR2_TARGET_ROOTFS_CPIO=y BR2_TARGET_ROOTFS_EXT2=n BR2_TARGET_ROOTFS_INITRAMFS=n " >> br2_cli.gitignore ;; j) echo "$OPTARG" >> br2_cli.gitignore ;; K) linux_kernel_custom_config_file="$OPTARG" ;; k) extra_make_args="${extra_make_args} kernel_module-reconfigure \\ " ;; l) linux_reconfigure=true 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 ;; ?) exit 2 ;; esac done shift $(($OPTIND - 1)) extra_make_args="${extra_make_args} $@" set_common_vars "$arch" "$gem5" config_file="${buildroot_out_dir}/.config" 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 if ! "$gem5"; then config_fragments="$config_fragments br2_qemu" fi config_fragments="$config_fragments br2_cli.gitignore" # Configure. 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="$buildroot_out_dir" BR2_EXTERNAL="../kernel_module:../gem5:../parsec-benchmark:../sample_package" "$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_DL_DIR=\"${common_dir}/dl\" 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" ] && [ ! "$arch" = aarch64 ]; then f="../kernel_config_${arch_dir}" if [ -f "$f" ]; then printf "BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"$f\"\n" >> "${config_file}" fi fi fi if [ -n "$linux_kernel_custom_config_file" ]; then f="../${linux_kernel_custom_config_file}" if [ -f "$f" ]; then printf "BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE=\"${f}\"\n" >> "${config_file}" if "${linux_reconfigure}"; then touch "$f" fi else echo "error: -K: file does not exist: ${linux_kernel_custom_config_file}" 1>&2 exit 1 fi else f=../kernel_config_fragment printf "BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES=\"${f}\"\n" >> "${config_file}" if "${linux_reconfigure}"; then # https://stackoverflow.com/questions/49260466/why-when-i-change-br2-linux-kernel-custom-config-file-and-run-make-linux-reconfi touch "$f" 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 make O="$buildroot_out_dir" olddefconfig fi mkdir -p \ "${gem5_out_dir}" \ "${qemu_out_dir}" \ "${p9_dir}" \ ; 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='${buildroot_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 "${out_arch_dir}/build.sh" eval "$cmd"