檢視原始碼 erlc

編譯器

描述

erlc 程式提供了一種在 Erlang 系統中執行所有編譯器的通用方法。根據每個輸入檔的副檔名,erlc 會呼叫適當的編譯器。無論使用哪個編譯器,都會使用相同的旗標來提供參數,例如 include 路徑和輸出目錄。

執行編譯器時,目前的執行目錄 "." 不會包含在程式碼路徑中。這是為了避免從目前的執行目錄載入 Beam 檔案,這些檔案可能會與編譯器或編譯器使用的 Erlang/OTP 系統發生衝突。

erlc 旗標 檔案1.ext 檔案2.ext...

編譯一個或多個檔案。這些檔案必須包含副檔名,例如,Erlang 原始碼使用 .erl,Yecc 原始碼使用 .yrlErlc 使用副檔名來呼叫正確的編譯器。

一般有用的旗標

支援以下旗標

  • -I <目錄> - 指示編譯器在 目錄 中搜尋 include 檔案。當遇到 -include-include_lib 指示詞時,編譯器會在下列目錄中搜尋標頭檔

    • ".",檔案伺服器的目前工作目錄
    • 已編譯檔案的基本名稱
    • 使用選項 -I 指定的目錄;最後指定的目錄會先被搜尋
  • -o <目錄> - 編譯器放置輸出檔案的目錄。預設為目前的工作目錄。

  • -D<名稱> - 定義一個巨集。

  • -D<名稱>=<值> - 定義具有指定值的巨集。該值可以是任何 Erlang 項。根據平台,如果 shell 本身解釋某些字元,則該值可能需要加上引號。在 Unix 上,包含元組和清單的項必須加上引號。在所有平台上,包含空格的項都必須加上引號。

  • -WError - 將所有警告變成錯誤。

  • -W<數字> - 將警告層級設定為 數字。預設為 1。若要關閉警告,請使用 -W0

  • -W - 與 -W1 相同。預設值。

  • -v - 啟用詳細輸出。

  • -b <輸出類型> - 指定輸出檔案的類型。輸出類型 與輸出檔案的副檔名相同,但不含句點。對於具有單一輸出格式的編譯器,會忽略此選項。

  • -no-server - 不要使用編譯伺服器

  • -server - 使用編譯伺服器

  • -enable-feature <功能> - 在編譯期間啟用功能 功能。特殊功能 all 可用於啟用所有功能。

  • -disable-feature <功能> - 在編譯期間停用功能 功能。特殊功能 all 可用於停用所有非永久功能。

  • -list-features - 列出目前可設定的功能的簡短描述。不會顯示不可設定的功能(狀態為 rejectedpermanent 的功能)。

  • -describe-feature <功能> - 顯示功能 功能 的詳細描述和歷史記錄。

  • -M - 產生一個 Makefile 規則以追蹤標頭相依性。該規則會傳送到 stdout。不會產生任何物件檔案。

  • -MMD - 將相依性產生為副作用。物件檔案會照常產生。此選項會覆寫選項 -M

  • -MF <Makefile> - 與選項 -M 相同,不同之處在於 Makefile 會寫入 Makefile。不會產生任何物件檔案。

  • -MD - 與 -M -MF <檔案>.Pbeam 相同。

  • -MT <目標> - 與選項 -M-MF 結合使用,將發出的規則名稱變更為 目標

  • -MQ <目標> - 與選項 -MT 相同,不同之處在於 make/1 特殊的字元會加上引號。

  • -MP - 與選項 -M-MF 結合使用,為每個相依性新增一個虛擬目標。

  • -MG - 與選項 -M-MF 結合使用,將遺失的標頭視為產生的檔案,並將其新增至相依性。

  • -- - 表示後面不會再有選項。其餘的引數會被視為檔案名稱,即使它們以連字號開頭。

  • +<項> - 以加號 (+) 而非連字號開頭的旗標會轉換為 Erlang 項,並以未變更的方式傳遞至編譯器。例如,Erlang 編譯器的選項 export_all 可以如下指定

    erlc +export_all file.erl

    根據平台,如果 shell 本身解釋某些字元,則該值可能需要加上引號。在 Unix 上,包含元組和清單的項必須加上引號。在所有平台上,包含空格的項都必須加上引號。

特殊旗標

以下旗標在特殊情況下很有用,例如重建 OTP 系統

  • -pa <目錄> - 將 目錄 附加到呼叫的 Erlang 模擬器中程式碼路徑的前面。這可以用來呼叫另一個編譯器,而不是預設的編譯器。

  • -pz <目錄> - 將 目錄 附加到呼叫的 Erlang 模擬器中的程式碼路徑。

支援的編譯器

支援以下編譯器

  • .erl - Erlang 原始碼。它會產生一個 .beam 檔案。

    選項 -P-E-S 等同於 +'P'+'E'+'S',不同之處在於不必包含單引號來保護它們不受 shell 的影響。

    支援的選項:-I-o-D-v-W-b

  • .S - Erlang 組譯器原始碼。它會產生一個 .beam 檔案。

    支援的選項:與 .erl 相同。

  • .core - Erlang 核心原始碼。它會產生一個 .beam 檔案。

    支援的選項:與 .erl 相同。

  • .yrl - Yecc 原始碼。它會產生一個 .erl 檔案。

    使用選項 -I 和檔案名稱,將該檔案用作自訂的前言檔案(選項 includefile)。

    支援的選項:-o-v-I-W

  • .mib - SNMP 的 MIB。它會產生一個 .bin 檔案。

    支援的選項:-I-o-W

  • .bin - SNMP 的已編譯 MIB。它會產生一個 .hrl 檔案。

    支援的選項:-o-v

  • .rel - 指令碼檔案。它會產生一個開機檔案。

    使用選項 -I 來指定要搜尋應用程式檔案的目錄(相當於 systools:make_script/2 選項清單中的 path)。

    支援的選項:-o

  • .asn1 - ASN1 檔案。它會從 .asn1 檔案建立一個 .erl.hrl.asn1db 檔案。除非指定選項 +noobj,否則也會使用 Erlang 編譯器來編譯 .erl

    支援的選項:-I-o-b-W

  • .idl - IC 檔案。它會執行 IDL 編譯器。

    支援的選項:-I-o

編譯伺服器

編譯伺服器可用於避免為每個要編譯的檔案啟動 Erlang 系統,進而可能加快多檔案專案的建置速度。它是否會加快建置速度取決於專案的性質和建置機器。

依預設,不會使用編譯伺服器。可以透過給予 erlc 選項 -server 或將環境變數 ERLC_USE_SERVER 設定為 yestrue 來啟用它。

當啟用編譯伺服器時,erlc 會在伺服器已啟動時自動使用該伺服器,如果伺服器尚未啟動則會啟動它。伺服器在閒置一段時間後會自行終止。

erlc 和編譯伺服器使用 Erlang 發佈進行通訊。編譯伺服器會以隱藏節點啟動,其名稱包含目前的使用者。因此,電腦上的每個使用者都有自己的編譯伺服器。

使用編譯伺服器並不總是能加快建置速度,因為編譯伺服器有時必須重新啟動以確保正確性。以下是一些會強制重新啟動的情況範例

  • erlc 想要使用與編譯伺服器正在使用的不同 Erlang 版本。
  • erlc 想要對 erl 使用與啟動編譯伺服器時不同的選項。(使用選項 -pa 變更程式碼路徑可能會導致載入不同的剖析轉換。為了安全起見,當任何 erl 選項變更時,將重新啟動編譯伺服器。)
  • 如果 erlc 的目前工作目錄與啟動編譯伺服器時的有效工作目錄不同,而且編譯伺服器有作用中的工作,則會在這些工作完成後立即重新啟動。(在多個目錄中平行隨機建置檔案的建置系統可能不會從編譯伺服器中受益。)

環境變數

  • ERLC_EMULATOR - 啟動模擬器的指令。預設值為與 erlc 程式本身位於同一目錄下的 erl,如果該目錄下不存在,則會使用環境變數 PATH 中指定的任何目錄下的 erl

  • ERLC_USE_SERVER - 允許的值為 yestrue,表示使用編譯伺服器nofalse,表示不使用編譯伺服器。若指定其他值,erlc 將會印出警告訊息並繼續執行。

  • ERLC_SERVER_ID - 告知 erlc 以給定的名稱來識別編譯伺服器,允許單一使用者平行執行多個不相關的建置,而不會互相影響,這對於共用的建置機器等情況非常有用。名稱必須是字母數字,預設值為空字串。

參見

erl(1), compile, yecc, snmp