build: Properly handle spaces in PATH

This commit is contained in:
mintsuki 2021-04-11 09:56:48 +02:00
parent 7ac20e0615
commit d288550b2a
3 changed files with 57 additions and 29 deletions

View File

@ -2,51 +2,53 @@ PREFIX = /usr/local
DESTDIR = DESTDIR =
PATH := $(shell pwd)/toolchain/bin:$(PATH) PATH := $(shell pwd)/toolchain/bin:$(PATH)
SHELL := env PATH=$(PATH) /bin/bash SHELL := /usr/bin/env bash
TOOLCHAIN = x86_64-elf TOOLCHAIN = x86_64-elf
TOOLCHAIN_CC = $(TOOLCHAIN)-gcc TOOLCHAIN_CC = $(TOOLCHAIN)-gcc
TOOLCHAIN_AR = $(TOOLCHAIN)-ar TOOLCHAIN_AR = $(TOOLCHAIN)-ar
ifeq ($(shell which $(TOOLCHAIN_CC)), ) ifeq ($(shell export "PATH=$(PATH)"; which $(TOOLCHAIN_CC)), )
TOOLCHAIN_CC := gcc TOOLCHAIN_CC := gcc
endif endif
ifeq ($(shell which $(TOOLCHAIN_AR)), ) ifeq ($(shell export "PATH=$(PATH)"; which $(TOOLCHAIN_AR)), )
TOOLCHAIN_AR := ar TOOLCHAIN_AR := ar
endif endif
ifneq ($(shell $(TOOLCHAIN_CC) -dumpmachine | head -c 6), x86_64) ifneq ($(shell export "PATH=$(PATH)"; $(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") $(error No suitable x86_64 GCC compiler found, please install an x86_64 GCC toolchain or run "make toolchain")
endif endif
STAGE1_FILES := $(shell find -L ./stage1 -type f -name '*.asm' | sort) STAGE1_FILES := $(shell find -L ./stage1 -type f -name '*.asm' | sort)
.PHONY: all bin/limine-install clean install distclean limine-bios limine-uefi limine-bios-clean limine-uefi-clean stage23-bios stage23-bios-clean stage23-uefi stage23-uefi-clean decompressor decompressor-clean toolchain test.hdd echfs-test ext2-test fat16-test fat32-test iso9660-test iso9660-uefi-test pxe-test uefi-test hybrid-iso9660-test .PHONY: all
all: all:
$(MAKE) limine-uefi $(MAKE) limine-uefi
$(MAKE) limine-bios $(MAKE) limine-bios
$(MAKE) bin/limine-install $(MAKE) bin/limine-install
.PHONY: bin/limine-install
bin/limine-install: bin/limine-install:
$(MAKE) -C limine-install LIMINE_HDD_BIN=`realpath bin`/limine-hdd.bin $(MAKE) -C limine-install LIMINE_HDD_BIN=`realpath bin`/limine-hdd.bin
[ -f limine-install/limine-install ] && cp limine-install/limine-install bin/ || true [ -f limine-install/limine-install ] && cp limine-install/limine-install bin/ || true
[ -f limine-install/limine-install.exe ] && cp limine-install/limine-install.exe bin/ || true [ -f limine-install/limine-install.exe ] && cp limine-install/limine-install.exe bin/ || true
.PHONY: clean
clean: limine-bios-clean limine-uefi-clean clean: limine-bios-clean limine-uefi-clean
$(MAKE) -C limine-install clean $(MAKE) -C limine-install clean
.PHONY: install
install: all install: all
install -d $(DESTDIR)$(PREFIX)/bin install -d "$(DESTDIR)$(PREFIX)/bin"
install -s bin/limine-install $(DESTDIR)$(PREFIX)/bin/ install -s bin/limine-install "$(DESTDIR)$(PREFIX)/bin/"
install -d $(DESTDIR)$(PREFIX)/share install -d "$(DESTDIR)$(PREFIX)/share"
install -d $(DESTDIR)$(PREFIX)/share/limine install -d "$(DESTDIR)$(PREFIX)/share/limine"
install -m 644 bin/limine.sys $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 bin/limine.sys "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 bin/limine-cd.bin $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 bin/limine-cd.bin "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 bin/limine-eltorito-efi.bin $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 bin/limine-eltorito-efi.bin "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 bin/limine-pxe.bin $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 bin/limine-pxe.bin "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 bin/BOOTX64.EFI $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 bin/BOOTX64.EFI "$(DESTDIR)$(PREFIX)/share/limine/"
build/stage1: $(STAGE1_FILES) build/decompressor/decompressor.bin build/stage23-bios/stage2.bin.gz build/stage1: $(STAGE1_FILES) build/decompressor/decompressor.bin build/stage23-bios/stage2.bin.gz
mkdir -p bin mkdir -p bin
@ -56,6 +58,7 @@ build/stage1: $(STAGE1_FILES) build/decompressor/decompressor.bin build/stage23-
cp build/stage23-bios/limine.sys ./bin/ cp build/stage23-bios/limine.sys ./bin/
touch build/stage1 touch build/stage1
.PHONY: limine-bios
limine-bios: stage23-bios decompressor limine-bios: stage23-bios decompressor
$(MAKE) build/stage1 $(MAKE) build/stage1
@ -66,6 +69,7 @@ bin/limine-eltorito-efi.bin: build/stage23-uefi/BOOTX64.EFI
mmd -D s -i $@ ::/EFI/BOOT mmd -D s -i $@ ::/EFI/BOOT
mcopy -D o -i $@ build/stage23-uefi/BOOTX64.EFI ::/EFI/BOOT mcopy -D o -i $@ build/stage23-uefi/BOOTX64.EFI ::/EFI/BOOT
.PHONY: limine-uefi
limine-uefi: limine-uefi:
$(MAKE) gnu-efi $(MAKE) gnu-efi
$(MAKE) stage23-uefi $(MAKE) stage23-uefi
@ -73,38 +77,49 @@ limine-uefi:
cp build/stage23-uefi/BOOTX64.EFI ./bin/ cp build/stage23-uefi/BOOTX64.EFI ./bin/
$(MAKE) bin/limine-eltorito-efi.bin $(MAKE) bin/limine-eltorito-efi.bin
.PHONY: limine-bios-clean
limine-bios-clean: stage23-bios-clean decompressor-clean limine-bios-clean: stage23-bios-clean decompressor-clean
.PHONY: limine-uefi-clean
limine-uefi-clean: stage23-uefi-clean limine-uefi-clean: stage23-uefi-clean
.PHONY: distclean
distclean: clean test-clean distclean: clean test-clean
rm -rf bin build stivale toolchain ovmf gnu-efi rm -rf bin build stivale toolchain ovmf gnu-efi
stivale: stivale:
git clone https://github.com/stivale/stivale.git git clone https://github.com/stivale/stivale.git
.PHONY: stage23-uefi
stage23-uefi: stivale stage23-uefi: stivale
$(MAKE) -C stage23 all TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi" $(MAKE) -C stage23 all TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi"
.PHONY: stage23-uefi-clean
stage23-uefi-clean: stage23-uefi-clean:
$(MAKE) -C stage23 clean TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi" $(MAKE) -C stage23 clean TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi"
.PHONY: stage23-bios
stage23-bios: stivale stage23-bios: stivale
$(MAKE) -C stage23 all TARGET=bios BUILDDIR="`pwd`/build/stage23-bios" $(MAKE) -C stage23 all TARGET=bios BUILDDIR="`pwd`/build/stage23-bios"
.PHONY: stage23-bios-clean
stage23-bios-clean: stage23-bios-clean:
$(MAKE) -C stage23 clean TARGET=bios BUILDDIR="`pwd`/build/stage23-bios" $(MAKE) -C stage23 clean TARGET=bios BUILDDIR="`pwd`/build/stage23-bios"
.PHONY: decompressor
decompressor: decompressor:
$(MAKE) -C decompressor all BUILDDIR="`pwd`/build/decompressor" $(MAKE) -C decompressor all BUILDDIR="`pwd`/build/decompressor"
.PHONY: decompressor-clean
decompressor-clean: decompressor-clean:
$(MAKE) -C decompressor clean BUILDDIR="`pwd`/build/decompressor" $(MAKE) -C decompressor clean BUILDDIR="`pwd`/build/decompressor"
.PHONY: test-clean
test-clean: test-clean:
$(MAKE) -C test clean $(MAKE) -C test clean
rm -rf test_image test.hdd test.iso rm -rf test_image test.hdd test.iso
.PHONY: toolchain
toolchain: toolchain:
scripts/make_toolchain.sh "`realpath ./toolchain`" -j`nproc` scripts/make_toolchain.sh "`realpath ./toolchain`" -j`nproc`
@ -117,12 +132,14 @@ ovmf:
mkdir -p ovmf mkdir -p ovmf
cd ovmf && wget https://efi.akeo.ie/OVMF/OVMF-X64.zip && 7z x OVMF-X64.zip cd ovmf && wget https://efi.akeo.ie/OVMF/OVMF-X64.zip && 7z x OVMF-X64.zip
.PHONY: test.hdd
test.hdd: test.hdd:
rm -f test.hdd rm -f test.hdd
dd if=/dev/zero bs=1M count=0 seek=64 of=test.hdd dd if=/dev/zero bs=1M count=0 seek=64 of=test.hdd
parted -s test.hdd mklabel gpt parted -s test.hdd mklabel gpt
parted -s test.hdd mkpart primary 2048s 100% parted -s test.hdd mkpart primary 2048s 100%
.PHONY: echfs-test
echfs-test: echfs-test:
$(MAKE) test-clean $(MAKE) test-clean
$(MAKE) test.hdd $(MAKE) test.hdd
@ -139,6 +156,7 @@ echfs-test:
bin/limine-install test.hdd bin/limine-install test.hdd
qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
.PHONY: ext2-test
ext2-test: ext2-test:
$(MAKE) test-clean $(MAKE) test-clean
$(MAKE) test.hdd $(MAKE) test.hdd
@ -160,6 +178,7 @@ ext2-test:
bin/limine-install test.hdd bin/limine-install test.hdd
qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
.PHONY: fat16-test
fat16-test: fat16-test:
$(MAKE) test-clean $(MAKE) test-clean
$(MAKE) test.hdd $(MAKE) test.hdd
@ -181,6 +200,7 @@ fat16-test:
bin/limine-install test.hdd bin/limine-install test.hdd
qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
.PHONY: fat32-test
fat32-test: fat32-test:
$(MAKE) test-clean $(MAKE) test-clean
$(MAKE) test.hdd $(MAKE) test.hdd
@ -202,6 +222,7 @@ fat32-test:
bin/limine-install test.hdd bin/limine-install test.hdd
qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
.PHONY: iso9660-test
iso9660-test: iso9660-test:
$(MAKE) test-clean $(MAKE) test-clean
$(MAKE) test.hdd $(MAKE) test.hdd
@ -213,6 +234,7 @@ iso9660-test:
xorriso -as mkisofs -b boot/limine-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table test_image/ -o test.iso xorriso -as mkisofs -b boot/limine-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table test_image/ -o test.iso
qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -cdrom test.iso -debugcon stdio qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -cdrom test.iso -debugcon stdio
.PHONY: iso9660-uefi-test
iso9660-uefi-test: iso9660-uefi-test:
$(MAKE) ovmf $(MAKE) ovmf
$(MAKE) test-clean $(MAKE) test-clean
@ -225,6 +247,7 @@ iso9660-uefi-test:
xorriso -as mkisofs -eltorito-alt-boot -e boot/limine-eltorito-efi.bin -no-emul-boot test_image/ -o test.iso xorriso -as mkisofs -eltorito-alt-boot -e boot/limine-eltorito-efi.bin -no-emul-boot test_image/ -o test.iso
qemu-system-x86_64 -M q35 -L ovmf -bios ovmf/OVMF.fd -net none -smp 4 -enable-kvm -cpu host -cdrom test.iso -debugcon stdio qemu-system-x86_64 -M q35 -L ovmf -bios ovmf/OVMF.fd -net none -smp 4 -enable-kvm -cpu host -cdrom test.iso -debugcon stdio
.PHONY: hybrid-iso9660-test
hybrid-iso9660-test: hybrid-iso9660-test:
$(MAKE) ovmf $(MAKE) ovmf
$(MAKE) test-clean $(MAKE) test-clean
@ -240,6 +263,7 @@ hybrid-iso9660-test:
xorriso -as mkisofs -b boot/limine-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/limine-eltorito-efi.bin -no-emul-boot test_image/ -o test.iso xorriso -as mkisofs -b boot/limine-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e boot/limine-eltorito-efi.bin -no-emul-boot test_image/ -o test.iso
qemu-system-x86_64 -M q35 -L ovmf -bios ovmf/OVMF.fd -net none -smp 4 -enable-kvm -cpu host -cdrom test.iso -debugcon stdio qemu-system-x86_64 -M q35 -L ovmf -bios ovmf/OVMF.fd -net none -smp 4 -enable-kvm -cpu host -cdrom test.iso -debugcon stdio
.PHONY: pxe-test
pxe-test: pxe-test:
$(MAKE) test-clean $(MAKE) test-clean
$(MAKE) limine-bios $(MAKE) limine-bios
@ -249,6 +273,7 @@ pxe-test:
cp -rv bin/* test/* test_image/boot/ cp -rv bin/* test/* test_image/boot/
qemu-system-x86_64 -enable-kvm -smp 4 -cpu host -netdev user,id=n0,tftp=./test_image,bootfile=boot/limine-pxe.bin -device rtl8139,netdev=n0,mac=00:00:00:11:11:11 -debugcon stdio qemu-system-x86_64 -enable-kvm -smp 4 -cpu host -netdev user,id=n0,tftp=./test_image,bootfile=boot/limine-pxe.bin -device rtl8139,netdev=n0,mac=00:00:00:11:11:11 -debugcon stdio
.PHONY: uefi-test
uefi-test: uefi-test:
$(MAKE) ovmf $(MAKE) ovmf
$(MAKE) test-clean $(MAKE) test-clean

View File

@ -55,13 +55,16 @@ rebuild `limine-install`, simply use `make` in the binary release.
*These steps are not necessary if cloning a binary release. If so, skip to* *These steps are not necessary if cloning a binary release. If so, skip to*
*"Installing Limine binaries".* *"Installing Limine binaries".*
**Note that the build system does not support building from a directory whose**
**full path contains spaces.**
### Building the toolchain ### Building the toolchain
This step can take a long time, but it will ensure that the compiler will work with 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 Limine. If on an x86_64 host, with GCC installed, you can also skip to the next
paragraph. paragraph.
The toolchain building process depends on the following packages: `make`, `wget`, The toolchain building process depends on the following packages: `bash`, `make`, `wget`,
`gcc`, `g++`, `binutils`. `gcc`, `g++`, `binutils`.
Building the toolchain can be accomplished by running: Building the toolchain can be accomplished by running:
@ -72,7 +75,7 @@ make toolchain
### Building Limine ### Building Limine
In order to build Limine, the following packages have to be installed: `make`, `git`, In order to build Limine, the following packages have to be installed: `bash`, `make`, `git`,
`which`, `nasm`, `mtools`. Furthermore, either the toolchain must have been built in `which`, `nasm`, `mtools`. Furthermore, either the toolchain must have been built in
the previous paragraph, or `gcc` and `binutils` must also be installed. the previous paragraph, or `gcc` and `binutils` must also be installed.

View File

@ -15,15 +15,15 @@ CFLAGS = -O2 -pipe -Wall -Wextra
all: limine-install all: limine-install
install: all install: all
install -d $(DESTDIR)$(PREFIX)/bin install -d "$(DESTDIR)$(PREFIX)/bin"
install -s limine-install $(DESTDIR)$(PREFIX)/bin/ install -s limine-install "$(DESTDIR)$(PREFIX)/bin/"
install -d $(DESTDIR)$(PREFIX)/share install -d "$(DESTDIR)$(PREFIX)/share"
install -d $(DESTDIR)$(PREFIX)/share/limine install -d "$(DESTDIR)$(PREFIX)/share/limine"
install -m 644 limine.sys $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 limine.sys "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 limine-cd.bin $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 limine-cd.bin "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 limine-eltorito-efi.bin $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 limine-eltorito-efi.bin "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 limine-pxe.bin $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 limine-pxe.bin "$(DESTDIR)$(PREFIX)/share/limine/"
install -m 644 BOOTX64.EFI $(DESTDIR)$(PREFIX)/share/limine/ install -m 644 BOOTX64.EFI "$(DESTDIR)$(PREFIX)/share/limine/"
clean: clean:
rm -f limine-hdd.o limine-install limine-install.exe rm -f limine-hdd.o limine-install limine-install.exe
@ -31,6 +31,6 @@ clean:
limine-install: limine-install.c limine-hdd.o limine-install: limine-install.c limine-hdd.o
$(CC) $(CFLAGS) -std=c11 $^ -o $@ $(CC) $(CFLAGS) -std=c11 $^ -o $@
limine-hdd.o: $(LIMINE_HDD_BIN) limine-hdd.o: $(shell echo "$(LIMINE_HDD_BIN)" | sed 's/ /\\ /g')
cd `dirname $^` && \ cd "`dirname $^`" && \
$(OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) `basename $^` $(BUILD_DIR)/$@ $(OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) "`basename $^`" "$(BUILD_DIR)/$@"