查看源码 erlc

编译器

描述

erlc 程序提供了一种在 Erlang 系统中运行所有编译器的通用方法。根据每个输入文件的扩展名,erlc 调用相应的编译器。无论使用哪个编译器,都使用相同的标志来提供参数,例如包含路径和输出目录。

当运行编译器时,当前工作目录 "." 不包含在代码路径中。这是为了避免从当前工作目录加载 Beam 文件,这些文件可能与编译器或编译器使用的 Erlang/OTP 系统冲突。

erlc 标志 file1.ext file2.ext...

编译一个或多个文件。这些文件必须包含扩展名,例如,Erlang 源代码的 .erl 或 Yecc 源代码的 .yrlErlc 使用扩展名来调用正确的编译器。

常用标志

支持以下标志

  • -I <目录> - 指示编译器在 目录 中搜索包含文件。当遇到 -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 <File>.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 core 源代码。它会生成一个 .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 文件。还会使用 Erlang 编译器编译 .erl,除非指定了选项 +noobj

    支持的选项:-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