#!/bin/sh event() { printf "$1... " } ARCH=${ARCH:-x86_64} # Define toolchain and QEMU/GDB settings for per architecture event "target architecture" echo "$ARCH" case "$ARCH" in x86_64) QEMU_EXECUTABLES="qemu-system-x86_64" GDB_EXECUTABLES="gdb x86_64-elf-gdb" : "${CROSS_COMPILE:=}" ;; riscv64) QEMU_EXECUTABLES="qemu-system-riscv64" GDB_EXECUTABLES="gdb riscv64-unknown-elf-gdb" : "${CROSS_COMPILE:=riscv64-unknown-elf-}" ;; aarch64) QEMU_EXECUTABLES="qemu-system-aarch64" GDB_EXECUTABLES="gdb aarch64-none-elf-gdb" : "${CROSS_COMPILE:=aarch64-none-elf-}" ;; *) echo "Unsupported ARCH: $ARCH" exit 1 ;; esac # $1: OS NAME # $2: CROSS COMPILE FLAG # $3: FDISK_BIN generate_cross_compile_script() { cat > cross-compile.cmake < /dev/null 2>&1; then QEMU="$item" break fi done if [ "$QEMU" = "" ]; then echo "failed" exit 1 fi echo "$QEMU" check_gdb_arch() { local item="$1" if $item --init-eval-command 'set arch' \ --init-eval-command 'q' 2>&1 \ | grep "$ARCH" >/dev/null 2>&1; then return 0 else return 1 fi } if [ "$GDB" = "" ]; then event "finding gdb" for item in $GDB_EXECUTABLES; do if check_gdb_arch "$item"; then GDB="$item" break fi done if [ "$GDB" = "" ]; then echo "failed" exit 1 fi else event 'checking given gdb' if ! check_gdb_arch "$GDB"; then echo "failed" exit 1 fi fi echo "$GDB" event "checking os type" OS=`uname` case "$OS" in "Linux") echo "Linux" ;; "Darwin") echo "macOS" ;; *) echo "unknown" exit 1 ;; esac event "setting hardware acceleration type" case "$OS" in "Linux") echo "kvm" # QEMU_ACCEL='-enable-kvm' ;; "Darwin") echo "tcg" QEMU_ACCEL='-accel tcg' ;; esac event "checking util-linux fdisk" if [ -z "$FDISK_BIN" ]; then if ! which fdisk > /dev/null 2>&1; then echo "no" exit 1 fi FDISK_BIN=$(which fdisk) fi if ! $FDISK_BIN -v 2>&1 | grep util-linux > /dev/null 2>&1 ; then echo "no, fdisk is not from util-linux" exit 1 else echo "$FDISK_BIN" fi event "checking cross compiling" if [ "$CROSS_COMPILE" != "" ]; then echo "yes" CROSS_COMPILE_FLAG='--toolchain cross-compile.cmake' generate_cross_compile_script "$OS" "$CROSS_COMPILE" "$FDISK_BIN" else echo "no" CROSS_COMPILE_FLAG= fi event "checking mkfs tool" if ! which mkfs.fat > /dev/null 2>&1; then echo "no" exit 1 else echo `which mkfs.fat` fi cp Makefile.src Makefile sed -i '' -e "s|##PLACEHOLDER_1##|$QEMU|" Makefile > /dev/null 2>&1 sed -i '' -e "s|##PLACEHOLDER_2##|$GDB|" Makefile > /dev/null 2>&1 sed -i '' -e "s|##PLACEHOLDER_3##|$QEMU_ACCEL|" Makefile > /dev/null 2>&1 sed -i '' -e "s|##PLACEHOLDER_4##|$CROSS_COMPILE_FLAG|" Makefile > /dev/null 2>&1 sed -i '' -e "s|##PLACEHOLDER_5##|$FDISK_BIN|" Makefile > /dev/null 2>&1 echo "Configuration successful for architecture: $ARCH" exit 0