:: commit 897b6ca90927a0f77873f4126dbca8462d70f5d3

Mintsuki <mintsuki@protonmail.com> — 2025-08-07 16:07

parents: 5f5dbbc9a1

build: Get rid of freestanding-toolchain

And some other miscellaneous improvements.
diff --git a/.gitignore b/.gitignore
index 6d51ecb5..084fab6d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,7 +24,6 @@
 
 /bin
 /build
-/toolchain-files
 /limine-protocol
 /nyu-efi
 /freestnd-c-hdrs
diff --git a/GNUmakefile.in b/GNUmakefile.in
index 22cfd0ef..50def39f 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -62,6 +62,17 @@ CFLAGS := @CFLAGS@
 LDFLAGS := @LDFLAGS@
 LIBS := @LIBS@
 
+CC_FOR_TARGET := @CC_FOR_TARGET@
+export CC_FOR_TARGET
+LD_FOR_TARGET := @LD_FOR_TARGET@
+export LD_FOR_TARGET
+OBJCOPY_FOR_TARGET := @OBJCOPY_FOR_TARGET@
+export OBJCOPY_FOR_TARGET
+OBJDUMP_FOR_TARGET := @OBJDUMP_FOR_TARGET@
+export OBJDUMP_FOR_TARGET
+READELF_FOR_TARGET := @READELF_FOR_TARGET@
+export READELF_FOR_TARGET
+
 override WERROR_FLAG := @WERROR_FLAG@
 export WERROR_FLAG
 
@@ -290,7 +301,6 @@ dist:
 	cp -r '$(call SHESCAPE,$(SRCDIR))'/.git '$(call SHESCAPE,$(BUILDDIR))'/"$(DIST_OUTPUT)"/
 	cd '$(call SHESCAPE,$(BUILDDIR))'/"$(DIST_OUTPUT)" && git checkout .
 	cd '$(call SHESCAPE,$(BUILDDIR))'/"$(DIST_OUTPUT)" && ./bootstrap
-	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"$(DIST_OUTPUT)/build-aux/freestanding-toolchain/.git"
 	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"$(DIST_OUTPUT)/flanterm/.git"
 	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"$(DIST_OUTPUT)/flanterm/.gitignore"
 	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"$(DIST_OUTPUT)/freestnd-c-hdrs/.git"
@@ -323,7 +333,7 @@ dist:
 
 .PHONY: distclean
 distclean: clean
-	rm -rf ovmf* config.log config.status GNUmakefile config.h toolchain-files man/man1/limine.1
+	rm -rf ovmf* config.log config.status GNUmakefile config.h man/man1/limine.1
 
 .PHONY: maintainer-clean
 maintainer-clean: distclean
@@ -331,7 +341,6 @@ maintainer-clean: distclean
 
 .PHONY: common-uefi-x86-64
 common-uefi-x86-64:
-	TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk' \
 	TARGET=uefi-x86-64 \
 	BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64' \
 		$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' -f common.mk
@@ -342,7 +351,6 @@ common-uefi-x86-64-clean:
 
 .PHONY: common-uefi-aarch64
 common-uefi-aarch64:
-	TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-aarch64-toolchain.mk' \
 	TARGET=uefi-aarch64 \
 	BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-aarch64' \
 		$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' -f common.mk
@@ -353,7 +361,6 @@ common-uefi-aarch64-clean:
 
 .PHONY: common-uefi-riscv64
 common-uefi-riscv64:
-	TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-riscv64-toolchain.mk' \
 	TARGET=uefi-riscv64 \
 	BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-riscv64' \
 		$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' -f common.mk
@@ -364,7 +371,6 @@ common-uefi-riscv64-clean:
 
 .PHONY: common-uefi-loongarch64
 common-uefi-loongarch64:
-	TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-loongarch64-toolchain.mk' \
 	TARGET=uefi-loongarch64 \
 	BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-loongarch64' \
 		$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' -f common.mk
@@ -375,7 +381,6 @@ common-uefi-loongarch64-clean:
 
 .PHONY: common-uefi-ia32
 common-uefi-ia32:
-	TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-i686-toolchain.mk' \
 	TARGET=uefi-ia32 \
 	BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32' \
 		$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' -f common.mk
@@ -386,7 +391,6 @@ common-uefi-ia32-clean:
 
 .PHONY: common-bios
 common-bios:
-	TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/bios-i686-toolchain.mk' \
 	TARGET=bios \
 	BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-bios' \
 		$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' -f common.mk
@@ -397,7 +401,6 @@ common-bios-clean:
 
 .PHONY: decompressor
 decompressor:
-	TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/bios-i686-toolchain.mk' \
 	BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor-build' \
 		$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/decompressor' -f decompressor.mk
 
diff --git a/bootstrap b/bootstrap
index 7806b935..f3a45a52 100755
--- a/bootstrap
+++ b/bootstrap
@@ -82,11 +82,6 @@ if ! test -f version; then
     cp cc-runtime/src/cc-runtime.c common/cc-runtime.s2.c
     cp cc-runtime/src/cc-runtime.c decompressor/cc-runtime.c
 
-    clone_repo_commit \
-        https://codeberg.org/osdev/freestanding-toolchain.git \
-        build-aux/freestanding-toolchain \
-        75fb06aae0fa3cd191f7013985dc55019f7a94d1
-
     clone_repo_commit \
         https://github.com/limine-bootloader/limine-protocol.git \
         limine-protocol \
diff --git a/common/common.mk b/common/common.mk
index 3bee4cee..1cb04350 100644
--- a/common/common.mk
+++ b/common/common.mk
@@ -1,8 +1,5 @@
 .SUFFIXES:
 
-include $(TOOLCHAIN_FILE)
-export OBJDUMP_FOR_TARGET
-
 override SRCDIR := $(shell pwd -P)
 
 override SPACE := $(subst ,, )
@@ -11,6 +8,8 @@ override MKESCAPE = $(subst $(SPACE),\ ,$(1))
 override SHESCAPE = $(subst ','\'',$(1))
 override OBJESCAPE = $(subst .a ,.a' ',$(subst .o ,.o' ',$(call SHESCAPE,$(1))))
 
+override CC_FOR_TARGET_IS_CLANG := $(shell ! $(CC_FOR_TARGET) --version 2>/dev/null | $(GREP) -q '^Target: '; echo $$?)
+
 COM_OUTPUT := false
 E9_OUTPUT := false
 
@@ -69,12 +68,17 @@ override NASMFLAGS_FOR_TARGET := \
     $(patsubst -g,-g -F dwarf,$(NASMFLAGS_FOR_TARGET))
 
 ifeq ($(TARGET),bios)
+    ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
+        override CC_FOR_TARGET += \
+            -target i686-unknown-none-elf
+    endif
     override CFLAGS_FOR_TARGET += \
         -fno-PIC \
         -m32 \
         -march=i686 \
         -mabi=sysv \
-        -mno-80387
+        -mno-80387 \
+        -mno-mmx
     override CPPFLAGS_FOR_TARGET := \
         $(CPPFLAGS_FOR_TARGET) \
         -DBIOS
@@ -86,6 +90,10 @@ ifeq ($(TARGET),bios)
 endif
 
 ifeq ($(TARGET),uefi-x86-64)
+    ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
+        override CC_FOR_TARGET += \
+            -target x86_64-unknown-none-elf
+    endif
     override CFLAGS_FOR_TARGET += \
         -fPIE \
         -fshort-wchar \
@@ -109,13 +117,18 @@ ifeq ($(TARGET),uefi-x86-64)
 endif
 
 ifeq ($(TARGET),uefi-ia32)
+    ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
+        override CC_FOR_TARGET += \
+            -target i686-unknown-none-elf
+    endif
     override CFLAGS_FOR_TARGET += \
         -fPIE \
         -fshort-wchar \
         -m32 \
         -march=i686 \
         -mabi=sysv \
-        -mno-80387
+        -mno-80387 \
+        -mno-mmx
     override CPPFLAGS_FOR_TARGET := \
         -I ../nyu-efi/inc \
         $(CPPFLAGS_FOR_TARGET) \
@@ -128,6 +141,10 @@ ifeq ($(TARGET),uefi-ia32)
 endif
 
 ifeq ($(TARGET),uefi-aarch64)
+    ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
+        override CC_FOR_TARGET += \
+            -target aarch64-unknown-none-elf
+    endif
     override CFLAGS_FOR_TARGET += \
         -fPIE \
         -fshort-wchar \
@@ -141,16 +158,18 @@ ifeq ($(TARGET),uefi-aarch64)
 endif
 
 ifeq ($(TARGET),uefi-riscv64)
+    ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
+        override CC_FOR_TARGET += \
+            -target riscv64-unknown-none-elf
+    endif
     override CFLAGS_FOR_TARGET += \
         -fPIE \
         -fshort-wchar
-
-    ifeq ($(CC_FOR_TARGET_IS_CLANG),yes)
+    ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
         override CFLAGS_FOR_TARGET += -march=rv64imac
     else
         override CFLAGS_FOR_TARGET += -march=rv64imac_zicsr_zifencei
     endif
-
     override CFLAGS_FOR_TARGET += \
         -mabi=lp64 \
         -mno-relax
@@ -162,6 +181,10 @@ ifeq ($(TARGET),uefi-riscv64)
 endif
 
 ifeq ($(TARGET),uefi-loongarch64)
+    ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
+        override CC_FOR_TARGET += \
+            -target loongarch64-unknown-none-elf
+    endif
     override CFLAGS_FOR_TARGET += \
         -fPIE \
         -fshort-wchar \
diff --git a/configure.ac b/configure.ac
index cb88f626..3f9530b6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -113,14 +113,54 @@ GET_PROG_FROM_TOOLCHAIN([STRIP], [strip])
 AC_CHECK_HEADERS([stdint.h stddef.h stdbool.h limits.h inttypes.h stdio.h stdlib.h string.h],
     [], [AC_MSG_ERROR([required header not found])])
 
-AC_ARG_VAR([TOOLCHAIN_FOR_TARGET], [alternative toolchain prefix for Limine (or 'llvm', or 'gnu')])
+AC_ARG_VAR([TOOLCHAIN_FOR_TARGET], [alternative toolchain prefix for Limine])
+
 AC_ARG_VAR([CC_FOR_TARGET], [C compiler command for Limine])
+if test "x${CC_FOR_TARGET+set}" = "x"; then
+    if test "x${TOOLCHAIN_FOR_TARGET}" = "x"; then
+        CC_FOR_TARGET="clang"
+    else
+        CC_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}gcc"
+    fi
+fi
 AC_ARG_VAR([LD_FOR_TARGET], [linker command for Limine])
+if test "x${LD_FOR_TARGET+set}" = "x"; then
+    if test "x${TOOLCHAIN_FOR_TARGET}" = "x"; then
+        LD_FOR_TARGET="ld.lld"
+    else
+        LD_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}ld"
+    fi
+fi
+
+test "x${TOOLCHAIN_FOR_TARGET+set}" = "x" && TOOLCHAIN_FOR_TARGET=llvm-
+
 AC_ARG_VAR([OBJCOPY_FOR_TARGET], [objcopy command for Limine])
+test "x${OBJCOPY_FOR_TARGET+set}" = "x" && OBJCOPY_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}objcopy"
 AC_ARG_VAR([OBJDUMP_FOR_TARGET], [objdump command for Limine])
+test "x${OBJDUMP_FOR_TARGET+set}" = "x" && OBJDUMP_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}objdump"
 AC_ARG_VAR([READELF_FOR_TARGET], [readelf command for Limine])
+test "x${READELF_FOR_TARGET+set}" = "x" && READELF_FOR_TARGET="${TOOLCHAIN_FOR_TARGET}readelf"
 
-rm -rf toolchain-files
+AC_CHECK_PROG([CC_FOR_TARGET_FOUND], [$CC_FOR_TARGET], [yes])
+if ! test "x$CC_FOR_TARGET_FOUND" = "xyes"; then
+    AC_MSG_ERROR([$CC_FOR_TARGET invalid, set CC_FOR_TARGET to a valid program])
+fi
+AC_CHECK_PROG([LD_FOR_TARGET_FOUND], [$LD_FOR_TARGET], [yes])
+if ! test "x$LD_FOR_TARGET_FOUND" = "xyes"; then
+    AC_MSG_ERROR([$LD_FOR_TARGET invalid, set LD_FOR_TARGET to a valid program])
+fi
+AC_CHECK_PROG([OBJCOPY_FOR_TARGET_FOUND], [$OBJCOPY_FOR_TARGET], [yes])
+if ! test "x$OBJCOPY_FOR_TARGET_FOUND" = "xyes"; then
+    AC_MSG_ERROR([$OBJCOPY_FOR_TARGET invalid, set OBJCOPY_FOR_TARGET to a valid program])
+fi
+AC_CHECK_PROG([OBJDUMP_FOR_TARGET_FOUND], [$OBJDUMP_FOR_TARGET], [yes])
+if ! test "x$OBJDUMP_FOR_TARGET_FOUND" = "xyes"; then
+    AC_MSG_ERROR([$OBJDUMP_FOR_TARGET invalid, set OBJDUMP_FOR_TARGET to a valid program])
+fi
+AC_CHECK_PROG([READELF_FOR_TARGET_FOUND], [$READELF_FOR_TARGET], [yes])
+if ! test "x$READELF_FOR_TARGET_FOUND" = "xyes"; then
+    AC_MSG_ERROR([$READELF_FOR_TARGET invalid, set READELF_FOR_TARGET to a valid program])
+fi
 
 BUILD_ALL="no"
 
@@ -162,22 +202,6 @@ fi
 if test "x$BUILD_BIOS" = "xno"; then
     BUILD_BIOS=""
 else
-    $MKDIR_P toolchain-files
-    CC="$CC" \
-        ARCHITECTURE=i686 \
-        FREESTANDING_TOOLCHAIN_SUFFIX="_FOR_TARGET" \
-        FREESTANDING_TOOLCHAIN="$TOOLCHAIN_FOR_TARGET" \
-        WANT_FREESTANDING_CC=yes \
-        FREESTANDING_CC="$CC_FOR_TARGET" \
-        WANT_FREESTANDING_LD=yes \
-        FREESTANDING_LD="$LD_FOR_TARGET" \
-        WANT_FREESTANDING_OBJCOPY=yes \
-        FREESTANDING_OBJCOPY="$OBJCOPY_FOR_TARGET" \
-        WANT_FREESTANDING_OBJDUMP=yes \
-        FREESTANDING_OBJDUMP="$OBJDUMP_FOR_TARGET" \
-        WANT_FREESTANDING_READELF=yes \
-        FREESTANDING_READELF="$READELF_FOR_TARGET" \
-        "$SRCDIR/build-aux/freestanding-toolchain/freestanding-toolchain" 2>"toolchain-files/bios-i686-toolchain.mk" || exit 1
     BUILD_BIOS="limine-bios"
     NEED_NASM=yes
     NEED_GZIP=yes
@@ -194,20 +218,6 @@ AC_ARG_ENABLE([uefi-ia32],
 if test "x$BUILD_UEFI_IA32" = "xno"; then
     BUILD_UEFI_IA32=""
 else
-    $MKDIR_P toolchain-files
-    CC="$CC" \
-        ARCHITECTURE=i686 \
-        FREESTANDING_TOOLCHAIN_SUFFIX="_FOR_TARGET" \
-        FREESTANDING_TOOLCHAIN="$TOOLCHAIN_FOR_TARGET" \
-        WANT_FREESTANDING_CC=yes \
-        FREESTANDING_CC="$CC_FOR_TARGET" \
-        WANT_FREESTANDING_LD=yes \
-        FREESTANDING_LD="$LD_FOR_TARGET" \
-        WANT_FREESTANDING_OBJCOPY=yes \
-        FREESTANDING_OBJCOPY="$OBJCOPY_FOR_TARGET" \
-        WANT_FREESTANDING_OBJDUMP=yes \
-        FREESTANDING_OBJDUMP="$OBJDUMP_FOR_TARGET" \
-        "$SRCDIR/build-aux/freestanding-toolchain/freestanding-toolchain" 2>"toolchain-files/uefi-i686-toolchain.mk" || exit 1
     BUILD_UEFI_IA32="limine-uefi-ia32"
     NEED_NASM=yes
 fi
@@ -223,20 +233,6 @@ AC_ARG_ENABLE([uefi-x86-64],
 if test "x$BUILD_UEFI_X86_64" = "xno"; then
     BUILD_UEFI_X86_64=""
 else
-    $MKDIR_P toolchain-files
-    CC="$CC" \
-        ARCHITECTURE=x86_64 \
-        FREESTANDING_TOOLCHAIN_SUFFIX="_FOR_TARGET" \
-        FREESTANDING_TOOLCHAIN="$TOOLCHAIN_FOR_TARGET" \
-        WANT_FREESTANDING_CC=yes \
-        FREESTANDING_CC="$CC_FOR_TARGET" \
-        WANT_FREESTANDING_LD=yes \
-        FREESTANDING_LD="$LD_FOR_TARGET" \
-        WANT_FREESTANDING_OBJCOPY=yes \
-        FREESTANDING_OBJCOPY="$OBJCOPY_FOR_TARGET" \
-        WANT_FREESTANDING_OBJDUMP=yes \
-        FREESTANDING_OBJDUMP="$OBJDUMP_FOR_TARGET" \
-        "$SRCDIR/build-aux/freestanding-toolchain/freestanding-toolchain" 2>"toolchain-files/uefi-x86_64-toolchain.mk" || exit 1
     BUILD_UEFI_X86_64="limine-uefi-x86-64"
     NEED_NASM=yes
 fi
@@ -252,20 +248,6 @@ AC_ARG_ENABLE([uefi-aarch64],
 if test "x$BUILD_UEFI_AARCH64" = "xno"; then
     BUILD_UEFI_AARCH64=""
 else
-    mkdir -p toolchain-files
-    CC="$CC" \
-        ARCHITECTURE=aarch64 \
-        FREESTANDING_TOOLCHAIN_SUFFIX="_FOR_TARGET" \
-        FREESTANDING_TOOLCHAIN="$TOOLCHAIN_FOR_TARGET" \
-        WANT_FREESTANDING_CC=yes \
-        FREESTANDING_CC="$CC_FOR_TARGET" \
-        WANT_FREESTANDING_LD=yes \
-        FREESTANDING_LD="$LD_FOR_TARGET" \
-        WANT_FREESTANDING_OBJCOPY=yes \
-        FREESTANDING_OBJCOPY="$OBJCOPY_FOR_TARGET" \
-        WANT_FREESTANDING_OBJDUMP=yes \
-        FREESTANDING_OBJDUMP="$OBJDUMP_FOR_TARGET" \
-        "$SRCDIR/build-aux/freestanding-toolchain/freestanding-toolchain" 2>"toolchain-files/uefi-aarch64-toolchain.mk" || exit 1
     BUILD_UEFI_AARCH64="limine-uefi-aarch64"
 fi
 
@@ -280,20 +262,6 @@ AC_ARG_ENABLE([uefi-riscv64],
 if test "x$BUILD_UEFI_RISCV64" = "xno"; then
     BUILD_UEFI_RISCV64=""
 else
-    mkdir -p toolchain-files
-    CC="$CC" \
-        ARCHITECTURE=riscv64 \
-        FREESTANDING_TOOLCHAIN_SUFFIX="_FOR_TARGET" \
-        FREESTANDING_TOOLCHAIN="$TOOLCHAIN_FOR_TARGET" \
-        WANT_FREESTANDING_CC=yes \
-        FREESTANDING_CC="$CC_FOR_TARGET" \
-        WANT_FREESTANDING_LD=yes \
-        FREESTANDING_LD="$LD_FOR_TARGET" \
-        WANT_FREESTANDING_OBJCOPY=yes \
-        FREESTANDING_OBJCOPY="$OBJCOPY_FOR_TARGET" \
-        WANT_FREESTANDING_OBJDUMP=yes \
-        FREESTANDING_OBJDUMP="$OBJDUMP_FOR_TARGET" \
-        "$SRCDIR/build-aux/freestanding-toolchain/freestanding-toolchain" 2>"toolchain-files/uefi-riscv64-toolchain.mk" || exit 1
     BUILD_UEFI_RISCV64="limine-uefi-riscv64"
 fi
 
@@ -308,20 +276,6 @@ AC_ARG_ENABLE([uefi-loongarch64],
 if test "x$BUILD_UEFI_LOONGARCH64" = "xno"; then
     BUILD_UEFI_LOONGARCH64=""
 else
-    mkdir -p toolchain-files
-    CC="$CC" \
-        ARCHITECTURE=loongarch64 \
-        FREESTANDING_TOOLCHAIN_SUFFIX="_FOR_TARGET" \
-        FREESTANDING_TOOLCHAIN="$TOOLCHAIN_FOR_TARGET" \
-        WANT_FREESTANDING_CC=yes \
-        FREESTANDING_CC="$CC_FOR_TARGET" \
-        WANT_FREESTANDING_LD=yes \
-        FREESTANDING_LD="$LD_FOR_TARGET" \
-        WANT_FREESTANDING_OBJCOPY=yes \
-        FREESTANDING_OBJCOPY="$OBJCOPY_FOR_TARGET" \
-        WANT_FREESTANDING_OBJDUMP=yes \
-        FREESTANDING_OBJDUMP="$OBJDUMP_FOR_TARGET" \
-        "$SRCDIR/build-aux/freestanding-toolchain/freestanding-toolchain" 2>"toolchain-files/uefi-loongarch64-toolchain.mk" || exit 1
     BUILD_UEFI_LOONGARCH64="limine-uefi-loongarch64"
 fi
 
diff --git a/decompressor/decompressor.mk b/decompressor/decompressor.mk
index 4aae3ee9..5000a1fb 100644
--- a/decompressor/decompressor.mk
+++ b/decompressor/decompressor.mk
@@ -1,13 +1,18 @@
 .SUFFIXES:
 
-include $(TOOLCHAIN_FILE)
-
 override SPACE := $(subst ,, )
 
 override MKESCAPE = $(subst $(SPACE),\ ,$(1))
 override SHESCAPE = $(subst ','\'',$(1))
 override OBJESCAPE = $(subst .a ,.a' ',$(subst .o ,.o' ',$(call SHESCAPE,$(1))))
 
+override CC_FOR_TARGET_IS_CLANG := $(shell ! $(CC_FOR_TARGET) --version 2>/dev/null | $(GREP) -q '^Target: '; echo $$?)
+
+ifeq ($(CC_FOR_TARGET_IS_CLANG),1)
+    override CC_FOR_TARGET += \
+        -target i686-unknown-none-elf
+endif
+
 override CFLAGS_FOR_TARGET += \
     -Os \
     -Wall \
@@ -29,7 +34,8 @@ override CFLAGS_FOR_TARGET += \
     -m32 \
     -march=i686 \
     -mabi=sysv \
-    -mno-80387
+    -mno-80387 \
+    -mno-mmx
 
 override CPPFLAGS_FOR_TARGET := \
     -I . \
diff --git a/test.mk b/test.mk
index 0eae9bbf..3703da9c 100644
--- a/test.mk
+++ b/test.mk
@@ -51,7 +51,7 @@ fat12-test:
 	$(MAKE) test.hdd
 	$(MAKE) limine-bios
 	$(MAKE) limine
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
@@ -74,7 +74,7 @@ fat16-test:
 	$(MAKE) test.hdd
 	$(MAKE) limine-bios
 	$(MAKE) limine
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
@@ -98,7 +98,7 @@ legacy-fat16-test:
 	fdisk -l mbrtest.hdd
 	$(MAKE) limine-bios
 	$(MAKE) limine
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show mbrtest.hdd > loopback_dev
@@ -121,7 +121,7 @@ fat32-test:
 	$(MAKE) test.hdd
 	$(MAKE) limine-bios
 	$(MAKE) limine
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
@@ -143,7 +143,7 @@ iso9660-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
 	$(MAKE) limine-bios
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	$(MKDIR_P) test_image/boot
 	cp -rv $(BINDIR)/* test_image/boot/
@@ -157,7 +157,7 @@ full-hybrid-test:
 	$(MAKE) ovmf-ia32
 	$(MAKE) test-clean
 	$(MAKE) all
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	$(MKDIR_P) test_image/boot
 	cp -rv $(BINDIR)/* test_image/boot/
@@ -177,7 +177,7 @@ full-hybrid-test:
 pxe-test:
 	$(MAKE) test-clean
 	$(MAKE) limine-bios
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	$(MKDIR_P) test_image/boot
 	cp -rv $(BINDIR)/* test_image/boot/
@@ -190,7 +190,7 @@ uefi-x86-64-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
 	$(MAKE) limine-uefi-x86-64
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
@@ -214,7 +214,7 @@ uefi-aa64-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
 	$(MAKE) limine-uefi-aarch64
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-aarch64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=aarch64
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
@@ -238,7 +238,7 @@ uefi-rv64-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
 	$(MAKE) limine-uefi-riscv64
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-riscv64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=riscv64
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
@@ -262,7 +262,7 @@ uefi-loongarch64-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
 	$(MAKE) limine-uefi-loongarch64
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-loongarch64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=loongarch64
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
@@ -286,7 +286,7 @@ uefi-ia32-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
 	$(MAKE) limine-uefi-ia32
-	$(MAKE) -C test -f test.mk TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/toolchain-files/uefi-x86_64-toolchain.mk'
+	$(MAKE) -C test -f test.mk ARCH=x86
 	rm -rf test_image/
 	mkdir test_image
 	sudo losetup -Pf --show test.hdd > loopback_dev
diff --git a/test/test.mk b/test/test.mk
index 23963385..d10c063a 100644
--- a/test/test.mk
+++ b/test/test.mk
@@ -1,25 +1,39 @@
-include $(TOOLCHAIN_FILE)
-
 override CC := $(CC_FOR_TARGET)
-CFLAGS = -O2 -g -Wall -Wextra
-LDFLAGS =
+override CFLAGS := -O2 -g -Wall -Wextra
+override LDFLAGS :=
 override LD := $(LD_FOR_TARGET)
-override QEMU := qemu-system-x86_64
-QEMUFLAGS = -m 1G -enable-kvm -cpu host
 
-ifneq ($(findstring x86_64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+override CC_IS_CLANG := $(shell ! $(CC) --version 2>/dev/null | $(GREP) -q '^Target: '; echo $$?)
+
+ifeq ($(ARCH),x86)
+ifeq ($(CC_IS_CLANG),1)
+override CC += \
+    -target x86_64-unknown-none-elf
+endif
 override LDFLAGS += \
     -m elf_x86_64
 endif
-ifneq ($(findstring aarch64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),aarch64)
+ifeq ($(CC_IS_CLANG),1)
+override CC += \
+    -target aarch64-unknown-none-elf
+endif
 override LDFLAGS += \
     -m aarch64elf
 endif
-ifneq ($(findstring riscv64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),riscv64)
+ifeq ($(CC_IS_CLANG),1)
+override CC += \
+    -target riscv64-unknown-none-elf
+endif
 override LDFLAGS += \
     -m elf64lriscv
 endif
-ifneq ($(findstring loongarch64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),loongarch64)
+ifeq ($(CC_IS_CLANG),1)
+override CC += \
+    -target loongarch64-unknown-none-elf
+endif
 override LDFLAGS += \
     -m elf64loongarch
 endif
@@ -60,7 +74,7 @@ override CFLAGS += \
     -D_LIMINE_PROTO \
     -DLIMINE_API_REVISION=3
 
-ifneq ($(findstring x86_64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),x86)
 override CFLAGS += \
     -m64 \
     -march=x86-64 \
@@ -69,12 +83,14 @@ override CFLAGS += \
     -mno-red-zone
 endif
 
-ifneq ($(findstring aarch64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),aarch64)
 override CFLAGS += \
+    -mcpu=generic \
+    -march=armv8-a+nofp+nosimd \
     -mgeneral-regs-only
 endif
 
-ifneq ($(findstring riscv64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),riscv64)
 override CFLAGS += \
     -march=rv64imac \
     -mabi=lp64 \
@@ -83,10 +99,13 @@ override LDFLAGS += \
     --no-relax
 endif
 
-ifneq ($(findstring loongarch64,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),loongarch64)
 override CFLAGS += \
     -march=loongarch64 \
-    -mabi=lp64s
+    -mabi=lp64s \
+    -mfpu=none \
+    -msimd=none \
+    -mno-relax
 override LDFLAGS += \
     --no-relax
 endif
@@ -107,7 +126,7 @@ override CFLAGS_MB := \
     -I../common/protos \
     -isystem ../freestnd-c-hdrs/include
 
-ifneq ($(findstring 86,$(shell $(CC_FOR_TARGET) -dumpmachine)),)
+ifeq ($(ARCH),x86)
 all: test.elf multiboot2.elf multiboot.elf device_tree.dtb
 else
 all: test.elf device_tree.dtb
tab: 248 wrap: offon