Compilation 如何发现SML源文件之间的依赖关系(可能是近似的)?

Compilation 如何发现SML源文件之间的依赖关系(可能是近似的)?,compilation,dependencies,sml,Compilation,Dependencies,Sml,我有一个用标准ML编写的软件(从现在起是SML),我想让它可以在三个编译器之间移植 是最简单的,因为他们的编译管理器会为您进行依赖关系分析 使用与SML/NJ类似的格式,但它要求文件按依赖项顺序列出,类似于Unix库 使用普通的Makefile,但要求在命令行中列出依赖项(因此理想情况下进入Makefile) 我想做的是获取SML源文件的列表,并发现文件之间的依赖关系。以下是我尝试过但失败的方法: SML/NJ编译管理器生成依赖关系图,但它不是文件图。相反,它包含大量未记录的编译器内部构件

我有一个用标准ML编写的软件(从现在起是SML),我想让它可以在三个编译器之间移植

  • 是最简单的,因为他们的编译管理器会为您进行依赖关系分析

  • 使用与SML/NJ类似的格式,但它要求文件按依赖项顺序列出,类似于Unix库

  • 使用普通的Makefile,但要求在命令行中列出依赖项(因此理想情况下进入Makefile)

我想做的是获取SML源文件的列表,并发现文件之间的依赖关系。以下是我尝试过但失败的方法:

  • SML/NJ编译管理器生成依赖关系图,但它不是文件图。相反,它包含大量未记录的编译器内部构件。至少从2009年起,就开始尝试将其转换为文件依赖关系图;没有人做过这件事

  • 若我一旦将文件放入依赖顺序,我就可以从MLton获取def/use信息,其中包括源代码位置。所以,如果我找到一个局部解决方案,可以为MLton获取文件,我可以使用它来获得一个完整的解决方案

我正在寻找一些简单工具的想法,这些工具可以给出大致的答案。我的代码有两个特殊属性:

  • 它从不使用
    open
  • 每个顶级定义都是一个结构、函子或签名定义
在我看来,在这种情况下,一个简单的语法工具可能能够找到文件的外部依赖项。但我不太知道怎么写


Ideas?

在MLton存储库中,有一个
cm2mlb
工具,可以将
.cm
文件转换为MLB文件(git repo的util/cm2mlb)。如果您将所有文件放入一个
.cm
文件中,您应该能够使用该文件生成一个MLB文件,该文件将按依赖顺序排列。

基于这个问题,我可以编写一个适用于我的小程序(我复制了生成的文件名列表,将其粘贴到一个.mlb文件中,MLton能够编译我的小项目)。因此,我不能保证任何事情,但这可能是一个好的开始。希望能有所帮助

资料来源.cm 副秘书长
@andreas rossberg这件上面有你的名字。看起来很完美,我会去看看。
group
  structure Deps
is
  $/basis.cm
  $/pgraph.cm
  $smlnj/cm.cm

  deps.sml
structure Deps =
struct
  structure PG = PortableGraph

  fun list () =
    let
      fun println s = print (s ^ "\n")

      fun extractFiles def =
        case def of
          PG.DEF { rhs = PG.COMPILE { src, ... }, ... } => SOME (#1 src)
        | _ => NONE

      val PG.GRAPH { defs, ... } =
        (* Replace "sources.cm" with your project's .cm file path. *)
        #graph (valOf (CM.Graph.graph "sources.cm"))

      val files = List.mapPartial extractFiles defs
    in
      List.app println files
    end
end