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