From 7404cb467ea4f1a2a47e5e7443ee2ee450648e5a Mon Sep 17 00:00:00 2001 From: mintsuki Date: Wed, 15 Jun 2022 07:16:41 +0200 Subject: [PATCH] build: Add toolchain-detect --- .gitignore | 4 ++ GNUmakefile.in | 43 +++++++++--- bootstrap | 1 + common/GNUmakefile | 8 +-- configure.ac | 103 ++-------------------------- decompressor/GNUmakefile | 3 +- make_toolchain.sh | 24 +++---- toolchain-detect/configure.ac | 112 +++++++++++++++++++++++++++++++ toolchain-detect/toolchain.mk.in | 18 +++++ 9 files changed, 188 insertions(+), 128 deletions(-) create mode 100644 toolchain-detect/configure.ac create mode 100644 toolchain-detect/toolchain.mk.in diff --git a/.gitignore b/.gitignore index bc59d861..b39fae39 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,10 @@ /.vscode /test_image !/common/font.bin +/toolchain-detect/configure +/toolchain-detect/configure.ac.save +/toolchain-detect/*~ +/toolchain-detect/autom4te.cache /configure /configure.ac.save /build-aux diff --git a/GNUmakefile.in b/GNUmakefile.in index df5ad698..edd24b03 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -76,9 +76,6 @@ export LIMINE_READELF override LIMINE_VERSION := @PACKAGE_VERSION@ -override USING_CLANG := @USING_CLANG@ -export USING_CLANG - override STAGE1_FILES := $(shell find '$(call SHESCAPE,$(SRCDIR))/stage1' -type f -name '*.asm') .PHONY: all @@ -211,38 +208,62 @@ distclean: clean .PHONY: maintainer-clean maintainer-clean: distclean cd '$(call SHESCAPE,$(SRCDIR))' && rm -rf freestanding_headers limine-efi configure build-aux *'~' autom4te.cache *.tar.xz *.tar.gz + cd '$(call SHESCAPE,$(SRCDIR))'/toolchain-detect && rm -rf configure *'~' autom4te.cache .PHONY: common-uefi-x86-64 common-uefi-x86-64: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' all TARGET=uefi-x86-64 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64' + mkdir -p '$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64' + cd '$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64' && \ + TARGET=uefi-x86-64 '$(call SHESCAPE,$(SRCDIR))'/toolchain-detect/configure + $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' all \ + TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64/toolchain.mk' \ + TARGET=uefi-x86-64 \ + BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64' .PHONY: common-uefi-x86-64-clean common-uefi-x86-64-clean: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' clean TARGET=uefi-x86-64 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64' + rm -rf '$(call SHESCAPE,$(BUILDDIR))/common-uefi-x86-64' .PHONY: common-uefi-ia32 common-uefi-ia32: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' all TARGET=uefi-ia32 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32' + mkdir -p '$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32' + cd '$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32' && \ + TARGET=uefi-ia32 '$(call SHESCAPE,$(SRCDIR))'/toolchain-detect/configure + $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' all \ + TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32/toolchain.mk' \ + TARGET=uefi-ia32 \ + BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32' .PHONY: common-uefi-ia32-clean common-uefi-ia32-clean: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' clean TARGET=uefi-ia32 BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32' + rm -rf '$(call SHESCAPE,$(BUILDDIR))/common-uefi-ia32' .PHONY: common-bios common-bios: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' all TARGET=bios BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-bios' + mkdir -p '$(call SHESCAPE,$(BUILDDIR))/common-bios' + cd '$(call SHESCAPE,$(BUILDDIR))/common-bios' && \ + TARGET=bios '$(call SHESCAPE,$(SRCDIR))'/toolchain-detect/configure + $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' all \ + TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/common-bios/toolchain.mk' \ + TARGET=bios \ + BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-bios' .PHONY: common-bios-clean common-bios-clean: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/common' clean TARGET=bios BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/common-bios' + rm -rf '$(call SHESCAPE,$(BUILDDIR))/common-bios' .PHONY: decompressor decompressor: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/decompressor' all BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor-build' + mkdir -p '$(call SHESCAPE,$(BUILDDIR))/decompressor-build' + cd '$(call SHESCAPE,$(BUILDDIR))/decompressor-build' && \ + TARGET=bios '$(call SHESCAPE,$(SRCDIR))'/toolchain-detect/configure + $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/decompressor' all \ + TOOLCHAIN_FILE='$(call SHESCAPE,$(BUILDDIR))/common-bios/toolchain.mk' \ + BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor-build' .PHONY: decompressor-clean decompressor-clean: - $(MAKE) -C '$(call SHESCAPE,$(SRCDIR))/decompressor' clean BUILDDIR='$(call SHESCAPE,$(BUILDDIR))/decompressor-build' + rm -rf '$(call SHESCAPE,$(BUILDDIR))/decompressor-build' .PHONY: test-clean test-clean: diff --git a/bootstrap b/bootstrap index 8d5bd400..f2de4457 100755 --- a/bootstrap +++ b/bootstrap @@ -16,3 +16,4 @@ mkdir -p build-aux cp "${automake_libdir}/install-sh" build-aux autoconf +( cd toolchain-detect && autoconf ) diff --git a/common/GNUmakefile b/common/GNUmakefile index 7797b28e..8bae057b 100644 --- a/common/GNUmakefile +++ b/common/GNUmakefile @@ -1,6 +1,7 @@ +include $(TOOLCHAIN_FILE) + TARGET ?= BUILDDIR ?= -USING_CLANG ?= 0 override SRCDIR := $(shell pwd -P) @@ -150,7 +151,7 @@ override INTERNAL_LDFLAGS += \ -ztext endif -.PHONY: all clean +.PHONY: all override C_FILES := $(shell find ./ -type f -name '*.c') ifeq ($(TARGET), bios) @@ -442,6 +443,3 @@ $(call MKESCAPE,$(BUILDDIR))/%.o: %.asm_uefi_ia32 mkdir -p "$$(dirname '$(call SHESCAPE,$@)')" nasm '$(call SHESCAPE,$<)' -F dwarf -g $(WERROR) -f elf32 -o '$(call SHESCAPE,$@)' endif - -clean: - rm -rf '$(call SHESCAPE,$(BUILDDIR))' diff --git a/configure.ac b/configure.ac index b33da137..ffe5c803 100644 --- a/configure.ac +++ b/configure.ac @@ -137,103 +137,14 @@ fi AC_SUBST(BUILD_CD_EFI, [$BUILD_CD_EFI]) -AC_ARG_VAR(TOOLCHAIN, [Alternative toolchain prefix (or 'llvm') [default: limine]]) -test "x$TOOLCHAIN" = "x" && TOOLCHAIN='limine' - +AC_ARG_VAR(TOOLCHAIN, [alternative toolchain prefix (or 'llvm')]) AC_ARG_VAR(LIMINE_CC, [C compiler command for Limine]) - -AC_DEFUN([CC_ERROR_MSG], [ - AC_MSG_ERROR([no suitable LIMINE_CC found, run $srcdir/make_toolchain.sh or install the appropriate GCC/Clang]) -]) - -if ! test "x$LIMINE_CC" = "x"; then - AC_CHECK_PROG([LIMINE_CC_0], [$LIMINE_CC], [yes]) - if ! test "x$LIMINE_CC_0" = "xyes"; then - AC_MSG_ERROR([LIMINE_CC ($LIMINE_CC) not found]) - fi -else - if test "$TOOLCHAIN" = 'llvm'; then - LIMINE_CC='clang' - else - LIMINE_CC="$TOOLCHAIN-gcc" - fi - AC_CHECK_PROG([LIMINE_CC_1], [$LIMINE_CC], [yes]) - if ! test "x$LIMINE_CC_1" = "xyes"; then - LIMINE_CC="$TOOLCHAIN-cc" - AC_CHECK_PROG([LIMINE_CC_2], [$LIMINE_CC], [yes]) - if ! test "x$LIMINE_CC_2" = "xyes"; then - LIMINE_CC="gcc" - AC_CHECK_PROG([LIMINE_CC_3], [$LIMINE_CC], [yes]) - if ! test "x$LIMINE_CC_3" = "xyes"; then - LIMINE_CC="clang" - AC_CHECK_PROG([LIMINE_CC_4], [$LIMINE_CC], [yes]) - if ! test "x$LIMINE_CC_4" = "xyes"; then - LIMINE_CC="cc" - AC_CHECK_PROG([LIMINE_CC_5], [$LIMINE_CC], [yes]) - if ! test "x$LIMINE_CC_5" = "xyes"; then - CC_ERROR_MSG - fi - fi - fi - fi - fi -fi - -if ! $LIMINE_CC --version >/dev/null 2>&1; then - CC_ERROR_MSG -fi - -if $LIMINE_CC --version | $GREP clang >/dev/null 2>&1; then - AC_SUBST(USING_CLANG, 1) -elif $LIMINE_CC --version | $GREP 'Free Software Foundation' >/dev/null 2>&1; then - AC_SUBST(USING_CLANG, 0) -else - CC_ERROR_MSG -fi - -AC_DEFUN([GET_BINUTILS_PROG], [ - AC_ARG_VAR(LIMINE_$1, [$3 command for Limine]) - - if ! test "x$LIMINE_$1" = "x"; then - AC_CHECK_PROG([LIMINE_$1_0], [$LIMINE_$1], [yes]) - if ! test "x$LIMINE_$1_0" = "xyes"; then - AC_MSG_ERROR([LIMINE_$1 ($LIMINE_$1) not found]) - fi - else - if test "$TOOLCHAIN" = 'llvm' && test '$2' = 'ld'; then - LIMINE_$1='ld.lld' - else - LIMINE_$1="$TOOLCHAIN-$2" - fi - AC_CHECK_PROG([LIMINE_$1_1], [$LIMINE_$1], [yes]) - if ! test "x$LIMINE_$1_1" = "xyes"; then - LIMINE_$1='g$2' - AC_CHECK_PROG([LIMINE_$1_2], [$LIMINE_$1], [yes]) - if ! test "x$LIMINE_$1_2" = "xyes"; then - LIMINE_$1='$2' - AC_CHECK_PROG([LIMINE_$1_3], [$LIMINE_$1], [yes]) - if ! test "x$LIMINE_$1_3" = "xyes"; then - if test '$2' = 'ld'; then - LIMINE_$1='ld.lld' - else - LIMINE_$1='llvm-$2' - fi - AC_CHECK_PROG([LIMINE_$1_4], [$LIMINE_$1], [yes]) - if ! test "x$LIMINE_$1_4" = "xyes"; then - AC_MSG_ERROR([no suitable LIMINE_$1 found, run $srcdir/make_toolchain.sh or install the appropriate LLVM/GNU binutils]) - fi - fi - fi - fi - fi -]) - -GET_BINUTILS_PROG(LD, ld, linker) -GET_BINUTILS_PROG(AR, ar, archiver) -GET_BINUTILS_PROG(AS, as, assembler) -GET_BINUTILS_PROG(OBJCOPY, objcopy, objcopy) -GET_BINUTILS_PROG(OBJDUMP, objdump, objdump) -GET_BINUTILS_PROG(READELF, readelf, readelf) +AC_ARG_VAR(LIMINE_LD, [linker command for Limine]) +AC_ARG_VAR(LIMINE_AR, [archiver command for Limine]) +AC_ARG_VAR(LIMINE_AS, [assembler command for Limine]) +AC_ARG_VAR(LIMINE_OBJCOPY, [objcopy command for Limine]) +AC_ARG_VAR(LIMINE_OBJDUMP, [objdump command for Limine]) +AC_ARG_VAR(LIMINE_READELF, [readelf command for Limine]) AC_ARG_VAR(LIMINE_CFLAGS, [C flags for Limine [default: -O3 -pipe -Wall -Wextra]]) test "x$LIMINE_CFLAGS" = "x" && LIMINE_CFLAGS='-O3 -pipe -Wall -Wextra' diff --git a/decompressor/GNUmakefile b/decompressor/GNUmakefile index 4d11a9ad..c8cccd25 100644 --- a/decompressor/GNUmakefile +++ b/decompressor/GNUmakefile @@ -1,5 +1,6 @@ +include $(TOOLCHAIN_FILE) + BUILDDIR ?= -USING_CLANG ?= 0 override SPACE := $(subst ,, ) diff --git a/make_toolchain.sh b/make_toolchain.sh index afaba565..f025cccb 100755 --- a/make_toolchain.sh +++ b/make_toolchain.sh @@ -7,10 +7,15 @@ test -z "$srcdir" && srcdir=. cd "$srcdir" -TARGET=x86_64-elf +if [ -z "$TARGET" ]; then + set +x + echo "TARGET not specified" + exit 1 +fi + +TARGET=$TARGET-elf BINUTILSVERSION=2.38 GCCVERSION=12.1.0 -NASMVERSION=2.15.05 if command -v gmake; then export MAKE=gmake @@ -49,9 +54,6 @@ fi if [ ! -f gcc-$GCCVERSION.tar.gz ]; then curl -o gcc-$GCCVERSION.tar.gz https://ftp.gnu.org/gnu/gcc/gcc-$GCCVERSION/gcc-$GCCVERSION.tar.gz fi -if [ ! -f nasm-$NASMVERSION.tar.gz ]; then - curl -o nasm-$NASMVERSION.tar.gz https://limine-bootloader.org/files/misc/nasm-$NASMVERSION.tar.gz -fi rm -rf build mkdir build @@ -59,11 +61,10 @@ cd build $TAR -zxf ../binutils-$BINUTILSVERSION.tar.gz $TAR -zxf ../gcc-$GCCVERSION.tar.gz -$TAR -zxf ../nasm-$NASMVERSION.tar.gz mkdir build-binutils cd build-binutils -../binutils-$BINUTILSVERSION/configure CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" --target=$TARGET --prefix="$PREFIX" --program-prefix=limine- --with-sysroot --disable-nls --disable-werror --enable-targets=x86_64-elf,x86_64-pe +../binutils-$BINUTILSVERSION/configure CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror $MAKE $MAKE install cd .. @@ -76,16 +77,9 @@ chmod +x contrib/download_prerequisites cd .. mkdir build-gcc cd build-gcc -../gcc-$GCCVERSION/configure CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" --target=$TARGET --prefix="$PREFIX" --program-prefix=limine- --disable-nls --enable-languages=c --without-headers +../gcc-$GCCVERSION/configure CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c --without-headers $MAKE all-gcc $MAKE all-target-libgcc $MAKE install-gcc $MAKE install-target-libgcc cd .. - -mkdir build-nasm -cd build-nasm -../nasm-$NASMVERSION/configure --prefix="$PREFIX" -MAKEFLAGS="" $MAKE -MAKEFLAGS="" $MAKE install -cd .. diff --git a/toolchain-detect/configure.ac b/toolchain-detect/configure.ac new file mode 100644 index 00000000..3ff70f26 --- /dev/null +++ b/toolchain-detect/configure.ac @@ -0,0 +1,112 @@ +AC_INIT([Limine], m4_esyscmd([../version.sh]), [https://github.com/limine-bootloader/limine/issues], [limine], [https://limine-bootloader.org/]) + +AC_PREREQ(2.69) + +case "$TARGET" in + uefi-x86-64) + ARCHITECTURE=x86_64 + ;; + uefi-ia32|bios) + ARCHITECTURE=i686 + ;; + *) + AC_MSG_ERROR([invalid target]) + ;; +esac + +if test "x$TOOLCHAIN" = "x"; then + TOOLCHAIN=$ARCHITECTURE-elf +fi +AC_SUBST(TOOLCHAIN, $TOOLCHAIN) + +AC_DEFUN([CC_ERROR_MSG], [ + AC_MSG_ERROR([no suitable LIMINE_CC found, run $srcdir/make_toolchain.sh or install the appropriate GCC/Clang]) +]) + +if ! test "x$LIMINE_CC" = "x"; then + AC_CHECK_PROG([LIMINE_CC_0], [$LIMINE_CC], [yes]) + if ! test "x$LIMINE_CC_0" = "xyes"; then + AC_MSG_ERROR([LIMINE_CC ($LIMINE_CC) not found]) + fi +else + if test "$TOOLCHAIN" = 'llvm'; then + LIMINE_CC='clang' + else + LIMINE_CC="$TOOLCHAIN-gcc" + fi + AC_CHECK_PROG([LIMINE_CC_1], [$LIMINE_CC], [yes]) + if ! test "x$LIMINE_CC_1" = "xyes"; then + LIMINE_CC="$TOOLCHAIN-cc" + AC_CHECK_PROG([LIMINE_CC_2], [$LIMINE_CC], [yes]) + if ! test "x$LIMINE_CC_2" = "xyes"; then + LIMINE_CC="clang" + AC_CHECK_PROG([LIMINE_CC_3], [$LIMINE_CC], [yes]) + if ! test "x$LIMINE_CC_3" = "xyes"; then + LIMINE_CC="gcc" + AC_CHECK_PROG([LIMINE_CC_4], [$LIMINE_CC], [yes]) + if ! test "x$LIMINE_CC_4" = "xyes"; then + LIMINE_CC="cc" + AC_CHECK_PROG([LIMINE_CC_5], [$LIMINE_CC], [yes]) + if ! test "x$LIMINE_CC_5" = "xyes"; then + CC_ERROR_MSG + fi + fi + fi + fi + fi +fi +AC_SUBST(LIMINE_CC, $LIMINE_CC) + +if ! $LIMINE_CC --version >/dev/null 2>&1; then + CC_ERROR_MSG +fi + +if $LIMINE_CC --version | $GREP clang >/dev/null 2>&1; then + AC_SUBST(USING_CLANG, 1) +elif $LIMINE_CC --version | $GREP 'Free Software Foundation' >/dev/null 2>&1; then + AC_SUBST(USING_CLANG, 0) +else + CC_ERROR_MSG +fi + +AC_DEFUN([GET_BINUTILS_PROG], [ + if ! test "x$LIMINE_$1" = "x"; then + AC_CHECK_PROG([LIMINE_$1_0], [$LIMINE_$1], [yes]) + if ! test "x$LIMINE_$1_0" = "xyes"; then + AC_MSG_ERROR([LIMINE_$1 ($LIMINE_$1) not found]) + fi + else + if test "$TOOLCHAIN" = 'llvm' && test '$2' = 'ld'; then + LIMINE_$1='ld.lld' + else + LIMINE_$1="$TOOLCHAIN-$2" + fi + AC_CHECK_PROG([LIMINE_$1_1], [$LIMINE_$1], [yes]) + if ! test "x$LIMINE_$1_1" = "xyes"; then + if test '$2' = 'ld'; then + LIMINE_$1='ld.lld' + else + LIMINE_$1='llvm-$2' + fi + AC_CHECK_PROG([LIMINE_$1_2], [$LIMINE_$1], [yes]) + if ! test "x$LIMINE_$1_2" = "xyes"; then + LIMINE_$1='$2' + AC_CHECK_PROG([LIMINE_$1_3], [$LIMINE_$1], [yes]) + if ! test "x$LIMINE_$1_3" = "xyes"; then + AC_MSG_ERROR([no suitable LIMINE_$1 found, run $srcdir/make_toolchain.sh or install the appropriate LLVM/GNU binutils]) + fi + fi + fi + fi + AC_SUBST(LIMINE_$1, $LIMINE_$1) +]) + +GET_BINUTILS_PROG(LD, ld, linker) +GET_BINUTILS_PROG(AR, ar, archiver) +GET_BINUTILS_PROG(AS, as, assembler) +GET_BINUTILS_PROG(OBJCOPY, objcopy, objcopy) +GET_BINUTILS_PROG(OBJDUMP, objdump, objdump) +GET_BINUTILS_PROG(READELF, readelf, readelf) + +AC_CONFIG_FILES(toolchain.mk) +AC_OUTPUT diff --git a/toolchain-detect/toolchain.mk.in b/toolchain-detect/toolchain.mk.in new file mode 100644 index 00000000..1455df4a --- /dev/null +++ b/toolchain-detect/toolchain.mk.in @@ -0,0 +1,18 @@ +override USING_CLANG := @USING_CLANG@ +export USING_CLANG +override TOOLCHAIN := @TOOLCHAIN@ +export TOOLCHAIN +override LIMINE_CC := @LIMINE_CC@ +export LIMINE_CC +override LIMINE_LD := @LIMINE_LD@ +export LIMINE_LD +override LIMINE_AR := @LIMINE_AR@ +export LIMINE_AR +override LIMINE_AS := @LIMINE_AS@ +export LIMINE_AS +override LIMINE_OBJCOPY := @LIMINE_OBJCOPY@ +export LIMINE_OBJCOPY +override LIMINE_OBJDUMP := @LIMINE_OBJDUMP@ +export LIMINE_OBJDUMP +override LIMINE_READELF := @LIMINE_READELF@ +export LIMINE_READELF