summaryrefslogtreecommitdiffhomepage
path: root/run
diff options
context:
space:
mode:
Diffstat (limited to 'run')
-rwxr-xr-xrun102
1 files changed, 102 insertions, 0 deletions
diff --git a/run b/run
new file mode 100755
index 0000000..6e48550
--- /dev/null
+++ b/run
@@ -0,0 +1,102 @@
+#!/usr/bin/env sh
+# MIT License, Copyright (c) 2021 Marvin Borner
+
+set -e
+
+cd "$(dirname "$0")"
+
+MAKE=make
+NPROC=nproc
+SUDO=sudo
+TAGS=ctags
+
+mode="${1}"
+no_ask="${2}"
+
+build_cross() {
+ if [ ! -d "./cross/" ]; then
+ if [ "$no_ask" != "-y" ]; then
+ echo -n "Do you want to compile a cross compiler (this can take around 20 minutes)? [yn] "
+ read -r answer
+ if ! [ "$answer" != "${answer#[Yy]}" ]; then
+ echo "The compilation of melvix requires a cross compiler!"
+ exit 1
+ fi
+ fi
+
+ # Create directory
+ mkdir -p cross
+ cd cross
+ DIR=$(pwd)
+
+ # Get sources
+ mkdir "${DIR}/src" && cd "${DIR}/src"
+ echo "Downloading..."
+ curl "https://ftp.gnu.org/gnu/binutils/binutils-2.36.1.tar.gz" >binutils.tar.gz
+ tar xzf binutils.tar.gz
+ curl "https://ftp.gnu.org/gnu/gcc/gcc-11.1.0/gcc-11.1.0.tar.gz" >gcc.tar.gz
+ tar xzf gcc.tar.gz
+
+ # Prepare compiling
+ mkdir -p "${DIR}/opt/bin"
+ export PREFIX="${DIR}/opt"
+ export TARGET=i686-elf
+ export PATH="$PREFIX/bin:$PATH"
+
+ # Compile binutils
+ mkdir "${DIR}/src/build-binutils" && cd "${DIR}/src/build-binutils"
+ ../binutils-2.36.1/configure --target="$TARGET" --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
+ $MAKE -j $($NPROC)
+ $MAKE install
+
+ # Compile GCC
+ mkdir "${DIR}/src/build-gcc" && cd "${DIR}/src/build-gcc"
+ ../gcc-11.1.0/configure --target="$TARGET" --prefix="$PREFIX" --disable-nls --enable-languages=c --without-headers
+ $MAKE -j $($NPROC) all-gcc all-target-libgcc
+ $MAKE install-gcc install-target-libgcc
+
+ cd "${DIR}/.."
+ fi
+}
+
+build() {
+ mkdir -p build/
+
+ # Build
+ printf "\nBuilding...\n"
+ $MAKE -j $($NPROC)
+
+ # Create disk image
+ dd if=/dev/zero of=build/disk.img bs=1k count=32k status=none
+ DEV=$($SUDO losetup --find --partscan --show build/disk.img)
+ PART="p1"
+ $SUDO parted -s "$DEV" mklabel msdos mkpart primary ext2 32k 100% -a minimal set 1 boot on
+ $SUDO mke2fs -b 1024 -q "$DEV$PART"
+ $SUDO dd if=build/boot.bin of="$DEV" conv=notrunc status=none
+
+ # Mount disk and copy files
+ #mkdir -p mnt/
+ #$SUDO mount "$DEV$PART" mnt/
+ #$SUDO mkdir -p mnt/boot/
+ #$SUDO umount mnt/ || (sync && $SUDO umount mnt/)
+ #rm -rf mnt/
+
+ $SUDO losetup -d "$DEV"
+}
+
+emulate() {
+ qemu-system-i386 -d guest_errors -cpu max -serial stdio -m 256M -vga std -drive file=build/disk.img,format=raw,index=1,media=disk
+}
+
+if [ "${mode}" = "cross" ]; then
+ build_cross
+elif [ "${mode}" = "build" ]; then
+ build_cross
+ $MAKE clean
+ build
+else
+ build_cross
+ $MAKE clean
+ build
+ emulate
+fi