:: commit 543edfa0b388a703dbd33d54942cfd589fc97b21

mintsuki <mintsuki@protonmail.com> — 2021-04-08 17:41

parents: 7e5b809a7e

build: Make build system more flexible to use when using the host toolchain

diff --git a/Makefile b/Makefile
index 58a934d7..aaa48ee7 100644
--- a/Makefile
+++ b/Makefile
@@ -1,14 +1,24 @@
-CC = cc
 PREFIX = /usr/local
 DESTDIR =
 
+PATH := $(shell pwd)/toolchain/bin:$(PATH)
+SHELL := env PATH=$(PATH) /bin/bash
+
 TOOLCHAIN = x86_64-elf
 
 TOOLCHAIN_CC = $(TOOLCHAIN)-gcc
-AR = $(TOOLCHAIN)-ar
-OBJCOPY = $(TOOLCHAIN)-objcopy
+TOOLCHAIN_AR = $(TOOLCHAIN)-ar
 
-PATH := $(shell pwd)/toolchain/bin:$(PATH)
+ifeq ($(shell which $(TOOLCHAIN_CC)), )
+TOOLCHAIN_CC := gcc
+endif
+ifeq ($(shell which $(TOOLCHAIN_AR)), )
+TOOLCHAIN_AR := ar
+endif
+
+ifneq ($(shell $(TOOLCHAIN_CC) -dumpmachine | head -c 6), x86_64)
+$(error No suitable x86_64 GCC compiler found, please install an x86_64 GCC toolchain or run "make toolchain")
+endif
 
 STAGE1_FILES := $(shell find -L ./stage1 -type f -name '*.asm' | sort)
 
@@ -100,7 +110,7 @@ toolchain:
 
 gnu-efi:
 	git clone https://git.code.sf.net/p/gnu-efi/code --branch=3.0.13 --depth=1 $@
-	$(MAKE) -C gnu-efi/gnuefi CC="$(TOOLCHAIN_CC) -m64" AR="$(AR)"
+	$(MAKE) -C gnu-efi/gnuefi CC="$(TOOLCHAIN_CC) -m64" AR="$(TOOLCHAIN_AR)"
 	$(MAKE) -C gnu-efi/lib CC="$(TOOLCHAIN_CC) -m64" ARCH=x86_64 x86_64/efi_stub.o
 
 ovmf:
diff --git a/README.md b/README.md
index 59fefef9..dfdac099 100644
--- a/README.md
+++ b/README.md
@@ -32,13 +32,13 @@ such as Long Mode, 5-level paging, and SMP (multicore), to name a few.
 For convenience, for point releases, binaries are distributed. These binaries are
 shipped in the `-binary` branches and tags of this repository (see [branches](https://github.com/limine-bootloader/limine/branches/all) and [tags](https://github.com/limine-bootloader/limine/tags)).
 
-For example, to clone the latest binary release of the `v2.0` branch one can do
+For example, to clone the latest binary release of the `v2.x` branch one can do
 ```bash
 git clone https://github.com/limine-bootloader/limine.git --branch=v2.0-branch-binary --depth=1
 ```
-or, to clone a specific binary point release (for example v2.0.1)
+or, to clone a specific binary point release (for example v2.1.6)
 ```bash
-git clone https://github.com/limine-bootloader/limine.git --branch=v2.0.1-binary --depth=1
+git clone https://github.com/limine-bootloader/limine.git --branch=v2.1.6-binary --depth=1
 ```
 
 Additionally, the absolute latest Limine binary release can be obtained by fetching
@@ -52,23 +52,39 @@ rebuild `limine-install`, simply use `make` in the binary release.
 
 ## Building the bootloader
 
-*These steps are not necessary if cloning a binary release. if so, skip to the*
-*next paragraph.*
+*These steps are not necessary if cloning a binary release. if so, skip to*
+*"Installing Limine binaries".*
 
-It is necessary to first build the set of tools that the bootloader needs
-in order to be built.
+### Building the toolchain
 
-This can be accomplished by running:
+This step can take a long time, but it will ensure that the compiler will work with
+Limine. If on an x86_64 host, with GCC installed, you can also skip to the next
+paragraph.
+
+The toolchain building process depends on the following packages: `wget`, `gcc`,
+`g++`, `binutils`.
+
+Building the toolchain can be accomplished by running:
 ```bash
 make toolchain
 ```
 *The above step may take a while*
 
-After that is done, the bootloader itself can be built with:
+### Building Limine
+
+In order to build Limine, the following packages have to be installed: `git`,
+`nasm`, `mtools`. Furthermore, either the toolchain must have been built in the
+previous paragraph, or `gcc` and `binutils` must also be installed.
+
+The bootloader can then be built with:
 ```bash
 make
 ```
 
+It is possible to pass `make` additional flags, most relevantly, `TOOLCHAIN=` which
+allows one to specify an alternative toolchain for the build system to use
+(the default is `x86_64-elf`, falling back to no-triple, or host, toolchain).
+
 The generated bootloader files are going to be in `bin`.
 
 ## Installing Limine binaries
diff --git a/decompressor/Makefile b/decompressor/Makefile
index 9dfea6b9..5de15065 100644
--- a/decompressor/Makefile
+++ b/decompressor/Makefile
@@ -6,8 +6,15 @@ endif
 
 TOOLCHAIN = x86_64-elf
 
-CC = $(TOOLCHAIN)-gcc
-OBJCOPY = $(TOOLCHAIN)-objcopy
+TOOLCHAIN_CC = $(TOOLCHAIN)-gcc
+TOOLCHAIN_OBJCOPY = $(TOOLCHAIN)-objcopy
+
+ifeq ($(shell which $(TOOLCHAIN_CC)), )
+TOOLCHAIN_CC := gcc
+endif
+ifeq ($(shell which $(OBJCOPY)), )
+TOOLCHAIN_OBJCOPY := objcopy
+endif
 
 CFLAGS = -flto -Os -pipe -Wall -Wextra -Werror
 
@@ -55,13 +62,13 @@ builddir:
 	for i in $(OBJ); do mkdir -p `dirname $$i`; done
 
 $(BUILDDIR)/decompressor.bin: $(OBJ)
-	$(CC) $(OBJ) $(LDFLAGS) $(INTERNAL_LDFLAGS) -o $(BUILDDIR)/decompressor.elf
-	$(OBJCOPY) -O binary $(BUILDDIR)/decompressor.elf $@
+	$(TOOLCHAIN_CC) $(OBJ) $(LDFLAGS) $(INTERNAL_LDFLAGS) -o $(BUILDDIR)/decompressor.elf
+	$(TOOLCHAIN_OBJCOPY) -O binary $(BUILDDIR)/decompressor.elf $@
 
 -include $(HEADER_DEPS)
 
 $(BUILDDIR)/%.o: %.c
-	$(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
+	$(TOOLCHAIN_CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
 
 $(BUILDDIR)/%.o: %.asm
 	nasm $< -f elf32 -o $@
diff --git a/limine-install/Makefile b/limine-install/Makefile
index 4d0c2b4b..5ac1a889 100644
--- a/limine-install/Makefile
+++ b/limine-install/Makefile
@@ -1,7 +1,9 @@
+CC = cc
+OBJCOPY = objcopy
+
 PREFIX = /usr/local
 DESTDIR =
 
-OBJCOPY = objcopy
 OBJCOPY_ARCH = default
 LIMINE_HDD_BIN = limine-hdd.bin
 BUILD_DIR = $(shell realpath .)
diff --git a/stage23/Makefile b/stage23/Makefile
index 58f588be..7586f51d 100644
--- a/stage23/Makefile
+++ b/stage23/Makefile
@@ -15,10 +15,23 @@ endif
 
 TOOLCHAIN = x86_64-elf
 
-CC = $(TOOLCHAIN)-gcc
-OBJCOPY = $(TOOLCHAIN)-objcopy
-OBJDUMP = $(TOOLCHAIN)-objdump
-READELF = $(TOOLCHAIN)-readelf
+TOOLCHAIN_CC = $(TOOLCHAIN)-gcc
+TOOLCHAIN_OBJCOPY = $(TOOLCHAIN)-objcopy
+TOOLCHAIN_OBJDUMP = $(TOOLCHAIN)-objdump
+TOOLCHAIN_READELF = $(TOOLCHAIN)-readelf
+
+ifeq ($(shell which $(TOOLCHAIN_CC)), )
+TOOLCHAIN_CC := gcc
+endif
+ifeq ($(shell which $(TOOLCHAIN_OBJCOPY)), )
+TOOLCHAIN_OBJCOPY := objcopy
+endif
+ifeq ($(shell which $(TOOLCHAIN_OBJDUMP)), )
+TOOLCHAIN_OBJDUMP := objdump
+endif
+ifeq ($(shell which $(TOOLCHAIN_READELF)), )
+TOOLCHAIN_READELF := readelf
+endif
 
 COM_OUTPUT = false
 E9_OUTPUT = false
@@ -134,11 +147,11 @@ $(BUILDDIR)/sys/smp_trampoline.bin: sys/smp_trampoline.real
 
 $(BUILDDIR)/sys/smp_trampoline.o: $(BUILDDIR)/sys/smp_trampoline.bin
 	cd "`dirname $<`" && \
-		$(OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) "`basename $<`" $@
+		$(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) "`basename $<`" $@
 
 $(BUILDDIR)/font.o: font.bin
 	cd "`dirname $<`" && \
-		$(OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) "`basename $<`" $@
+		$(TOOLCHAIN_OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) "`basename $<`" $@
 
 ifeq ($(TARGET), bios)
 
@@ -146,34 +159,34 @@ $(BUILDDIR)/stage2.bin.gz: $(BUILDDIR)/stage2.bin
 	gzip -n -9 < $< > $@
 
 $(BUILDDIR)/stage2.bin: $(BUILDDIR)/limine.sys
-	dd if=$< bs=$$(( 0x$$($(READELF) -S $(BUILDDIR)/limine.elf | grep .stage3.text | sed 's/^.*] //' | awk '{print $$3}' | sed 's/^0*//') - 0x8000 )) count=1 of=$@
+	dd if=$< bs=$$(( 0x$$($(TOOLCHAIN_READELF) -S $(BUILDDIR)/limine.elf | grep .stage3.text | sed 's/^.*] //' | awk '{print $$3}' | sed 's/^0*//') - 0x8000 )) count=1 of=$@
 
 $(BUILDDIR)/stage2.map.o: $(BUILDDIR)/limine_stage2only.elf
 	GENSYMS="`pwd`/gensyms.sh" && \
 	cd "`dirname $<`" && \
-	"$$GENSYMS" $(OBJDUMP) $< stage2 32
+	"$$GENSYMS" $(TOOLCHAIN_OBJDUMP) $< stage2 32
 
 $(BUILDDIR)/full.map.o: $(BUILDDIR)/limine_nomap.elf
 	GENSYMS="`pwd`/gensyms.sh" && \
 	cd "`dirname $<`" && \
-	"$$GENSYMS" $(OBJDUMP) $< full 32
+	"$$GENSYMS" $(TOOLCHAIN_OBJDUMP) $< full 32
 
 $(BUILDDIR)/limine.sys: $(BUILDDIR)/limine.elf
-	$(OBJCOPY) -O binary $< $@
+	$(TOOLCHAIN_OBJCOPY) -O binary $< $@
 
 $(BUILDDIR)/limine_stage2only.elf: $(OBJ)
-	$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_stage2only.ld -o $@ || \
+	$(TOOLCHAIN_CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_stage2only.ld -o $@ || \
 		( echo "This error means that stage 2 was trying to use stage 3 symbols before loading stage 3" && \
 		  false )
 
 $(BUILDDIR)/limine_nomap.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/stage2.map.o
-	$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap.ld -o $@
+	$(TOOLCHAIN_CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_nomap.ld -o $@
 
 $(BUILDDIR)/limine.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/stage2.map.o $(BUILDDIR)/full.map.o
-	$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o $@
+	$(TOOLCHAIN_CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker.ld -o $@
 
 $(BUILDDIR)/limine_dbg.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/stage2.map.o $(BUILDDIR)/full.map.o
-	$(CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o $@
+	$(TOOLCHAIN_CC) $^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -Tlinker_dbg.ld -o $@
 
 endif
 
@@ -182,13 +195,13 @@ ifeq ($(TARGET), uefi)
 $(BUILDDIR)/full.map.o: $(BUILDDIR)/limine_efi_nomap.elf
 	GENSYMS="`pwd`/gensyms.sh" && \
 	cd "`dirname $<`" && \
-	"$$GENSYMS" $(OBJDUMP) $< full 64
+	"$$GENSYMS" $(TOOLCHAIN_OBJDUMP) $< full 64
 
 $(BUILDDIR)/BOOTX64.EFI: $(BUILDDIR)/limine_efi.elf
-	$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --target efi-app-x86_64 --subsystem=10 $< $@
+	$(TOOLCHAIN_OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel -j .rela -j .rel.* -j .rela.* -j .reloc --target efi-app-x86_64 --subsystem=10 $< $@
 
 $(BUILDDIR)/limine_efi_nomap.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o
-	$(CC) \
+	$(TOOLCHAIN_CC) \
 		-Tlinker_uefi_nomap.ld \
 		../gnu-efi/gnuefi/crt0-efi-x86_64.o \
 		../gnu-efi/gnuefi/libgnuefi.a \
@@ -196,7 +209,7 @@ $(BUILDDIR)/limine_efi_nomap.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_
 		$^ $(LDFLAGS) $(INTERNAL_LDFLAGS) -o $@
 
 $(BUILDDIR)/limine_efi.elf: $(OBJ) $(BUILDDIR)/font.o $(BUILDDIR)/sys/smp_trampoline.o $(BUILDDIR)/full.map.o
-	$(CC) \
+	$(TOOLCHAIN_CC) \
 		-Tlinker_uefi.ld \
 		../gnu-efi/gnuefi/crt0-efi-x86_64.o \
 		../gnu-efi/gnuefi/libgnuefi.a \
@@ -208,21 +221,21 @@ endif
 -include $(HEADER_DEPS)
 
 $(BUILDDIR)/%.o: %.c
-	$(CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
+	$(TOOLCHAIN_CC) $(CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
 
 -include $(HEADER_DEPS)
 
 ifeq ($(TARGET), bios)
 $(BUILDDIR)/%.s2.o: %.s2.c
-	$(CC) $(S2CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
+	$(TOOLCHAIN_CC) $(S2CFLAGS) $(INTERNAL_CFLAGS) -c $< -o $@
 endif
 
 -include $(HEADER_DEPS)
 
 ifeq ($(TARGET), uefi)
 $(BUILDDIR)/%.32.o: %.32.c
-	$(CC) $(CFLAGS) $(INTERNAL_CFLAGS32) -c $< -o $@.32
-	$(OBJCOPY) -I elf32-i386 -O elf64-x86-64 $@.32 $@
+	$(TOOLCHAIN_CC) $(CFLAGS) $(INTERNAL_CFLAGS32) -c $< -o $@.32
+	$(TOOLCHAIN_OBJCOPY) -I elf32-i386 -O elf64-x86-64 $@.32 $@
 	rm $@.32
 endif
 
tab: 248 wrap: offon