:: commit f7b0f240d369862135b341fbc7aee99ac26a6e89

mintsuki <mintsuki@protonmail.com> — 2020-01-21 22:45

parents: d624a35427

Add make toolchain script and reorganise source tree

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 <<EOF >"$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
tab: 248 wrap: offon