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

时间:2015-06-08 15:15:42

标签: compilation dependencies sml

我有用标准ML(以下简称SML)编写的软件,我想在三个编译器中移植它。

  • Standard ML of New Jersey是最简单的,因为他们的编译管理器会为您进行依赖性分析。

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

  • Moscow ML使用普通的Makefile,但要求在命令行中列出依赖关系(理想情况下要进入Makefile)。

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

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

  • 如果我曾经将文件转换为依赖顺序,我可以从MLton获取def / use信息,其中包括源代码位置。因此,如果我找到一个部分解决方案来获取MLton的文件,我可以使用它来获得完整的解决方案。

我正在寻找能够给出近似答案的简单工具的想法。我的代码有两个特殊属性:

  • 它从不使用open
  • 每个顶级定义都是结构,仿函数或签名定义。

在我看来,在这种情况下,一个简单的语法工具可能能够找到文件的外部依赖关系。但我不太清楚如何写一个。

想法?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

根据提出类似问题的Set Env Variable - Tutorial,我能够编写一个为我工作的小程序(我复制了生成的文件名列表,粘贴在里面一个.mlb文件,MLton能够编译我的小项目)。所以,我无法保证任何事情,但这可能是一个好的开始。希望它有所帮助。

sources.cm

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

deps.sml

{{1}}