aboutsummaryrefslogtreecommitdiff
path: root/include/00.build
diff options
context:
space:
mode:
authorAleksa Vučković <aleksav013@gmail.com>2022-05-01 15:22:15 +0200
committerAleksa Vučković <aleksav013@gmail.com>2022-05-01 15:22:15 +0200
commita5f0c5c71a5e50ddf418d58d8a3115bbcaca0538 (patch)
treed681e6f882ec5a63da7fab987f0641fc2287b6bf /include/00.build
parent149dac1314e474524af0494e4c74536b7bd76f9d (diff)
Added Makefile & aleksa-toolchain setup.sh
Diffstat (limited to 'include/00.build')
-rw-r--r--include/00.build/Makefile98
-rwxr-xr-xinclude/00.build/setup.sh142
2 files changed, 240 insertions, 0 deletions
diff --git a/include/00.build/Makefile b/include/00.build/Makefile
new file mode 100644
index 0000000..03b5c11
--- /dev/null
+++ b/include/00.build/Makefile
@@ -0,0 +1,98 @@
+# HOST ARCH
+ARCH=i686-aleksa-
+
+
+# GCC CROSS COMPILER
+export CC=$(ARCH)gcc
+export AS=$(ARCH)as
+
+WARNINGS := -Wall -Wextra -pedantic -Wshadow -Wpointer-arith -Wcast-align \
+ -Wwrite-strings -Wmissing-prototypes -Wmissing-declarations \
+ -Wredundant-decls -Wnested-externs -Winline -Wno-long-long \
+ -Wconversion -Wstrict-prototypes
+
+export CFLAGS=-std=gnu99 -O3 $(WARNINGS) -ffreestanding -fstack-protector-all
+
+
+# TOOLS
+export MKDIR=mkdir -p
+export RM=rm -rf
+export CP=cp -r
+QEMU=qemu-system-i386
+
+
+
+# DIRS
+
+## SOURCE
+SOURCE_DIR=src
+
+## BUILD
+ISO_DIR=isodir
+BUILD_DIR=${CURDIR}/build
+export AS_OBJECT_DIR=$(BUILD_DIR)/as
+export C_OBJECT_DIR=$(BUILD_DIR)/c
+
+## GCC USR
+GCC_USR_DIR=$(shell $(CC) -print-file-name=)
+
+
+
+# TARGET
+TARGET=myos
+BINARY=$(BUILD_DIR)/$(TARGET).bin
+ISO=$(TARGET).iso
+
+
+
+# OBJECTS
+
+## AS OBJECTS
+AS_OBJ=boot.o ioport.o gdt.o idt.o irq.o paging.o
+export AS_OBJECTS=$(patsubst %,$(AS_OBJECT_DIR)/%,$(AS_OBJ))
+
+## C OBJECTS
+C_OBJ=gdt.o heap.o idt.o kernel.o keyboard.o keymap.o stdio.o string.o tty.o vga.o irq_handler.o stack_protector.o timer.o paging.o
+export C_OBJECTS=$(patsubst %,$(C_OBJECT_DIR)/%,$(C_OBJ))
+
+## ALL OBJECTS IN ORDER
+OBJ=$(GCC_USR_DIR)crti.o $(GCC_USR_DIR)crtbegin.o $(AS_OBJECTS) $(C_OBJECTS) $(GCC_USR_DIR)crtend.o $(GCC_USR_DIR)crtn.o
+
+
+
+# OTHER FILES
+LINKER=$(SOURCE_DIR)/linker.ld
+GRUB.CFG=$(SOURCE_DIR)/grub.cfg
+
+
+# RULES
+.PHONY: all compile run run-iso clean install_headers
+all: compile
+
+$(BINARY): $(OBJ)
+ $(CC) -T $(LINKER) -o $(BINARY) $(CFLAGS) -nostdlib -lgcc $(OBJ)
+
+install_headers:
+ ./scripts/install_headers.sh
+
+compile:
+ $(MAKE) install_headers
+ @$(MAKE) --directory $(SOURCE_DIR)
+ $(MAKE) $(BINARY)
+
+$(ISO): $(BINARY)
+ grub-file --is-x86-multiboot $(BINARY)
+ $(MKDIR) $(ISO_DIR)/boot/grub
+ $(CP) $(BINARY) $(ISO_DIR)/boot/$(TARGET).bin
+ $(CP) $(GRUB.CFG) $(ISO_DIR)/boot/grub/grub.cfg
+ grub-mkrescue -o $(ISO) $(ISO_DIR)
+
+run: compile
+ $(QEMU) -kernel $(BINARY) $(QEMU_DEBUG)
+
+run-iso: compile
+ $(MAKE) $(ISO)
+ $(QEMU) -cdrom $(ISO)
+
+clean:
+ $(RM) $(BUILD_DIR) $(ISO_DIR) $(ISO)
diff --git a/include/00.build/setup.sh b/include/00.build/setup.sh
new file mode 100755
index 0000000..86cf20f
--- /dev/null
+++ b/include/00.build/setup.sh
@@ -0,0 +1,142 @@
+#!/bin/sh
+
+SYSROOT=/opt/aleksa
+
+BINUTILS=binutils-2.37
+GCC=gcc-11.2.0
+
+
+download()
+{
+ if [ ! -f "./$BINUTILS.tar.gz" ]; then
+ wget "https://ftp.gnu.org/gnu/binutils/$BINUTILS.tar.gz"
+ fi
+
+ if [ ! -f "./$GCC.tar.gz" ]; then
+ wget "https://ftp.gnu.org/gnu/gcc/$GCC/$GCC.tar.gz"
+ fi
+}
+
+extract()
+{
+ if [ ! -d "$BINUTILS" ]; then
+ tar xzvf "$BINUTILS.tar.gz"
+ fi
+
+ if [ ! -d "$GCC" ]; then
+ tar xzvf "$GCC.tar.gz"
+ fi
+}
+
+patch_gnu()
+{
+ mkdir -p "mine"
+ cd "mine" || exit
+
+ if [ ! -d "$BINUTILS" ]; then
+ cp -rv "../$BINUTILS" .
+ patch -p0 < "../files/aleksa-$BINUTILS.diff"
+ cd "$BINUTILS/ld" || exit
+ sed -i "s/2.69/2.71/" "Makefile.am"
+ aclocal
+ automake
+ cd "../.."
+ fi
+
+ if [ ! -d "$GCC" ]; then
+ cp -rv "../$GCC" .
+ patch -p0 < "../files/aleksa-$GCC.diff"
+ cd "$GCC/libstdc++-v3" || exit
+ sed -i "s/2.69/2.71/" "../config/override.m4"
+ autoreconf
+ cd "../.."
+ fi
+
+ cd ".."
+}
+
+install_headers()
+{
+ if [ -d "mykernel" ]; then
+ cd "mykernel" || exit
+ git pull
+ cd ".."
+ else
+ git clone "https://github.com/aleksav013/mykernel"
+ fi
+
+ cd "mykernel" || exit
+ ./scripts/install_headers.sh
+ cd ".."
+}
+
+build_binutils()
+{
+ cd "./mine/$BINUTILS" || exit
+
+ mkdir -p build
+ cd build || exit
+
+ if [ ! -f Makefile ]; then
+ ../configure --target=i686-aleksa \
+ --prefix="$SYSROOT/usr" \
+ --with-sysroot="$SYSROOT" \
+ --disable-nls
+ fi
+
+ make -j4
+ make install
+
+ cd "../../.."
+}
+
+build_gcc()
+{
+ cd "./mine/$GCC" || exit
+
+ mkdir -p build
+ cd build || exit
+
+ if [ ! -f Makefile ]; then
+ ../configure --target=i686-aleksa \
+ --prefix="$SYSROOT/usr" \
+ --with-sysroot="$SYSROOT" \
+ --disable-nls \
+ --disable-plugin \
+ --enable-languages=c,c++
+ fi
+
+ make -j4 all-gcc all-target-libgcc
+ make -k check || true
+ make install-gcc install-target-libgcc
+
+ cd "../../.."
+}
+
+setup_compiler()
+{
+ if [ -d "mykernel" ]; then
+ cd "mykernel" || exit
+ git pull
+ cd ".."
+ else
+ git clone "https://github.com/aleksav013/mykernel"
+ fi
+
+ cd "mykernel" || exit
+ ./scripts/setup_compiler.sh
+ cd ".."
+}
+
+main()
+{
+ download
+ extract
+ patch_gnu
+ build_binutils
+ install_headers
+ build_gcc
+ setup_compiler
+}
+
+main