From 4b8a8e417d29d3108c1fe8ab2a4671e7e778d39d Mon Sep 17 00:00:00 2001 From: Romain Calascibetta Date: Thu, 2 Jan 2025 12:16:39 +0100 Subject: [PATCH] . --- GNUmakefile | 51 ++- configure.sh | 8 +- gilbraltar.ld => gilbraltar.rpi5.ld | 0 gilbraltar.stub.ld | 1 + libgilbraltar.a | Bin 118100 -> 0 bytes ...sues-with-preprocessor-directives-13.patch | 49 +++ ...and-use-CC-.-_FOR_BUILD-to-build-sak.patch | 311 ++++++++++++++++++ ...ad-of-host-to-detect-the-C-toolchain.patch | 112 +++++++ ...ad-of-host-when-relevant-in-configur.patch | 83 +++++ ...he-strip-command-detected-by-libtool.patch | 42 +++ ...-Strip-tmpheader.exe-also-on-Windows.patch | 32 ++ ...-target-OS-to-configure-freestanding.patch | 65 ++++ .../5.2.1/0008-Define-OS-type-to-None.patch | 38 +++ ...-targets-to-supported-configurations.patch | 40 +++ ...onfigured-and-the-installed-OCaml-ar.patch | 46 +++ ...the-target-pkg-config-to-detect-zstd.patch | 44 +++ ...le.cross-for-recipes-to-build-a-cros.patch | 122 +++++++ patches/5.2.1/0013-Set-Max_domains-to-1.patch | 35 ++ ...n-executable-on-freestanding-targets.patch | 53 +++ test/test.c | 2 +- toolchain/ar.in | 2 + toolchain/as.in | 2 + toolchain/cc.in | 130 ++++++++ toolchain/gcc.in | 1 + toolchain/ld.in | 73 ++++ toolchain/nm.in | 2 + toolchain/objcopy.in | 2 + toolchain/objdump.in | 2 + toolchain/ranlib.in | 2 + toolchain/readelf.in | 2 + toolchain/strip.in | 2 + 31 files changed, 1337 insertions(+), 17 deletions(-) rename gilbraltar.ld => gilbraltar.rpi5.ld (100%) create mode 100644 gilbraltar.stub.ld delete mode 100644 libgilbraltar.a create mode 100644 patches/5.2.1/0001-Fix-two-small-issues-with-preprocessor-directives-13.patch create mode 100644 patches/5.2.1/0002-Detect-and-use-CC-.-_FOR_BUILD-to-build-sak.patch create mode 100644 patches/5.2.1/0003-Use-target-instead-of-host-to-detect-the-C-toolchain.patch create mode 100644 patches/5.2.1/0004-Use-target-instead-of-host-when-relevant-in-configur.patch create mode 100644 patches/5.2.1/0005-Use-the-strip-command-detected-by-libtool.patch create mode 100644 patches/5.2.1/0006-Strip-tmpheader.exe-also-on-Windows.patch create mode 100644 patches/5.2.1/0007-Allow-ocaml-as-a-target-OS-to-configure-freestanding.patch create mode 100644 patches/5.2.1/0008-Define-OS-type-to-None.patch create mode 100644 patches/5.2.1/0009-Add-freestanding-targets-to-supported-configurations.patch create mode 100644 patches/5.2.1/0010-Check-that-the-configured-and-the-installed-OCaml-ar.patch create mode 100644 patches/5.2.1/0011-Use-the-target-pkg-config-to-detect-zstd.patch create mode 100644 patches/5.2.1/0012-WIP-Add-a-Makefile.cross-for-recipes-to-build-a-cros.patch create mode 100644 patches/5.2.1/0013-Set-Max_domains-to-1.patch create mode 100644 patches/5.2.1/0014-Set-stack-as-non-executable-on-freestanding-targets.patch create mode 100644 toolchain/ar.in create mode 100644 toolchain/as.in create mode 100644 toolchain/cc.in create mode 120000 toolchain/gcc.in create mode 100644 toolchain/ld.in create mode 100644 toolchain/nm.in create mode 100644 toolchain/objcopy.in create mode 100644 toolchain/objdump.in create mode 100644 toolchain/ranlib.in create mode 100644 toolchain/readelf.in create mode 100644 toolchain/strip.in diff --git a/GNUmakefile b/GNUmakefile index 7845cfc..3f80746 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -4,8 +4,8 @@ AS= $(CONFIG_TARGET_CC) # NOTE(dinosaure): we must use [aarch64-none-elf-gcc] to compile assembly code # to be able to include some files and define some macros. LD= $(CONFIG_TARGET_LD) -AR= aarch64-none-elf-ar # TODO -OBJDUMP= aarch64-none-elf-objdump # TODO +AR= aarch64-linux-gnu-ar # TODO +OBJDUMP= aarch64-linux-gnu-objdump # TODO OBJCOPY= $(CONFIG_TARGET_OBJCOPY) export TOPDIR := $(abspath .) @@ -37,7 +37,7 @@ CFLAGS += -std=c11 -ffreestanding -fstack-protector-strong -nostdlib \ LDFLAGS += -nostdlib -static -Wl,--no-warn-rwx-segments \ -Wl,--section-start=.init=0x80000 -Wl,--build-id=none \ - -Wl,--start-group -L . -lgilbraltar -L nolibc -lnolibc -L openlibm -lopenlibm -lgcc -Wl,--end-group + -Wl,--start-group -L lib/$(CONFIG_TARGET_TRIPLE) -lgilbraltar.rpi5 -L nolibc -lnolibc -L openlibm -lopenlibm -lgcc -Wl,--end-group SRCS= kernel.c timer.c led.c interrupt_handler.c exception_handler.c \ mbox.c clock.c crt.c serial.c log.c power.c tag.c coherent_page.c dtb.c \ @@ -50,6 +50,23 @@ ASMS:=$(addprefix kernel/,$(ASMS)) OBJS= $(SRCS:c=o) $(ASMS:S=o) +bin: + @test ! -d $@ + @mkdir -p $@ + +bin/$(CONFIG_TARGET_TRIPLE)-%: toolchain/%.in | bin + @echo "SUBST $@" + @sed -e 's!@@CONFIG_TARGET_ARCH@@!$(CONFIG_TARGET_ARCH)!g' \ + -e 's!@@CONFIG_TARGET_TRIPLE@@!$(CONFIG_TARGET_TRIPLE)!g' \ + -e 's!@@CONFIG_TARGET_CC@@!$(CONFIG_TARGET_CC)!g' \ + -e 's!@@CONFIG_TARGET_CC_CFLAGS@@!$(CONFIG_TARGET_CC_CFLAGS)!g' \ + -e 's!@@CONFIG_TARGET_CC_LDFLAGS@@!$(CONFIG_TARGET_CC_LDFLAGS)!g' \ + -e 's!@@CONFIG_TARGET_LD@@!$(CONFIG_TARGET_LD)!g' \ + -e 's!@@CONFIG_TARGET_LD_LDFLAGS@@!$(CONFIG_TARGET_LD_LDFLAGS)!g' \ + -e 's!@@CONFIG_TARGET_OBJCOPY@@!$(CONFIG_TARGET_OBJCOPY)!g' \ + $< >$@ + @chmod +x $@ + %.o: %.S @echo "AS $@" @$(AS) $(AFLAGS) -c -o $@ $< @@ -58,11 +75,18 @@ OBJS= $(SRCS:c=o) $(ASMS:S=o) @echo "CC $@" @$(CC) $(CFLAGS) -c -o $@ $< -kernel/libgilbraltar.a: $(OBJS) +lib/$(CONFIG_TARGET_TRIPLE): + @test ! -d $@ + @mkdir -p $@ + +lib/$(CONFIG_TARGET_TRIPLE)/libgilbraltar.rpi5.a: $(OBJS) | lib/$(CONFIG_TARGET_TRIPLE) @echo "AR $@" @rm -f $@ @$(AR) cr $@ $^ +lib/$(CONFIG_TARGET_TRIPLE)/libgilbraltar.stub.a: | lib/$(CONFIG_TARGET_TRIPLE) + @$(AR) cr $@ + .PHONY: phony-openlibm phony-openlibm: include/$(CONFIG_TARGET_TRIPLE) @$(MAKE) -C openlibm \ @@ -79,11 +103,12 @@ ocaml: fi ocaml/Makefile.config: | ocaml - PATH="$$PWD/$(TOOLDIR_FOR_BUILD):$$PATH" ; + PATH="$$PWD/bin/:$$PATH" ; \ cd ocaml && \ ./configure \ - --target="$(MAKECONF_TARGET_ARCH)-gilbraltar-ocaml" \ - --prefix="$(MAKECONF_SYSROOT)" \ + --host="$(CONFIG_HOST_ARCH)-unknown-none" \ + --target="$(CONFIG_TARGET_TRIPLE)" \ + --prefix="$(CONFIG_SYSROOT)" \ --disable-shared \ --disable-systhreads \ --disable-unix-lib \ @@ -91,7 +116,7 @@ ocaml/Makefile.config: | ocaml --disable-debug-runtime \ --disable-ocamltest \ --disable-ocamldoc \ - --disable-zstd \ + --without-zstd \ $(MAKECONF_OCAML_CONFIGURE_OPTIONS) OCAML_IS_BUILT := _build/ocaml_is_built @@ -111,13 +136,15 @@ phony-nolibc: include/$(CONFIG_TARGET_TRIPLE) nolibc/libnolibc.a: phony-nolibc .PHONY: all -all: kernel/libgilbraltar.a +all: kernel/libgilbraltar.rpi5.a .PHONY: clean clean: $(RM) -f kernel/*.o kernel/*.a *.elf *.bin *.img *.map - $(RM) -rf include/$(CONFIG_TARGET_TRIPLE) + $(RM) -rf include/$(CONFIG_TARGET_TRIPLE)/ $(RM) -rf _build + $(RM) -rf bin/ + $(RM) -rf lib/$(CONFIG_TARGET_TRIPLE)/ if [ -d ocaml ] ; then $(MAKE) -C ocaml clean ; fi $(RM) -f test/*.o $(MAKE) -C openlibm clean @@ -132,7 +159,7 @@ test/%.o: test/%.c @echo "CC $@" @$(CC) $(CFLAGS) -c -o $@ $< -kernel_2712.img: kernel/libgilbraltar.a nolibc/libnolibc.a openlibm/libopenlibm.a test/test.o +kernel_2712.img: lib/$(CONFIG_TARGET_TRIPLE)/libgilbraltar.rpi5.a nolibc/libnolibc.a openlibm/libopenlibm.a test/test.o @echo "LD ${@:img=elf}" - @$(LD) test/test.o -o ${@:img=elf} $(LDFLAGS) -Wl,-Map ${@:img=map} -Wl,-T gilbraltar.ld + @$(LD) test/test.o -o ${@:img=elf} $(LDFLAGS) -Wl,-Map ${@:img=map} -Wl,-T gilbraltar.rpi5.ld @$(OBJCOPY) ${@:img=elf} -O binary $@ diff --git a/configure.sh b/configure.sh index 0f6a0eb..2a9423f 100755 --- a/configure.sh +++ b/configure.sh @@ -18,9 +18,9 @@ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -TARGET_CC="${TARGET_CC:-aarch64-none-elf-gcc}" -TARGET_LD="${TARGET_LD:-aarch64-none-elf-gcc}" -TARGET_OBJCOPY="${TARGET_OBJCOPY:-aarch64-none-elf-objcopy}" +TARGET_CC="${TARGET_CC:-aarch64-linux-gnu-gcc}" +TARGET_LD="${TARGET_LD:-aarch64-linux-gnu-gcc}" +TARGET_OBJCOPY="${TARGET_OBJCOPY:-aarch64-linux-gnu-objcopy}" prog_NAME="$(basename $0)" @@ -424,7 +424,7 @@ fi echo "${prog_NAME}: Using ${TARGET_LD} for target linker" echo "${prog_NAME}: Using ${TARGET_OBJCOPY} for target objcopy" -TARGET_TRIPLE="${TARGET_ARCH}-gilbraltar-none-static" +TARGET_TRIPLE="${TARGET_ARCH}-gilbraltar-none" echo "${prog_NAME}: Target toolchain triple is ${TARGET_TRIPLE}" # diff --git a/gilbraltar.ld b/gilbraltar.rpi5.ld similarity index 100% rename from gilbraltar.ld rename to gilbraltar.rpi5.ld diff --git a/gilbraltar.stub.ld b/gilbraltar.stub.ld new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/gilbraltar.stub.ld @@ -0,0 +1 @@ + diff --git a/libgilbraltar.a b/libgilbraltar.a deleted file mode 100644 index 2ef3e95cd4d3852d3abaa449c970b74181506e88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118100 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 +Date: Thu, 4 Jul 2024 18:01:17 +0200 +Subject: [PATCH 01/14] Fix two small issues with preprocessor directives + (#13281) + +* Add missing `defined` in preprocessor test + +When `HAS_CLOCK_GETTIME_NSEC_NP` is not defined, +`#elif HAS_CLOCK_GETTIME_NSEC_NP` triggers a warning + +* Include `caml/config.h` before `HAS_GETTIMEOFDAY` is tested + +Also remove a duplicate `errno.h` +--- + runtime/unix.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/runtime/unix.c b/runtime/unix.c +index b5fd4de17b..c0677e09ac 100644 +--- a/runtime/unix.c ++++ b/runtime/unix.c +@@ -27,13 +27,12 @@ + #include + #include + #include ++#include "caml/config.h" + #ifdef HAS_GETTIMEOFDAY + #include + #endif + #include + #include +-#include +-#include "caml/config.h" + #if defined(SUPPORT_DYNAMIC_LINKING) && !defined(BUILDING_LIBCAMLRUNS) + #define WITH_DYNAMIC_LINKING + #ifdef __CYGWIN__ +@@ -47,7 +46,7 @@ + #endif + #ifdef HAS_POSIX_MONOTONIC_CLOCK + #include +-#elif HAS_CLOCK_GETTIME_NSEC_NP ++#elif defined(HAS_CLOCK_GETTIME_NSEC_NP) + #include + #endif + #ifdef HAS_DIRENT +-- +2.45.2 + diff --git a/patches/5.2.1/0002-Detect-and-use-CC-.-_FOR_BUILD-to-build-sak.patch b/patches/5.2.1/0002-Detect-and-use-CC-.-_FOR_BUILD-to-build-sak.patch new file mode 100644 index 0000000..91ede64 --- /dev/null +++ b/patches/5.2.1/0002-Detect-and-use-CC-.-_FOR_BUILD-to-build-sak.patch @@ -0,0 +1,311 @@ +From acd2f9c4ae0ee5dd550796b547e781794eb9b58c Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Wed, 21 Feb 2024 18:47:12 +0100 +Subject: [PATCH 02/14] Detect and use {CC,...}_FOR_BUILD to build sak + +--- + Makefile | 9 +- + Makefile.config.in | 4 + + aclocal.m4 | 1 + + build-aux/ax_prog_cc_for_build.m4 | 155 ++++++++++++++++++++++++++++++ + configure | Bin 647326 -> 682393 bytes + configure.ac | 10 +- + 6 files changed, 172 insertions(+), 7 deletions(-) + create mode 100644 build-aux/ax_prog_cc_for_build.m4 + +diff --git a/Makefile b/Makefile +index 71d41cd2d6..df191af79c 100644 +--- a/Makefile ++++ b/Makefile +@@ -1284,11 +1284,10 @@ runtime/caml/jumptbl.h : runtime/caml/instruct.h + sed -n -e '/^ /s/ \([A-Z]\)/ \&\&lbl_\1/gp' \ + -e '/^}/q' > $@ + +-# These are provided as a temporary shim to allow cross-compilation systems +-# to supply a host C compiler and different flags and a linking macro. +-SAK_CC ?= $(CC) +-SAK_CFLAGS ?= $(OC_CFLAGS) $(CFLAGS) $(OC_CPPFLAGS) $(CPPFLAGS) +-SAK_LINK ?= $(MKEXE_VIA_CC) ++SAK_CC ?= $(CC_FOR_BUILD) ++SAK_CFLAGS ?=\ ++ $(OC_CFLAGS) $(CFLAGS_FOR_BUILD) $(OC_CPPFLAGS) $(CPPFLAGS_FOR_BUILD) ++SAK_LINK ?= $(SAK_CC) $(SAK_CFLAGS) $(OC_EXE_LDFLAGS) $(OUTPUTEXE)$(1) $(2) + + $(SAK): runtime/sak.$(O) + $(V_MKEXE)$(call SAK_LINK,$@,$^) +diff --git a/Makefile.config.in b/Makefile.config.in +index 559738f6ed..4243bebad9 100644 +--- a/Makefile.config.in ++++ b/Makefile.config.in +@@ -65,11 +65,13 @@ LIBTOOL = $(TOP_BUILDDIR)/libtool + ### Which C compiler to use + TOOLPREF=@ac_tool_prefix@ + CC=@CC@ ++CC_FOR_BUILD=@CC_FOR_BUILD@ + + CC_HAS_DEBUG_PREFIX_MAP=@cc_has_debug_prefix_map@ + AS_HAS_DEBUG_PREFIX_MAP=@as_has_debug_prefix_map@ + + LDFLAGS?=@LDFLAGS@ ++LDFLAGS_FOR_BUILD=@LDFLAGS_FOR_BUILD@ + + ### How to invoke the C preprocessor through the C compiler + CPP=@CPP@ +@@ -160,7 +162,9 @@ UNIX_OR_WIN32=@unix_or_win32@ + INSTALL_SOURCE_ARTIFACTS=@install_source_artifacts@ + + CFLAGS=@CFLAGS@ ++CFLAGS_FOR_BUILD=@CFLAGS_FOR_BUILD@ + CPPFLAGS=@CPPFLAGS@ ++CPPFLAGS_FOR_BUILD=@CPPFLAGS_FOR_BUILD@ + OCAMLC_CFLAGS=@ocamlc_cflags@ + + OCAMLC_CPPFLAGS=@ocamlc_cppflags@ +diff --git a/aclocal.m4 b/aclocal.m4 +index cb73385dda..d2e58a45f6 100644 +--- a/aclocal.m4 ++++ b/aclocal.m4 +@@ -30,6 +30,7 @@ m4_include([build-aux/ax_check_compile_flag.m4]) + + # Macros from the autoconf macro archive + m4_include([build-aux/ax_func_which_gethostbyname_r.m4]) ++m4_include([build-aux/ax_prog_cc_for_build.m4]) + m4_include([build-aux/ax_pthread.m4]) + + # OCaml version +diff --git a/build-aux/ax_prog_cc_for_build.m4 b/build-aux/ax_prog_cc_for_build.m4 +new file mode 100644 +index 0000000000..1db8d73f96 +--- /dev/null ++++ b/build-aux/ax_prog_cc_for_build.m4 +@@ -0,0 +1,155 @@ ++# =========================================================================== ++# https://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html ++# =========================================================================== ++# ++# SYNOPSIS ++# ++# AX_PROG_CC_FOR_BUILD ++# ++# DESCRIPTION ++# ++# This macro searches for a C compiler that generates native executables, ++# that is a C compiler that surely is not a cross-compiler. This can be ++# useful if you have to generate source code at compile-time like for ++# example GCC does. ++# ++# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything ++# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD). ++# The value of these variables can be overridden by the user by specifying ++# a compiler with an environment variable (like you do for standard CC). ++# ++# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object ++# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if ++# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are ++# substituted in the Makefile. ++# ++# LICENSE ++# ++# Copyright (c) 2008 Paolo Bonzini ++# ++# Copying and distribution of this file, with or without modification, are ++# permitted in any medium without royalty provided the copyright notice ++# and this notice are preserved. This file is offered as-is, without any ++# warranty. ++ ++#serial 21 ++ ++AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD]) ++AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl ++AC_REQUIRE([AC_PROG_CC])dnl ++AC_REQUIRE([AC_PROG_CPP])dnl ++AC_REQUIRE([AC_CANONICAL_BUILD])dnl ++ ++dnl Use the standard macros, but make them use other variable names ++dnl ++pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl ++pushdef([ac_cv_prog_cc_c89], ac_cv_build_prog_cc_c89)dnl ++pushdef([ac_cv_prog_cc_c99], ac_cv_build_prog_cc_c99)dnl ++pushdef([ac_cv_prog_cc_c11], ac_cv_build_prog_cc_c11)dnl ++pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl ++pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl ++pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl ++pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl ++pushdef([ac_cv_c_compiler_gnu], ac_cv_build_c_compiler_gnu)dnl ++pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl ++pushdef([ac_cv_objext], ac_cv_build_objext)dnl ++pushdef([ac_exeext], ac_build_exeext)dnl ++pushdef([ac_objext], ac_build_objext)dnl ++pushdef([CC], CC_FOR_BUILD)dnl ++pushdef([CPP], CPP_FOR_BUILD)dnl ++pushdef([GCC], GCC_FOR_BUILD)dnl ++pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl ++pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl ++pushdef([EXEEXT], BUILD_EXEEXT)dnl ++pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl ++pushdef([OBJEXT], BUILD_OBJEXT)dnl ++pushdef([host], build)dnl ++pushdef([host_alias], build_alias)dnl ++pushdef([host_cpu], build_cpu)dnl ++pushdef([host_vendor], build_vendor)dnl ++pushdef([host_os], build_os)dnl ++pushdef([ac_cv_host], ac_cv_build)dnl ++pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl ++pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl ++pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl ++pushdef([ac_cv_host_os], ac_cv_build_os)dnl ++pushdef([ac_tool_prefix], ac_build_tool_prefix)dnl ++pushdef([am_cv_CC_dependencies_compiler_type], am_cv_build_CC_dependencies_compiler_type)dnl ++pushdef([am_cv_prog_cc_c_o], am_cv_build_prog_cc_c_o)dnl ++pushdef([cross_compiling], cross_compiling_build)dnl ++ ++cross_compiling_build=no ++ ++ac_build_tool_prefix= ++AS_IF([test -n "$build"], [ac_build_tool_prefix="$build-"], ++ [test -n "$build_alias"],[ac_build_tool_prefix="$build_alias-"]) ++ ++AC_LANG_PUSH([C]) ++ ++dnl The pushdef([ac_cv_c_compiler_gnu], ...) currently does not cover ++dnl the use of this variable in _AC_LANG_COMPILER_GNU called by ++dnl AC_PROG_CC. Unset this cache variable temporarily as a workaround. ++was_set_c_compiler_gnu=${[ac_cv_c_compiler_gnu]+y} ++AS_IF([test ${was_set_c_compiler_gnu}], ++ [saved_c_compiler_gnu=$[ac_cv_c_compiler_gnu] ++ AS_UNSET([[ac_cv_c_compiler_gnu]])]) ++ ++AC_PROG_CC ++ ++dnl Restore ac_cv_c_compiler_gnu ++AS_IF([test ${was_set_c_compiler_gnu}], ++ [[ac_cv_c_compiler_gnu]=$[saved_c_compiler_gnu]]) ++ ++_AC_COMPILER_EXEEXT ++_AC_COMPILER_OBJEXT ++AC_PROG_CPP ++ ++dnl Restore the old definitions ++dnl ++popdef([cross_compiling])dnl ++popdef([am_cv_prog_cc_c_o])dnl ++popdef([am_cv_CC_dependencies_compiler_type])dnl ++popdef([ac_tool_prefix])dnl ++popdef([ac_cv_host_os])dnl ++popdef([ac_cv_host_vendor])dnl ++popdef([ac_cv_host_cpu])dnl ++popdef([ac_cv_host_alias])dnl ++popdef([ac_cv_host])dnl ++popdef([host_os])dnl ++popdef([host_vendor])dnl ++popdef([host_cpu])dnl ++popdef([host_alias])dnl ++popdef([host])dnl ++popdef([OBJEXT])dnl ++popdef([LDFLAGS])dnl ++popdef([EXEEXT])dnl ++popdef([CPPFLAGS])dnl ++popdef([CFLAGS])dnl ++popdef([GCC])dnl ++popdef([CPP])dnl ++popdef([CC])dnl ++popdef([ac_objext])dnl ++popdef([ac_exeext])dnl ++popdef([ac_cv_objext])dnl ++popdef([ac_cv_exeext])dnl ++popdef([ac_cv_c_compiler_gnu])dnl ++popdef([ac_cv_prog_cc_g])dnl ++popdef([ac_cv_prog_cc_cross])dnl ++popdef([ac_cv_prog_cc_works])dnl ++popdef([ac_cv_prog_cc_c89])dnl ++popdef([ac_cv_prog_gcc])dnl ++popdef([ac_cv_prog_CPP])dnl ++ ++dnl restore global variables ac_ext, ac_cpp, ac_compile, ++dnl ac_link, ac_compiler_gnu (dependant on the current ++dnl language after popping): ++AC_LANG_POP([C]) ++ ++dnl Finally, set Makefile variables ++dnl ++AC_SUBST(BUILD_EXEEXT)dnl ++AC_SUBST(BUILD_OBJEXT)dnl ++AC_SUBST([CFLAGS_FOR_BUILD])dnl ++AC_SUBST([CPPFLAGS_FOR_BUILD])dnl ++AC_SUBST([LDFLAGS_FOR_BUILD])dnl ++]) +diff --git a/configure b/configure +index 49d5bff6495b2f38d91d97ec777a4212e3c23677..9f16ca87352a88b5e995631c15fd8914f6b2ebfc 100755 +GIT binary patch +delta 6754 +zcmds5eN0r@70*4x8{mn2L`L~qc=H?>6lV~20WBRBXVBG91-ET%WBL}xfn~)RWQLV3 +zK{Ph8G;Lv*T~2gUm$peawcBQClTMp#7frfd~-*CgKtYi-PWh1EjxEfo4>TJ!N+?W +z8xy+B9SWzkbMyB4-CyKYqJDS1OwiektY*LDk4RoG(`6)%4(vEKu!GPa=x?EaQgmPk +zCq?@O`mwwor=!&CUFGDJ0n>(*L8ULokf4OZqV;M_3A)QXS|_Y>;&smIz@rCKDhu}p +zA_0G-J=i8ho(TwEArcC8_@8NR4+^cJE&+dkm=p|WZnXCQcfOYH_Kv-xu%V>7wvXp| +ze^)3Rmi(dpo$Vb|w4@Asf+3!#uqlKjuOoGK1zOvCJbZhr5DA1Mf-5M94pkOUw-XdT +zM=?>R_^Euu9F5N<@_~-T=~8n?dvjPc30Xjf%Ip#`R0Vl0`hg0LM1yh48mNi|D5mT& +z3NAmLVLHC~WDMJsh&p=bXY13E4L3g**el`eq@~y@8*s0HbCZ_r +zR8OtY9i$7WB-Hjjn(%T8y!i21B52L#+u%d#9QnLPpEyTO@%l;Q_umC?8f!TC!Utf> +zWqUj#V_DI;H_4Ytj%mC%W+X^1kkMLQzDG76|8w+ih1!h%DR!vJEz`x}l@{>w4Bb3V +za#*^5oP_Z7QA>Wc&eY%&Yh{lSR4=H>6?&NMH~6q=ng}?3kxZFkz|0#Yh3%wB-ssD*=nipMRUe0kFG9Cw1hao4yR_!c2`GQcu=@lR>02cTt?kscg#)x@ +zU{(Q{=X~*nNn&Hc{Lv&4b(>s{mnX?Sjo$h$`7z7-pl$M}eL5DMPaef5m#3FT6!YjXS+>N5zVze)Ev!8CrD0uj%x_WG#nV6j;C!8ib?i(unx_xlH^~OgT=(51ubXiUofuV%kt{}1NX +z6lFtIeqK#M%(f~DB_%Yd?G-w^@J2Zq!0&B<^l0%1q~C)7oPZkq$M2HT@Z4`xQ}OQw +zbY#2$-Xf|kzdS~q_`^cDyHdY|p63JM*t@=!)dzo41O;xLvF!OiIoFWGYe~&2XjEm& +zE^xL8yxIC3nk)GOosqEM!n&%Id>pi=EV0cu+=gck5fOU@7${To10`Ja`=vHHO_LK; +z(^4MM)h1%|U*Y7)AZN`mO~RRV)@+=ygLSFCoJSOKw3OIJZgAD;{u)<1vOPH$Px+Fw +z@VE%&Su7_N&Zpwsb*^6F#HW9gY}Xt@XeHF>cn%N!t8_jJ>m2Z6x^Y{0<|AtkcJ8xs +zcIw4 +z_y$Y&mB2<5U5Ha9@R$b7of3FbYkHhexJ2JRKRkBZhoesLvGbcMVVlOkrW8DJ6m9s1 +z3$nD4@07v@cG9P=I7aW6!fRPZg#8s2IN^r3GtJ$YwV$xi53Gg)CWJO5I1N5QiwG1c +zIJO#G+HNkdh9P!0`^$`wP}%^=wX!%Qt~K*OGPDMcvGN#5B-cWaoOUe;Ns${~)3*Ay +z8z!{o%jHn2THKrE_pbJP<#Dw$*BaFxU29aE(uMfR+PEd;R>akQx?&!+sU>9Kx0?u$ +zmnxup0RWCyE(E}bl?wv!mB-@%eD-)8fD2D(0Bly%Q0iCw>(;CFA)!xpF9}Hv>k5tL +zP*@emWqTEDeB=r=o7KBxti#X(O)Pr4hZ>Ahamn{M)LM*5lKj5mk!{JHIFbSB__vvq +z>geu|$+WdtU05wL(dR~f=#)1wmSU>cvB3hG$Hl=ka79Ngu#MQ+xw5wmhUDpL=|LHb +zewqZkEx9aTtTds@^{2o(^}<9?q`)1E)~0J5)!t9cN{9N?xCG2BfFku?9ZZL6wNNOj +z+t&+=D(!KowcF@;I#hy|kVoe-VOW#>i}!BsA$VmO=hNJ#a(!ii*36A*j^L^nOS(pS +z#>QA6$y~emm{}-w19A-89*ndKc(N$Ty@Xi+<(l78rlY|Zt(oOgIrgpCbd76yPu7q0nJy5)&Kwi + +delta 62 +zcmbPvS##b&^$i_<&20YdZ2pWu%ml>DK+Lk8&7U=4`}CCy*!ib_XJZp-XX|GJVs;?r +L*v{6^Ir$a +Date: Thu, 22 Feb 2024 13:37:28 +0100 +Subject: [PATCH 03/14] Use `target` instead of `host` to detect the C + toolchain + +When building a cross-compiler, the runtime will run on the target, not +the host so: +- set `cross_compiling` by comparing `build` to `target` (rather than to + `host`), as this variable will be used later +- use `target` to set up the tool prefix, +- as the libtool configuration will configure a `build` to `host` + toolchain, temporarily assign `host*` values to `target*` values +--- + configure | Bin 682393 -> 682949 bytes + configure.ac | 18 ++++++++++++++++++ + 2 files changed, 18 insertions(+) + +diff --git a/configure b/configure +index 9f16ca87352a88b5e995631c15fd8914f6b2ebfc..f81f4ca213b710395b61b64d1380318d4d80867d 100755 +GIT binary patch +delta 1998 +zcmZ`(drVbz9N+yt?u9D~^12Qaj&QXR!UV#QN5pXGe6e(h`QUQ6_W&nu=Unc&0<{Wr +zD<>GO8vK+s2i9!ONBq(FHF{hNafq|VoH5JU!?YZcjAl&@>UX)nUodan?QEa>`F_s# +z{XIu7rw)#$?*GVC)z(thsCd1qOOc#j-7p+Z{W*{7R<&A5)?AY8bog}L?eKV&8nsz! +zl)b84?N$uQP&KC_`RWv@L<%UJb+W2Ss$or$_8E$caZ;_KDPGyfRI;~L@kvgd1!<~N +zG^u)@>UPb9kerEusLU3Ks(7txjpS1dpVXXepHY#uX0tt(X$v*os<;hBvde};(>>O= +zdymC~8kGz+TUI=jXQ4e9(jmK5*+{q6sB}-8>Ch7ioYsxGab`&J;7ijZcm~ph0aI~I +z5R;zYOxrmuo&>9j|1VP}X|$OmN!hr`N;5`Hp1Ap?(RA&&X)65x1(f-^xhyQ0)1w(= +zxdl8gomu7I0!t;ZJwKOzJrW(hzrdtQTD3?x@xW)&S1G|1oF}<2d&V +z0MXK5amo3CP0_59hg(n2Y;C8)fgU;wM8tvmlQcC0q52Vq>Rs&=oWH^-Tei +z`Kx(_XiAjJlFp9jyr&%H3jX8{)RMsY^aj)_T=pC2JFx&qUPN8uP;w5SB5^=Xub~m4 +z+4KhLS|s8Yp(#LbcB9|LJ!^jSSl{QUUPNX8RSQ>tdmiL-^Wu2knhm89Y%(qoTQV@9d>Y>^JvXM;@S`#FF%xv6}}Qi^R#~c?*uD +zJ1qDuQ4?c-;Zewy#rQ5y3tm<(;iJEM4=x*@sTt_(vb-*3Sw#J&~(LDy}@uZwgq +zmfARQznZR9_EoeIZ=!5!znGe4&ZHKV1x};-!_~d#i~n4@+jl$nbAEl! +z`JVF~ycmiPhdMsdUfdzOcWRvl`E@a~sXAur^)DGsQM1Wt4bGW_g2rMa*xFLRab2v% +z4C+mF(TzrtZWxwYK7Udx$q?Tswdvw&C6w7xo@n?(OBeV4qXlH-TW$Lchgw={pY8z3 +zM_N9^_k$hxW)@pmM$)|1Y*!jd$$GZb@9>kmx3UNBLz}7iY7Z+#o3zm0VVi9iG5#*A +z6uEI`h=%vrEa{E2t4OgdMFL2AtCxN3aYp^}5X&LMPd{SkIN5z8*#btAw~y^|k<^o9 +zfF3(}aFJp6Ma-+wv*gezc2Al!Z@1V!XQyP~UzV?l +z!W!Lsq!!#N2Rd8{i_x`uhTO9NW+}T91#rMa>X(;7HkBhRsj#~Y +zQsiJMjHtQ}Jp+L$3}2{%7*Jk$u^M`(@Zt^7H3giz1y(q~`4V4+r~}NC6FXr46fi7c +zkxztwb@{}lYDkyc_rgI{N#TBoXHX>r +ziHP^IxiXZG3FRX%6yWI;758v4M#$W?1n+1RLs(><6$O{kC$9Blnrth<{uyNRSUDD| +z3fn8NeI`YaJ`>y2?CoyG@6;VNwqZg|rhgkQQBxgx1HV?<@Y|S}_P?o$d$1)ysrve{ +zi&6X0ck$(Ip +zu1*Wu8&SO_YCRZ@lZ#@Vc&Achtpe)Lez!{FqCDmY6Nw>3mT0 +zQM8z8Y*?3T#)7(7*~w>$M;f_LxH9?Y#Ohoo|5*_@mc`wZS8zU?o9U!p9_A0LZEw%z +z5p^x{r}^CDCH0>re4Hl3CnrjIK2v0hp5UugdGRNCvD%d@PxA_LS-6}ZR>~VI_-)li +zOA1JQjvtuZk`oc$rxsOqmh+Xf$?@_le2C`FFORhIoM|f8_?x^nPZhpZ1FzgRz{}A7 +u&lW!p@=K}(wVRsnJ~JiB)J%E(6z`yWe|`NKZk-hCq*})%*Pn5(>G=<2b2Q8V + +diff --git a/configure.ac b/configure.ac +index 2e3a11f60c..0862b381ff 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -288,6 +288,14 @@ AC_CANONICAL_BUILD + AC_CANONICAL_HOST + AC_CANONICAL_TARGET + ++# Override cross_compiling and ac_tool_prefix variables since the C toolchain is ++# used to generate target code when building a cross compiler ++AS_IF([test x"$build" = x"$target"], ++ [cross_compiling=no], ++ [cross_compiling=yes]) ++AS_IF([test -n "$target_alias"], ++ [ac_tool_prefix=$target_alias-]) ++ + # Ensure that AC_CONFIG_LINKS will either create symlinks which are compatible + # with native Windows (i.e. NTFS symlinks, not WSL or Cygwin-emulated ones) or + # use its fallback mechanisms. Native Windows versions of ocamlc/ocamlopt cannot +@@ -594,12 +602,22 @@ AC_CHECK_TOOLS([LD],[ld link]) + # Also, it has been observed that, on some platforms (e.g. msvc) LT_INIT + # alters the CFLAGS variable, so we save its value before calling the macro + # and restore it after the call ++pushdef([host], target)dnl ++pushdef([host_alias], target_alias)dnl ++pushdef([host_cpu], target_cpu)dnl ++pushdef([host_vendor], target_vendor)dnl ++pushdef([host_os], target_os)dnl + old_host_os=$host_os + AS_IF([test x"$host_os" = "xwindows"],[host_os=mingw]) + saved_CFLAGS="$CFLAGS" + LT_INIT + CFLAGS="$saved_CFLAGS" + host_os=$old_host_os ++popdef([host_os])dnl ++popdef([host_vendor])dnl ++popdef([host_cpu])dnl ++popdef([host_alias])dnl ++popdef([host])dnl + + AS_CASE([$host], + [sparc-sun-solaris*], +-- +2.45.2 + diff --git a/patches/5.2.1/0004-Use-target-instead-of-host-when-relevant-in-configur.patch b/patches/5.2.1/0004-Use-target-instead-of-host-when-relevant-in-configur.patch new file mode 100644 index 0000000..4ab437d --- /dev/null +++ b/patches/5.2.1/0004-Use-target-instead-of-host-when-relevant-in-configur.patch @@ -0,0 +1,83 @@ +From 7acd97746d8c41a191d5de96b03c915a52bdc142 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Wed, 21 Feb 2024 19:05:44 +0100 +Subject: [PATCH 04/14] Use `target` instead of `host` when relevant in + configuration + +--- + configure | Bin 682949 -> 682314 bytes + configure.ac | 10 +++++----- + 2 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/configure b/configure +index f81f4ca213b710395b61b64d1380318d4d80867d..b393e6e2871a942e0171f1a52b70f75ef74f780a 100755 +GIT binary patch +delta 382 +zcmX?lUGvl>&4w+Esyn8O?`5>&ElDg&Pc4a0%*jkF)}0=(m(dngX#2w*j4@28V$(0M +zFi)HQa5v-Y=?MmGT+?stVdP~=$?_$tCeVF19K@F4I5U +zVH4S|wwG}+i@bsYNDL;+rJ#_SQ=AHlQVFkN& +zd+d3(9Zb`AtYPEdu5^hlt_dpK9K!A)Jbhvrvm8H)pK?;B8!l!t#SnCS!Z>65{|xr~ +zjHsTQ{82+<`h?qz72E5w*?AbJD}82^n9fto&NY2~4m&5t;^V@#oqI3i7MAJ%DwqU?d|Z?iY!xc3 +z6-qKv^SBg%VETPAHnr*ftC>otpS{Z3$pg{^)82mXAR`bn0WmWWvj8#c_In4}?0BaC +zv|{Jou6>Se9n1^xsX_NBR0pbmyQbR|u*QYK + +diff --git a/configure.ac b/configure.ac +index 0862b381ff..26de5bed24 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -597,7 +597,7 @@ AS_IF([test x"$enable_ocamldoc" = "xno"], + # Initialization of libtool + # Allow the MSVC linker to be found even if ld isn't installed. + # User-specified LD still takes precedence. +-AC_CHECK_TOOLS([LD],[ld link]) ++AC_CHECK_TARGET_TOOLS([LD],[ld link]) + # libtool expects host_os=mingw for native Windows + # Also, it has been observed that, on some platforms (e.g. msvc) LT_INIT + # alters the CFLAGS variable, so we save its value before calling the macro +@@ -1027,7 +1027,7 @@ AS_CASE([$flexdll_source_dir,$supports_shared_libraries,$flexlink,$host], + + mkexe_cmd_exp="$CC" + +-AS_CASE([$ocaml_cc_vendor,$host], ++AS_CASE([$ocaml_cc_vendor,$target], + [*,x86_64-*-darwin*], + [oc_ldflags='-Wl,-no_compact_unwind'; + AC_DEFINE([HAS_ARCH_CODE32], [1])], +@@ -1045,7 +1045,7 @@ AS_CASE([$ocaml_cc_vendor,$host], + ) + ostype="Cygwin"], + [*,*-*-mingw32*], +- [AS_CASE([$host], ++ [AS_CASE([$target], + [i686-*-*], [oc_dll_ldflags="-static-libgcc"]) + ostype="Win32" + toolchain="mingw" +@@ -1342,7 +1342,7 @@ system=unknown + # preserving $arch = 'none' <=> $system = 'unknown' + has_native_backend=no + native_ldflags="" +-AS_CASE([$host], ++AS_CASE([$target], + [[i[3456]86-*-linux*]], + [arch=i386; system=linux], + [[i[3456]86-*-freebsd*]], +@@ -1479,7 +1479,7 @@ AS_IF([$natdynlink], + + AC_DEFINE_UNQUOTED([OCAML_OS_TYPE], ["$ostype"]) + +-AC_CHECK_TOOL([DIRECT_LD],[ld]) ++AC_CHECK_TARGET_TOOL([DIRECT_LD],[ld]) + AS_IF([test -z "$PARTIALLD"], + [AS_CASE(["$host,$ocaml_cc_vendor"], + [x86_64-*-darwin*,gcc-*], [PACKLD_FLAGS=' -arch x86_64'], +-- +2.45.2 + diff --git a/patches/5.2.1/0005-Use-the-strip-command-detected-by-libtool.patch b/patches/5.2.1/0005-Use-the-strip-command-detected-by-libtool.patch new file mode 100644 index 0000000..a0e2cc9 --- /dev/null +++ b/patches/5.2.1/0005-Use-the-strip-command-detected-by-libtool.patch @@ -0,0 +1,42 @@ +From a67f2491770af3937b9cf5c548855dff678d99b5 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Fri, 5 Jul 2024 12:42:36 +0200 +Subject: [PATCH 05/14] Use the `strip` command detected by libtool + +Instead of using `strip` unconditionally to build `tmpheader.exe`, use +the `strip` command detected by `libtool` during configure so that it is +replaced with `:` when the command is absent and it becomes easy to +override it if need be +--- + Makefile.config.in | 1 + + stdlib/Makefile | 2 +- + 2 files changed, 2 insertions(+), 1 deletion(-) + +diff --git a/Makefile.config.in b/Makefile.config.in +index 4243bebad9..b91634efb6 100644 +--- a/Makefile.config.in ++++ b/Makefile.config.in +@@ -185,6 +185,7 @@ OCAMLOPT_CFLAGS=@ocamlc_cflags@ + OCAMLOPT_CPPFLAGS=@ocamlc_cppflags@ + NATIVECCLIBS=@cclibs@ + SYSTHREAD_SUPPORT=@systhread_support@ ++STRIP=@STRIP@ + PACKLD=@PACKLD@$(EMPTY) + CCOMPTYPE=@ccomptype@ + TOOLCHAIN=@toolchain@ +diff --git a/stdlib/Makefile b/stdlib/Makefile +index 50f825a1b3..b6286920f2 100644 +--- a/stdlib/Makefile ++++ b/stdlib/Makefile +@@ -98,7 +98,7 @@ tmpheader.exe: $(HEADERPROGRAM).$(O) + $(V_MKEXE)$(call MKEXE_VIA_CC,$@,$^) + # FIXME This is wrong - mingw could invoke strip; MSVC equivalent? + ifneq "$(UNIX_OR_WIN32)" "win32" +- strip $@ ++ $(STRIP) $@ + endif + + stdlib.cma: $(OBJS) +-- +2.45.2 + diff --git a/patches/5.2.1/0006-Strip-tmpheader.exe-also-on-Windows.patch b/patches/5.2.1/0006-Strip-tmpheader.exe-also-on-Windows.patch new file mode 100644 index 0000000..5b6d595 --- /dev/null +++ b/patches/5.2.1/0006-Strip-tmpheader.exe-also-on-Windows.patch @@ -0,0 +1,32 @@ +From aefbbb813cdc27252153d2cf043900681c8689d8 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Fri, 5 Jul 2024 12:58:58 +0200 +Subject: [PATCH 06/14] Strip tmpheader.exe also on Windows + +GNU strip can be called safely on binaries generated by cl as well as by +MinGW GCC (even if it doesn't produce a smaller executable for +cl-generated binaries) so invoke strip also on Windows so that MinGW +binaries are properly stripped +Tested with GNU strip 2.42 +--- + stdlib/Makefile | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/stdlib/Makefile b/stdlib/Makefile +index b6286920f2..a7f2e60a7a 100644 +--- a/stdlib/Makefile ++++ b/stdlib/Makefile +@@ -96,10 +96,7 @@ endif + .INTERMEDIATE: tmpheader.exe + tmpheader.exe: $(HEADERPROGRAM).$(O) + $(V_MKEXE)$(call MKEXE_VIA_CC,$@,$^) +-# FIXME This is wrong - mingw could invoke strip; MSVC equivalent? +-ifneq "$(UNIX_OR_WIN32)" "win32" + $(STRIP) $@ +-endif + + stdlib.cma: $(OBJS) + $(V_LINKC)$(CAMLC) -a -o $@ $^ +-- +2.45.2 + diff --git a/patches/5.2.1/0007-Allow-ocaml-as-a-target-OS-to-configure-freestanding.patch b/patches/5.2.1/0007-Allow-ocaml-as-a-target-OS-to-configure-freestanding.patch new file mode 100644 index 0000000..0af801e --- /dev/null +++ b/patches/5.2.1/0007-Allow-ocaml-as-a-target-OS-to-configure-freestanding.patch @@ -0,0 +1,65 @@ +From 627cf134087f67001306b9480a51f6c5ea082758 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Mon, 26 Feb 2024 11:51:11 +0100 +Subject: [PATCH 07/14] Allow `ocaml` as a target OS to configure freestanding + cross-compilers + +Allow the use of *-*-ocaml or *-*-*-ocaml target triplets to stand for +freestanding cross-compilers by temporarily rewriting the target OS to +`none` when generating the canonical target + +This allows to use *-*-ocaml and *-*-*-ocaml prefixes for cross-compiler +specific toolchains, so that all the specific tools (for instance +aarch64-solo5-ocaml-gcc, etc.) are automatically discovered +--- + configure | Bin 682314 -> 682823 bytes + configure.ac | 17 +++++++++++++++++ + 2 files changed, 17 insertions(+) + +diff --git a/configure b/configure +index b393e6e2871a942e0171f1a52b70f75ef74f780a..498bc2042686e7fc202a6ecdfaa1ca6d2c780efc 100755 +GIT binary patch +delta 551 +zcmb7Au}T9$5G64hyAYqSwV3K0acut*y?#&dEm?A?al#Tc8Uibbka`3PGf +zpCDMKu(PuF8=Rb?7e!E(x6Hg5-n^N|dGPQQ4DU;Kqd^T0mC`*BI>uB9Kno5{LJrPa +z(9s4uhR8b1E@YNKtkbSkWZ=9Hj?%6+Xr$_cp`MYBJG>gWODae>4IMa;o{|61aQCv0LGEUD~e8z +zTTP$8oLnUJu%5@31`e*51@l62Dx261{k<^X;#0yeh(n|C<>7x0jx1mLPY!+`Kb@Rb +sH>dMqd4KjYD&17JzPbN#R&m=Nml$Qn3ZueUWvnr(jP+T2yz%<{2ER13{Qv*} + +delta 60 +zcmX?pP4mg9ZU +F7XS(}7}x*+ + +diff --git a/configure.ac b/configure.ac +index 26de5bed24..6f02258356 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -286,7 +286,24 @@ AC_CONFIG_COMMANDS_PRE(OCAML_QUOTED_STRING_ID) + + AC_CANONICAL_BUILD + AC_CANONICAL_HOST ++# Allow "ocaml" as target OS for freestanding compiler by temporarily rewriting ++# the target OS to "none" to generate the canonical target ++real_target_alias="$target_alias" ++AS_CASE([$target_alias], ++ [*-*-*-ocaml], ++ [ac_save_IFS=$IFS ++ IFS='-' ++ set x $target_alias ++ target_alias="$2-$3-none" ++ IFS=$ac_save_IFS], ++ [*-*-ocaml], ++ [ac_save_IFS=$IFS ++ IFS='-' ++ set x $target_alias ++ target_alias="$2-none" ++ IFS=$ac_save_IFS]) + AC_CANONICAL_TARGET ++target_alias="$real_target_alias" + + # Override cross_compiling and ac_tool_prefix variables since the C toolchain is + # used to generate target code when building a cross compiler +-- +2.45.2 + diff --git a/patches/5.2.1/0008-Define-OS-type-to-None.patch b/patches/5.2.1/0008-Define-OS-type-to-None.patch new file mode 100644 index 0000000..089f689 --- /dev/null +++ b/patches/5.2.1/0008-Define-OS-type-to-None.patch @@ -0,0 +1,38 @@ +From 8056ab2f13faa7a484dc1d985208a6066cebfc89 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Mon, 26 Feb 2024 12:06:45 +0100 +Subject: [PATCH 08/14] Define OS type to None + +--- + configure | Bin 682823 -> 682873 bytes + configure.ac | 4 +++- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/configure b/configure +index 498bc2042686e7fc202a6ecdfaa1ca6d2c780efc..0eebc7063ceea9c5c392b02e68dce28144556545 100755 +GIT binary patch +delta 89 +zcmX?pP4nk9&4w1n7N!>F7M2#)Eo{-()pfLVwRH3H^HOWHz|7Q~G))C7E(IXSFD|Jp +lNVQe+1IkWsRN)k!zQC8At3CHR8xXStF~|1Y>zubH0{~+sAF2QV + +delta 44 +ycmex)P4oCQ&4w1n7N!>F7M2#)Eo{-(r@y(&F3>*rIvWtP12M<;xz{=GOa=hQ!xZiS + +diff --git a/configure.ac b/configure.ac +index 6f02258356..5523a1013c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1090,7 +1090,9 @@ AS_CASE([$ocaml_cc_vendor,$target], + [oc_ldflags='-brtl -bexpfull' + AC_DEFINE([HAS_ARCH_CODE32], [1])], + [gcc-*,powerpc-*-linux*], +- [oc_ldflags="-mbss-plt"]) ++ [oc_ldflags="-mbss-plt"], ++ [*,*-*-none|*,*-*-elf], ++ [ostype="None"]) + + ## Program to use to install files + AC_PROG_INSTALL +-- +2.45.2 + diff --git a/patches/5.2.1/0009-Add-freestanding-targets-to-supported-configurations.patch b/patches/5.2.1/0009-Add-freestanding-targets-to-supported-configurations.patch new file mode 100644 index 0000000..8c24fcb --- /dev/null +++ b/patches/5.2.1/0009-Add-freestanding-targets-to-supported-configurations.patch @@ -0,0 +1,40 @@ +From cbcf96dca5420b9a2665b0064c5ba2b37b7ecaa6 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Mon, 26 Feb 2024 19:35:26 +0100 +Subject: [PATCH 09/14] Add freestanding targets to supported configurations + +--- + configure | Bin 682873 -> 683028 bytes + configure.ac | 6 +++++- + 2 files changed, 5 insertions(+), 1 deletion(-) + +diff --git a/configure b/configure +index 0eebc7063ceea9c5c392b02e68dce28144556545..d95fd568597e59d6f9e92aacadc9f50840dcee16 100755 +GIT binary patch +delta 99 +zcmex)O>@c(&4w1n7N!>F7M2#)7Pc+yfyvYRBiK2opN(bbWXa3VOPzi;f!$ad#8R-f +sR#4X9Qcy@tEK1HWGtt%31uNK_$ZiZ)+8&t94#XTl%(*=F7M2#)7Pc+yfyvW13UCOw|4(KIVh$kY-2OkAOOyiuw<;1a + +diff --git a/configure.ac b/configure.ac +index 5523a1013c..3b2de0b053 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -1458,7 +1458,11 @@ AS_CASE([$target], + [x86_64-*-cygwin*], + [has_native_backend=yes; arch=amd64; system=cygwin], + [riscv64-*-linux*], +- [has_native_backend=yes; arch=riscv; model=riscv64; system=linux] ++ [has_native_backend=yes; arch=riscv; model=riscv64; system=linux], ++ [x86_64-*-none], ++ [has_native_backend=yes; arch=amd64; system=none], ++ [aarch64-*-none], ++ [has_native_backend=yes; arch=arm64; system=none] + ) + + AS_CASE([$arch], +-- +2.45.2 + diff --git a/patches/5.2.1/0010-Check-that-the-configured-and-the-installed-OCaml-ar.patch b/patches/5.2.1/0010-Check-that-the-configured-and-the-installed-OCaml-ar.patch new file mode 100644 index 0000000..87b0c45 --- /dev/null +++ b/patches/5.2.1/0010-Check-that-the-configured-and-the-installed-OCaml-ar.patch @@ -0,0 +1,46 @@ +From 156caacd6b9b4d3d83adf02ffd0c68f11a0ff5a7 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Tue, 19 Mar 2024 19:14:29 +0100 +Subject: [PATCH 10/14] Check that the configured and the installed OCaml are + compatible + +--- + configure | Bin 683028 -> 683595 bytes + configure.ac | 7 +++++++ + 2 files changed, 7 insertions(+) + +diff --git a/configure b/configure +index d95fd568597e59d6f9e92aacadc9f50840dcee16..58c25a0c685bf6860c63c9c394d191f9281bd1b3 100755 +GIT binary patch +delta 436 +zcmbPoL-X_<&4w1n7N!>F7M2#)Eo{FyO_deGQx%F*3rjPLQWX*v^78X^lZ*0;i*=Lp +za|<$aQi~Mw(-cZFQWc65b5j+{Qj3Z+^Yf-}+{1384HAV4z!YWX6_+ID9)8%)`*8P*$vF7M2#)Eo{Fyr$_j)>$S)8umLeU5OV-A=k|CWt~ZGQuvrin + +diff --git a/configure.ac b/configure.ac +index 3b2de0b053..c5b2a3f217 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -825,6 +825,13 @@ AS_IF( + CPPFLAGS_FOR_BUILD='$(CPPFLAGS)' + LDFLAGS_FOR_BUILD='$(LDFLAGS)'], + [cross_compiler=true ++ # We require a non-cross-compiler of the same version ++ AC_MSG_CHECKING([the version of the installed OCaml compiler]) ++ already_installed_version=`ocamlc -vnum` ++ AS_IF([test x"AC_PACKAGE_VERSION" = x"$already_installed_version"], ++ [AC_MSG_RESULT([compatible (AC_PACKAGE_VERSION)])], ++ [AC_MSG_ERROR(m4_normalize([incompatible (AC_PACKAGE_VERSION vs ++ $already_installed_version)]))]) + AC_MSG_NOTICE([detecting the C toolchain for build]) + AX_PROG_CC_FOR_BUILD]) + +-- +2.45.2 + diff --git a/patches/5.2.1/0011-Use-the-target-pkg-config-to-detect-zstd.patch b/patches/5.2.1/0011-Use-the-target-pkg-config-to-detect-zstd.patch new file mode 100644 index 0000000..f4d0a0e --- /dev/null +++ b/patches/5.2.1/0011-Use-the-target-pkg-config-to-detect-zstd.patch @@ -0,0 +1,44 @@ +From 40f00c44630bae376edf63dc5f76150b3a8065af Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Wed, 20 Mar 2024 17:41:26 +0100 +Subject: [PATCH 11/14] Use the target pkg-config to detect zstd + +Make sure that we don't detect zstd on build when we are building a +cross-compiler, as the native zstd has no reason to be compatible with +the cross toolchain +--- + configure | Bin 683595 -> 683354 bytes + configure.ac | 2 +- + 2 files changed, 1 insertion(+), 1 deletion(-) + +diff --git a/configure b/configure +index 58c25a0c685bf6860c63c9c394d191f9281bd1b3..e364c57560a234055311de9b09ff0f399fd0f44a 100755 +GIT binary patch +delta 151 +zcmV;I0BHZq+$q}HDS(6lgaU*Egam{Iga(8MvRQ2tN&UVRC0>bYEd? +zX<>6Mx88CHV+59$0ST8ba0d&QSa%2*m(sogDwlJ22ppG`a0ef^tak{b1DEr^2oaZv +zcnA~)A|NIvAeVu72pb4JB4%N1b7dm8OnV4E0hi=`2q6SzY;$FouzUy_hXsBJw*`I) +FM({SFH0=NY + +delta 171 +zcmcb0OY`&{&4w1n7N!>F7M2#)7Pc1lEgUvQ)4#lA3T7_IPM_Ylo5Ongft!qiVBUq@ +z9J8lOlyUHFk1yuf&OAL}1(W!6t#S^D>6zsm^3z4WFv@OUUe2+YdHSzX4({zst2qo9 +zr~BKp@ktbv#0Pl0$2g?s_5lEp)jm4_ + +diff --git a/configure.ac b/configure.ac +index c5b2a3f217..14d0356368 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -2261,7 +2261,7 @@ AC_CHECK_HEADER([spawn.h], + [AC_CHECK_FUNC([posix_spawn], + [AC_CHECK_FUNC([posix_spawnp], [AC_DEFINE([HAS_POSIX_SPAWN])])])]) + +-AC_PATH_TOOL([PKG_CONFIG], [pkg-config], [false]) ++AC_PATH_TARGET_TOOL([PKG_CONFIG], [pkg-config], [false]) + + ## ZSTD compression library + +-- +2.45.2 + diff --git a/patches/5.2.1/0012-WIP-Add-a-Makefile.cross-for-recipes-to-build-a-cros.patch b/patches/5.2.1/0012-WIP-Add-a-Makefile.cross-for-recipes-to-build-a-cros.patch new file mode 100644 index 0000000..44c0458 --- /dev/null +++ b/patches/5.2.1/0012-WIP-Add-a-Makefile.cross-for-recipes-to-build-a-cros.patch @@ -0,0 +1,122 @@ +From 4ab2e100f97da1a4251137dfaf473af705f0274f Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Fri, 23 Feb 2024 16:56:07 +0100 +Subject: [PATCH 12/14] WIP Add a Makefile.cross for recipes to build a + cross-compiler + +Define cross.opt and cross-install targets + +FIXME: Problems of inconsistencies between compilation options (only +about zstd?) between the native toolchain and the cross toolchain may +break the build? +--- + Makefile | 2 ++ + Makefile.cross | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 85 insertions(+) + create mode 100644 Makefile.cross + +diff --git a/Makefile b/Makefile +index df191af79c..cb6b3f4484 100644 +--- a/Makefile ++++ b/Makefile +@@ -2732,6 +2732,8 @@ endif + + include .depend + ++include Makefile.cross ++ + Makefile.config Makefile.build_config: config.status + config.status: + @echo "Please refer to the installation instructions:" +diff --git a/Makefile.cross b/Makefile.cross +new file mode 100644 +index 0000000000..b993783d2f +--- /dev/null ++++ b/Makefile.cross +@@ -0,0 +1,83 @@ ++#************************************************************************** ++#* * ++#* OCaml * ++#* * ++#* Samuel Hym, Tarides * ++#* * ++#* Copyright 2024 Tarides * ++#* * ++#* All rights reserved. This file is distributed under the terms of * ++#* the GNU Lesser General Public License version 2.1, with the * ++#* special exception on linking described in the file LICENSE. * ++#* * ++#************************************************************************** ++ ++# Recipes to build a cross-compiler (_not_ cross-compiling the compiler), aka ++# generating code that will run on `target`, assuming that a non-cross OCaml ++# compiler (so targetting our build machine) of the same version is available in ++# $PATH ++ ++# We assume no zstd for the cross-compiler (ie no requirement on zstd for the ++# target) ++# Still the cross-compiler will run on host, not target. And as a consequence of ++# the rules linking it, the cross-compilers will be linked with the _build_ ++# version of libcomprmarsh, so we still must discover the flags to link with ++# libzstd if it was set up in the non-cross compiler, so we rely on the ++# pkg-config command to get the linking flags for zstd ++PKG_CONFIG := pkg-config ++# This is used only once, so it doesn't have to be much lazier ++NATIVE_ZSTD_LIBS=ZSTD_LIBS="$(shell $(PKG_CONFIG) --libs libzstd)" ++# As the libcomprmarsh built by the C cross compiler will not be linked in, we ++# can build an empty one ++NO_ZSTD=libcomprmarsh_OBJECTS= ++ ++CROSS_OVERRIDES=OCAMLRUN=ocamlrun NEW_OCAMLRUN=ocamlrun \ ++ BOOT_OCAMLLEX=ocamllex OCAMLYACC=ocamlyacc ++CROSS_COMPILER_OVERRIDES=$(CROSS_OVERRIDES) CAMLC=ocamlc CAMLOPT=ocamlopt \ ++ BEST_OCAMLC=ocamlc BEST_OCAMLOPT=ocamlopt BEST_OCAMLLEX=ocamllex ++ ++INSTALL_OVERRIDES=build_ocamldoc=false WITH_DEBUGGER= ++ ++# Freestanding target custom options ++ifeq "$(SYSTEM)" "none" ++RUNTIME_BUILD_OVERRIDES=runtime_PROGRAMS= ++INSTALL_OVERRIDES += runtime_PROGRAMS=`which ocamlrun` \ ++ runtime_BYTECODE_STATIC_LIBRARIES=runtime/ld.conf ++else ++RUNTIME_BUILD_OVERRIDES= ++endif ++ ++cross.opt: ++ $(MAKE) runtime-all $(NO_ZSTD) $(RUNTIME_BUILD_OVERRIDES) ++ $(MAKE) ocamlc ocamlopt $(TOOLS_BYTECODE_TARGETS) expunge \ ++ $(CROSS_COMPILER_OVERRIDES) ++ $(MAKE) library $(CROSS_OVERRIDES) ++ifneq "$(SYSTEM)" "none" ++ $(MAKE) ocamlyacc $(CROSS_OVERRIDES) ++ $(MAKE) ocamllex $(CROSS_COMPILER_OVERRIDES) ++endif ++ $(MAKE) ocaml $(CROSS_COMPILER_OVERRIDES) ++ $(MAKE) -C otherlibs all $(CROSS_OVERRIDES) ++ # Opt ++ $(MAKE) runtimeopt $(NO_ZSTD) ++ $(MAKE) ocamlc.opt ocamlopt.opt $(TOOLS_NATIVE_TARGETS) \ ++ $(NO_ZSTD) $(CROSS_COMPILER_OVERRIDES) $(NATIVE_ZSTD_LIBS) ++ $(MAKE) libraryopt $(NO_ZSTD) $(CROSS_OVERRIDES) ++ $(MAKE) otherlibrariesopt ocamltoolsopt $(NO_ZSTD) $(CROSS_OVERRIDES) ++ $(MAKE) tools-allopt.opt $(NO_ZSTD) $(CROSS_COMPILER_OVERRIDES) ++ ++.PHONY: cross-install ++cross-install: ++ # dummy files ++ touch \ ++ $(addprefix toplevel/, \ ++ $(foreach ext,cmi cmt cmti cmx, native/nat__dummy__.$(ext)) \ ++ all__dummy__.cmx topstart.o native/tophooks.cmi) ++ $(LN) `which ocamlyacc` yacc/ocamlyacc.opt$(EXE) ++ $(LN) `which ocamllex` lex/ocamllex.opt$(EXE) ++ifeq "$(SYSTEM)" "none" ++ $(LN) `which ocamlyacc` yacc/ocamlyacc$(EXE) ++ $(LN) `which ocamllex` lex/ocamllex$(EXE) ++endif ++ # Real installation ++ $(MAKE) install $(INSTALL_OVERRIDES) OCAMLRUN=ocamlrun +-- +2.45.2 + diff --git a/patches/5.2.1/0013-Set-Max_domains-to-1.patch b/patches/5.2.1/0013-Set-Max_domains-to-1.patch new file mode 100644 index 0000000..2eb5515 --- /dev/null +++ b/patches/5.2.1/0013-Set-Max_domains-to-1.patch @@ -0,0 +1,35 @@ +From bde7866513c8deeddd9165d05502162229abd13a Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Fri, 12 Apr 2024 19:21:52 +0200 +Subject: [PATCH 13/14] Set Max_domains to 1 + +Solo5 is single-core with no scheduler, so avoid the useless memory +waste + +Note that since PR#13272 the maximum number of domains can set using a +parameter in OCAMLRUNPARAM so `getenv` might be a better place to set +this limit in the future +--- + runtime/caml/domain.h | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +diff --git a/runtime/caml/domain.h b/runtime/caml/domain.h +index 4b9be80b41..986486478c 100644 +--- a/runtime/caml/domain.h ++++ b/runtime/caml/domain.h +@@ -31,11 +31,7 @@ extern "C" { + + /* The runtime currently has a hard limit on the number of domains. + This hard limit may go away in the future. */ +-#ifdef ARCH_SIXTYFOUR +-#define Max_domains 128 +-#else +-#define Max_domains 16 +-#endif ++#define Max_domains 1 + + /* is the minor heap full or an external interrupt has been triggered */ + Caml_inline int caml_check_gc_interrupt(caml_domain_state * dom_st) +-- +2.45.2 + diff --git a/patches/5.2.1/0014-Set-stack-as-non-executable-on-freestanding-targets.patch b/patches/5.2.1/0014-Set-stack-as-non-executable-on-freestanding-targets.patch new file mode 100644 index 0000000..d0e29b0 --- /dev/null +++ b/patches/5.2.1/0014-Set-stack-as-non-executable-on-freestanding-targets.patch @@ -0,0 +1,53 @@ +From d6d0345ba0d079ffc17c397ae1773e50ecc470b1 Mon Sep 17 00:00:00 2001 +From: Samuel Hym +Date: Mon, 29 Apr 2024 18:21:24 +0200 +Subject: [PATCH 14/14] Set stack as non-executable on freestanding targets + +--- + asmcomp/amd64/emit.mlp | 2 +- + asmcomp/arm64/emit.mlp | 2 +- + runtime/amd64.S | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp +index 619ce9c3c5..19f896c1ac 100644 +--- a/asmcomp/amd64/emit.mlp ++++ b/asmcomp/amd64/emit.mlp +@@ -1079,7 +1079,7 @@ let end_assembly() = + D.size frametable (ConstSub (ConstThis, ConstLabel frametable)) + end; + +- if system = S_linux then ++ if system = S_linux || system = S_unknown then + (* Mark stack as non-executable, PR#4564 *) + D.section [".note.GNU-stack"] (Some "") [ "%progbits" ]; + +diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp +index 1816f8c345..41769e4f93 100644 +--- a/asmcomp/arm64/emit.mlp ++++ b/asmcomp/arm64/emit.mlp +@@ -1217,7 +1217,7 @@ let end_assembly () = + emit_symbol_type emit_symbol lbl "object"; + emit_symbol_size lbl; + begin match Config.system with +- | "linux" -> ++ | "linux" | "none" -> + (* Mark stack as non-executable *) + ` .section .note.GNU-stack,\"\",%progbits\n` + | _ -> () +diff --git a/runtime/amd64.S b/runtime/amd64.S +index 49c712b167..be0856a72b 100644 +--- a/runtime/amd64.S ++++ b/runtime/amd64.S +@@ -1386,7 +1386,7 @@ G(caml_negf_mask): + G(caml_absf_mask): + .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF + +-#if defined(SYS_linux) ++#if defined(SYS_linux) || defined(SYS_none) + /* Mark stack as non-executable, PR#4564 */ + .section .note.GNU-stack,"",%progbits + #endif +-- +2.45.2 + diff --git a/test/test.c b/test/test.c index 7717a15..8ab1365 100644 --- a/test/test.c +++ b/test/test.c @@ -1,6 +1,6 @@ #include int main(int ac, const char *av[]) { - gilbraltar_log(INFO, "Hello World!\r\n"); + gilbraltar_log(INFO, "Hello Tazi!\r\n"); return (0); } diff --git a/toolchain/ar.in b/toolchain/ar.in new file mode 100644 index 0000000..1795c99 --- /dev/null +++ b/toolchain/ar.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_AR@@ "$@" diff --git a/toolchain/as.in b/toolchain/as.in new file mode 100644 index 0000000..3e4eb88 --- /dev/null +++ b/toolchain/as.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_CC@@ -c "$@" diff --git a/toolchain/cc.in b/toolchain/cc.in new file mode 100644 index 0000000..8f502a8 --- /dev/null +++ b/toolchain/cc.in @@ -0,0 +1,130 @@ +#!/bin/sh +# Copyright (c) 2015-2021 Solo5 Contributors +# Copyright (c) 2024 Romain Calascibetta +# +# This file is part of Gilbraltar, a bare-metal OS for RaspBerry Pi 5. +# +# Permission to use, copy, modify, and/or distribute this software +# for any purpose with or without fee is hereby granted, provided +# that the above copyright notice and this permission notice appear +# in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# @@CONFIG_TARGET_TRIPLE@@-cc: Gilbraltar wrapper for 'cc'. +# Generated by configure.sh at build time. +# +# Passes through to @@CONFIG_TARGET_CC@ for actual work. Defines all flags +# required for correct operation when building C code intended for inclusion in +# a Gilbraltar operating system. +# +# Provides a '-z gilbraltar-abi=ABI' option to select the Gilbraltar bindings to +# use if linking. ABI defaults to 'stub' to accomodate non-Gilbraltar-aware +# build systems, such as GNU autoconf, which use 'cc'-as-linker to test for the +# presence of symbols. + +prog="$(basename $0)" +I="$(dirname $0)/../include" +[ ! -d "${I}" ] && echo "$prog: Could not determine include path" 1>&2 && exit 1 +L="$(dirname $0)/../lib/@@CONFIG_TARGET_TRIPLE@@" +[ ! -d "${L}" ] && echo "$prog: Could not determine library path" 1>&2 && exit 1 +# we can't really tell if 'cc' is called with no input, but work around the +# most obvious cases and stop them from "succeeding" and producing an "a.out" +[ "$#" -lt 1 ] && \ + echo "$prog: No input files. Compilation terminated." 1>&1 && exit 1 +[ "$#" -eq 1 -a "$1" = "-v" ] && exec @@CONFIG_TARGET_CC@@ "$@" +# default to cc as linker, unless we see args to the contrary +M=link +# cc as linker with no -z gilbraltar-abi= defaults to stub +B=stub +Z= +for arg do + shift + if [ -n "${Z}" ]; then + # handle -z linker-arg + Z= + case "$arg" in + gilbraltar-abi=*) + B="${arg##*=}" + continue + ;; + *) + set -- "$@" "-z" "$arg" + continue + ;; + esac + fi + + case "$arg" in + -c|-S|-E) + M=compile + ;; + -z) + if [ -z "${Z}" ]; then + Z=1 + continue + fi + ;; + esac + set -- "$@" "$arg" +done +case ${M} in + compile) + [ -n "${__V}" ] && set -x + echo exec @@CONFIG_TARGET_CC@@ \ + @@CONFIG_TARGET_CC_CFLAGS@@ \ + -isystem ${I}/@@CONFIG_TARGET_TRIPLE@@ \ + -I ${I} \ + -D__BSD_VISIBLE=0 \ + -D__XSI_VISIBLE=0 \ + -std=c11 \ + -ffreestanding \ + -fstack-protector-strong \ + -nostdlib \ + -nostartfiles \ + -mstrict-align \ + -Wall \ + -DAARCH=64 \ + -mcpu=cortex-a76 \ + "$@" ; + exec @@CONFIG_TARGET_CC@@ \ + @@CONFIG_TARGET_CC_CFLAGS@@ \ + -isystem ${I}/@@CONFIG_TARGET_TRIPLE@@ \ + -I ${I} \ + -D__BSD_VISIBLE=0 \ + -D__XSI_VISIBLE=0 \ + -std=c11 \ + -ffreestanding \ + -fstack-protector-strong \ + -nostdlib \ + -nostartfiles \ + -mstrict-align \ + -Wall \ + -DAARCH=64 \ + -mcpu=cortex-a76 \ + "$@" + ;; + link) + [ -n "${B}" ] && B="-Wl,-T,gilbraltar.${B}.ld -lgilbraltar.${B}" + [ -n "${__V}" ] && set -x + exec @@CONFIG_TARGET_CC@@ \ + @@CONFIG_TARGET_CC_CFLAGS@@ \ + -isystem ${I}/@@CONFIG_TARGET_TRIPLE@@ \ + -I ${I} \ + -ffreestanding \ + -fstack-protector-strong \ + @@CONFIG_TARGET_CC_LDFLAGS@@ \ + -nostdlib \ + -L ${L} \ + ${B} \ + -static \ + "$@" + ;; +esac diff --git a/toolchain/gcc.in b/toolchain/gcc.in new file mode 120000 index 0000000..0895a9f --- /dev/null +++ b/toolchain/gcc.in @@ -0,0 +1 @@ +cc.in \ No newline at end of file diff --git a/toolchain/ld.in b/toolchain/ld.in new file mode 100644 index 0000000..38936de --- /dev/null +++ b/toolchain/ld.in @@ -0,0 +1,73 @@ +#!/bin/sh +# Copyright (c) 2015-2021 Solo5 Contributors +# Copyright (c) 2024 Romain Calascibetta +# +# This file is part of Gilbraltar, a bare-metal OS for RaspBerry Pi 5. +# +# Permission to use, copy, modify, and/or distribute this software +# for any purpose with or without fee is hereby granted, provided +# that the above copyright notice and this permission notice appear +# in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +# WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +# AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# @@CONFIG_TARGET_TRIPLE@@-ld: Gilbraltar wrapper for 'ld'. +# Generated by configure.sh at build time. +# +# Passes through to @@CONFIG_TARGET_LD@ for actual work. Defines all flags +# required for correct operation when linking code intended for inclusion in a +# Gilbraltar operating system. +# +# Provides a '-z gilbraltar-abi=ABI' option to select the RPi4 bindings to use +# if linking. No default for ABI is provided, as it is expected that a caller +# directly using 'ld' knows what they are doing. + +L="$(dirname $0)/../lib/@@CONFIG_TARGET_TRIPLE@@" +[ ! -d "${L}" ] && echo "$0: Could not determine library path" 1>&2 && exit 1 +# ld accepts -z gilbraltar-abi=ABI, but does not provide a default ABI +# this is intentional +B= +Z= +for arg do + shift + if [ -n "${Z}" ]; then + # handle -z linker-arg + Z= + case "$arg" in + gilbraltar-abi=*) + B="${arg##*=}" + continue + ;; + *) + set -- "$@" "-z" "$arg" + continue + ;; + esac + fi + + case "$arg" in + -z) + if [ -z "${Z}" ]; then + Z=1 + continue + fi + ;; + esac + set -- "$@" "$arg" +done +[ -n "${B}" ] && B="-T $gilbraltar.{B}.ld -lgilbraltar.${B}" +[ -n "${__V}" ] && set -x +exec @@CONFIG_TARGET_LD@@ \ + @@CONFIG_TARGET_LD_LDFLAGS@@ \ + -nostdlib \ + -L ${L} \ + -static \ + ${B} \ + "$@" diff --git a/toolchain/nm.in b/toolchain/nm.in new file mode 100644 index 0000000..0a0e59f --- /dev/null +++ b/toolchain/nm.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_NM@@ "$@" diff --git a/toolchain/objcopy.in b/toolchain/objcopy.in new file mode 100644 index 0000000..5b4f3c3 --- /dev/null +++ b/toolchain/objcopy.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_OBJCOPY@@ "$@" diff --git a/toolchain/objdump.in b/toolchain/objdump.in new file mode 100644 index 0000000..40769e8 --- /dev/null +++ b/toolchain/objdump.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_OBJDUMP@@ "$@" diff --git a/toolchain/ranlib.in b/toolchain/ranlib.in new file mode 100644 index 0000000..90db357 --- /dev/null +++ b/toolchain/ranlib.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_RANLIB@@ "$@" diff --git a/toolchain/readelf.in b/toolchain/readelf.in new file mode 100644 index 0000000..b236a16 --- /dev/null +++ b/toolchain/readelf.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_READELF@@ "$@" diff --git a/toolchain/strip.in b/toolchain/strip.in new file mode 100644 index 0000000..dad08a4 --- /dev/null +++ b/toolchain/strip.in @@ -0,0 +1,2 @@ +#!/bin/sh +exec @@CONFIG_TARGET_STRIP@@ "$@"