2013-06-06 01:53:30 +02:00
|
|
|
################################################################################
|
2012-08-24 23:39:26 +02:00
|
|
|
#
|
|
|
|
# erlang
|
|
|
|
#
|
2013-06-06 01:53:30 +02:00
|
|
|
################################################################################
|
2012-08-24 23:39:26 +02:00
|
|
|
|
2023-07-15 18:55:35 +02:00
|
|
|
ERLANG_VERSION = 26.0.2
|
package/erlang: do not hard-code the Erlang Interface Version (EI_VSN)
The note above the erlang version instructs to refer to another note
further down the file. However, even if it is not too difficult to find,
it is still located a bit too far away, and the reference is not very
explicit what note we should look at.
When we introduced that variable in 6c1d128844c5 (package/erlang: export
EI_VSN so other packages can use it), the rationale for hard-coding it
was "to avoid spawning a shell every time the variable is dereferenced".
However, that can get a bit confusing and hard to follow. Also, that in
fact spawns a shell only once for each rebar-packages, so the overhead
is far from being too high.
The EI_VSN is only used by rebar-package packages, is derefrenced from
the rebar-infra and not the packages themselves, and is not needed by
erlang itself (it knows its own EI_VSN), so we can de-hard-code it, and
rely on build-time detection, by looking in the appropriate file.
We have two files where we could look:
- lib/erl_interface/vsn.mk in the erlang source tree, but it is not
installed,
- .../lib/erlang/releases/$(ERLANG_RELASE)/installed_application_versions
as installed by erlang.
We use the second one, as it is cleaner, for a package, to look into
installed files, rather than to look in the source tree of another
package.
Although both the host and target erlang are the same, we still look
into the corresponding file to extract the version. This is so that it
would be easier if in the future we ever manage to rely on a
system-installed erlang that could have a EI_VSN different from the
target one.
We can't re-use the variable ERLANG_EI_VSN, because it now needs to be
$(call)-ed with a parameter. Hopefully, external packages that use it
directly rather than through the rebar infra, are not legion...
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Will Newton <will.newton@gmail.com>
Cc: Johan Oudinet <johan.oudinet@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2023-02-10 22:55:48 +01:00
|
|
|
ERLANG_RELEASE = $(firstword $(subst ., ,$(ERLANG_VERSION)))
|
2021-11-05 17:45:09 +01:00
|
|
|
ERLANG_SITE = \
|
|
|
|
https://github.com/erlang/otp/releases/download/OTP-$(ERLANG_VERSION)
|
2012-08-24 23:39:26 +02:00
|
|
|
ERLANG_SOURCE = otp_src_$(ERLANG_VERSION).tar.gz
|
|
|
|
ERLANG_DEPENDENCIES = host-erlang
|
|
|
|
|
2016-02-02 20:57:27 +01:00
|
|
|
ERLANG_LICENSE = Apache-2.0
|
|
|
|
ERLANG_LICENSE_FILES = LICENSE.txt
|
2021-03-05 10:49:57 +01:00
|
|
|
ERLANG_CPE_ID_VENDOR = erlang
|
|
|
|
ERLANG_CPE_ID_PRODUCT = erlang\/otp
|
2013-08-09 03:37:24 +02:00
|
|
|
ERLANG_INSTALL_STAGING = YES
|
2012-08-24 23:39:26 +02:00
|
|
|
|
2024-02-26 18:36:44 +01:00
|
|
|
define ERLANG_FIX_AUTOCONF_VERSION
|
|
|
|
$(SED) "s/USE_AUTOCONF_VERSION=.*/USE_AUTOCONF_VERSION=$(AUTOCONF_VERSION)/" $(@D)/otp_build
|
|
|
|
endef
|
|
|
|
|
2016-02-02 20:57:27 +01:00
|
|
|
# Patched erts/aclocal.m4
|
2020-02-04 11:07:31 +01:00
|
|
|
define ERLANG_RUN_AUTOCONF
|
2023-07-15 18:55:35 +02:00
|
|
|
cd $(@D) && PATH=$(BR_PATH) ./otp_build update_configure --no-commit
|
2020-02-04 11:07:31 +01:00
|
|
|
endef
|
|
|
|
ERLANG_DEPENDENCIES += host-autoconf
|
2024-02-26 18:36:44 +01:00
|
|
|
ERLANG_PRE_CONFIGURE_HOOKS += \
|
|
|
|
ERLANG_FIX_AUTOCONF_VERSION \
|
|
|
|
ERLANG_RUN_AUTOCONF
|
2020-02-04 11:07:31 +01:00
|
|
|
HOST_ERLANG_DEPENDENCIES += host-autoconf
|
2024-02-26 18:36:44 +01:00
|
|
|
HOST_ERLANG_PRE_CONFIGURE_HOOKS += \
|
|
|
|
ERLANG_FIX_AUTOCONF_VERSION \
|
|
|
|
ERLANG_RUN_AUTOCONF
|
package/erlang: fix detection of libatomic_ops
For some platforms, hardware-assisted compare-and-swap may not be
available, so libatomic_ops will not provide it.
However, libatomic_ops can provide a purely software CAS emulation, but
must be instructed to do so. erlang just forgot to tell libatomic_ops
that it does require CAS.
Fix that by defining AO_REQUIRE_CAS before including atmoic_ops.h, like
is done in libunwind, as pointed out by Thomas.
Also, erlang has a convoluted, mind-alterating set on aclocal.m4 macros,
that just forgets to link against -latomic_ops when checking CAS is
available, so that even if CAS is available, configure chokes.
Since I would like to keep the little sanity I still have, just force
linking with -latomic_ops. This is useless when the check is natrally
sucessful (i.e. on platforms where CAS is available in HW), but we
would eventually link with -latomic_ops there, too; it's just redundant.
Overall, just consider that erlang requires libatomic_ops, so forcibly
depend on it, it is easier than trying to disable it. We can revisit
that whenever someone wants to run erlang on a platform for which there
is no libatomic_ops support.
Fixes a slew of autobuild ARM failures:
http://autobuild.buildroot.org/results/e7b/e7bfc4893dea6b133f0794ef44d50ad89bcb6662/
http://autobuild.buildroot.org/results/3e9/3e9c307f1ec6536482641019dcaa94677f7267a3/
http://autobuild.buildroot.org/results/a85/a85ca414e5b67af46510abd7b610eb5ae8661de4/
[...]
[Thomas: fix minor typos in commit log, add dependency on
BR2_PACKAGE_LIBATOMIC_ARCH_SUPPORTS to the Erlang comment about thread
and shared library dependency.]
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>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
2015-01-04 15:17:14 +01:00
|
|
|
|
package/erlang: do not hard-code the Erlang Interface Version (EI_VSN)
The note above the erlang version instructs to refer to another note
further down the file. However, even if it is not too difficult to find,
it is still located a bit too far away, and the reference is not very
explicit what note we should look at.
When we introduced that variable in 6c1d128844c5 (package/erlang: export
EI_VSN so other packages can use it), the rationale for hard-coding it
was "to avoid spawning a shell every time the variable is dereferenced".
However, that can get a bit confusing and hard to follow. Also, that in
fact spawns a shell only once for each rebar-packages, so the overhead
is far from being too high.
The EI_VSN is only used by rebar-package packages, is derefrenced from
the rebar-infra and not the packages themselves, and is not needed by
erlang itself (it knows its own EI_VSN), so we can de-hard-code it, and
rely on build-time detection, by looking in the appropriate file.
We have two files where we could look:
- lib/erl_interface/vsn.mk in the erlang source tree, but it is not
installed,
- .../lib/erlang/releases/$(ERLANG_RELASE)/installed_application_versions
as installed by erlang.
We use the second one, as it is cleaner, for a package, to look into
installed files, rather than to look in the source tree of another
package.
Although both the host and target erlang are the same, we still look
into the corresponding file to extract the version. This is so that it
would be easier if in the future we ever manage to rely on a
system-installed erlang that could have a EI_VSN different from the
target one.
We can't re-use the variable ERLANG_EI_VSN, because it now needs to be
$(call)-ed with a parameter. Hopefully, external packages that use it
directly rather than through the rebar infra, are not legion...
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
Cc: Will Newton <will.newton@gmail.com>
Cc: Johan Oudinet <johan.oudinet@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2023-02-10 22:55:48 +01:00
|
|
|
# Return the EIV (Erlang Interface Version, EI_VSN)
|
|
|
|
# $(1): base directory, i.e. either $(HOST_DIR) or $(STAGING_DIR)/usr
|
|
|
|
erlang_ei_vsn = `sed -r -e '/^erl_interface-(.+)/!d; s//\1/' $(1)/lib/erlang/releases/$(ERLANG_RELEASE)/installed_application_versions`
|
2015-01-12 10:32:05 +01:00
|
|
|
|
2012-08-24 23:39:26 +02:00
|
|
|
# The configure checks for these functions fail incorrectly
|
|
|
|
ERLANG_CONF_ENV = ac_cv_func_isnan=yes ac_cv_func_isinf=yes
|
|
|
|
|
2013-09-13 17:46:01 +02:00
|
|
|
# Set erl_xcomp variables. See xcomp/erl-xcomp.conf.template
|
|
|
|
# for documentation.
|
|
|
|
ERLANG_CONF_ENV += erl_xcomp_sysroot=$(STAGING_DIR)
|
|
|
|
|
2014-09-27 21:32:44 +02:00
|
|
|
ERLANG_CONF_OPTS = --without-javac
|
2014-08-15 17:49:15 +02:00
|
|
|
|
2017-02-18 22:01:11 +01:00
|
|
|
# Force ERL_TOP to the downloaded source directory. This prevents
|
|
|
|
# Erlang's configure script from inadvertantly using files from
|
|
|
|
# a version of Erlang installed on the host.
|
|
|
|
ERLANG_CONF_ENV += ERL_TOP=$(@D)
|
|
|
|
HOST_ERLANG_CONF_ENV += ERL_TOP=$(@D)
|
|
|
|
|
2014-08-15 17:49:15 +02:00
|
|
|
# erlang uses openssl for all things crypto. Since the host tools (such as
|
|
|
|
# rebar) uses crypto, we need to build host-erlang with support for openssl.
|
2020-02-04 11:07:31 +01:00
|
|
|
HOST_ERLANG_DEPENDENCIES += host-openssl
|
2017-07-05 13:14:24 +02:00
|
|
|
HOST_ERLANG_CONF_OPTS = --without-javac --with-ssl=$(HOST_DIR)
|
2012-08-24 23:39:26 +02:00
|
|
|
|
2014-11-17 23:33:16 +01:00
|
|
|
HOST_ERLANG_CONF_OPTS += --without-termcap
|
|
|
|
|
2012-08-24 23:39:26 +02:00
|
|
|
ifeq ($(BR2_PACKAGE_NCURSES),y)
|
2014-09-27 21:32:44 +02:00
|
|
|
ERLANG_CONF_OPTS += --with-termcap
|
2012-08-24 23:39:26 +02:00
|
|
|
ERLANG_DEPENDENCIES += ncurses
|
|
|
|
else
|
2014-09-27 21:32:44 +02:00
|
|
|
ERLANG_CONF_OPTS += --without-termcap
|
2012-08-24 23:39:26 +02:00
|
|
|
endif
|
|
|
|
|
|
|
|
ifeq ($(BR2_PACKAGE_OPENSSL),y)
|
2014-09-27 21:32:44 +02:00
|
|
|
ERLANG_CONF_OPTS += --with-ssl
|
2012-08-24 23:39:26 +02:00
|
|
|
ERLANG_DEPENDENCIES += openssl
|
|
|
|
else
|
2014-09-27 21:32:44 +02:00
|
|
|
ERLANG_CONF_OPTS += --without-ssl
|
2012-08-24 23:39:26 +02:00
|
|
|
endif
|
|
|
|
|
2018-07-21 11:13:38 +02:00
|
|
|
ifeq ($(BR2_PACKAGE_UNIXODBC),y)
|
2016-10-23 17:34:03 +02:00
|
|
|
ERLANG_DEPENDENCIES += unixodbc
|
2016-12-04 22:44:56 +01:00
|
|
|
ERLANG_CONF_OPTS += --with-odbc
|
|
|
|
else
|
|
|
|
ERLANG_CONF_OPTS += --without-odbc
|
2016-10-23 17:34:03 +02:00
|
|
|
endif
|
|
|
|
|
2018-10-12 16:11:49 +02:00
|
|
|
# Always use Buildroot's zlib
|
2020-02-04 11:07:31 +01:00
|
|
|
ERLANG_CONF_OPTS += --disable-builtin-zlib
|
2012-08-24 23:39:26 +02:00
|
|
|
ERLANG_DEPENDENCIES += zlib
|
|
|
|
|
2016-02-25 15:56:35 +01:00
|
|
|
# Remove source, example, gs and wx files from staging and target.
|
2012-08-24 23:39:26 +02:00
|
|
|
ERLANG_REMOVE_PACKAGES = gs wx
|
|
|
|
|
|
|
|
ifneq ($(BR2_PACKAGE_ERLANG_MEGACO),y)
|
|
|
|
ERLANG_REMOVE_PACKAGES += megaco
|
|
|
|
endif
|
|
|
|
|
2016-02-25 15:56:35 +01:00
|
|
|
define ERLANG_REMOVE_STAGING_UNUSED
|
|
|
|
for package in $(ERLANG_REMOVE_PACKAGES); do \
|
|
|
|
rm -rf $(STAGING_DIR)/usr/lib/erlang/lib/$${package}-*; \
|
|
|
|
done
|
|
|
|
endef
|
|
|
|
|
|
|
|
define ERLANG_REMOVE_TARGET_UNUSED
|
2012-08-24 23:39:26 +02:00
|
|
|
find $(TARGET_DIR)/usr/lib/erlang -type d -name src -prune -exec rm -rf {} \;
|
|
|
|
find $(TARGET_DIR)/usr/lib/erlang -type d -name examples -prune -exec rm -rf {} \;
|
|
|
|
for package in $(ERLANG_REMOVE_PACKAGES); do \
|
|
|
|
rm -rf $(TARGET_DIR)/usr/lib/erlang/lib/$${package}-*; \
|
|
|
|
done
|
|
|
|
endef
|
|
|
|
|
2016-02-25 15:56:35 +01:00
|
|
|
ERLANG_POST_INSTALL_STAGING_HOOKS += ERLANG_REMOVE_STAGING_UNUSED
|
|
|
|
ERLANG_POST_INSTALL_TARGET_HOOKS += ERLANG_REMOVE_TARGET_UNUSED
|
2012-08-24 23:39:26 +02:00
|
|
|
|
|
|
|
$(eval $(autotools-package))
|
|
|
|
$(eval $(host-autotools-package))
|