:: commit d288550b2a28c0c3d9bea0068c149ec0ee8edf70

mintsuki <mintsuki@protonmail.com> — 2021-04-11 07:56

parents: 7ac20e0615

build: Properly handle spaces in PATH

diff --git a/Makefile b/Makefile
index b875edfd..54f60630 100644
--- a/Makefile
+++ b/Makefile
@@ -2,51 +2,53 @@ PREFIX = /usr/local
 DESTDIR =
 
 PATH := $(shell pwd)/toolchain/bin:$(PATH)
-SHELL := env PATH=$(PATH) /bin/bash
+SHELL := /usr/bin/env bash
 
 TOOLCHAIN = x86_64-elf
 
 TOOLCHAIN_CC = $(TOOLCHAIN)-gcc
 TOOLCHAIN_AR = $(TOOLCHAIN)-ar
 
-ifeq ($(shell which $(TOOLCHAIN_CC)), )
+ifeq ($(shell export "PATH=$(PATH)"; which $(TOOLCHAIN_CC)), )
 TOOLCHAIN_CC := gcc
 endif
-ifeq ($(shell which $(TOOLCHAIN_AR)), )
+ifeq ($(shell export "PATH=$(PATH)"; which $(TOOLCHAIN_AR)), )
 TOOLCHAIN_AR := ar
 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")
 endif
 
 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:
 	$(MAKE) limine-uefi
 	$(MAKE) limine-bios
 	$(MAKE) bin/limine-install
 
+.PHONY: bin/limine-install
 bin/limine-install:
 	$(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.exe ] && cp limine-install/limine-install.exe bin/ || true
 
+.PHONY: clean
 clean: limine-bios-clean limine-uefi-clean
 	$(MAKE) -C limine-install clean
 
+.PHONY: install
 install: all
-	install -d $(DESTDIR)$(PREFIX)/bin
-	install -s bin/limine-install $(DESTDIR)$(PREFIX)/bin/
-	install -d $(DESTDIR)$(PREFIX)/share
-	install -d $(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-eltorito-efi.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 -d "$(DESTDIR)$(PREFIX)/bin"
+	install -s bin/limine-install "$(DESTDIR)$(PREFIX)/bin/"
+	install -d "$(DESTDIR)$(PREFIX)/share"
+	install -d "$(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-eltorito-efi.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/"
 
 build/stage1: $(STAGE1_FILES) build/decompressor/decompressor.bin build/stage23-bios/stage2.bin.gz
 	mkdir -p bin
@@ -56,6 +58,7 @@ build/stage1: $(STAGE1_FILES) build/decompressor/decompressor.bin build/stage23-
 	cp build/stage23-bios/limine.sys ./bin/
 	touch build/stage1
 
+.PHONY: limine-bios
 limine-bios: stage23-bios decompressor
 	$(MAKE) build/stage1
 
@@ -66,6 +69,7 @@ bin/limine-eltorito-efi.bin: build/stage23-uefi/BOOTX64.EFI
 	mmd -D s -i $@ ::/EFI/BOOT
 	mcopy -D o -i $@ build/stage23-uefi/BOOTX64.EFI ::/EFI/BOOT
 
+.PHONY: limine-uefi
 limine-uefi:
 	$(MAKE) gnu-efi
 	$(MAKE) stage23-uefi
@@ -73,38 +77,49 @@ limine-uefi:
 	cp build/stage23-uefi/BOOTX64.EFI ./bin/
 	$(MAKE) bin/limine-eltorito-efi.bin
 
+.PHONY: limine-bios-clean
 limine-bios-clean: stage23-bios-clean decompressor-clean
 
+.PHONY: limine-uefi-clean
 limine-uefi-clean: stage23-uefi-clean
 
+.PHONY: distclean
 distclean: clean test-clean
 	rm -rf bin build stivale toolchain ovmf gnu-efi
 
 stivale:
 	git clone https://github.com/stivale/stivale.git
 
+.PHONY: stage23-uefi
 stage23-uefi: stivale
 	$(MAKE) -C stage23 all TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi"
 
+.PHONY: stage23-uefi-clean
 stage23-uefi-clean:
 	$(MAKE) -C stage23 clean TARGET=uefi BUILDDIR="`pwd`/build/stage23-uefi"
 
+.PHONY: stage23-bios
 stage23-bios: stivale
 	$(MAKE) -C stage23 all TARGET=bios BUILDDIR="`pwd`/build/stage23-bios"
 
+.PHONY: stage23-bios-clean
 stage23-bios-clean:
 	$(MAKE) -C stage23 clean TARGET=bios BUILDDIR="`pwd`/build/stage23-bios"
 
+.PHONY: decompressor
 decompressor:
 	$(MAKE) -C decompressor all BUILDDIR="`pwd`/build/decompressor"
 
+.PHONY: decompressor-clean
 decompressor-clean:
 	$(MAKE) -C decompressor clean BUILDDIR="`pwd`/build/decompressor"
 
+.PHONY: test-clean
 test-clean:
 	$(MAKE) -C test clean
 	rm -rf test_image test.hdd test.iso
 
+.PHONY: toolchain
 toolchain:
 	scripts/make_toolchain.sh "`realpath ./toolchain`" -j`nproc`
 
@@ -117,12 +132,14 @@ ovmf:
 	mkdir -p ovmf
 	cd ovmf && wget https://efi.akeo.ie/OVMF/OVMF-X64.zip && 7z x OVMF-X64.zip
 
+.PHONY: test.hdd
 test.hdd:
 	rm -f 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 mkpart primary 2048s 100%
 
+.PHONY: echfs-test
 echfs-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
@@ -139,6 +156,7 @@ echfs-test:
 	bin/limine-install test.hdd
 	qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
 
+.PHONY: ext2-test
 ext2-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
@@ -160,6 +178,7 @@ ext2-test:
 	bin/limine-install test.hdd
 	qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
 
+.PHONY: fat16-test
 fat16-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
@@ -181,6 +200,7 @@ fat16-test:
 	bin/limine-install test.hdd
 	qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
 
+.PHONY: fat32-test
 fat32-test:
 	$(MAKE) test-clean
 	$(MAKE) test.hdd
@@ -202,6 +222,7 @@ fat32-test:
 	bin/limine-install test.hdd
 	qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -hda test.hdd -debugcon stdio
 
+.PHONY: iso9660-test
 iso9660-test:
 	$(MAKE) test-clean
 	$(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
 	qemu-system-x86_64 -net none -smp 4 -enable-kvm -cpu host -cdrom test.iso -debugcon stdio
 
+.PHONY: iso9660-uefi-test
 iso9660-uefi-test:
 	$(MAKE) ovmf
 	$(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
 	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:
 	$(MAKE) ovmf
 	$(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
 	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:
 	$(MAKE) test-clean
 	$(MAKE) limine-bios
@@ -249,6 +273,7 @@ pxe-test:
 	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
 
+.PHONY: uefi-test
 uefi-test:
 	$(MAKE) ovmf
 	$(MAKE) test-clean
diff --git a/README.md b/README.md
index 0adae2da..12c34d5d 100644
--- a/README.md
+++ b/README.md
@@ -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*
 *"Installing Limine binaries".*
 
+**Note that the build system does not support building from a directory whose**
+**full path contains spaces.**
+
 ### Building the toolchain
 
 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: `make`, `wget`,
+The toolchain building process depends on the following packages: `bash`, `make`, `wget`,
 `gcc`, `g++`, `binutils`.
 
 Building the toolchain can be accomplished by running:
@@ -72,7 +75,7 @@ make toolchain
 
 ### 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
 the previous paragraph, or `gcc` and `binutils` must also be installed.
 
diff --git a/limine-install/Makefile b/limine-install/Makefile
index 5ac1a889..1e21cada 100644
--- a/limine-install/Makefile
+++ b/limine-install/Makefile
@@ -15,15 +15,15 @@ CFLAGS = -O2 -pipe -Wall -Wextra
 all: limine-install
 
 install: all
-	install -d $(DESTDIR)$(PREFIX)/bin
-	install -s limine-install $(DESTDIR)$(PREFIX)/bin/
-	install -d $(DESTDIR)$(PREFIX)/share
-	install -d $(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-eltorito-efi.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 -d "$(DESTDIR)$(PREFIX)/bin"
+	install -s limine-install "$(DESTDIR)$(PREFIX)/bin/"
+	install -d "$(DESTDIR)$(PREFIX)/share"
+	install -d "$(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-eltorito-efi.bin "$(DESTDIR)$(PREFIX)/share/limine/"
+	install -m 644 limine-pxe.bin "$(DESTDIR)$(PREFIX)/share/limine/"
+	install -m 644 BOOTX64.EFI "$(DESTDIR)$(PREFIX)/share/limine/"
 
 clean:
 	rm -f limine-hdd.o limine-install limine-install.exe
@@ -31,6 +31,6 @@ clean:
 limine-install: limine-install.c limine-hdd.o
 	$(CC) $(CFLAGS) -std=c11 $^ -o $@
 
-limine-hdd.o: $(LIMINE_HDD_BIN)
-	cd `dirname $^` && \
-	  $(OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) `basename $^` $(BUILD_DIR)/$@
+limine-hdd.o: $(shell echo "$(LIMINE_HDD_BIN)" | sed 's/ /\\ /g')
+	cd "`dirname $^`" && \
+	  $(OBJCOPY) -B i8086 -I binary -O $(OBJCOPY_ARCH) "`basename $^`" "$(BUILD_DIR)/$@"
tab: 248 wrap: offon