模块 Unit_info

module Unit_info: sig .. end

此模块集中处理编译文件及其元数据。

也许更重要的是,此模块提供了从字符串或文件名派生模块名称的函数。


模块名称约定和计算

type modname = string 
type filename = string 
type file_prefix = string 
val modulize : string -> modname

modulize ss 的首字母大写。

val normalize : string -> string

normalize ss 的首字母小写。

val modname_from_source : filename -> modname

modname_from_source filename 等于 modulize stem,其中 stem 是文件名 filename 的基本名称,去掉了所有扩展名。例如,modname_from_source "/pa.th/x.ml.pp" 等于 "X"

模块名称验证函数

val is_unit_name : modname -> bool

is_unit_name ~strict name 仅当 name 可用作有效的模块名称时才为真。

编译单元的元数据

type t 

编译单元的元数据

  • 与单元关联的模块名称
  • 编译工件的文件名前缀(dirname + basename,已去除所有扩展名)
  • 输入源文件 例如,当调用 ocamlopt dir/x.mli -o target/y.cmi 时,
  • 输入源文件是 dir/x.mli
  • 模块名称是 Y
  • 前缀是 target/y
val source_file : t -> filename

source_file uu 的源文件。

val prefix : t -> file_prefix

prefix u 是单元的文件名前缀。

val modname : t -> modname

modname uartifact_modname a 是单元或编译工件的模块名称。

val check_unit_name : t -> unit

check_unit_name u 如果派生的模块名称 modname u 不应按 Unit_info.is_unit_name ~strict:true 指定的那样用作模块名称,则会打印警告。

val make : ?check_modname:bool ->
source_file:filename -> file_prefix -> t

make ~check ~source_file prefixsource_file 和模块名称 Unit_info.modname_from_source target_prefix 都关联到文件系统路径前缀 prefix

如果 check_modname=true,则此函数会在派生的模块名称根据 Unit_info.check_unit_name 无效时发出警告。

module Artifact: sig .. end

构建工件

派生构建工件元数据

val cmi : t -> Artifact.t

这些函数从 unit 元数据派生特定的 artifact 元数据。

val cmo : t -> Artifact.t
val cmx : t -> Artifact.t
val obj : t -> Artifact.t
val cmt : t -> Artifact.t
val cmti : t -> Artifact.t
val annot : t -> Artifact.t
val companion_cmi : Artifact.t -> Artifact.t

以下函数通过更新其文件名的扩展名来更改工件的类型。这些函数有意不涵盖所有工件种类,因为我们希望跟踪哪些工件被假定为捆绑在一起。

val companion_obj : Artifact.t -> Artifact.t
val companion_cmt : Artifact.t -> Artifact.t

从实现文件派生的 Mli 和 Cmi

模块实现的编译在存在 mli 和 cmi 文件的情况下会发生变化,以下函数有助于处理此问题。

val mli_from_source : t -> filename

mli_from_source u 是与单元 u 关联的接口源文件名。实际后缀取决于 Config.interface_suffix

val mli_from_artifact : Artifact.t -> filename

mli_from_artifact t 是从工件 t 派生的接口源文件的名称。当处理从未知源文件(例如打包模块)派生的工件时,此变体是必要的。

val is_cmi : Artifact.t -> bool

检查工件是否为 cmi

val find_normalized_cmi : t -> Artifact.t

find_normalized_cmi u 在 load_path 中查找与模块名称 modname u 匹配的文件。