查看源代码 构建和安装 Erlang/OTP

简介

本文档描述了如何构建和安装 Erlang/OTP-27。Erlang/OTP 应该可以在任何 Unix/Linux 系统(包括 macOS)上从源代码构建。在尝试构建和安装 Erlang/OTP 之前,建议您阅读完整文档。

源代码可以从 Erlang/OTP 的官方网站或 GitHub 下载。

所需工具

以下是解压和构建 Erlang/OTP 所需的工具。

解压

  • GNU unzip 或现代 uncompress。
  • 一个能理解 GNU TAR 格式长文件名的 TAR 程序。

构建

  • GNU make
  • 编译器 -- GNU C 编译器,gcc 或 LLVM 的 C 编译器前端,clang
  • Perl 5
  • ncursestermcaptermlib -- 需要开发头文件和库,通常称为 ncurses-devel。使用 --without-termcap 构建而不使用任何这些库。请注意,在这种情况下,只能使用旧的 shell(没有任何行编辑功能)。
  • sed -- 用于基本文本转换的流编辑器。

在 Git 中构建

构建方式与构建解压后的 tar 文件相同。

在 macOS 上构建

  • Xcode -- 通过 Mac App Store 下载并安装。在继续之前,请阅读关于 在 Mac 上构建 的内容。

安装

  • 一个可以接受多个文件名的 install 程序。

可选工具

如果未满足依赖项,某些应用程序将自动跳过。以下是这些应用程序所需的工具列表。您还将找到构建文档所需的工具。

构建

  • OpenSSL -- 用于安全套接字层和传输层安全的开源工具包。构建 crypto 应用程序所需。此外,sslssh 需要一个工作的 crypto 应用程序,如果缺少 OpenSSL,也将被跳过。public_key 应用程序在没有 crypto 的情况下可用,但功能将非常有限。

    还需要 OpenSSL 的开发包,包括头文件以及二进制命令程序 openssl。至少需要 OpenSSL 的 0.9.8 版本。从 http://www.openssl.org 阅读更多信息并下载。

  • Oracle Java SE JDK -- Java 开发工具包(标准版)。构建 jinterface 应用程序所需。至少需要 JDK 的 1.6.0 版本。

    http://www.oracle.com/technetwork/java/javase/downloads 下载。我们还测试了 IBM 的 JDK 1.6.0。

  • flex -- 需要头文件和库来为 Unix/Linux 上的 megaco 应用程序构建 flex 扫描器。

  • wxWidgets -- 用于 GUI 应用程序的工具包。构建 wx 应用程序所需。至少需要 wxWidgets 的 3.0 版本。

    http://sourceforge.net/projects/wxwindows/files/3.0.0/ 下载,或者从 GitHub 获取:https://github.com/wxWidgets/wxWidgets

    有关 wxWidgets 的更多说明,请阅读 使用 Wx 构建

构建文档

  • ex_doc -- ExDoc 是一个为 Erlang 和 Elixir 项目生成 html 和 epub 文档的工具。

    github 下载 escript 或从 GitHub 获取:https://github.com/elixir-lang/ex_doc 并自行构建。

    ExDoc v0.34.1 用于构建此版本的文档,但之后的任何版本也应该可以正常工作。

    您也可以使用 ./otp_build download_ex_doc 从 github 下载正确的版本。需要以下依赖项之一来检查文档

    • sha256sum, 或
    • sha1sum, 或
    • shasum

如何构建和安装 Erlang/OTP

以下说明适用于构建 发布的源代码 tar 包或从 git clone 构建。

变量 $ERL_TOP 将被多次提及。它指的是源代码树中的顶层目录。有关 $ERL_TOP 的更多信息,请参阅下面的 make 和 $ERL_TOP 部分。

解压

首先,使用与 GNU 兼容的 TAR 程序解压 Erlang/OTP 发行版文件。

$ tar -zxf otp_src_27.2.tar.gz    # Assuming bash/sh

或从 github 克隆

$ git clone https://github.com/erlang/otp otp_src_27.2

现在,将目录更改为基本目录,并设置 $ERL_TOP 变量。

$ cd otp_src_27.2
$ export ERL_TOP=`pwd`    # Assuming bash/sh

配置

运行以下命令来配置构建

$ ./configure [ options ]

默认情况下,Erlang/OTP 发行版将安装在 /usr/local/{bin,lib/erlang} 中。例如,如果您没有在标准位置安装的权限,您可以将 Erlang/OTP 安装在其他位置。例如,要安装在 /opt/erlang/27.2/{bin,lib/erlang} 中,请使用 --prefix=/opt/erlang/27.2 选项。

在某些平台上,如果设置了某些语言环境,Perl 的行为可能会很奇怪。如果在构建时出现错误,请尝试设置 LANG 变量

$ export LANG=C   # Assuming bash/sh

构建

构建 Erlang/OTP 发行版。

$ make

测试

在安装之前,您应该通过运行我们的冒烟测试来测试您的构建是否正常工作。冒烟测试是完整 Erlang/OTP 测试套件的子集。首先,您需要构建和发布测试套件。

$ make release_tests

这会在 $ERL_TOP/release 中创建一个名为 tests 的附加文件夹。现在,是时候开始冒烟测试了。

$ cd release/tests/test_server
$ $ERL_TOP/bin/erl -s ts install -s ts smoke_test batch -s init stop

要验证一切是否正常,您应该在 Web 浏览器中打开 $ERL_TOP/release/tests/test_server/index.html 并确保没有失败的测试用例。

注意

在没有 cryptosslssh 的构建中,对于未定义的函数会有一个失败的测试用例。验证失败的测试用例日志是否仅显示对跳过的应用程序的调用。

安装

您现在可以安装 Erlang/OTP 发行版了!以下命令将在您的系统上安装发行版。

$ make install

运行

您现在应该有一个可以工作的 Erlang/OTP 发行版了!跳转到 系统原理 以获取有关运行 Erlang/OTP 的说明。

如何构建文档

确保您位于源代码树的顶层目录中。

$ cd $ERL_TOP

如果您刚刚在当前的源代码树中构建了 Erlang/OTP,您已经运行了 configure,无需再次执行此操作;否则,请运行 configure

$ ./configure [Configure Args]

构建文档时,您需要在 $PATH 中有一个完整的 Erlang/OTP-27.2 系统。

$ export PATH=$ERL_TOP/bin:$PATH     # Assuming bash/sh

要构建 htmlepub 文档,您需要安装 ExDoc v0.34.1。有关如何安装 ExDoc 的信息,请参阅 构建文档

使用以下命令构建文档

$ make docs

可以通过将 DOC_TARGETS 环境变量传递给 make docs 来限制构建的文档类型。

示例:

$ make docs DOC_TARGETS=chunks

当前可用的类型有:htmlchunks。其中

  • chunks - 构建 EEP-48 文档块。
  • html - 构建 html 和 epub 文档。

如何安装文档

可以使用 install-docs 目标或 release_docs 目标来安装文档。

  • 如果您已使用 install 目标安装了 Erlang/OTP,请使用 install-docs 目标安装文档。将使用 configure 确定的安装位置。$DESTDIR 的用法与执行 make install 时相同。

    $ make install-docs
    
  • 如果您已使用 release 目标安装了 Erlang/OTP,请使用 release_docs 目标安装文档。您通常希望使用与调用 make release 时相同的 RELEASE_ROOT

    $ make release_docs RELEASE_ROOT=<release dir>
    

可以使用与构建文档时相同的 DOC_TARGETS 环境变量来限制发布的文档类型。

访问文档

安装后,您可以通过以下方式访问文档

  • 通过加载页面 /usr/local/lib/erlang/doc/erlang/index.html<BaseDir>/lib/erlang/doc/erlang/index.html (如果使用了 prefix 选项)来浏览 html 页面。

  • 通过使用内置 shell 函数 h/1,2,3ht/1,2,3 读取嵌入式文档。

如何安装预格式化文档

预格式化的 html 文档 可以从 https://erlang.org.cn/download.html 下载。

将 html 压缩包解压到安装目录。

$ cd <ReleaseDir>
$ tar -zxf otp_html_27.2.tar.gz

其中 <ReleaseDir>

  • 如果您使用 make install 安装了 Erlang/OTP,则为 <PrefixDir>/lib/erlang
  • 如果您使用 make install DESTDIR=<TmpInstallDir> 安装了 Erlang/OTP,则为 $DESTDIR<PrefixDir>/lib/erlang
  • 如果您使用 make release RELEASE_ROOT=<ReleaseDir> 安装,则为 RELEASE_ROOT

Erlang/OTP 的高级配置和构建

如果您想定制 Erlang/OTP 的构建和安装,请继续阅读以获取有关各个步骤的详细信息。

make 和 $ERL_TOP

整个目录树中的所有 makefile 都使用环境变量 ERL_TOP 来查找安装的绝对路径。configure 脚本会找出这个路径并在顶层 Makefile 中设置它(在构建时,它会将这个路径传递下去)。但是,在开发过程中,有时可以在子目录中运行 make 会很方便。要做到这一点,您必须在运行 make 之前设置 ERL_TOP 变量。

例如,假设您的 GNU make 程序名为 make,并且您想重建应用程序 STDLIB,那么您可以这样做

$ cd lib/stdlib; env ERL_TOP=<Dir> make

其中 <Dir> 是您在顶层 Makefile 中找到 ERL_TOP 设置的值。

otp_build 与 configure/make

构建 Erlang/OTP 可以使用 $ERL_TOP/otp_build 脚本,或者直接调用 $ERL_TOP/configuremake 完成。使用 otp_build 构建更容易,因为它涉及的步骤更少,但是 otp_build 构建过程不如 configure/make 构建过程灵活。我们交付的 Windows 二进制版本是使用 otp_build 构建的。

配置

configure 脚本由 GNU autoconf 实用程序创建,该实用程序检查系统特定的功能,然后创建许多 makefile。

configure 脚本允许您自定义许多参数;输入 ./configure --help./configure --help=recursive 以获取详细信息。./configure --help=recursive 将为所有应用程序中的所有 configure 脚本提供帮助。

您可以指定的其中一件事是 Erlang/OTP 应该安装在哪里。默认情况下,Erlang/OTP 将安装在 /usr/local/{bin,lib/erlang} 中。要保持相同的结构但在不同的位置(比如 <Dir>)安装,请使用 --prefix 参数,如下所示:./configure --prefix=<Dir>

一些可用的 configure 选项有

  • --prefix=PATH - 指定安装前缀。
  • --disable-parallel-configure - 禁用 configure 脚本的并行执行(默认启用并行执行)
  • --{enable,disable}-jit - 强制启用或禁用 JIT。
  • --{enable,disable}-kernel-poll - 内核轮询支持(如果可能,默认启用)
  • --enable-m64-build - 使用 -m64 标志为 (g)cc 构建 64 位二进制文件
  • --enable-m32-build - 使用 -m32 标志为 (g)cc 构建 32 位二进制文件
  • --{enable,disable}-pie - 构建位置无关的可执行二进制文件。
  • --with-assumed-cache-line-size=SIZE - 设置假定的缓存行大小(以字节为单位)。默认值为 64。有效值是 16 到 8192 之间(包括 16 和 8192)的 2 的幂。运行时系统使用此值以尝试避免伪共享。过大的值会浪费内存。过小的值会增加伪共享的数量。
  • --{with,without}-termcap - termcap(without 表示只能使用旧的 Erlang shell)
  • --with-javac=JAVAC - 指定要使用的 Java 编译器
  • --{with,without}-javac - Java 编译器(without 表示不会构建 jinterface 应用程序)
  • --{enable,disable}-builtin-zlib - 使用内置的 zlib 源代码。
  • --{enable,disable}-dynamic-ssl-lib - 在链接 crypto NIF 时启用或禁用动态 OpenSSL 库。默认情况下,除非它不起作用或它是 Windows 系统,否则会进行动态链接。
  • --{with,without}-ssl - OpenSSL(without 表示不会构建 cryptosshssl
  • --with-ssl=PATH - 指定 OpenSSL include 和 lib 目录的基本位置。
  • --with-ssl-incl=PATH - 指定 OpenSSL include 目录的基本位置(如果与 --with-ssl=PATH 指定的基本位置不同)。
  • --with-ssl-zlib=PATH - 用于链接 crypto NIF 的静态 zlib 库的路径。此 zlib 库通常不是必需的,但在某些情况下可能需要链接 NIF。
  • --with-ssl-lib-subdir=RELATIVE_PATH - 指定要搜索的额外的 OpenSSL lib 子目录(相对于基本目录)。
  • --with-ssl-rpath=yes|no|PATHS - OpenSSL 的运行时库路径。默认值为 yes,它等同于许多标准位置。如果为 no,则不会使用运行时库路径。其他任何值都应是以逗号或冒号分隔的路径列表。
  • --with-libatomic_ops=PATH - 使用 libatomic_ops 库进行原子内存访问。如果 configure 通知您没有可用的本机原子实现,您通常需要尝试使用 libatomic_ops 库。它可以从 https://github.com/ivmai/libatomic_ops/ 下载。
  • --disable-smp-require-native-atomics - 默认情况下,如果要构建 SMP 运行时系统,并且找不到本机原子内存访问的实现,configure 将会失败。如果发生这种情况,我们建议您找到一个可以使用的本机原子实现,例如,使用 libatomic_ops,但是通过传递 --disable-smp-require-native-atomics,您可以使用基于互斥锁或自旋锁的回退实现进行构建。但是,如果没有本机原子内存访问的实现,SMP 运行时系统的性能将会受到极大影响。
  • --enable-static-{nifs,drivers} - 为了允许在不支持动态链接库的操作系统上使用 nifs 和驱动程序,可以将 nifs 和驱动程序与主 Erlang VM 二进制文件静态链接。这是通过将逗号分隔的列表传递给要静态链接的归档文件来完成的。例如:--enable-static-nifs=/home/$USER/my_nif.a。路径必须是绝对路径。对于驱动程序,驱动程序名称必须与文件名相同。在编译 nif/驱动程序的 .o 文件时,您还必须定义 STATIC_ERLANG_NIF_LIBNAME(请参阅 erl_nif 文档)或 STATIC_ERLANG_DRIVER。如果您的 nif/驱动程序依赖于其他动态库,您现在必须将其链接到 Erlang VM 二进制文件。这可以通过将 LIBS=-llibname 传递给 configure 来轻松实现。
  • --without-$app - 默认情况下,Erlang/OTP 中的所有应用程序都将包含在发行版中。如果不需要这样做,则可以指定 Erlang/OTP 在编译时不包含一个或多个应用程序,即 --without-wx。应用程序之间没有自动依赖关系处理。如果您禁用另一个应用程序所依赖的应用程序,您还必须禁用依赖的应用程序。
  • --enable-gettimeofday-as-os-system-time - 强制使用 gettimeofday() 作为操作系统系统时间。
  • --enable-prefer-elapsed-monotonic-time-during-suspend - 在挂起期间首选使用具有经过时间的操作系统单调时间源。
  • --disable-prefer-elapsed-monotonic-time-during-suspend - 在挂起期间不首选使用具有经过时间的操作系统单调时间源。
  • --with-clock-resolution=high|low - 尝试查找操作系统系统时间,以及分辨率高于或低于默认选择的操作系统单调时间的时钟源。请注意,与默认选择的时钟源相比,这两种替代方案都可能对性能和可伸缩性产生负面影响。
  • --enable-ensure-os-monotonic-time - 启用确保操作系统提供的单调时间戳的单调性的功能。当检测到非单调时间戳时,它将被上次交付的单调时间戳替换,然后再由 Erlang 的时间功能使用。请注意,除非系统上的操作系统单调时间源未能生成单调时间戳,否则您希望启用此功能。这是因为确保操作系统单调时间戳的单调性会损害系统的可伸缩性和性能。
  • --disable-saved-compile-time - 禁用在仿真器二进制文件中保存编译日期和时间。
  • --enable-ei-dynamic-lib - 使 erl_interface 除了通常构建的归档文件之外,还构建一个共享库。
  • --disable-year2038 - 不支持 2038 年 1 月中旬之后的日期。默认情况下,configure 将尝试启用对 2038 年 1 月中旬之后的时间戳的支持。如果它无法弄清楚如何执行此操作,它将失败并中止并显示错误。如果您仍然想在知道系统在 2038 年 1 月中旬之后将无法正常工作的情况下构建系统,则可以传递此选项,这将使 configure 能够在不支持 2038 年 1 月中旬之后的时间戳的情况下继续。这通常仅在 32 位平台上是一个问题。

如果您或您的系统有特殊要求,请阅读 Makefile 以获取其他配置信息。

configure 检查的重要变量

编译器和链接器
  • CC - C 编译器。
  • CFLAGS - C 编译器标志。默认为 "-g -O2"。如果您设置它,这些标志将被删除。
  • STATIC_CFLAGS - 静态 C 编译器标志。
  • CFLAG_RUNTIME_LIBRARY_PATH - 此标志应为共享库设置运行时库搜索路径。请注意,这实际上是一个链接器标志,但需要通过编译器传递。
  • CPP - C 预处理器。
  • CPPFLAGS - C 预处理器标志。
  • CXX - C++ 编译器。
  • CXXFLAGS - C++ 编译器标志。
  • LD - 链接器。
  • LDFLAGS - 链接器标志。
  • LIBS - 库。
动态 Erlang 驱动程序链接

注意

要么设置所有 DED_LD* 变量,要么都不设置(DED_LDFLAGS_CONFTEST 除外)。

  • DED_LD - 用于动态加载 Erlang 驱动程序的链接器。
  • DED_LDFLAGS - 与 DED_LD 一起使用的链接器标志。
  • DED_LDFLAGS_CONFTEST - 如果 DED_LDFLAGS 不能在配置链接测试中使用,则在配置链接测试中与 DED_LD 一起使用的链接器标志。如果未设置,则将在配置测试中使用 DED_LDFLAGS
  • DED_LD_FLAG_RUNTIME_LIBRARY_PATH - 此标志应在与 DED_LD 链接时设置共享库的运行时库搜索路径。
大文件支持

注意

要么设置所有 LFS_* 变量,要么都不设置。

  • LFS_CFLAGS - 大文件支持 C 编译器标志。
  • LFS_LDFLAGS - 大文件支持链接器标志。
  • LFS_LIBS - 大文件支持库。
其他工具
  • RANLIB - ranlib 归档索引工具。
  • AR - ar 归档工具。
  • GETCONF - getconf 系统配置检查工具。getconf 当前用于查找要使用的大文件支持标志,以及在 Linux 系统上查找我们是否具有 NPTL 线程库。

更新配置脚本

生成的 configure 脚本现在包含在 git 存储库中。

如果您修改了任何 configure.in 文件或 erts/aclocal.m4 文件,则需要在更改生效之前重新生成 configure 脚本。首先确保您的路径中有 2.69 版本的 GNU autoconf。然后在 $ERL_TOP 目录中执行 ./otp_build update_configure [--no-commit]otp_build 脚本将验证 autoconf 是否为正确的版本,如果不是其他版本,则将拒绝更新 configure 脚本。

原子内存操作和虚拟机

具有 SMP 支持的虚拟机大量使用原子内存操作。因此,在构建 Erlang/OTP 时,提供本机原子内存操作的实现非常重要。默认情况下,如果本机原子内存操作不可用,虚拟机将拒绝构建。

Erlang/OTP 本身提供了本机原子内存操作的实现,当使用与 32/64 位 x86、32/64 位 SPARC V9、32 位 PowerPC 或 32 位 Tile 兼容的 gcc 编译器进行编译时可以使用。当使用与 32/64 位 x86、32/64 位 SPARC V9、32 位 PowerPC 或 32 位 Tile 兼容的 gcc 编译器进行编译时,虚拟机可以使用 __atomic_* 内置函数(当使用至少 4.7 版本的 gcc 时可能可用)和/或使用 __sync_* 内置函数(当使用至少 4.1 版本的 gcc 时可能可用)来使用本机原子操作。如果只有 gcc__sync_* 内置函数可用,性能会受到影响。这种配置只应作为最后的手段使用。当在 Windows 上使用 MicroSoft Visual C++ 编译器进行编译时,本机原子内存操作由 Windows API 提供。

首选顺序的本机原子实现

  1. Erlang/OTP 提供的实现。
  2. Windows 提供的 API。
  3. 基于 gcc __atomic_* 内置函数的实现。
  4. 如果以上任何一种都不适用于您的架构/编译器,建议您在构建 Erlang/OTP 之前构建并安装 libatomic_opslibatomic_ops 库为各种架构和编译器提供本机原子内存操作。在构建 Erlang/OTP 时,您需要使用 --with-libatomic_ops=PATH configure 开关告知构建系统 libatomic_ops 库的安装位置。
  5. 作为最后的手段,是仅基于 gcc __sync_* 内置函数的实现。但是,这将导致发出大量昂贵且不必要的内存屏障指令。也就是说,性能会受到影响。如果 configure 脚本找不到任何其他替代方案,它将在执行结束时发出警告。

构建

在相对较快的计算机上构建 Erlang/OTP 大约需要 5 分钟。要加快速度,您可以使用 -j<num_jobs> 选项利用并行 make。

$ export MAKEFLAGS=-j8    # Assuming bash/sh
$ make

如果您使用补丁升级了源代码,则可能需要在新构建之前清理以前的构建。在执行 make clean 之前,请务必阅读下面的预构建源代码发布部分。

其他有用的信息可以在这里找到

macOS (Darwin)

确保命令 hostname 返回有效的完全限定主机名(在 /etc/hostconfig 中配置)。否则,在运行分布式系统时可能会遇到问题。

如果您开发链接的驱动程序(共享库),则需要使用 gcc 和标志 -bundle -flat_namespace -undefined suppress 进行链接。在编译时,您还需要在 CFLAGS 中包含 -fno-common。使用 .so 作为库后缀。

如果您有 Xcode 4.3 或更高版本,则还需要通过 Xcode 中的“下载”首选项窗格下载“命令行工具”。

使用 Wx 构建

建议使用 wxWidgets-3.2.x 来构建 wx 应用程序(wxWidgets-3.0.x 也可以工作)。从 https://www.wxwidgets.org/downloadshttps://github.com/wxWidgets/wxWidgets 下载。建议使用 3.2 系列中的最新版本,在编写本文时为 3.2.2.1。

请注意,wxWidgets-3.3 版本是实验性的,但如果通过将 --enable-compat30 添加到下面的 configure 命令来启用 3.0 兼容性,它们也应该可以工作。

在所有其他平台上,共享库的构建方式如下

$ ./configure --prefix=/usr/local
$ make && sudo make install
$ export PATH=/usr/local/bin:$PATH

在 Linux 上,静态库的构建方式如下

$ export CFLAGS=-fPIC
$ export CXXFLAGS=-fPIC
$ ./configure --prefix=/usr/local --disable-shared
$ make && sudo make install
$ export PATH=/usr/local/bin:$PATH

在 macOS 上,构建与 macOS 13 (Ventura) 及更高版本兼容的静态库,如下所示

$ ./configure --prefix=/usr/local --with-macosx-version-min=13.0 --disable-shared
$ make
$ sudo make install
$ export PATH=/usr/local/bin:$PATH

验证构建和安装是否成功

$ which wx-config && wx-config --version-full

预期输出在一行上是 /usr/local/bin/wx-config,后跟完整版本号。例如,如果您构建的版本为 3.2.2.1,则预期输出为

/usr/local/bin/wx-config
3.2.2.1

以通常的方式构建 Erlang/OTP。要验证 wx 应用程序是否正在工作,请运行以下命令

$ erl -run wx demo

预构建源代码发布

源代码发布提供了许多已经预先构建的平台无关构建结果。如果要删除这些预构建的文件,请从 $ERL_TOP 目录中调用 ./otp_build remove_prebuilt_files。完成此操作后,您可以像以前一样进行构建,但构建过程将花费更长的时间。

警告

在源代码树的任意目录中执行 make clean 可能会删除构建引导所需的文件。

在执行 make clean 之前,从 $ERL_TOP 目录中执行 ./otp_build save_bootstrap 将确保在执行 make clean 后可以进行构建。当从 $ERL_TOP 调用 make 时,无论使用 clean 目标还是默认目标,都会自动调用 ./otp_build save_bootstrap。如果调用 ./otp_build remove_prebuilt_files,也会自动调用它。

如果您需要验证引导 beam 文件是否与提供的源文件匹配,请使用 ./otp_build update_primary 创建一个包含差异(如果存在)的新提交。

如何构建启用调试的 Erlang 运行时系统

完成上述所有正常构建步骤后,可以构建启用调试的运行时系统。为此,您必须将目录更改为 $ERL_TOP/erts/emulator 并执行

$ (cd $ERL_TOP/erts/emulator && make debug)

这将生成一个 beam.debug.smp 可执行文件。该文件与普通 (opt) 版本 beam.smp 一起安装。

要启动启用调试的运行时系统,请执行

$ $ERL_TOP/bin/cerl -debug

启用调试的运行时系统具有锁定违规检查、断言检查和各种健全性检查,以帮助开发人员确保正确性。可以使用适当的配置选项在普通 beam 上启用其中一些功能。

也可以使用刚刚描述的类似步骤构建其他类型的运行时系统。

$ (cd $ERL_TOP/erts/emulator && make $TYPE)

其中 $TYPEoptgcovgprofdebugvalgrindasanlcnt。这些不同的 beam 类型对于调试和分析很有用。

安装

  • 使用 DESTDIR 进行分阶段安装。您可以在临时目录中执行安装阶段,然后使用 DESTDIR 变量将安装移动到其正确的位置

    $ make DESTDIR=<tmp install dir> install
    

    安装将在以 $DESTDIR 为前缀的位置创建。但是,它不能从那里运行。它需要移动到正确的位置才能运行。如果未设置 DESTDIR,但已设置 INSTALL_PREFIX,则 DESTDIR 将设置为 INSTALL_PREFIX。请注意,预 R13B04 中的 INSTALL_PREFIX 有错误,其行为类似于 EXTRA_PREFIX(见下文)。使用 DESTDIR 的安装过程有很多用途,例如在创建包、交叉编译等时。这是一个示例,其中安装应位于 /opt/local

    $ ./configure --prefix=/opt/local
    $ make
    $ make DESTDIR=/tmp/erlang-build install
    $ cd /tmp/erlang-build/opt/local
    $     # gnu-tar is used in this example
    $ tar -zcf /home/me/my-erlang-build.tgz *
    $ su -
    Password: *****
    $ cd /opt/local
    $ tar -zxf /home/me/my-erlang-build.tgz
    
  • 使用 release 目标进行安装。您可以使用 release 目标在您喜欢的任何目录中创建安装,而不是执行 make install,并自己运行 Install 脚本。RELEASE_ROOT 用于指定应创建安装的目录。如果您使用 make install 进行安装,默认情况下最终会位于 /usr/local/lib/erlang 下。在 configure 阶段提供的所有安装路径,以及 DESTDIRINSTALL_PREFIX 都会被忽略。如果您希望从特定的 bin 目录链接到安装,则必须自己设置这些链接。这是一个示例,其中 Erlang/OTP 应位于 /home/me/OTP

    $ ./configure
    $ make
    $ make RELEASE_ROOT=/home/me/OTP release
    $ cd /home/me/OTP
    $ ./Install -minimal /home/me/OTP
    $ mkdir -p /home/me/bin
    $ cd /home/me/bin
    $ ln -s /home/me/OTP/bin/erl erl
    $ ln -s /home/me/OTP/bin/erlc erlc
    $ ln -s /home/me/OTP/bin/escript escript
    ...
    

    目前应在它所在的目录(顶层目录)中按如下方式调用 Install 脚本

    $ ./Install [-cross] [-minimal|-sasl] <ERL_ROOT>
    

    其中

    • -minimal 创建一个启动最少应用程序的安装,即只启动 kernelstdlib。最小系统通常足够,也是 make install 使用的系统。
    • -sasl 创建一个还启动 sasl 应用程序的安装。
    • -cross 用于交叉编译。告知安装脚本它在构建计算机上运行。
    • <ERL_ROOT> - 在运行时要使用的 Erlang 安装的绝对路径。这通常与当前工作目录相同,但不必如此。它可以遵循文件系统中的任何其他路径到达同一目录。

    如果未将 -minimal-sasl 作为参数传递,系统将提示您。

  • 使用 EXTRA_PREFIX 测试安装。在执行 make install 时,EXTRA_PREFIX 变量的内容将作为所有安装路径的前缀。请注意,EXTRA_PREFIX 类似于 DESTDIR,但它与 DESTDIR 的效果相同。安装必须且只能从 EXTRA_PREFIX 指定的位置运行。也就是说,如果您想在不使用 EXTRA_PREFIX 进行实际安装之前尝试该系统、运行测试套件等,它会很有用。

--bindir 中的符号链接

当执行 make install 并且使用默认安装前缀时,将从 /usr/local/bin 创建相对符号链接到 /usr/local/lib/erlang/bin 中的所有公共 Erlang/OTP 可执行文件。只要 --bindir 和 Erlang bin 目录(位于 --libdir 下)都以 --exec-prefix 作为前缀,安装阶段将尝试创建相对符号链接。其中 --exec-prefix 默认为 --prefix--prefix--exec-prefix--bindir--libdir 都是可以传递给 configure 的参数。可以通过在安装阶段将 BINDIR_SYMLINKS=relative|absolute 作为参数传递给 make 来强制使用相对或绝对链接。请注意,如果无法满足请求,则此类请求可能会导致失败。

Erlang/OTP 测试架构

Erlang/OTP 当前在以下硬件和操作系统上进行测试。 这不是一个详尽的列表,但我们会尽力保持其最新状态。

架构

  • x86, x86-64
  • Aarch32, Aarch64
  • powerpc, powerpc64le
  • Apple M1, M2, M2 Pro

操作系统

  • Fedora 31
  • FreeBSD
  • macOS 13 - 14
  • MontaVista 4
  • NetBSD
  • OpenBSD
  • SLES 10, 11, 12
  • SunOS 5.11
  • Ubuntu 10.04 - 22.04
  • Windows 11, Windows 10, Windows Server 2019