smol-gilbraltar/patches/5.2.1/0012-WIP-Add-a-Makefile.cross-for-recipes-to-build-a-cros.patch
2025-01-02 12:16:39 +01:00

122 lines
4.8 KiB
Diff

From 4ab2e100f97da1a4251137dfaf473af705f0274f Mon Sep 17 00:00:00 2001
From: Samuel Hym <samuel@tarides.com>
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