:: commit 3dcde21bcf6a9052eb49d19e61e5b13f9addff56

mintsuki <mintsuki@protonmail.com> — 2022-01-16 05:09

parents: 351031e212

build: Move to using autoconf

diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index 40bc3396..b2659e30 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -15,4 +15,4 @@ jobs:
         run: sudo apt-get update && sudo apt-get install git build-essential nasm curl mtools -y
 
       - name: Build the bootloader
-        run: make all
+        run: ./autogen.sh && make all
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 38fa9f4e..43edb7a1 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -25,17 +25,26 @@ jobs:
       - name: Install dependencies
         run: sudo apt-get update && sudo apt-get install git build-essential nasm gcc-mingw-w64 gcc-multilib curl mtools -y
 
+      - name: Regenerate
+        run: NOCONFIGURE=yes ./autogen.sh
+
+      - name: Create build dir
+        run: mkdir -p build
+
+      - name: Configure
+        run: cd build && ../configure
+
       - name: Build the toolchain
-        run: make toolchain
+        run: make -C build toolchain
 
       - name: Build the bootloader
-        run: make
+        run: make -C build
 
       - name: Clean limine-install
-        run: make -C limine-install clean
+        run: rm build/bin/limine-install
 
       - name: Build limine-install-linux-x86_64
-        run: make CFLAGS="-O2 -pipe -static" limine-install
+        run: make -C build CFLAGS="-O2 -pipe -static" limine-install
 
       - name: Strip limine-install-linux-x86_64
         run: strip build/bin/limine-install
@@ -43,11 +52,8 @@ jobs:
       - name: Rename limine-install-linux-x86_64
         run: mv build/bin/limine-install build/bin/limine-install-linux-x86_64
 
-      - name: Clean limine-install
-        run: make -C limine-install clean
-
       - name: Build limine-install-linux-x86_32
-        run: make CC="gcc -m32" CFLAGS="-O2 -pipe -static" limine-install
+        run: make -C build CC="gcc -m32" CFLAGS="-O2 -pipe -static" limine-install
 
       - name: Strip limine-install-linux-x86_32
         run: strip build/bin/limine-install
@@ -55,11 +61,8 @@ jobs:
       - name: Rename limine-install-linux-x86_32
         run: mv build/bin/limine-install build/bin/limine-install-linux-x86_32
 
-      - name: Clean limine-install
-        run: make -C limine-install clean
-
       - name: Build limine-install-win32
-        run: make CC="i686-w64-mingw32-gcc" CFLAGS="-O2 -pipe" limine-install
+        run: make -C build CC="i686-w64-mingw32-gcc" CFLAGS="-O2 -pipe" limine-install
 
       - name: Strip limine-install-win32
         run: i686-w64-mingw32-strip build/bin/limine-install.exe
@@ -67,9 +70,6 @@ jobs:
       - name: Rename limine-install-win32
         run: mv build/bin/limine-install.exe build/bin/limine-install-win32.exe
 
-      - name: Clean limine-install
-        run: make -C limine-install clean
-
       - name: Copy LICENSE to bin
         run: cp LICENSE.md build/bin/
 
@@ -94,7 +94,7 @@ jobs:
         run: git checkout $TAG_NAME && rm -rf * && git checkout .
 
       - name: Package release tarball
-        run: make dist
+        run: ./autogen.sh && make dist
 
       - name: Create release notes
         run: echo "Binary release can be found at https://github.com/limine-bootloader/limine/tree/$TAG_NAME-binary" > rel_notes.txt
diff --git a/.gitignore b/.gitignore
index 1fd49086..87417fd4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,14 @@ bx_enh_dbg.ini
 stivale
 test_image
 !stage23/font.bin
+configure
+configure~
+config.status
+config.log
+autom4te.cache
+GNUmakefile
+stage23-bios
+stage23-uefi32
+stage23-uefi64
+decompressor-build
+stage1.stamp
diff --git a/GNUmakefile b/GNUmakefile.in
similarity index 72%
rename from GNUmakefile
rename to GNUmakefile.in
index 120741f7..6fefabf8 100644
--- a/GNUmakefile
+++ b/GNUmakefile.in
@@ -1,9 +1,11 @@
-PREFIX ?= /usr/local
+PREFIX ?= @prefix@
 DESTDIR ?=
 
-BUILDDIR ?= $(shell pwd)/build
+BUILDDIR ?= @abs_builddir@
 override BINDIR := $(BUILDDIR)/bin
 
+SRCDIR ?= @abs_srcdir@
+
 override SPACE := $(subst ,, )
 override COMMA := ,
 
@@ -11,24 +13,55 @@ MKESCAPE = $(subst $(SPACE),\ ,$(1))
 SHESCAPE = $(subst ','\'',$(1))
 NASMESCAPE = $(subst ','"'$(COMMA) \"'\"$(COMMA) '"',$(1))
 
-override PATH := $(shell pwd)/toolchain/bin:$(PATH)
+override PATH := $(BUILDDIR)/toolchain/bin:$(PATH)
 export PATH
 
 override NCPUS := $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
 
-override LIMINE_VERSION := $(shell cat version 2>/dev/null || ( git describe --exact-match --tags `git log -n1 --pretty='%h'` 2>/dev/null || git log -n1 --pretty='%h' ) )
+override LIMINE_VERSION := @limine_version@
 export LIMINE_VERSION
 
-override LIMINE_COPYRIGHT := $(shell grep Copyright LICENSE.md)
+override LIMINE_COPYRIGHT := $(shell grep Copyright '$(call SHESCAPE,$(SRCDIR))/LICENSE.md')
 export LIMINE_COPYRIGHT
 
-TOOLCHAIN ?= limine
+ifeq ($(origin CC), default)
+CC := @CC@
+endif
 
-TOOLCHAIN_CC ?= $(TOOLCHAIN)-gcc
+TOOLCHAIN ?= @TOOLCHAIN@
+TOOLCHAIN_CC ?= @TOOLCHAIN_CC@
+TOOLCHAIN_LD ?= @TOOLCHAIN_LD@
+TOOLCHAIN_AR ?= @TOOLCHAIN_AR@
+TOOLCHAIN_OBJCOPY ?= @TOOLCHAIN_OBJCOPY@
+TOOLCHAIN_OBJDUMP ?= @TOOLCHAIN_OBJDUMP@
+TOOLCHAIN_READELF ?= @TOOLCHAIN_READELF@
 
 ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(TOOLCHAIN_CC) ; ), )
-override TOOLCHAIN_CC := cc
+override TOOLCHAIN_CC := $(CC)
+endif
+ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(TOOLCHAIN_LD) ; ), )
+override TOOLCHAIN_LD := ld
+endif
+ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(TOOLCHAIN_AR) ; ), )
+override TOOLCHAIN_AR := ar
+endif
+ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(TOOLCHAIN_OBJCOPY) ; ), )
+override TOOLCHAIN_OBJCOPY := objcopy
+endif
+ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(TOOLCHAIN_OBJDUMP) ; ), )
+override TOOLCHAIN_OBJDUMP := objdump
 endif
+ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(TOOLCHAIN_READELF) ; ), )
+override TOOLCHAIN_READELF := readelf
+endif
+
+export TOOLCHAIN
+export TOOLCHAIN_CC
+export TOOLCHAIN_LD
+export TOOLCHAIN_AR
+export TOOLCHAIN_OBJCOPY
+export TOOLCHAIN_OBJDUMP
+export TOOLCHAIN_READELF
 
 override USING_CLANG := $(shell $(TOOLCHAIN_CC) --version | grep clang >/dev/null && echo 1)
 export USING_CLANG
@@ -56,7 +89,7 @@ ifeq ($(USING_CLANG), 1)
 override TOOLCHAIN_CC := $(ORIG_TOOLCHAIN_CC)
 endif
 
-override STAGE1_FILES := $(shell find -L ./stage1 -type f -name '*.asm')
+override STAGE1_FILES := $(shell find -L '$(call SHESCAPE,$(SRCDIR))/stage1' -type f -name '*.asm')
 
 .PHONY: all
 all: limine-uefi limine-bios
@@ -64,12 +97,12 @@ all: limine-uefi limine-bios
 .PHONY: limine-install
 limine-install:
 	mkdir -p '$(call SHESCAPE,$(BINDIR))'
-	cp limine-install/* limine-install/.gitignore '$(call SHESCAPE,$(BINDIR))/'
-	$(MAKE) -C '$(call SHESCAPE,$(BINDIR))'
+	cp '$(call SHESCAPE,$(SRCDIR))/limine-install/'* '$(call SHESCAPE,$(SRCDIR))/limine-install/.gitignore' '$(call SHESCAPE,$(BINDIR))/'
+	$(MAKE) -C '$(call SHESCAPE,$(BINDIR))' CC=$(CC)
 
 .PHONY: clean
 clean: limine-bios-clean limine-uefi32-clean limine-uefi64-clean
-	rm -rf '$(call SHESCAPE,$(BINDIR))' '$(call SHESCAPE,$(BUILDDIR))/stage1'
+	rm -rf '$(call SHESCAPE,$(BINDIR))' '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp'
 
 .PHONY: install
 install:
@@ -84,17 +117,17 @@ install:
 	install -m 644 '$(call SHESCAPE,$(BINDIR))/BOOTX64.EFI' '$(DESTDIR)$(PREFIX)/share/limine/' || true
 	install -m 644 '$(call SHESCAPE,$(BINDIR))/BOOTIA32.EFI' '$(DESTDIR)$(PREFIX)/share/limine/' || true
 
-$(call MKESCAPE,$(BUILDDIR))/stage1: $(STAGE1_FILES) $(call MKESCAPE,$(BUILDDIR))/decompressor/decompressor.bin $(call MKESCAPE,$(BUILDDIR))/stage23-bios/stage2.bin.gz
+$(call MKESCAPE,$(BUILDDIR))/stage1.stamp: $(STAGE1_FILES) $(call MKESCAPE,$(BUILDDIR))/decompressor-build/decompressor.bin $(call MKESCAPE,$(BUILDDIR))/stage23-bios/stage2.bin.gz
 	mkdir -p '$(call SHESCAPE,$(BINDIR))'
-	cd stage1/hdd && nasm bootsect.asm -Werror -fbin -DBUILDDIR="'"'$(call NASMESCAPE,$(BUILDDIR))'"'" -o '$(call SHESCAPE,$(BINDIR))/limine-hdd.bin'
-	cd stage1/cd  && nasm bootsect.asm -Werror -fbin -DBUILDDIR="'"'$(call NASMESCAPE,$(BUILDDIR))'"'" -o '$(call SHESCAPE,$(BINDIR))/limine-cd.bin'
-	cd stage1/pxe && nasm bootsect.asm -Werror -fbin -DBUILDDIR="'"'$(call NASMESCAPE,$(BUILDDIR))'"'" -o '$(call SHESCAPE,$(BINDIR))/limine-pxe.bin'
+	cd '$(call SHESCAPE,$(SRCDIR))/stage1/hdd' && nasm bootsect.asm -Werror -fbin -DBUILDDIR="'"'$(call NASMESCAPE,$(BUILDDIR))'"'" -o '$(call SHESCAPE,$(BINDIR))/limine-hdd.bin'
+	cd '$(call SHESCAPE,$(SRCDIR))/stage1/cd'  && nasm bootsect.asm -Werror -fbin -DBUILDDIR="'"'$(call NASMESCAPE,$(BUILDDIR))'"'" -o '$(call SHESCAPE,$(BINDIR))/limine-cd.bin'
+	cd '$(call SHESCAPE,$(SRCDIR))/stage1/pxe' && nasm bootsect.asm -Werror -fbin -DBUILDDIR="'"'$(call NASMESCAPE,$(BUILDDIR))'"'" -o '$(call SHESCAPE,$(BINDIR))/limine-pxe.bin'
 	cp '$(call SHESCAPE,$(BUILDDIR))/stage23-bios/limine.sys' '$(call SHESCAPE,$(BINDIR))/'
-	touch '$(call SHESCAPE,$(BUILDDIR))/stage1'
+	touch '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp'
 
 .PHONY: limine-bios
 limine-bios: stage23-bios decompressor
-	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/stage1'
+	$(MAKE) '$(call SHESCAPE,$(BUILDDIR))/stage1.stamp'
 	$(MAKE) limine-install
 
 .PHONY: limine-eltorito-efi
@@ -115,13 +148,13 @@ limine-uefi: limine-uefi32 limine-uefi64
 	$(MAKE) limine-eltorito-efi
 
 .PHONY: limine-uefi64
-limine-uefi64: reduced-gnu-efi
+limine-uefi64: $(call MKESCAPE,$(SRCDIR))/reduced-gnu-efi
 	$(MAKE) stage23-uefi64
 	mkdir -p '$(call SHESCAPE,$(BINDIR))'
 	cp '$(call SHESCAPE,$(BUILDDIR))/stage23-uefi64/BOOTX64.EFI' '$(call SHESCAPE,$(BINDIR))/'
 
 .PHONY: limine-uefi32
-limine-uefi32: reduced-gnu-efi
+limine-uefi32: $(call MKESCAPE,$(SRCDIR))/reduced-gnu-efi
 	$(MAKE) stage23-uefi32
 	mkdir -p '$(call SHESCAPE,$(BINDIR))'
 	cp '$(call SHESCAPE,$(BUILDDIR))/stage23-uefi32/BOOTIA32.EFI' '$(call SHESCAPE,$(BINDIR))/'
@@ -135,68 +168,60 @@ limine-uefi64-clean: stage23-uefi64-clean
 .PHONY: limine-uefi32-clean
 limine-uefi32-clean: stage23-uefi32-clean
 
-.PHONY: regenerate
-regenerate: reduced-gnu-efi stivale
-
 .PHONY: dist
 dist:
-	rm -rf "limine-$(LIMINE_VERSION)"
-	LIST="$$(ls -A)"; mkdir "limine-$(LIMINE_VERSION)" && cp -r $$LIST "limine-$(LIMINE_VERSION)/"
-	rm -rf "limine-$(LIMINE_VERSION)/"*.tar*
-	$(MAKE) -C "limine-$(LIMINE_VERSION)" repoclean
-	$(MAKE) -C "limine-$(LIMINE_VERSION)" regenerate
-	rm -rf "limine-$(LIMINE_VERSION)/reduced-gnu-efi/.git"
-	rm -rf "limine-$(LIMINE_VERSION)/stivale/.git"
-	rm -rf "limine-$(LIMINE_VERSION)/.git"
-	echo "$(LIMINE_VERSION)" > "limine-$(LIMINE_VERSION)/version"
-	tar -Jcf "limine-$(LIMINE_VERSION).tar.xz" "limine-$(LIMINE_VERSION)"
-	rm -rf "limine-$(LIMINE_VERSION)"
+	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)"
+	mkdir -p '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)"
+	cp -r '$(call SHESCAPE,$(SRCDIR))'/.git '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)"/
+	cd '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)" && git checkout .
+	cd '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)" && NOCONFIGURE=yes && ./autogen.sh
+	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)/reduced-gnu-efi/.git"
+	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)/stivale/.git"
+	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)/.git"
+	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)/autom4te.cache"
+	echo "$(LIMINE_VERSION)" > '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)/version"
+	cd '$(call SHESCAPE,$(BUILDDIR))' && tar -Jcf "limine-$(LIMINE_VERSION).tar.xz" "limine-$(LIMINE_VERSION)"
+	rm -rf '$(call SHESCAPE,$(BUILDDIR))'/"limine-$(LIMINE_VERSION)"
 
 .PHONY: distclean
-distclean: clean test-clean
-	rm -rf build toolchain ovmf*
-
-.PHONY: repoclean
-repoclean: distclean
-	rm -rf stivale reduced-gnu-efi *.tar.xz
-
-stivale:
-	git clone https://github.com/stivale/stivale.git
+distclean: clean
+	rm -rf toolchain ovmf* config.log config.status GNUmakefile
 
-reduced-gnu-efi:
-	git clone https://github.com/limine-bootloader/reduced-gnu-efi.git
+.PHONY: maintainer-clean
+maintainer-clean: distclean
+	cd '$(call SHESCAPE,$(SRCDIR))' && rm -rf stivale reduced-gnu-efi configure 'configure~' autom4te.cache *.tar.xz
 
 .PHONY: stage23-uefi64
-stage23-uefi64: stivale
-	$(MAKE) -C stage23 all TARGET=uefi64 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi64'
+stage23-uefi64: $(call MKESCAPE,$(SRCDIR))/stivale
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/stage23' all TARGET=uefi64 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi64'
 
 .PHONY: stage23-uefi64-clean
 stage23-uefi64-clean:
-	$(MAKE) -C stage23 clean TARGET=uefi64 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi64'
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/stage23' clean TARGET=uefi64 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi64'
 
 .PHONY: stage23-uefi32
-stage23-uefi32: stivale
-	$(MAKE) -C stage23 all TARGET=uefi32 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi32'
+stage23-uefi32: $(call MKESCAPE,$(SRCDIR))/stivale
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/stage23' all TARGET=uefi32 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi32'
 
 .PHONY: stage23-uefi32-clean
 stage23-uefi32-clean:
-	$(MAKE) -C stage23 clean TARGET=uefi32 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi32'
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/stage23' clean TARGET=uefi32 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-uefi32'
 
 .PHONY: stage23-bios
-stage23-bios: stivale
-	$(MAKE) -C stage23 all TARGET=bios BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-bios'
+stage23-bios: $(call MKESCAPE,$(SRCDIR))/stivale
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/stage23' all TARGET=bios BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-bios'
 
 .PHONY: stage23-bios-clean
 stage23-bios-clean:
-	$(MAKE) -C stage23 clean TARGET=bios BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-bios'
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/stage23' clean TARGET=bios BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/stage23-bios'
 
 .PHONY: decompressor
 decompressor:
-	$(MAKE) -C decompressor all BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor'
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/decompressor' all BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor-build'
 
 .PHONY: decompressor-clean
 decompressor-clean:
-	$(MAKE) -C decompressor clean BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor'
+	$(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/decompressor' clean BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor-build'
 
 .PHONY: test-clean
 test-clean:
@@ -205,7 +230,7 @@ test-clean:
 
 .PHONY: toolchain
 toolchain:
-	MAKE="$(MAKE)" build-aux/make_toolchain.sh "`pwd`/toolchain" -j$(NCPUS)
+	MAKE="$(MAKE)" '$(call SHESCAPE,$(SRCDIR))'/build-aux/make_toolchain.sh '$(call SHESCAPE,$(BUILDDIR))'/toolchain -j$(NCPUS)
 
 ovmf-x64:
 	mkdir -p ovmf-x64
diff --git a/README.md b/README.md
index 158fffb3..c5d41f89 100644
--- a/README.md
+++ b/README.md
@@ -45,9 +45,9 @@ 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.65)
+or, to clone a specific binary point release (for example v2.75)
 ```bash
-git clone https://github.com/limine-bootloader/limine.git --branch=v2.65-binary --depth=1
+git clone https://github.com/limine-bootloader/limine.git --branch=v2.75-binary --depth=1
 ```
 
 Additionally, the absolute latest Limine binary release can be obtained by
@@ -66,6 +66,18 @@ release.
 *These steps are not necessary if cloning a binary release. If so, skip to*
 *"Installing Limine binaries".*
 
+### Configure
+
+If checking out from the repository, run `./autogen.sh`, else, if using a
+release tarball, run `./configure` directly.
+
+Both `./autogen.sh` and `./configure` take arguments and environment variables;
+for more information on these, run `./configure --help`.
+
+Limine supports both in-tree and out-of-tree builds. Simply run the configure
+script from the directory you wish to execute the build in. The following `make`
+commands are supposed to be ran inside the build directory.
+
 ### Building the toolchain
 
 This step can take a long time, but it will ensure that the toolchain will work
@@ -86,52 +98,27 @@ In order to build Limine, the following packages have to be installed:
 `GNU make`, `nasm`, `mtools` (optional, necessary to build
 `limine-eltorito-efi.bin`).
 Furthermore, either the toolchain must have been built in the previous
-paragraph, or `gcc` or `llvm/clang` must also be installed.
-`GNU binutils` is necessary in order to build the UEFI ports of Limine. A full
-LLVM toolchain without `GNU binutils` can be used to build just the BIOS port
-instead.
+paragraph, or `gcc` or `llvm/clang` must also be installed, alongside
+`GNU binutils`.
 
-Both the UEFI and BIOS ports of the bootloader can be built, using
-`GCC/GNU binutils` (which includes the shipped toolchain), with:
+Then, to build Limine, run:
 ```bash
 make    # (or gmake where applicable)
 ```
 
-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 `limine`, resulting in program names like `limine-gcc`,
-falling back to no-prefix, or host, toolchain), and `BUILDDIR=`, which specifies an
-alternative build directory (for example, out of tree - the default is `./build`).
-
-The generated bootloader files are going to be in `$BUILDDIR/bin` (by default that
-is `./build/bin`).
-
-#### Using clang/LLVM
-
-In order to build the BIOS port fully using clang/LLVM, run `make` as such:
-```bash
-# (or gmake where applicable)
-make limine-bios CC="clang" TOOLCHAIN="llvm" TOOLCHAIN_CC="clang" TOOLCHAIN_LD="ld.lld"
-```
-
-And in order to build the UEFI port using clang/LLVM + `GNU binutils`, run
-`make` as such:
-```bash
-# (or gmake where applicable)
-make limine-uefi TOOLCHAIN="llvm" TOOLCHAIN_CC="clang" TOOLCHAIN_LD="ld.bfd" TOOLCHAIN_OBJCOPY="objcopy"
-```
-
-Where `ld.bfd` and `objcopy` refer to GNU binutils versions of them. Specify their
-full path if necessary.
+The generated bootloader files are going to be in `$BUILDDIR/bin`.
 
 ## Installing Limine binaries
 
 This step is optional as the bootloader binaries can be used from the `bin` or
 release directory just fine. This step will only install them to a `share` and
-`bin` directories in the specified `PREFIX` (default is `/usr/local`).
+`bin` directories in the specified prefix (default is `/usr/local`, see
+`.configure --help`).
 
-Use `make install` to install the Limine binaries, optionally specifying a
-different prefix with `make install PREFIX=/myprefix`.
+To install Limine, run:
+```bash
+make install
+```
 
 ## How to use
 
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 00000000..8a619cf1
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+set -ex
+
+srcdir="$(realpath $(dirname "$0"))"
+test -z "$srcdir" && srcdir=.
+
+cd "$srcdir"
+
+[ -d stivale ] || git clone https://github.com/stivale/stivale.git
+[ -d reduced-gnu-efi ] || git clone https://github.com/limine-bootloader/reduced-gnu-efi.git
+
+autoconf
+
+if test -z "$NOCONFIGURE"; then
+    exec "$srcdir"/configure "$@"
+fi
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 00000000..b7f0c09a
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,36 @@
+AC_INIT([Limine], m4_esyscmd([./version.sh]), [https://github.com/limine-bootloader/limine/issues], [limine])
+
+AC_PREREQ(2.69)
+
+AC_PROG_CC
+
+AC_SUBST(limine_version, m4_esyscmd([./version.sh]))
+
+AC_ARG_VAR(CC, [C compiler command [cc]])
+test -z "$CC" && CC='cc'
+
+AC_ARG_VAR(TOOLCHAIN, [Alternative toolchain prefix [limine]])
+test -z "$TOOLCHAIN" && TOOLCHAIN='limine'
+
+AC_ARG_VAR(TOOLCHAIN_CC, [Toolchain C compiler command [$(TOOLCHAIN)-gcc]])
+test -z "$TOOLCHAIN_CC" && TOOLCHAIN_CC='$(TOOLCHAIN)-gcc'
+
+AC_ARG_VAR(TOOLCHAIN_LD, [Toolchain linker command [$(TOOLCHAIN)-ld]])
+test -z "$TOOLCHAIN_LD" && TOOLCHAIN_LD='$(TOOLCHAIN)-ld'
+
+AC_ARG_VAR(TOOLCHAIN_AR, [Toolchain archiver command [$(TOOLCHAIN)-ar]])
+test -z "$TOOLCHAIN_AR" && TOOLCHAIN_AR='$(TOOLCHAIN)-ar'
+
+AC_ARG_VAR(TOOLCHAIN_OBJCOPY, [Toolchain objcopy command [$(TOOLCHAIN)-objcopy]])
+test -z "$TOOLCHAIN_OBJCOPY" && TOOLCHAIN_OBJCOPY='$(TOOLCHAIN)-objcopy'
+
+AC_ARG_VAR(TOOLCHAIN_OBJDUMP, [Toolchain objdump command [$(TOOLCHAIN)-objdump]])
+test -z "$TOOLCHAIN_OBJDUMP" && TOOLCHAIN_OBJDUMP='$(TOOLCHAIN)-objdump'
+
+AC_ARG_VAR(TOOLCHAIN_READELF, [Toolchain readelf command [$(TOOLCHAIN)-readelf]])
+test -z "$TOOLCHAIN_READELF" && TOOLCHAIN_READELF='$(TOOLCHAIN)-readelf'
+
+AC_PREFIX_DEFAULT(/usr/local)
+
+AC_CONFIG_FILES(GNUmakefile)
+AC_OUTPUT
diff --git a/decompressor/GNUmakefile b/decompressor/GNUmakefile
index ef193ffe..8852aa51 100644
--- a/decompressor/GNUmakefile
+++ b/decompressor/GNUmakefile
@@ -11,22 +11,6 @@ ifeq ($(call MKESCAPE,$(BUILDDIR)), )
 	$(error BUILDDIR not specified)
 endif
 
-TOOLCHAIN ?= limine
-
-TOOLCHAIN_CC ?= $(TOOLCHAIN)-gcc
-TOOLCHAIN_LD ?= $(TOOLCHAIN)-ld
-TOOLCHAIN_OBJCOPY ?= $(TOOLCHAIN)-objcopy
-
-ifeq ($(shell command -v $(TOOLCHAIN_CC) ; ), )
-override TOOLCHAIN_CC := cc
-endif
-ifeq ($(shell command -v $(TOOLCHAIN_LD) ; ), )
-override TOOLCHAIN_LD := ld
-endif
-ifeq ($(shell command -v $(TOOLCHAIN_OBJCOPY) ; ), )
-override TOOLCHAIN_OBJCOPY := objcopy
-endif
-
 ifeq ($(USING_CLANG), 1)
 override TOOLCHAIN_CC += --target=i686-elf
 endif
diff --git a/stage1/cd/bootsect.asm b/stage1/cd/bootsect.asm
index 8ebf6600..d09562b2 100644
--- a/stage1/cd/bootsect.asm
+++ b/stage1/cd/bootsect.asm
@@ -95,7 +95,7 @@ pmode:
 ; Align stage2 to 2K ON DISK
 times 2048-($-$$) db 0
 decompressor:
-%strcat DECOMPRESSOR_PATH BUILDDIR, '/decompressor/decompressor.bin'
+%strcat DECOMPRESSOR_PATH BUILDDIR, '/decompressor-build/decompressor.bin'
 incbin DECOMPRESSOR_PATH
 
 align 16
diff --git a/stage1/hdd/bootsect.asm b/stage1/hdd/bootsect.asm
index d9d55d72..cf451e1a 100644
--- a/stage1/hdd/bootsect.asm
+++ b/stage1/hdd/bootsect.asm
@@ -132,7 +132,7 @@ dw 0xaa55
 ; ********************* Stage 2 *********************
 
 decompressor:
-%strcat DECOMPRESSOR_PATH BUILDDIR, '/decompressor/decompressor.bin'
+%strcat DECOMPRESSOR_PATH BUILDDIR, '/decompressor-build/decompressor.bin'
 incbin DECOMPRESSOR_PATH
 
 align 16
diff --git a/stage1/pxe/bootsect.asm b/stage1/pxe/bootsect.asm
index db896b58..ad66d97b 100644
--- a/stage1/pxe/bootsect.asm
+++ b/stage1/pxe/bootsect.asm
@@ -49,7 +49,7 @@ start:
 ; ********************* Stage 2 *********************
 
 decompressor:
-%strcat DECOMPRESSOR_PATH BUILDDIR, '/decompressor/decompressor.bin'
+%strcat DECOMPRESSOR_PATH BUILDDIR, '/decompressor-build/decompressor.bin'
 incbin DECOMPRESSOR_PATH
 
 align 16
diff --git a/stage23/GNUmakefile b/stage23/GNUmakefile
index c77d62aa..f802c4c9 100644
--- a/stage23/GNUmakefile
+++ b/stage23/GNUmakefile
@@ -24,34 +24,6 @@ else
 $(error Invalid target)
 endif
 
-TOOLCHAIN ?= limine
-
-TOOLCHAIN_CC ?= $(TOOLCHAIN)-gcc
-TOOLCHAIN_LD ?= $(TOOLCHAIN)-ld
-TOOLCHAIN_AR ?= $(TOOLCHAIN)-ar
-TOOLCHAIN_OBJCOPY ?= $(TOOLCHAIN)-objcopy
-TOOLCHAIN_OBJDUMP ?= $(TOOLCHAIN)-objdump
-TOOLCHAIN_READELF ?= $(TOOLCHAIN)-readelf
-
-ifeq ($(shell command -v $(TOOLCHAIN_CC) ; ), )
-override TOOLCHAIN_CC := cc
-endif
-ifeq ($(shell command -v $(TOOLCHAIN_LD) ; ), )
-override TOOLCHAIN_LD := ld
-endif
-ifeq ($(shell command -v $(TOOLCHAIN_AR) ; ), )
-override TOOLCHAIN_AR := ar
-endif
-ifeq ($(shell command -v $(TOOLCHAIN_OBJCOPY) ; ), )
-override TOOLCHAIN_OBJCOPY := objcopy
-endif
-ifeq ($(shell command -v $(TOOLCHAIN_OBJDUMP) ; ), )
-override TOOLCHAIN_OBJDUMP := objdump
-endif
-ifeq ($(shell command -v $(TOOLCHAIN_READELF) ; ), )
-override TOOLCHAIN_READELF := readelf
-endif
-
 ifeq ($(USING_CLANG), 1)
 ifeq ($(TARGET), bios)
 override TOOLCHAIN_CC += --target=i686-elf
diff --git a/version.sh b/version.sh
new file mode 100755
index 00000000..5325cbc3
--- /dev/null
+++ b/version.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cat version 2>/dev/null || ( git describe --exact-match --tags `git log -n1 --pretty='%h'` 2>/dev/null || git log -n1 --pretty='%h' )
tab: 248 wrap: offon