檢視原始碼 建置和安裝 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 -- 用於基本文字轉換的 Stream Editor。

在 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 文件的工具。

    escript 從 github 下載,或從 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 克隆

變數 $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.dev.org.tw/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 vs 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 旗標建置 64 位元二進位檔給 (g)cc
  • --enable-m32-build - 使用 -m32 旗標建置 32 位元二進位檔給 (g)cc
  • --{enable,disable}-pie - 建置與位置無關的可執行二進位檔。
  • --with-assumed-cache-line-size=SIZE - 設定假設的快取行大小(以位元組為單位)。預設值為 64。有效值是介於 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} - 為了允許在不支援動態連結函式庫的作業系統上使用 nif 和驅動程式,可以將 nif 和驅動程式與主要的 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 編譯器進行編譯時可以使用。當使用與其他架構相容的 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 版本為實驗性版本,但如果透過在下方的 configure 命令中新增 --enable-compat30 來啟用 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 後仍可建置。make$ERL_TOP 叫用,並具有 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 目標在您喜歡的任何目錄中建立安裝,並自行執行 Install 腳本,而不是執行 make installRELEASE_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 和位於 --libdir 下的 Erlang bin 目錄都以 --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