From 67b2e7afa8a6d9009ead714a6eee66cb1760961a Mon Sep 17 00:00:00 2001
From: Frank Hunleth <fhunleth@troodon-software.com>
Date: Tue, 11 Sep 2018 12:28:41 -0400
Subject: [PATCH] erlang: support OTP 21 - 28

This also adds the deterministic compile flag patch for OTP 21-24. On
OTP 26+, it enables the configuration option for deterministic
builds.

Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
---
 ...truct-libatomic_ops-we-do-require-CA.patch | 70 +++++++++++++++++
 ...ulator-reorder-inclued-headers-paths.patch | 46 +++++++++++
 ...-with-LDLIBS-instead-of-LIBS-for-DED.patch | 42 ++++++++++
 ...4-erlang-enable-deterministic-builds.patch | 28 +++++++
 ...truct-libatomic_ops-we-do-require-CA.patch | 71 +++++++++++++++++
 ...ulator-reorder-inclued-headers-paths.patch | 49 ++++++++++++
 ...3-erlang-enable-deterministic-builds.patch | 28 +++++++
 ...-update-df-call-to-work-with-Busybox.patch | 28 +++++++
 ...truct-libatomic_ops-we-do-require-CA.patch | 71 +++++++++++++++++
 ...ulator-reorder-inclued-headers-paths.patch | 49 ++++++++++++
 ...3-erlang-enable-deterministic-builds.patch | 28 +++++++
 ...-update-df-call-to-work-with-Busybox.patch | 28 +++++++
 ...truct-libatomic_ops-we-do-require-CA.patch | 71 +++++++++++++++++
 ...ulator-reorder-inclued-headers-paths.patch | 49 ++++++++++++
 ...3-erlang-enable-deterministic-builds.patch | 28 +++++++
 ...-update-df-call-to-work-with-Busybox.patch | 28 +++++++
 ...ulator-reorder-inclued-headers-paths.patch | 49 ++++++++++++
 ...-update-df-call-to-work-with-Busybox.patch | 28 +++++++
 ...-update-df-call-to-work-with-Busybox.patch | 77 +++++++++++++++++++
 .../0002-erlang-libei-arch-compile.patch      | 31 ++++++++
 ...-update-df-call-to-work-with-Busybox.patch | 77 +++++++++++++++++++
 ...-update-df-call-to-work-with-Busybox.patch | 57 ++++++++++++++
 package/erlang/Config.in                      | 52 +++++++++++++
 package/erlang/erlang.hash                    | 18 ++++-
 package/erlang/erlang.mk                      | 43 ++++++++++-
 25 files changed, 1143 insertions(+), 3 deletions(-)
 create mode 100644 package/erlang/21.3.8.24/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
 create mode 100644 package/erlang/21.3.8.24/0002-erts-emulator-reorder-inclued-headers-paths.patch
 create mode 100644 package/erlang/21.3.8.24/0003-Link-with-LDLIBS-instead-of-LIBS-for-DED.patch
 create mode 100644 package/erlang/21.3.8.24/0004-erlang-enable-deterministic-builds.patch
 create mode 100644 package/erlang/22.3.4.26/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
 create mode 100644 package/erlang/22.3.4.26/0002-erts-emulator-reorder-inclued-headers-paths.patch
 create mode 100644 package/erlang/22.3.4.26/0003-erlang-enable-deterministic-builds.patch
 create mode 100644 package/erlang/22.3.4.26/0004-disksup-update-df-call-to-work-with-Busybox.patch
 create mode 100644 package/erlang/23.3.4.14/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
 create mode 100644 package/erlang/23.3.4.14/0002-erts-emulator-reorder-inclued-headers-paths.patch
 create mode 100644 package/erlang/23.3.4.14/0003-erlang-enable-deterministic-builds.patch
 create mode 100644 package/erlang/23.3.4.14/0004-disksup-update-df-call-to-work-with-Busybox.patch
 create mode 100644 package/erlang/24.3.2/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
 create mode 100644 package/erlang/24.3.2/0002-erts-emulator-reorder-inclued-headers-paths.patch
 create mode 100644 package/erlang/24.3.2/0003-erlang-enable-deterministic-builds.patch
 create mode 100644 package/erlang/24.3.2/0004-disksup-update-df-call-to-work-with-Busybox.patch
 create mode 100644 package/erlang/25.3.2/0001-erts-emulator-reorder-inclued-headers-paths.patch
 create mode 100644 package/erlang/25.3.2/0003-disksup-update-df-call-to-work-with-Busybox.patch
 create mode 100644 package/erlang/26.2.5/0001-disksup-update-df-call-to-work-with-Busybox.patch
 create mode 100644 package/erlang/26.2.5/0002-erlang-libei-arch-compile.patch
 create mode 100644 package/erlang/27.3.4.3/0001-disksup-update-df-call-to-work-with-Busybox.patch
 create mode 100644 package/erlang/28.4.1/0001-disksup-update-df-call-to-work-with-Busybox.patch

diff --git a/package/erlang/21.3.8.24/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch b/package/erlang/21.3.8.24/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
new file mode 100644
index 0000000000..8e401430fe
--- /dev/null
+++ b/package/erlang/21.3.8.24/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
@@ -0,0 +1,70 @@
+From 439fa2eae78a8900bda120072335be19d626498c Mon Sep 17 00:00:00 2001
+From: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Date: Sun, 28 Dec 2014 23:39:40 +0100
+Subject: [PATCH] erts/ethread: instruct libatomic_ops we do require CAS
+
+We do require compare-and-swap (CAS), so we must instruct libatomic_ops
+to provide it, even if the architecture does not have instructions for
+it.
+
+For example, on ARM, LDREX is required for fast CAS. But LDREX is only
+available on ARMv6, so by default libatomic_ops will not have CAS for
+anything below, like ARMv5. But ARMv5 is always UP, so using an
+emulated CAS (that is signal-asyn-safe) is still possible (albeit much
+slower).
+
+Tell libatomic_ops to provide CAS, even if the hardware is not capable
+of it, by using emulated CAS, as per libatomic_ops dosc:
+    https://github.com/ivmai/libatomic_ops/blob/master/doc/README.txt#L28
+
+    If this is included after defining AO_REQUIRE_CAS, then the package
+    will make an attempt to emulate compare-and-swap in a way that (at
+    least on Linux) should still be async-signal-safe.
+
+Thanks go to Thomas for all this insight! :-)
+Thanks go to Frank for reporting the issue! :-)
+
+Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Cc: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ erts/include/internal/libatomic_ops/ethread.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/erts/include/internal/libatomic_ops/ethread.h b/erts/include/internal/libatomic_ops/ethread.h
+index d65ee19..71d3598 100644
+--- a/erts/include/internal/libatomic_ops/ethread.h
++++ b/erts/include/internal/libatomic_ops/ethread.h
+@@ -35,6 +35,7 @@
+ 
+ #define ETHR_NATIVE_IMPL__ "libatomic_ops"
+ 
++#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+ #include "ethr_membar.h"
+ #include "ethr_atomic.h"
+diff --git a/erts/aclocal.m4 b/erts/aclocal.m4
+index d65ee19..71d3598 100644
+--- a/erts/aclocal.m4
++++ b/erts/aclocal.m4
+@@ -1414,7 +1414,8 @@
+ 	    	    fi;;
+ 	    esac
+ 	    ethr_have_libatomic_ops=no
+-	    AC_TRY_LINK([#include "atomic_ops.h"],
++	    AC_TRY_LINK([#define AO_REQUIRE_CAS
++                    #include "atomic_ops.h"],
+ 	    	        [
+ 	    	    	    volatile AO_t x;
+ 	    	    	    AO_t y;
+@@ -1455,6 +1455,7 @@
+ 	        AC_CHECK_SIZEOF(AO_t, ,
+ 	    	    	        [
+ 	    	    	    	    #include <stdio.h>
++	    	    	    	    #define AO_REQUIRE_CAS
+ 	    	    	    	    #include "atomic_ops.h"
+ 	    	    	        ])
+ 	        AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used])
+-- 
+1.9.1
+
diff --git a/package/erlang/21.3.8.24/0002-erts-emulator-reorder-inclued-headers-paths.patch b/package/erlang/21.3.8.24/0002-erts-emulator-reorder-inclued-headers-paths.patch
new file mode 100644
index 0000000000..7a6e469dff
--- /dev/null
+++ b/package/erlang/21.3.8.24/0002-erts-emulator-reorder-inclued-headers-paths.patch
@@ -0,0 +1,46 @@
+From 85a3e5b4f65e5284e59dcdd90e92ea7d50ef6907 Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@openwide.fr>
+Date: Sun, 8 Feb 2015 17:23:13 +0100
+Subject: [PATCH] erts/emulator: reorder inclued headers paths
+
+If the Perl Compatible Regular Expressions is installed on the
+host and the path to the headers is added to the CFLAGS, the
+pcre.h from the host is used instead of the one provided by
+erlang.
+
+Erlang use an old version of this file which is incompatible
+with the upstream one.
+
+Move INCLUDES before CFLAGS to use pcre.h from erlang.
+
+http://autobuild.buildroot.net/results/cbd/cbd8b54eef535f19d7d400fd269af1b3571d6143/build-end.log
+
+Signed-off-by: Romain Naour <romain.naour@openwide.fr>
+[Bernd: rebased for erlang-21.0]
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+---
+ erts/emulator/Makefile.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
+index 7145824..d079487 100644
+--- a/erts/emulator/Makefile.in
++++ b/erts/emulator/Makefile.in
+@@ -712,7 +712,7 @@
+ # Usually the same as the default rule, but certain platforms (e.g. win32) mix
+ # different compilers
+ $(OBJDIR)/beam_emu.o: beam/beam_emu.c
+-	$(V_EMU_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_EMU_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/beam_emu.S: beam/beam_emu.c
+ 	$(V_EMU_CC) -S -fverbose-asm $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+@@ -765,7 +765,7 @@
+ # General targets
+ #
+ $(OBJDIR)/%.o: beam/%.c
+-	$(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/%.o: $(TARGET)/%.c
+ 	$(V_CC) $(CFLAGS) $(INCLUDES) -Idrivers/common -c $< -o $@
diff --git a/package/erlang/21.3.8.24/0003-Link-with-LDLIBS-instead-of-LIBS-for-DED.patch b/package/erlang/21.3.8.24/0003-Link-with-LDLIBS-instead-of-LIBS-for-DED.patch
new file mode 100644
index 0000000000..ad0bb6b453
--- /dev/null
+++ b/package/erlang/21.3.8.24/0003-Link-with-LDLIBS-instead-of-LIBS-for-DED.patch
@@ -0,0 +1,42 @@
+From 011752ec7b31e3dde376270fc65c7ee70644f6e7 Mon Sep 17 00:00:00 2001
+From: Johan Oudinet <johan.oudinet@gmail.com>
+Date: Wed, 6 Dec 2017 15:01:17 +0100
+Subject: [PATCH] Link with LDLIBS instead of LIBS for DED
+
+Fix ERL-529 by avoiding to link with libz for no reason.
+
+Signed-off-by: Johan Oudinet <johan.oudinet@gmail.com>
+---
+ lib/asn1/c_src/Makefile             | 2 +-
+ lib/runtime_tools/c_src/Makefile.in | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/asn1/c_src/Makefile b/lib/asn1/c_src/Makefile
+index 1f714df357..f7c6b8b9bc 100644
+--- a/lib/asn1/c_src/Makefile
++++ b/lib/asn1/c_src/Makefile
+@@ -126,7 +126,7 @@ $(NIF_LIB_FILE): $(NIF_STATIC_OBJ_FILES)
+ 	$(V_RANLIB) $@
+ 
+ $(NIF_SHARED_OBJ_FILE): $(NIF_OBJ_FILES)
+-	$(V_LD) $(LDFLAGS) -o $(NIF_SHARED_OBJ_FILE) $(NIF_OBJ_FILES) $(CLIB_FLAGS) $(LIBS)
++	$(V_LD) $(LDFLAGS) -o $(NIF_SHARED_OBJ_FILE) $(NIF_OBJ_FILES) $(CLIB_FLAGS) $(LDLIBS)
+ 
+ # ----------------------------------------------------
+ # Release Target
+diff --git a/lib/runtime_tools/c_src/Makefile.in b/lib/runtime_tools/c_src/Makefile.in
+index 4530a83aee..4e13e0d789 100644
+--- a/lib/runtime_tools/c_src/Makefile.in
++++ b/lib/runtime_tools/c_src/Makefile.in
+@@ -95,7 +95,7 @@ $(OBJDIR)/%$(TYPEMARKER).o: %.c dyntrace_lttng.h
+ 	$(V_CC) -c -o $@ $(ALL_CFLAGS) $<
+ 
+ $(LIBDIR)/%$(TYPEMARKER).@DED_EXT@: $(OBJDIR)/%$(TYPEMARKER).o
+-	$(V_LD) $(LDFLAGS) -o $@ $^ $(LIBS)
++	$(V_LD) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+ 
+ clean:
+ 	rm -f $(TRACE_LIBS)
+-- 
+2.14.1
+
diff --git a/package/erlang/21.3.8.24/0004-erlang-enable-deterministic-builds.patch b/package/erlang/21.3.8.24/0004-erlang-enable-deterministic-builds.patch
new file mode 100644
index 0000000000..1a7e66eca5
--- /dev/null
+++ b/package/erlang/21.3.8.24/0004-erlang-enable-deterministic-builds.patch
@@ -0,0 +1,28 @@
+From 3e357a561042db278d77a6da04623af5e238cecc Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Thu, 21 Mar 2019 20:49:54 -0400
+Subject: [PATCH] erlang: enable deterministic builds
+
+This adds the `+deterministic` compiler flag to the `erlc` calls to
+strip out absolute paths in compiled `.beam` files.
+
+Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ make/otp.mk.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/make/otp.mk.in b/make/otp.mk.in
+index fb573680c8..24acd87549 100644
+--- a/make/otp.mk.in
++++ b/make/otp.mk.in
+@@ -108,6 +108,7 @@ ifdef BOOTSTRAP
+ else
+   ERL_COMPILE_FLAGS += +debug_info
+ endif
++ERL_COMPILE_FLAGS += +deterministic
+ ERLC_WFLAGS = -W
+ ERLC = erlc $(ERLC_WFLAGS) $(ERLC_FLAGS)
+ ERL = erl -boot start_clean
+-- 
+2.17.1
+
diff --git a/package/erlang/22.3.4.26/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch b/package/erlang/22.3.4.26/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
new file mode 100644
index 0000000000..4d3dd75ce2
--- /dev/null
+++ b/package/erlang/22.3.4.26/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
@@ -0,0 +1,71 @@
+From 7040c252fb45e5423512094a1c9ca4a0a8fc77f0 Mon Sep 17 00:00:00 2001
+From: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Date: Sun, 28 Dec 2014 23:39:40 +0100
+Subject: [PATCH] erts/ethread: instruct libatomic_ops we do require CAS
+
+We do require compare-and-swap (CAS), so we must instruct libatomic_ops
+to provide it, even if the architecture does not have instructions for
+it.
+
+For example, on ARM, LDREX is required for fast CAS. But LDREX is only
+available on ARMv6, so by default libatomic_ops will not have CAS for
+anything below, like ARMv5. But ARMv5 is always UP, so using an
+emulated CAS (that is signal-asyn-safe) is still possible (albeit much
+slower).
+
+Tell libatomic_ops to provide CAS, even if the hardware is not capable
+of it, by using emulated CAS, as per libatomic_ops dosc:
+    https://github.com/ivmai/libatomic_ops/blob/master/doc/README.txt#L28
+
+    If this is included after defining AO_REQUIRE_CAS, then the package
+    will make an attempt to emulate compare-and-swap in a way that (at
+    least on Linux) should still be async-signal-safe.
+
+Thanks go to Thomas for all this insight! :-)
+Thanks go to Frank for reporting the issue! :-)
+
+Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Cc: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ erts/aclocal.m4                               | 4 +++-
+ erts/include/internal/libatomic_ops/ethread.h | 1 +
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/erts/aclocal.m4 b/erts/aclocal.m4
+index 0ca2755802..a1843dbc40 100644
+--- a/erts/aclocal.m4
++++ b/erts/aclocal.m4
+@@ -1978,7 +1978,8 @@ case "$THR_LIB_NAME" in
+ 	    	    fi;;
+ 	    esac
+ 	    ethr_have_libatomic_ops=no
+-	    AC_TRY_LINK([#include "atomic_ops.h"],
++	    AC_TRY_LINK([#define AO_REQUIRE_CAS
++                    #include "atomic_ops.h"],
+ 	    	        [
+ 	    	    	    volatile AO_t x;
+ 	    	    	    AO_t y;
+@@ -2019,6 +2020,7 @@ case "$THR_LIB_NAME" in
+ 	        AC_CHECK_SIZEOF(AO_t, ,
+ 	    	    	        [
+ 	    	    	    	    #include <stdio.h>
++	    	    	    	    #define AO_REQUIRE_CAS
+ 	    	    	    	    #include "atomic_ops.h"
+ 	    	    	        ])
+ 	        AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used])
+diff --git a/erts/include/internal/libatomic_ops/ethread.h b/erts/include/internal/libatomic_ops/ethread.h
+index 4adc31ed2a..18cc22a8ad 100644
+--- a/erts/include/internal/libatomic_ops/ethread.h
++++ b/erts/include/internal/libatomic_ops/ethread.h
+@@ -36,6 +36,7 @@
+ 
+ #define ETHR_NATIVE_IMPL__ "libatomic_ops"
+ 
++#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+ #include "ethr_membar.h"
+ #include "ethr_atomic.h"
+-- 
+2.17.1
+
diff --git a/package/erlang/22.3.4.26/0002-erts-emulator-reorder-inclued-headers-paths.patch b/package/erlang/22.3.4.26/0002-erts-emulator-reorder-inclued-headers-paths.patch
new file mode 100644
index 0000000000..7f2585870a
--- /dev/null
+++ b/package/erlang/22.3.4.26/0002-erts-emulator-reorder-inclued-headers-paths.patch
@@ -0,0 +1,49 @@
+From 2142338c7a82360087a21dc71cfdad777d43e6a8 Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@openwide.fr>
+Date: Sun, 8 Feb 2015 17:23:13 +0100
+Subject: [PATCH] erts/emulator: reorder inclued headers paths
+
+If the Perl Compatible Regular Expressions is installed on the
+host and the path to the headers is added to the CFLAGS, the
+pcre.h from the host is used instead of the one provided by
+erlang.
+
+Erlang use an old version of this file which is incompatible
+with the upstream one.
+
+Move INCLUDES before CFLAGS to use pcre.h from erlang.
+
+http://autobuild.buildroot.net/results/cbd/cbd8b54eef535f19d7d400fd269af1b3571d6143/build-end.log
+
+Signed-off-by: Romain Naour <romain.naour@openwide.fr>
+[Bernd: rebased for erlang-21.0]
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+---
+ erts/emulator/Makefile.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
+index a9f3bb8e89..e6eb231b37 100644
+--- a/erts/emulator/Makefile.in
++++ b/erts/emulator/Makefile.in
+@@ -725,7 +725,7 @@ endif
+ # Usually the same as the default rule, but certain platforms (e.g. win32) mix
+ # different compilers
+ $(OBJDIR)/beam_emu.o: beam/beam_emu.c
+-	$(V_EMU_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_EMU_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/beam_emu.S: beam/beam_emu.c
+ 	$(V_EMU_CC) -S -fverbose-asm $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+@@ -778,7 +778,7 @@ endif
+ # General targets
+ #
+ $(OBJDIR)/%.o: beam/%.c
+-	$(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/%.o: $(TARGET)/%.c
+ 	$(V_CC) $(CFLAGS) $(INCLUDES) -Idrivers/common -c $< -o $@
+-- 
+2.17.1
+
diff --git a/package/erlang/22.3.4.26/0003-erlang-enable-deterministic-builds.patch b/package/erlang/22.3.4.26/0003-erlang-enable-deterministic-builds.patch
new file mode 100644
index 0000000000..043c6f48c6
--- /dev/null
+++ b/package/erlang/22.3.4.26/0003-erlang-enable-deterministic-builds.patch
@@ -0,0 +1,28 @@
+From fed869414aa22aeea1c6e971a0600df3d5d0077e Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Thu, 21 Mar 2019 20:49:54 -0400
+Subject: [PATCH] erlang: enable deterministic builds
+
+This adds the `+deterministic` compiler flag to the `erlc` calls to
+strip out absolute paths in compiled `.beam` files.
+
+Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ make/otp.mk.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/make/otp.mk.in b/make/otp.mk.in
+index 63748c2f2b..c31cbfe971 100644
+--- a/make/otp.mk.in
++++ b/make/otp.mk.in
+@@ -114,6 +114,7 @@ ifeq ($(USE_ESOCK),yes)
+ ERL_COMPILE_FLAGS += -DUSE_ESOCK=true
+ endif
+ 
++ERL_COMPILE_FLAGS += +deterministic
+ ERLC_WFLAGS = -W
+ ERLC = erlc $(ERLC_WFLAGS) $(ERLC_FLAGS)
+ ERL = erl -boot start_clean
+-- 
+2.17.1
+
diff --git a/package/erlang/22.3.4.26/0004-disksup-update-df-call-to-work-with-Busybox.patch b/package/erlang/22.3.4.26/0004-disksup-update-df-call-to-work-with-Busybox.patch
new file mode 100644
index 0000000000..9f98c4ad82
--- /dev/null
+++ b/package/erlang/22.3.4.26/0004-disksup-update-df-call-to-work-with-Busybox.patch
@@ -0,0 +1,28 @@
+From 46b36f8b73b65b2697ec0fb499dd4af610e9ddd9 Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Tue, 5 May 2020 21:19:01 -0400
+Subject: [PATCH] disksup: update df call to work with Busybox
+
+Busybox's df doesn't support `-x` and `-l` and this removes those
+options. Plus SquashFS filesystems are nice to view on Nerves so we
+don't want to exclude them anyway.
+---
+ lib/os_mon/src/disksup.erl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
+index 4253067c90..971c017e14 100644
+--- a/lib/os_mon/src/disksup.erl
++++ b/lib/os_mon/src/disksup.erl
+@@ -264,7 +264,7 @@ check_disk_space({unix, irix}, Port, Threshold) ->
+     Result = my_cmd("/usr/sbin/df -lk",Port),
+     check_disks_irix(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, linux}, Port, Threshold) ->
+-    Result = my_cmd("/bin/df -lk -x squashfs", Port),
++    Result = my_cmd("/bin/df -k", Port),
+     check_disks_solaris(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, posix}, Port, Threshold) ->
+     Result = my_cmd("df -k -P", Port),
+-- 
+2.20.1
+
diff --git a/package/erlang/23.3.4.14/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch b/package/erlang/23.3.4.14/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
new file mode 100644
index 0000000000..4d3dd75ce2
--- /dev/null
+++ b/package/erlang/23.3.4.14/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
@@ -0,0 +1,71 @@
+From 7040c252fb45e5423512094a1c9ca4a0a8fc77f0 Mon Sep 17 00:00:00 2001
+From: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Date: Sun, 28 Dec 2014 23:39:40 +0100
+Subject: [PATCH] erts/ethread: instruct libatomic_ops we do require CAS
+
+We do require compare-and-swap (CAS), so we must instruct libatomic_ops
+to provide it, even if the architecture does not have instructions for
+it.
+
+For example, on ARM, LDREX is required for fast CAS. But LDREX is only
+available on ARMv6, so by default libatomic_ops will not have CAS for
+anything below, like ARMv5. But ARMv5 is always UP, so using an
+emulated CAS (that is signal-asyn-safe) is still possible (albeit much
+slower).
+
+Tell libatomic_ops to provide CAS, even if the hardware is not capable
+of it, by using emulated CAS, as per libatomic_ops dosc:
+    https://github.com/ivmai/libatomic_ops/blob/master/doc/README.txt#L28
+
+    If this is included after defining AO_REQUIRE_CAS, then the package
+    will make an attempt to emulate compare-and-swap in a way that (at
+    least on Linux) should still be async-signal-safe.
+
+Thanks go to Thomas for all this insight! :-)
+Thanks go to Frank for reporting the issue! :-)
+
+Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Cc: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ erts/aclocal.m4                               | 4 +++-
+ erts/include/internal/libatomic_ops/ethread.h | 1 +
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/erts/aclocal.m4 b/erts/aclocal.m4
+index 0ca2755802..a1843dbc40 100644
+--- a/erts/aclocal.m4
++++ b/erts/aclocal.m4
+@@ -1978,7 +1978,8 @@ case "$THR_LIB_NAME" in
+ 	    	    fi;;
+ 	    esac
+ 	    ethr_have_libatomic_ops=no
+-	    AC_TRY_LINK([#include "atomic_ops.h"],
++	    AC_TRY_LINK([#define AO_REQUIRE_CAS
++                    #include "atomic_ops.h"],
+ 	    	        [
+ 	    	    	    volatile AO_t x;
+ 	    	    	    AO_t y;
+@@ -2019,6 +2020,7 @@ case "$THR_LIB_NAME" in
+ 	        AC_CHECK_SIZEOF(AO_t, ,
+ 	    	    	        [
+ 	    	    	    	    #include <stdio.h>
++	    	    	    	    #define AO_REQUIRE_CAS
+ 	    	    	    	    #include "atomic_ops.h"
+ 	    	    	        ])
+ 	        AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used])
+diff --git a/erts/include/internal/libatomic_ops/ethread.h b/erts/include/internal/libatomic_ops/ethread.h
+index 4adc31ed2a..18cc22a8ad 100644
+--- a/erts/include/internal/libatomic_ops/ethread.h
++++ b/erts/include/internal/libatomic_ops/ethread.h
+@@ -36,6 +36,7 @@
+ 
+ #define ETHR_NATIVE_IMPL__ "libatomic_ops"
+ 
++#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+ #include "ethr_membar.h"
+ #include "ethr_atomic.h"
+-- 
+2.17.1
+
diff --git a/package/erlang/23.3.4.14/0002-erts-emulator-reorder-inclued-headers-paths.patch b/package/erlang/23.3.4.14/0002-erts-emulator-reorder-inclued-headers-paths.patch
new file mode 100644
index 0000000000..7f2585870a
--- /dev/null
+++ b/package/erlang/23.3.4.14/0002-erts-emulator-reorder-inclued-headers-paths.patch
@@ -0,0 +1,49 @@
+From 2142338c7a82360087a21dc71cfdad777d43e6a8 Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@openwide.fr>
+Date: Sun, 8 Feb 2015 17:23:13 +0100
+Subject: [PATCH] erts/emulator: reorder inclued headers paths
+
+If the Perl Compatible Regular Expressions is installed on the
+host and the path to the headers is added to the CFLAGS, the
+pcre.h from the host is used instead of the one provided by
+erlang.
+
+Erlang use an old version of this file which is incompatible
+with the upstream one.
+
+Move INCLUDES before CFLAGS to use pcre.h from erlang.
+
+http://autobuild.buildroot.net/results/cbd/cbd8b54eef535f19d7d400fd269af1b3571d6143/build-end.log
+
+Signed-off-by: Romain Naour <romain.naour@openwide.fr>
+[Bernd: rebased for erlang-21.0]
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+---
+ erts/emulator/Makefile.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
+index a9f3bb8e89..e6eb231b37 100644
+--- a/erts/emulator/Makefile.in
++++ b/erts/emulator/Makefile.in
+@@ -725,7 +725,7 @@ endif
+ # Usually the same as the default rule, but certain platforms (e.g. win32) mix
+ # different compilers
+ $(OBJDIR)/beam_emu.o: beam/beam_emu.c
+-	$(V_EMU_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_EMU_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/beam_emu.S: beam/beam_emu.c
+ 	$(V_EMU_CC) -S -fverbose-asm $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+@@ -778,7 +778,7 @@ endif
+ # General targets
+ #
+ $(OBJDIR)/%.o: beam/%.c
+-	$(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/%.o: $(TARGET)/%.c
+ 	$(V_CC) $(CFLAGS) $(INCLUDES) -Idrivers/common -c $< -o $@
+-- 
+2.17.1
+
diff --git a/package/erlang/23.3.4.14/0003-erlang-enable-deterministic-builds.patch b/package/erlang/23.3.4.14/0003-erlang-enable-deterministic-builds.patch
new file mode 100644
index 0000000000..043c6f48c6
--- /dev/null
+++ b/package/erlang/23.3.4.14/0003-erlang-enable-deterministic-builds.patch
@@ -0,0 +1,28 @@
+From fed869414aa22aeea1c6e971a0600df3d5d0077e Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Thu, 21 Mar 2019 20:49:54 -0400
+Subject: [PATCH] erlang: enable deterministic builds
+
+This adds the `+deterministic` compiler flag to the `erlc` calls to
+strip out absolute paths in compiled `.beam` files.
+
+Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ make/otp.mk.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/make/otp.mk.in b/make/otp.mk.in
+index 63748c2f2b..c31cbfe971 100644
+--- a/make/otp.mk.in
++++ b/make/otp.mk.in
+@@ -114,6 +114,7 @@ ifeq ($(USE_ESOCK),yes)
+ ERL_COMPILE_FLAGS += -DUSE_ESOCK=true
+ endif
+ 
++ERL_COMPILE_FLAGS += +deterministic
+ ERLC_WFLAGS = -W
+ ERLC = erlc $(ERLC_WFLAGS) $(ERLC_FLAGS)
+ ERL = erl -boot start_clean
+-- 
+2.17.1
+
diff --git a/package/erlang/23.3.4.14/0004-disksup-update-df-call-to-work-with-Busybox.patch b/package/erlang/23.3.4.14/0004-disksup-update-df-call-to-work-with-Busybox.patch
new file mode 100644
index 0000000000..9f98c4ad82
--- /dev/null
+++ b/package/erlang/23.3.4.14/0004-disksup-update-df-call-to-work-with-Busybox.patch
@@ -0,0 +1,28 @@
+From 46b36f8b73b65b2697ec0fb499dd4af610e9ddd9 Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Tue, 5 May 2020 21:19:01 -0400
+Subject: [PATCH] disksup: update df call to work with Busybox
+
+Busybox's df doesn't support `-x` and `-l` and this removes those
+options. Plus SquashFS filesystems are nice to view on Nerves so we
+don't want to exclude them anyway.
+---
+ lib/os_mon/src/disksup.erl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
+index 4253067c90..971c017e14 100644
+--- a/lib/os_mon/src/disksup.erl
++++ b/lib/os_mon/src/disksup.erl
+@@ -264,7 +264,7 @@ check_disk_space({unix, irix}, Port, Threshold) ->
+     Result = my_cmd("/usr/sbin/df -lk",Port),
+     check_disks_irix(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, linux}, Port, Threshold) ->
+-    Result = my_cmd("/bin/df -lk -x squashfs", Port),
++    Result = my_cmd("/bin/df -k", Port),
+     check_disks_solaris(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, posix}, Port, Threshold) ->
+     Result = my_cmd("df -k -P", Port),
+-- 
+2.20.1
+
diff --git a/package/erlang/24.3.2/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch b/package/erlang/24.3.2/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
new file mode 100644
index 0000000000..c5d83b2b36
--- /dev/null
+++ b/package/erlang/24.3.2/0001-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
@@ -0,0 +1,71 @@
+From 2400947f3af66fbf39be86719ed03b1867d1423e Mon Sep 17 00:00:00 2001
+From: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Date: Sun, 28 Dec 2014 23:39:40 +0100
+Subject: [PATCH] erts/ethread: instruct libatomic_ops we do require CAS
+
+We do require compare-and-swap (CAS), so we must instruct libatomic_ops
+to provide it, even if the architecture does not have instructions for
+it.
+
+For example, on ARM, LDREX is required for fast CAS. But LDREX is only
+available on ARMv6, so by default libatomic_ops will not have CAS for
+anything below, like ARMv5. But ARMv5 is always UP, so using an
+emulated CAS (that is signal-asyn-safe) is still possible (albeit much
+slower).
+
+Tell libatomic_ops to provide CAS, even if the hardware is not capable
+of it, by using emulated CAS, as per libatomic_ops dosc:
+    https://github.com/ivmai/libatomic_ops/blob/master/doc/README.txt#L28
+
+    If this is included after defining AO_REQUIRE_CAS, then the package
+    will make an attempt to emulate compare-and-swap in a way that (at
+    least on Linux) should still be async-signal-safe.
+
+Thanks go to Thomas for all this insight! :-)
+Thanks go to Frank for reporting the issue! :-)
+
+Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Cc: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ erts/aclocal.m4                               | 4 +++-
+ erts/include/internal/libatomic_ops/ethread.h | 1 +
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/erts/aclocal.m4 b/erts/aclocal.m4
+index 8317e3b10e..3063a80c5c 100644
+--- a/erts/aclocal.m4
++++ b/erts/aclocal.m4
+@@ -2019,7 +2019,8 @@ case "$THR_LIB_NAME" in
+ 	    	    fi;;
+ 	    esac
+ 	    ethr_have_libatomic_ops=no
+-	    AC_TRY_LINK([#include "atomic_ops.h"],
++	    AC_TRY_LINK([#define AO_REQUIRE_CAS
++                    #include "atomic_ops.h"],
+ 	    	        [
+ 	    	    	    volatile AO_t x;
+ 	    	    	    AO_t y;
+@@ -2060,6 +2061,7 @@ case "$THR_LIB_NAME" in
+ 	        AC_CHECK_SIZEOF(AO_t, ,
+ 	    	    	        [
+ 	    	    	    	    #include <stdio.h>
++	    	    	    	    #define AO_REQUIRE_CAS
+ 	    	    	    	    #include "atomic_ops.h"
+ 	    	    	        ])
+ 	        AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used])
+diff --git a/erts/include/internal/libatomic_ops/ethread.h b/erts/include/internal/libatomic_ops/ethread.h
+index 4adc31ed2a..18cc22a8ad 100644
+--- a/erts/include/internal/libatomic_ops/ethread.h
++++ b/erts/include/internal/libatomic_ops/ethread.h
+@@ -36,6 +36,7 @@
+ 
+ #define ETHR_NATIVE_IMPL__ "libatomic_ops"
+ 
++#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+ #include "ethr_membar.h"
+ #include "ethr_atomic.h"
+-- 
+2.25.1
+
diff --git a/package/erlang/24.3.2/0002-erts-emulator-reorder-inclued-headers-paths.patch b/package/erlang/24.3.2/0002-erts-emulator-reorder-inclued-headers-paths.patch
new file mode 100644
index 0000000000..e7106f71ee
--- /dev/null
+++ b/package/erlang/24.3.2/0002-erts-emulator-reorder-inclued-headers-paths.patch
@@ -0,0 +1,49 @@
+From 4c86188d052cd6150d171dec003523a85fdfef91 Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@openwide.fr>
+Date: Sun, 8 Feb 2015 17:23:13 +0100
+Subject: [PATCH] erts/emulator: reorder inclued headers paths
+
+If the Perl Compatible Regular Expressions is installed on the
+host and the path to the headers is added to the CFLAGS, the
+pcre.h from the host is used instead of the one provided by
+erlang.
+
+Erlang use an old version of this file which is incompatible
+with the upstream one.
+
+Move INCLUDES before CFLAGS to use pcre.h from erlang.
+
+http://autobuild.buildroot.net/results/cbd/cbd8b54eef535f19d7d400fd269af1b3571d6143/build-end.log
+
+Signed-off-by: Romain Naour <romain.naour@openwide.fr>
+[Bernd: rebased for erlang-21.0]
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+---
+ erts/emulator/Makefile.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
+index c3449c5f73..8e1c323ad8 100644
+--- a/erts/emulator/Makefile.in
++++ b/erts/emulator/Makefile.in
+@@ -800,7 +800,7 @@ endif
+ # Usually the same as the default rule, but certain platforms (e.g. win32) mix
+ # different compilers
+ $(OBJDIR)/beam_emu.o: beam/emu/beam_emu.c
+-	$(V_EMU_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_EMU_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/beam_emu.S: beam/emu/beam_emu.c
+ 	$(V_EMU_CC) -S -fverbose-asm $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+@@ -863,7 +863,7 @@ endif
+ # General targets
+ #
+ $(OBJDIR)/%.o: beam/%.c
+-	$(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/%.o: beam/emu/%.c
+ 	$(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+-- 
+2.25.1
+
diff --git a/package/erlang/24.3.2/0003-erlang-enable-deterministic-builds.patch b/package/erlang/24.3.2/0003-erlang-enable-deterministic-builds.patch
new file mode 100644
index 0000000000..0cfc5894dc
--- /dev/null
+++ b/package/erlang/24.3.2/0003-erlang-enable-deterministic-builds.patch
@@ -0,0 +1,28 @@
+From 70a045ba5286716bf1d4078d9a5adb061649d6ec Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Thu, 21 Mar 2019 20:49:54 -0400
+Subject: [PATCH] erlang: enable deterministic builds
+
+This adds the `+deterministic` compiler flag to the `erlc` calls to
+strip out absolute paths in compiled `.beam` files.
+
+Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ make/otp.mk.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/make/otp.mk.in b/make/otp.mk.in
+index 85bc49d2b0..312f358cf8 100644
+--- a/make/otp.mk.in
++++ b/make/otp.mk.in
+@@ -109,6 +109,7 @@ ifeq ($(USE_ESOCK),yes)
+ ERL_COMPILE_FLAGS += -DUSE_ESOCK=true
+ endif
+ 
++ERL_COMPILE_FLAGS += +deterministic
+ ERLC_WFLAGS = -W
+ ERLC = erlc $(ERLC_WFLAGS) $(ERLC_FLAGS)
+ ERL = erl -boot start_clean
+-- 
+2.25.1
+
diff --git a/package/erlang/24.3.2/0004-disksup-update-df-call-to-work-with-Busybox.patch b/package/erlang/24.3.2/0004-disksup-update-df-call-to-work-with-Busybox.patch
new file mode 100644
index 0000000000..beb1957d46
--- /dev/null
+++ b/package/erlang/24.3.2/0004-disksup-update-df-call-to-work-with-Busybox.patch
@@ -0,0 +1,28 @@
+From c7d4172745f7a0fdafeaafc2166f0db74e99a870 Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Tue, 5 May 2020 21:19:01 -0400
+Subject: [PATCH] disksup: update df call to work with Busybox
+
+Busybox's df doesn't support `-x` and `-l` and this removes those
+options. Plus SquashFS filesystems are nice to view on Nerves so we
+don't want to exclude them anyway.
+---
+ lib/os_mon/src/disksup.erl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
+index b85b7c854a..a83f2daad8 100644
+--- a/lib/os_mon/src/disksup.erl
++++ b/lib/os_mon/src/disksup.erl
+@@ -256,7 +256,7 @@ check_disk_space({unix, irix}, Port, Threshold) ->
+     check_disks_irix(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, linux}, Port, Threshold) ->
+     Df = find_cmd("df", "/bin"),
+-    Result = my_cmd(Df ++ " -lk -x squashfs", Port),
++    Result = my_cmd(Df ++ " -k", Port),
+     check_disks_solaris(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, posix}, Port, Threshold) ->
+     Result = my_cmd("df -k -P", Port),
+-- 
+2.25.1
+
diff --git a/package/erlang/25.3.2/0001-erts-emulator-reorder-inclued-headers-paths.patch b/package/erlang/25.3.2/0001-erts-emulator-reorder-inclued-headers-paths.patch
new file mode 100644
index 0000000000..069d69784e
--- /dev/null
+++ b/package/erlang/25.3.2/0001-erts-emulator-reorder-inclued-headers-paths.patch
@@ -0,0 +1,49 @@
+From fe9a45130bcf1fc80a15628fbf14bf5619d84c1a Mon Sep 17 00:00:00 2001
+From: Romain Naour <romain.naour@openwide.fr>
+Date: Sun, 8 Feb 2015 17:23:13 +0100
+Subject: [PATCH] erts/emulator: reorder inclued headers paths
+
+If the Perl Compatible Regular Expressions is installed on the
+host and the path to the headers is added to the CFLAGS, the
+pcre.h from the host is used instead of the one provided by
+erlang.
+
+Erlang use an old version of this file which is incompatible
+with the upstream one.
+
+Move INCLUDES before CFLAGS to use pcre.h from erlang.
+
+http://autobuild.buildroot.net/results/cbd/cbd8b54eef535f19d7d400fd269af1b3571d6143/build-end.log
+
+Signed-off-by: Romain Naour <romain.naour@openwide.fr>
+[Bernd: rebased for erlang-21.0]
+Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
+---
+ erts/emulator/Makefile.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
+index 606bfc013f..b86b4f2f6a 100644
+--- a/erts/emulator/Makefile.in
++++ b/erts/emulator/Makefile.in
+@@ -821,7 +821,7 @@ endif
+ # Usually the same as the default rule, but certain platforms (e.g. win32) mix
+ # different compilers
+ $(OBJDIR)/beam_emu.o: beam/emu/beam_emu.c
+-	$(V_EMU_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_EMU_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/beam_emu.S: beam/emu/beam_emu.c
+ 	$(V_EMU_CC) -S -fverbose-asm $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+@@ -884,7 +884,7 @@ endif
+ # General targets
+ #
+ $(OBJDIR)/%.o: beam/%.c
+-	$(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
++	$(V_CC) $(INCLUDES) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) -c $< -o $@
+ 
+ $(OBJDIR)/%.o: beam/emu/%.c
+ 	$(V_CC) $(subst -O2, $(GEN_OPT_FLGS), $(CFLAGS)) $(INCLUDES) -c $< -o $@
+-- 
+2.25.1
+
diff --git a/package/erlang/25.3.2/0003-disksup-update-df-call-to-work-with-Busybox.patch b/package/erlang/25.3.2/0003-disksup-update-df-call-to-work-with-Busybox.patch
new file mode 100644
index 0000000000..97f410b18c
--- /dev/null
+++ b/package/erlang/25.3.2/0003-disksup-update-df-call-to-work-with-Busybox.patch
@@ -0,0 +1,28 @@
+From 2275a2743b85c8915ff64d487cfe0fd1367424e8 Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Tue, 5 May 2020 21:19:01 -0400
+Subject: [PATCH] disksup: update df call to work with Busybox
+
+Busybox's df doesn't support `-x` and `-l` and this removes those
+options. Plus SquashFS filesystems are nice to view on Nerves so we
+don't want to exclude them anyway.
+---
+ lib/os_mon/src/disksup.erl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
+index 80f833bb49..4697b09c53 100644
+--- a/lib/os_mon/src/disksup.erl
++++ b/lib/os_mon/src/disksup.erl
+@@ -256,7 +256,7 @@ check_disk_space({unix, irix}, Port, Threshold) ->
+     check_disks_irix(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, linux}, Port, Threshold) ->
+     Df = find_cmd("df", "/bin"),
+-    Result = my_cmd(Df ++ " -lk -x squashfs", Port),
++    Result = my_cmd(Df ++ " -k", Port),
+     check_disks_solaris(skip_to_eol(Result), Threshold);
+ check_disk_space({unix, posix}, Port, Threshold) ->
+     Result = my_cmd("df -k -P", Port),
+-- 
+2.25.1
+
diff --git a/package/erlang/26.2.5/0001-disksup-update-df-call-to-work-with-Busybox.patch b/package/erlang/26.2.5/0001-disksup-update-df-call-to-work-with-Busybox.patch
new file mode 100644
index 0000000000..9cccce73ac
--- /dev/null
+++ b/package/erlang/26.2.5/0001-disksup-update-df-call-to-work-with-Busybox.patch
@@ -0,0 +1,77 @@
+From 59f0d61699350a6df661c838a502a566b1c02768 Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Tue, 5 May 2020 21:19:01 -0400
+Subject: [PATCH] disksup: update df call to work with Busybox
+
+Busybox's df doesn't support `-x` and `-l` and this removes those
+options. Plus SquashFS filesystems are nice to view on Nerves so we
+don't want to exclude them anyway.
+---
+ lib/os_mon/src/disksup.erl | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
+index 8df01f9eb9..06333ce83c 100644
+--- a/lib/os_mon/src/disksup.erl
++++ b/lib/os_mon/src/disksup.erl
+@@ -1,8 +1,8 @@
+ %%
+ %% %CopyrightBegin%
+-%% 
++%%
+ %% Copyright Ericsson AB 1996-2022. All Rights Reserved.
+-%% 
++%%
+ %% Licensed under the Apache License, Version 2.0 (the "License");
+ %% you may not use this file except in compliance with the License.
+ %% You may obtain a copy of the License at
+@@ -14,7 +14,7 @@
+ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ %% See the License for the specific language governing permissions and
+ %% limitations under the License.
+-%% 
++%%
+ %% %CopyrightEnd%
+ %%
+ -module(disksup).
+@@ -115,7 +115,7 @@ param_default(disksup_posix_only) -> false.
+ %% gen_server callbacks
+ %%----------------------------------------------------------------------
+ 
+-init([]) ->  
++init([]) ->
+     process_flag(trap_exit, true),
+     process_flag(priority, low),
+ 
+@@ -239,7 +239,7 @@ get_os(PosixOnly) ->
+ 
+ %%--Port handling functions---------------------------------------------
+ 
+-start_portprogram() -> 
++start_portprogram() ->
+     open_port({spawn, "sh -s disksup 2>&1"}, [stream]).
+ 
+ my_cmd(Cmd0, Port) ->
+@@ -250,8 +250,8 @@ my_cmd(Cmd0, Port) ->
+     get_reply(Port, []).
+ 
+ get_reply(Port, O) ->
+-    receive 
+-        {Port, {data, N}} -> 
++    receive
++        {Port, {data, N}} ->
+             case newline(N, O) of
+                 {ok, Str} -> Str;
+                 {more, Acc} -> get_reply(Port, Acc)
+@@ -287,7 +287,7 @@ run_df(Path, {unix, irix}, Port) ->
+     my_cmd("/usr/sbin/df -lk " ++ Path, Port);
+ run_df(Path, {unix, linux}, Port) ->
+     Df = find_cmd("df", "/bin"),
+-    my_cmd(Df ++ " -lk -x squashfs " ++ Path, Port);
++    my_cmd(Df ++ " -k" ++ Path, Port);
+ run_df(Path, {unix, posix}, Port) ->
+     my_cmd("df -k -P " ++ Path, Port);
+ run_df(Path, {unix, dragonfly}, Port) ->
+-- 
+2.34.1
+
diff --git a/package/erlang/26.2.5/0002-erlang-libei-arch-compile.patch b/package/erlang/26.2.5/0002-erlang-libei-arch-compile.patch
new file mode 100644
index 0000000000..5a3c729289
--- /dev/null
+++ b/package/erlang/26.2.5/0002-erlang-libei-arch-compile.patch
@@ -0,0 +1,31 @@
+From 442b23d9dd8d5d66fe70ceef31be7531ac75fa56 Mon Sep 17 00:00:00 2001
+From: Ray Chang <ray@rclabs.org>
+Date: Fri, 19 Apr 2024 00:47:58 +1000
+Subject: [PATCH] Fix for compilation errors due to libei naming conflicts.
+
+Signed-off-by: Ray Chang <ray@rclabs.org>
+---
+ lib/odbc/c_src/Makefile.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/lib/odbc/c_src/Makefile.in b/lib/odbc/c_src/Makefile.in
+index d1b26743a6..03ed314f6a 100644
+--- a/lib/odbc/c_src/Makefile.in
++++ b/lib/odbc/c_src/Makefile.in
+@@ -80,10 +80,10 @@ ODBC_INCLUDE = @ODBC_INCLUDE@
+ # ----------------------------------------------------
+ CC =  @CC@
+ CFLAGS = $(TYPEFLAGS) @CFLAGS@ @THR_DEFS@ @DEFS@
+-EI_LDFLAGS = -L$(EI_ROOT)/obj$(TYPEMARKER)/$(TARGET)
++EI_LDFLAGS = -L$(EI_ROOT)/obj$(TYPEMARKER)/$(TARGET) $(EI_LIB)
+ LD = @LD@
+-LDFLAGS =  $(ODBC_LIB) $(EI_LDFLAGS)
+-LIBS = @LIBS@ @THR_LIBS@ $(EI_LIB)
++LDFLAGS =  $(EI_LDFLAGS) $(ODBC_LIB)
++LIBS = @LIBS@ @THR_LIBS@
+ INCLUDES = -I. $(ODBC_INCLUDE) $(EI_INCLUDE)
+ TARGET_FLAGS =  @TARGET_FLAGS@
+
+--
+2.44.0
+
diff --git a/package/erlang/27.3.4.3/0001-disksup-update-df-call-to-work-with-Busybox.patch b/package/erlang/27.3.4.3/0001-disksup-update-df-call-to-work-with-Busybox.patch
new file mode 100644
index 0000000000..b621381b4c
--- /dev/null
+++ b/package/erlang/27.3.4.3/0001-disksup-update-df-call-to-work-with-Busybox.patch
@@ -0,0 +1,77 @@
+From e85fabb333c9c03bf8b69c6edf49413a57fd5e86 Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Tue, 5 May 2020 21:19:01 -0400
+Subject: [PATCH] disksup: update df call to work with Busybox
+
+Busybox's df doesn't support `-x` and `-l` and this removes those
+options. Plus SquashFS filesystems are nice to view on Nerves so we
+don't want to exclude them anyway.
+---
+ lib/os_mon/src/disksup.erl | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
+index 471b01d1b7..201bfd1289 100644
+--- a/lib/os_mon/src/disksup.erl
++++ b/lib/os_mon/src/disksup.erl
+@@ -1,8 +1,8 @@
+ %%
+ %% %CopyrightBegin%
+-%% 
++%%
+ %% Copyright Ericsson AB 1996-2024. All Rights Reserved.
+-%% 
++%%
+ %% Licensed under the Apache License, Version 2.0 (the "License");
+ %% you may not use this file except in compliance with the License.
+ %% You may obtain a copy of the License at
+@@ -14,7 +14,7 @@
+ %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ %% See the License for the specific language governing permissions and
+ %% limitations under the License.
+-%% 
++%%
+ %% %CopyrightEnd%
+ %%
+ -module(disksup).
+@@ -260,7 +260,7 @@ param_default(disksup_posix_only) -> false.
+ %%----------------------------------------------------------------------
+ 
+ -doc false.
+-init([]) ->  
++init([]) ->
+     process_flag(trap_exit, true),
+     process_flag(priority, low),
+ 
+@@ -390,7 +390,7 @@ get_os(PosixOnly) ->
+ 
+ %%--Port handling functions---------------------------------------------
+ 
+-start_portprogram() -> 
++start_portprogram() ->
+     open_port({spawn, "sh -s disksup 2>&1"}, [stream]).
+ 
+ my_cmd(Cmd0, Port) ->
+@@ -401,8 +401,8 @@ my_cmd(Cmd0, Port) ->
+     get_reply(Port, []).
+ 
+ get_reply(Port, O) ->
+-    receive 
+-        {Port, {data, N}} -> 
++    receive
++        {Port, {data, N}} ->
+             case newline(N, O) of
+                 {ok, Str} -> Str;
+                 {more, Acc} -> get_reply(Port, Acc)
+@@ -438,7 +438,7 @@ run_df(Path, {unix, irix}, Port) ->
+     my_cmd("/usr/sbin/df -lk " ++ Path, Port);
+ run_df(Path, {unix, linux}, Port) ->
+     Df = find_cmd("df", "/bin"),
+-    my_cmd(Df ++ " -lk -x squashfs " ++ Path, Port);
++    my_cmd(Df ++ " -k" ++ Path, Port);
+ run_df(Path, {unix, posix}, Port) ->
+     my_cmd("df -k -P " ++ Path, Port);
+ run_df(Path, {unix, dragonfly}, Port) ->
+-- 
+2.34.1
+
diff --git a/package/erlang/28.4.1/0001-disksup-update-df-call-to-work-with-Busybox.patch b/package/erlang/28.4.1/0001-disksup-update-df-call-to-work-with-Busybox.patch
new file mode 100644
index 0000000000..8e30ef0365
--- /dev/null
+++ b/package/erlang/28.4.1/0001-disksup-update-df-call-to-work-with-Busybox.patch
@@ -0,0 +1,57 @@
+From aa48235ab5f561d78894e70cd84f853f9eaa2423 Mon Sep 17 00:00:00 2001
+From: Frank Hunleth <fhunleth@troodon-software.com>
+Date: Tue, 5 May 2020 21:19:01 -0400
+Subject: [PATCH] disksup: update df call to work with Busybox
+
+Busybox's df doesn't support `-x` and `-l` and this removes those
+options. Plus SquashFS filesystems are nice to view on Nerves so we
+don't want to exclude them anyway.
+---
+ lib/os_mon/src/disksup.erl | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/lib/os_mon/src/disksup.erl b/lib/os_mon/src/disksup.erl
+index 35c9d4096e..13e3162033 100644
+--- a/lib/os_mon/src/disksup.erl
++++ b/lib/os_mon/src/disksup.erl
+@@ -262,7 +262,7 @@ param_default(disksup_posix_only) -> false.
+ %%----------------------------------------------------------------------
+ 
+ -doc false.
+-init([]) ->  
++init([]) ->
+     process_flag(trap_exit, true),
+     process_flag(priority, low),
+ 
+@@ -392,7 +392,7 @@ get_os(PosixOnly) ->
+ 
+ %%--Port handling functions---------------------------------------------
+ 
+-start_portprogram() -> 
++start_portprogram() ->
+     open_port({spawn, "sh -s disksup 2>&1"}, [stream]).
+ 
+ my_cmd(Cmd0, Port) ->
+@@ -403,8 +403,8 @@ my_cmd(Cmd0, Port) ->
+     get_reply(Port, []).
+ 
+ get_reply(Port, O) ->
+-    receive 
+-        {Port, {data, N}} -> 
++    receive
++        {Port, {data, N}} ->
+             case newline(N, O) of
+                 {ok, Str} -> Str;
+                 {more, Acc} -> get_reply(Port, Acc)
+@@ -440,7 +440,7 @@ run_df(Path, {unix, irix}, Port) ->
+     my_cmd("/usr/sbin/df -lk " ++ Path, Port);
+ run_df(Path, {unix, linux}, Port) ->
+     Df = find_cmd("df", "/bin"),
+-    my_cmd(Df ++ " -lk -x squashfs " ++ Path, Port);
++    my_cmd(Df ++ " -k" ++ Path, Port);
+ run_df(Path, {unix, posix}, Port) ->
+     my_cmd("df -k -P " ++ Path, Port);
+ run_df(Path, {unix, dragonfly}, Port) ->
+-- 
+2.43.0
+
diff --git a/package/erlang/Config.in b/package/erlang/Config.in
index 724f91123b..b0856a82f3 100644
--- a/package/erlang/Config.in
+++ b/package/erlang/Config.in
@@ -42,6 +42,58 @@ config BR2_PACKAGE_ERLANG
 
 if BR2_PACKAGE_ERLANG
 
+choice
+	bool "Erlang/OTP version"
+	default BR2_PACKAGE_ERLANG_28
+	help
+	  Select the Erlang/OTP version
+
+config BR2_PACKAGE_ERLANG_20
+	bool "Erlang/OTP 20"
+	help
+	  Use Erlang/OTP 20 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_21
+	bool "Erlang/OTP 21"
+	help
+	  Use Erlang/OTP 21 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_22
+	bool "Erlang/OTP 22"
+	help
+	  Use Erlang/OTP 22 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_23
+	bool "Erlang/OTP 23"
+	help
+	  Use Erlang/OTP 23 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_24
+	bool "Erlang/OTP 24"
+	help
+	  Use Erlang/OTP 24 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_25
+	bool "Erlang/OTP 25"
+	help
+	  Use Erlang/OTP 25 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_26
+	bool "Erlang/OTP 26"
+	help
+	  Use Erlang/OTP 26 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_27
+	bool "Erlang/OTP 27"
+	help
+	  Use Erlang/OTP 27 (release may not include latest patches)
+
+config BR2_PACKAGE_ERLANG_28
+	bool "Erlang/OTP 28"
+	help
+	  Use the latest Erlang/OTP 28 release
+endchoice
+
 config BR2_PACKAGE_ERLANG_MEGACO
 	bool "install megaco application"
 	help
diff --git a/package/erlang/erlang.hash b/package/erlang/erlang.hash
index 7ff587e35c..f681b5db14 100644
--- a/package/erlang/erlang.hash
+++ b/package/erlang/erlang.hash
@@ -1,5 +1,19 @@
-# From https://github.com/erlang/otp/releases/download/OTP-26.2.5.15/SHA256.txt
-sha256  28e6d63d82927f132d56289dd3c428ef8bce6bf2283c8549aa0a7afca1a8fe3b  otp_src_26.2.5.15.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-28.4.1/SHA256.txt
+sha256  fb2aa0bd8d4118a275895d4a0ea5b24e40e9e1e27a7b29e001377d7660fd9ecf  otp_src_28.4.1.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-27.3.4.3/SHA256.txt
+sha256  597618c75890e8e606033bc8dbf6ec87fdf4e892c10b4912ae3c9a4f01384579  otp_src_27.3.4.3.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-26.2.5/SHA256.txt
+sha256  de155c4ad9baab2b9e6c96dbd03bf955575a04dd6feee9c08758beb28484c9f6  otp_src_26.2.5.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-25.3.2/SHA256.txt
+sha256  aed4e4726cdc587ab820c8379d63e511e46a1b1cc0c59d6a720b51ae625b2510  otp_src_25.3.2.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-24.3.2/SHA256.txt
+sha256  fb39eecf5a5710200871c85c11251e27afce7c2a11f569bd6394c6d48240ec8d  otp_src_24.3.2.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-23.3.4.14/SHA256.txt
+sha256  35123f366ded534775a05db8ad6c06c20519ae228af1b5952132b10845621f21  otp_src_23.3.4.14.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-22.3.4.26/SHA256.txt
+sha256  ee281e4638c8d671dd99459a11381345ee9d70f1f8338f5db31fc082349a370e  otp_src_22.3.4.26.tar.gz
+# From https://github.com/erlang/otp/releases/download/OTP-21.3.8.24/SHA256.txt
+sha256  a82de871d7ba40fd256558b23a3b4c1539e6c7ece7507d6eb2b00330c6135012  otp_src_21.3.8.24.tar.gz
 
 # Hash for license file
 sha256  809fa1ed21450f59827d1e9aec720bbc4b687434fa22283c6cb5dd82a47ab9c0  LICENSE.txt
diff --git a/package/erlang/erlang.mk b/package/erlang/erlang.mk
index 3472f4119d..561076dd89 100644
--- a/package/erlang/erlang.mk
+++ b/package/erlang/erlang.mk
@@ -4,7 +4,44 @@
 #
 ################################################################################
 
-ERLANG_VERSION = 26.2.5.15
+# When updating Erlang, the ERLANG_ERTS_VSN is found in erts/vsn.mk.
+ifeq ($(BR2_PACKAGE_ERLANG_21),y)
+ERLANG_VERSION = 21.3.8.24
+ERLANG_ERTS_VSN = 10.3.5.19
+else
+ifeq ($(BR2_PACKAGE_ERLANG_22),y)
+ERLANG_VERSION = 22.3.4.26
+ERLANG_ERTS_VSN = 10.7.2.18
+else
+ifeq ($(BR2_PACKAGE_ERLANG_23),y)
+ERLANG_VERSION = 23.3.4.14
+ERLANG_ERTS_VSN = 11.2.2.13
+else
+ifeq ($(BR2_PACKAGE_ERLANG_24),y)
+ERLANG_VERSION = 24.3.2
+ERLANG_ERTS_VSN = 12.3
+else
+ifeq ($(BR2_PACKAGE_ERLANG_25),y)
+ERLANG_VERSION = 25.3.2
+ERLANG_ERTS_VSN = 13.2.2
+else
+ifeq ($(BR2_PACKAGE_ERLANG_26),y)
+ERLANG_VERSION = 26.2.5
+ERLANG_ERTS_VSN = 14.2.5
+else
+ifeq ($(BR2_PACKAGE_ERLANG_27),y)
+ERLANG_VERSION = 27.3.4.3
+ERLANG_ERTS_VSN = 15.2.7.2
+else
+ERLANG_VERSION = 28.4.1
+ERLANG_ERTS_VSN = 16.3
+endif
+endif
+endif
+endif
+endif
+endif
+endif
 ERLANG_RELEASE = $(firstword $(subst ., ,$(ERLANG_VERSION)))
 ERLANG_SITE = \
 	https://github.com/erlang/otp/releases/download/OTP-$(ERLANG_VERSION)
@@ -53,6 +90,10 @@ ERLANG_CONF_ENV += erl_xcomp_clock_gettime_cpu_time=yes
 
 ERLANG_CONF_OPTS = --without-javac
 
+ifeq ($(BR2_REPRODUCIBLE),y)
+ERLANG_CONF_OPTS += --enable-deterministic-build
+endif
+
 # Force ERL_TOP to the downloaded source directory. This prevents
 # Erlang's configure script from inadvertently using files from
 # a version of Erlang installed on the host.
-- 
2.43.0

