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