我有用标准ML(以下简称SML)编写的软件,我想在三个编译器中移植它。
Standard ML of New Jersey是最简单的,因为他们的编译管理器会为您进行依赖性分析。
MLton使用与SML / NJ类似的格式,但它要求文件按依赖顺序列出,类似于Unix库。
Moscow ML使用普通的Makefile,但要求在命令行中列出依赖关系(理想情况下要进入Makefile)。
我想做的是获取SML源文件列表并发现文件之间的依赖关系。以下是我尝试和失败的方法:
SML / NJ编译管理器生成依赖关系图,但它不是文件图。相反,它包含大量未记录的编译器内部。至少从2009年开始尝试将其转换为文件上的依赖图。没人做过。
如果我曾经将文件转换为依赖顺序,我可以从MLton获取def / use信息,其中包括源代码位置。因此,如果我找到一个部分解决方案来获取MLton的文件,我可以使用它来获得完整的解决方案。
我正在寻找能够给出近似答案的简单工具的想法。我的代码有两个特殊属性:
open
。在我看来,在这种情况下,一个简单的语法工具可能能够找到文件的外部依赖关系。但我不太清楚如何写一个。
想法?
答案 0 :(得分:1)
在MLton存储库中,有一个cm2mlb
工具可以将.cm
文件转换为MLB文件(git repo的util / cm2mlb)。如果您将所有文件放入.cm
文件,您应该能够使用它来生成一个依赖顺序的MLB文件。
答案 1 :(得分:1)
根据提出类似问题的Set Env Variable - Tutorial,我能够编写一个为我工作的小程序(我复制了生成的文件名列表,粘贴在里面一个.mlb文件,MLton能够编译我的小项目)。所以,我无法保证任何事情,但这可能是一个好的开始。希望它有所帮助。
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
{{1}}