diff --git a/GNUmakefile.in b/GNUmakefile.in index c7713aca..80ee50e4 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -51,26 +51,62 @@ ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_CC) ; ), ) override LIMINE_CC := $(CC) endif ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_LD) ; ), ) +override LIMINE_LD := gld +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_LD) ; ), ) override LIMINE_LD := ld.bfd ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_LD) ; ), ) +override LIMINE_LD := /usr/local/bin/ld +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_LD) ; ), ) override LIMINE_LD := ld endif endif +endif +endif +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_AR) ; ), ) +override LIMINE_AR := gar +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_AR) ; ), ) +override LIMINE_AR := /usr/local/bin/ar ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_AR) ; ), ) override LIMINE_AR := ar endif +endif +endif +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_AS) ; ), ) +override LIMINE_AS := gas +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_AS) ; ), ) +override LIMINE_AS := /usr/local/bin/as ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_AS) ; ), ) override LIMINE_AS := as endif +endif +endif +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_OBJCOPY) ; ), ) +override LIMINE_OBJCOPY := gobjcopy +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_OBJCOPY) ; ), ) +override LIMINE_OBJCOPY := /usr/local/bin/objcopy ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_OBJCOPY) ; ), ) override LIMINE_OBJCOPY := objcopy endif +endif +endif +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_OBJDUMP) ; ), ) +override LIMINE_OBJDUMP := gobjdump +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_OBJDUMP) ; ), ) +override LIMINE_OBJDUMP := /usr/local/bin/objdump ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_OBJDUMP) ; ), ) override LIMINE_OBJDUMP := objdump endif +endif +endif +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_READELF) ; ), ) +override LIMINE_READELF := greadelf +ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_READELF) ; ), ) +override LIMINE_READELF := /usr/local/bin/readelf ifeq ($(shell PATH='$(call SHESCAPE,$(PATH))' command -v $(LIMINE_READELF) ; ), ) override LIMINE_READELF := readelf endif +endif +endif export LIMINE_CC export LIMINE_LD @@ -101,16 +137,36 @@ ifneq ($(MAKECMDGOALS), install) ifneq ($(MAKECMDGOALS), install-data) ifneq ($(MAKECMDGOALS), install-strip) -override USING_GNU_LD := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_LD) --version | grep Binutils >/dev/null && echo 1) +override USING_GNU_LD := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_LD) --version | grep 'GNU Binutils' >/dev/null && echo 1) ifneq ($(USING_GNU_LD), 1) $(error The specified LIMINE_LD linker ($(LIMINE_LD)) is not the GNU linker) endif -override USING_GNU_OBJCOPY := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_OBJCOPY) --version | grep Binutils >/dev/null && echo 1) +override USING_GNU_AR := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_AR) --version | grep 'GNU Binutils' >/dev/null && echo 1) +ifneq ($(USING_GNU_AR), 1) +$(error The specified LIMINE_AR archiver ($(LIMINE_AR)) is not the GNU archiver) +endif + +override USING_GNU_AS := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_AS) --version | grep 'GNU Binutils' >/dev/null && echo 1) +ifneq ($(USING_GNU_AS), 1) +$(error The specified LIMINE_AS assembler ($(LIMINE_AS)) is not the GNU assembler) +endif + +override USING_GNU_OBJCOPY := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_OBJCOPY) --version | grep 'GNU Binutils' >/dev/null && echo 1) ifneq ($(USING_GNU_OBJCOPY), 1) $(error The specified LIMINE_OBJCOPY ($(LIMINE_OBJCOPY)) is not GNU objcopy) endif +override USING_GNU_OBJDUMP := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_OBJDUMP) --version | grep 'GNU Binutils' >/dev/null && echo 1) +ifneq ($(USING_GNU_OBJDUMP), 1) +$(error The specified LIMINE_OBJDUMP ($(LIMINE_OBJDUMP)) is not GNU objdump) +endif + +override USING_GNU_READELF := $(shell PATH='$(call SHESCAPE,$(PATH))' $(LIMINE_READELF) --version | grep 'GNU Binutils' >/dev/null && echo 1) +ifneq ($(USING_GNU_READELF), 1) +$(error The specified LIMINE_READELF ($(LIMINE_READELF)) is not GNU readelf) +endif + ifneq ($(CC_MACHINE), x86_64) ifneq ($(CC_MACHINE), amd64-) $(error No suitable x86_64 C compiler found, please install an x86_64 C toolchain or run "./make_toolchain.sh") @@ -132,7 +188,7 @@ ifeq ($(USING_CLANG), 1) override LIMINE_CC := $(ORIG_LIMINE_CC) endif -override STAGE1_FILES := $(shell find -L '$(call SHESCAPE,$(SRCDIR))/stage1' -type f -name '*.asm') +override STAGE1_FILES := $(shell find '$(call SHESCAPE,$(SRCDIR))/stage1' -type f -name '*.asm') .PHONY: all all: limine-uefi limine-bios diff --git a/README.md b/README.md index 45821d42..bc8e2f88 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ This step can take a long time, but it will ensure that the toolchain will work with Limine. If on an x86_64 host, with GCC or Clang installed, you can skip to the next paragraph in order to use the system's toolchain instead. -The toolchain's build process depends on the following packages: `GNU make`, +The toolchain's build process depends on the following packages: `GNU make`, `GNU tar`, `curl`, `gzip`, `bzip2`, `gcc/clang`, `g++/clang++`. Building the toolchain can be accomplished by running: @@ -91,8 +91,8 @@ paragraph, or `gcc` or `llvm/clang` must also be installed, alongside ### Configure -If checking out from the repository, run `./autogen.sh`, else, if using a -release tarball, run `./configure` directly. +If checking out from the repository, run `./autogen.sh` (GNU autoconf required), +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`. @@ -119,7 +119,7 @@ release directory just fine. This step will only install them to a `share` and To install Limine, run: ```bash -make install +make install # (or gmake where applicable) ``` ## How to use diff --git a/autogen.sh b/autogen.sh index 909282e1..4ea3f17a 100755 --- a/autogen.sh +++ b/autogen.sh @@ -2,7 +2,9 @@ set -ex -srcdir="$(realpath $(dirname "$0"))" +origdir="$(pwd -P)" + +srcdir="$(dirname "$0")" test -z "$srcdir" && srcdir=. cd "$srcdir" @@ -12,6 +14,8 @@ cd "$srcdir" autoconf +cd "$origdir" + if test -z "$NOCONFIGURE"; then exec "$srcdir"/configure "$@" fi diff --git a/decompressor/GNUmakefile b/decompressor/GNUmakefile index 47f5e35f..e33702e6 100644 --- a/decompressor/GNUmakefile +++ b/decompressor/GNUmakefile @@ -47,8 +47,8 @@ override INTERNAL_LDFLAGS := \ -static \ -Tlinker.ld -override C_FILES := $(shell find -L ./ -type f -name '*.c') -override ASM_FILES := $(shell find -L ./ -type f -name '*.asm') +override C_FILES := $(shell find ./ -type f -name '*.c') +override ASM_FILES := $(shell find ./ -type f -name '*.asm') override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(ASM_FILES:.asm=.o) $(C_FILES:.c=.o)) override HEADER_DEPS := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(C_FILES:.c=.d)) diff --git a/make_toolchain.sh b/make_toolchain.sh index d686b651..000c71ae 100755 --- a/make_toolchain.sh +++ b/make_toolchain.sh @@ -2,7 +2,7 @@ set -ex -srcdir="$(realpath $(dirname "$0"))" +srcdir="$(dirname "$0")" test -z "$srcdir" && srcdir=. cd "$srcdir" @@ -17,6 +17,12 @@ else export MAKE=make fi +if command -v gtar; then + export TAR=gtar +else + export TAR=tar +fi + export CFLAGS="-O2 -pipe" unset CC @@ -30,9 +36,9 @@ if [ "$(uname)" = "OpenBSD" ]; then fi mkdir -p toolchain && cd toolchain -PREFIX="$(pwd)" +PREFIX="$(pwd -P)" -export MAKEFLAGS="-j$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)" +export MAKEFLAGS="-j$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || psrinfo -tc 2>/dev/null || echo 1)" export PATH="$PREFIX/bin:$PATH" @@ -47,8 +53,8 @@ rm -rf build mkdir build cd build -tar -zxf ../binutils-$BINUTILSVERSION.tar.gz -tar -zxf ../gcc-$GCCVERSION.tar.gz +$TAR -zxf ../binutils-$BINUTILSVERSION.tar.gz +$TAR -zxf ../gcc-$GCCVERSION.tar.gz mkdir build-binutils cd build-binutils @@ -58,7 +64,11 @@ $MAKE install cd .. cd gcc-$GCCVERSION -contrib/download_prerequisites +sed 's|http://gcc.gnu|https://gcc.gnu|g' < contrib/download_prerequisites > dp.sed +mv dp.sed contrib/download_prerequisites +chmod +x contrib/download_prerequisites +rm dp.sed +contrib/download_prerequisites --no-verify cd .. mkdir build-gcc cd build-gcc diff --git a/stage23/GNUmakefile b/stage23/GNUmakefile index ca09ae9c..5af8f9b0 100644 --- a/stage23/GNUmakefile +++ b/stage23/GNUmakefile @@ -2,7 +2,7 @@ TARGET ?= BUILDDIR ?= USING_CLANG ?= 0 -override SRCDIR := $(shell pwd) +override SRCDIR := $(shell pwd -P) override SPACE := $(subst ,, ) @@ -150,22 +150,22 @@ endif .PHONY: all clean -override C_FILES := $(shell find -L ./ -type f -name '*.c') +override C_FILES := $(shell find ./ -type f -name '*.c') ifeq ($(TARGET), bios) -override ASM32_FILES := $(shell find -L ./ -type f -name '*.asm32') -override ASMB_FILES := $(shell find -L ./ -type f -name '*.asmb') +override ASM32_FILES := $(shell find ./ -type f -name '*.asm32') +override ASMB_FILES := $(shell find ./ -type f -name '*.asmb') override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(ASM32_FILES:.asm32=.o) $(ASMB_FILES:.asmb=.o) $(C_FILES:.c=.o)) endif ifeq ($(TARGET), uefi64) -override ASM64_FILES := $(shell find -L ./ -type f -name '*.asm64') -override ASM64U_FILES := $(shell find -L ./ -type f -name '*.asm64u') +override ASM64_FILES := $(shell find ./ -type f -name '*.asm64') +override ASM64U_FILES := $(shell find ./ -type f -name '*.asm64u') override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(ASM64_FILES:.asm64=.o) $(ASM64U_FILES:.asm64u=.o) $(C_FILES:.c=.o)) endif ifeq ($(TARGET), uefi32) -override ASM32_FILES := $(shell find -L ./ -type f -name '*.asm32') -override ASM32U_FILES := $(shell find -L ./ -type f -name '*.asm32u') +override ASM32_FILES := $(shell find ./ -type f -name '*.asm32') +override ASM32U_FILES := $(shell find ./ -type f -name '*.asm32u') override OBJ := $(addprefix $(call MKESCAPE,$(BUILDDIR))/, $(ASM32_FILES:.asm32=.o) $(ASM32U_FILES:.asm32u=.o) $(C_FILES:.c=.o)) endif