From f7b0f240d369862135b341fbc7aee99ac26a6e89 Mon Sep 17 00:00:00 2001 From: mintsuki Date: Tue, 21 Jan 2020 23:45:13 +0100 Subject: [PATCH] Add make toolchain script and reorganise source tree --- Makefile | 42 ++------------- qloader2-install | 2 +- src/Makefile | 44 ++++++++++++++++ {bootsect => src/bootsect}/a20_enabler.inc | 0 {bootsect => src/bootsect}/bootsect.asm | 0 {bootsect => src/bootsect}/disk.inc | 0 {bootsect => src/bootsect}/gdt.inc | 0 {bootsect => src/bootsect}/simple_print.inc | 0 {drivers => src/drivers}/disk.c | 0 {drivers => src/drivers}/disk.h | 0 {drivers => src/drivers}/vga_textmode.c | 0 {drivers => src/drivers}/vga_textmode.h | 0 {lib => src/lib}/cio.h | 0 {lib => src/lib}/libc.c | 0 {lib => src/lib}/libc.h | 0 {lib => src/lib}/mbr.c | 0 {lib => src/lib}/mbr.h | 0 {lib => src/lib}/print.c | 0 {lib => src/lib}/print.h | 0 {lib => src/lib}/real.c | 0 {lib => src/lib}/real.h | 0 {lib => src/lib}/types.h | 0 linker.ld => src/linker.ld | 0 main.c => src/main.c | 0 toolchain/.gitignore | 3 ++ toolchain/make_toolchain.sh | 58 +++++++++++++++++++++ 26 files changed, 109 insertions(+), 40 deletions(-) create mode 100644 src/Makefile rename {bootsect => src/bootsect}/a20_enabler.inc (100%) rename {bootsect => src/bootsect}/bootsect.asm (100%) rename {bootsect => src/bootsect}/disk.inc (100%) rename {bootsect => src/bootsect}/gdt.inc (100%) rename {bootsect => src/bootsect}/simple_print.inc (100%) rename {drivers => src/drivers}/disk.c (100%) rename {drivers => src/drivers}/disk.h (100%) rename {drivers => src/drivers}/vga_textmode.c (100%) rename {drivers => src/drivers}/vga_textmode.h (100%) rename {lib => src/lib}/cio.h (100%) rename {lib => src/lib}/libc.c (100%) rename {lib => src/lib}/libc.h (100%) rename {lib => src/lib}/mbr.c (100%) rename {lib => src/lib}/mbr.h (100%) rename {lib => src/lib}/print.c (100%) rename {lib => src/lib}/print.h (100%) rename {lib => src/lib}/real.c (100%) rename {lib => src/lib}/real.h (100%) rename {lib => src/lib}/types.h (100%) rename linker.ld => src/linker.ld (100%) rename main.c => src/main.c (100%) create mode 100644 toolchain/.gitignore create mode 100755 toolchain/make_toolchain.sh diff --git a/Makefile b/Makefile index 392b7845..3082b2e7 100644 --- a/Makefile +++ b/Makefile @@ -1,43 +1,7 @@ -CC = gcc -LD = ld - -CFLAGS = -O2 -pipe -Wall -Wextra - -INTERNAL_CFLAGS = \ - -m32 \ - -ffreestanding \ - -nostdlib \ - -masm=intel \ - -fno-pic \ - -mno-sse \ - -mno-sse2 \ - -ffreestanding \ - -fno-stack-protector \ - -I. - -LDFLAGS = - -INTERNAL_LDFLAGS = \ - -m elf_i386 \ - -nostdlib \ - -Tlinker.ld - .PHONY: all clean -C_FILES := $(shell find ./ -type f -name '*.c') -OBJ := $(C_FILES:.c=.o) - -all: qloader2.bin - -qloader2.bin: bootsect/bootsect.bin $(OBJ) - $(LD) $(LDFLAGS) $(INTERNAL_LDFLAGS) $(OBJ) -o stage2.bin - cat bootsect/bootsect.bin stage2.bin > $@ - -bootsect/bootsect.bin: bootsect/bootsect.asm - cd bootsect && nasm bootsect.asm -fbin -o bootsect.bin - -%.o: %.c - $(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@ +all: + $(MAKE) -C src all clean: - rm -f $(OBJ) bootsect/bootsect.bin + $(MAKE) -C src clean diff --git a/qloader2-install b/qloader2-install index 4d0c4c9c..6c8ec6d8 100755 --- a/qloader2-install +++ b/qloader2-install @@ -11,7 +11,7 @@ fi # Variables. DEVICE="$1" MBR="$(mktemp)" -QLOADER2="qloader2.bin" +QLOADER2="src/qloader2.bin" # Copy the loader to the device. dd if="$DEVICE" of="$MBR" bs=1 count=64 skip=446 diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 00000000..31a4eccb --- /dev/null +++ b/src/Makefile @@ -0,0 +1,44 @@ +CC = ../toolchain/bin/i386-elf-gcc + +CFLAGS = -O2 -pipe -Wall -Wextra + +INTERNAL_CFLAGS = \ + -ffreestanding \ + -masm=intel \ + -fno-pic \ + -mno-sse \ + -mno-sse2 \ + -mno-mmx \ + -mno-80387 \ + -ffreestanding \ + -fno-stack-protector \ + -I. + +LDFLAGS = -O2 + +INTERNAL_LDFLAGS = \ + -nostdlib \ + -no-pie \ + -lgcc \ + -static-libgcc \ + -Tlinker.ld + +.PHONY: all clean + +C_FILES := $(shell find ./ -type f -name '*.c') +OBJ := $(C_FILES:.c=.o) + +all: qloader2.bin + +qloader2.bin: bootsect/bootsect.bin $(OBJ) + $(CC) $(LDFLAGS) $(INTERNAL_LDFLAGS) $(OBJ) -o stage2.bin + cat bootsect/bootsect.bin stage2.bin > $@ + +bootsect/bootsect.bin: bootsect/bootsect.asm + cd bootsect && nasm bootsect.asm -fbin -o bootsect.bin + +%.o: %.c + $(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@ + +clean: + rm -f $(OBJ) bootsect/bootsect.bin diff --git a/bootsect/a20_enabler.inc b/src/bootsect/a20_enabler.inc similarity index 100% rename from bootsect/a20_enabler.inc rename to src/bootsect/a20_enabler.inc diff --git a/bootsect/bootsect.asm b/src/bootsect/bootsect.asm similarity index 100% rename from bootsect/bootsect.asm rename to src/bootsect/bootsect.asm diff --git a/bootsect/disk.inc b/src/bootsect/disk.inc similarity index 100% rename from bootsect/disk.inc rename to src/bootsect/disk.inc diff --git a/bootsect/gdt.inc b/src/bootsect/gdt.inc similarity index 100% rename from bootsect/gdt.inc rename to src/bootsect/gdt.inc diff --git a/bootsect/simple_print.inc b/src/bootsect/simple_print.inc similarity index 100% rename from bootsect/simple_print.inc rename to src/bootsect/simple_print.inc diff --git a/drivers/disk.c b/src/drivers/disk.c similarity index 100% rename from drivers/disk.c rename to src/drivers/disk.c diff --git a/drivers/disk.h b/src/drivers/disk.h similarity index 100% rename from drivers/disk.h rename to src/drivers/disk.h diff --git a/drivers/vga_textmode.c b/src/drivers/vga_textmode.c similarity index 100% rename from drivers/vga_textmode.c rename to src/drivers/vga_textmode.c diff --git a/drivers/vga_textmode.h b/src/drivers/vga_textmode.h similarity index 100% rename from drivers/vga_textmode.h rename to src/drivers/vga_textmode.h diff --git a/lib/cio.h b/src/lib/cio.h similarity index 100% rename from lib/cio.h rename to src/lib/cio.h diff --git a/lib/libc.c b/src/lib/libc.c similarity index 100% rename from lib/libc.c rename to src/lib/libc.c diff --git a/lib/libc.h b/src/lib/libc.h similarity index 100% rename from lib/libc.h rename to src/lib/libc.h diff --git a/lib/mbr.c b/src/lib/mbr.c similarity index 100% rename from lib/mbr.c rename to src/lib/mbr.c diff --git a/lib/mbr.h b/src/lib/mbr.h similarity index 100% rename from lib/mbr.h rename to src/lib/mbr.h diff --git a/lib/print.c b/src/lib/print.c similarity index 100% rename from lib/print.c rename to src/lib/print.c diff --git a/lib/print.h b/src/lib/print.h similarity index 100% rename from lib/print.h rename to src/lib/print.h diff --git a/lib/real.c b/src/lib/real.c similarity index 100% rename from lib/real.c rename to src/lib/real.c diff --git a/lib/real.h b/src/lib/real.h similarity index 100% rename from lib/real.h rename to src/lib/real.h diff --git a/lib/types.h b/src/lib/types.h similarity index 100% rename from lib/types.h rename to src/lib/types.h diff --git a/linker.ld b/src/linker.ld similarity index 100% rename from linker.ld rename to src/linker.ld diff --git a/main.c b/src/main.c similarity index 100% rename from main.c rename to src/main.c diff --git a/toolchain/.gitignore b/toolchain/.gitignore new file mode 100644 index 00000000..fd038def --- /dev/null +++ b/toolchain/.gitignore @@ -0,0 +1,3 @@ +* +!.gitignore +!make_toolchain.sh diff --git a/toolchain/make_toolchain.sh b/toolchain/make_toolchain.sh new file mode 100755 index 00000000..4b78ed3f --- /dev/null +++ b/toolchain/make_toolchain.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +set -e +set -x + +PREFIX="$(pwd)" +TARGET=i386-elf +BINUTILSVERSION=2.33.1 +GCCVERSION=9.2.0 + +if [ -z "$MAKEFLAGS" ]; then + MAKEFLAGS="$1" +fi +export MAKEFLAGS + +export PATH="$PREFIX/bin:$PATH" + +if [ -x "$(command -v gmake)" ]; then + mkdir -p "$PREFIX/bin" + cat <"$PREFIX/bin/make" +#!/usr/bin/env sh +gmake "\$@" +EOF + chmod +x "$PREFIX/bin/make" +fi + +mkdir -p build +cd build + +if [ ! -f binutils-$BINUTILSVERSION.tar.gz ]; then + wget https://ftp.gnu.org/gnu/binutils/binutils-$BINUTILSVERSION.tar.gz +fi +if [ ! -f gcc-$GCCVERSION.tar.gz ]; then + wget https://ftp.gnu.org/gnu/gcc/gcc-$GCCVERSION/gcc-$GCCVERSION.tar.gz +fi + +tar -xf binutils-$BINUTILSVERSION.tar.gz +tar -xf gcc-$GCCVERSION.tar.gz + +rm -rf build-gcc build-binutils + +mkdir build-binutils +cd build-binutils +../binutils-$BINUTILSVERSION/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror +make +make install +cd .. + +cd gcc-$GCCVERSION +contrib/download_prerequisites +cd .. +mkdir build-gcc +cd build-gcc +../gcc-$GCCVERSION/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c --without-headers +make all-gcc +make all-target-libgcc +make install-gcc +make install-target-libgcc