使用Poly / ML构建具有嵌套目录结构的项目

时间:2015-03-28 09:59:57

标签: build build-automation sml polyml

到目前为止,我一直在使用Poly / ML进行几个小项目,其中所有源代码文件都在同一目录中。要构建这些项目,我所要做的就是在REPL中运行以下命令:

> PolyML.make "Main";

但是现在我有一个项目,其规模使得将所有源代码文件放在同一目录中是不切实际的。要在REPL中构建这些项目,我需要运行以下命令:

> PolyML.make "foo/Foo";
> PolyML.make "bar/Bar";
> PolyML.make "qux/Qux";
> PolyML.make "Main";

随着子系统数量的增长,这并不十分实用。

有没有办法自动化在Poly / ML中使用嵌套目录结构构建项目的过程?


P.D。:我看过SML / NJ的编译管理器和MLton的ML Basis系统。虽然无疑是强大的,但这些对我的需求来说太复杂了。

2 个答案:

答案 0 :(得分:4)

在每个子目录中放入一个名为ml_bind.ML的文件,并让这些文件构建该目录的组件。

PolyML.make期望源文件的名称与组件的名称(结构,签名或仿函数)匹配。因此,如果它正在寻找一个名为“Foo”的结构,它将在一个名为“Foo”,“Foo.ML”或“Foo.sml”的文件中期望“Foo”的来源。如果它找到一个名为“Foo”的目录,它会递归进入“Foo”目录并使用“ml_bind.ML”文件作为构建“Foo”结构的指南。通常,“Foo / ml_bind.ML”看起来像

structure Foo = FooFunctor(structure A = FooA and B = FooB);

文件“Foo / FooFunctor.ML”,“Foo / FooA.ML”和“Foo / FooB.ML”分别包含“FooFunctor”,“FooA”和“FooB”的来源。

您可以在Poly / ML编译器的代码中找到此示例,它是Poly / ML源代码分发的一部分。

答案 1 :(得分:1)

您可以拥有build.sml个文件列表和use所有项目文件:

use "bar/bar.sml";
use "foo/foo.sml";
use "main.sml";

或者,更简洁一点:

app use [
  "foo/foo.sml",
  "bar/bar.sml",
  "main.sml"
]

其中app是标准List.app

然后你可以构建这个文件:

$ polyc -o main main.sml
$ # or
$ poly
> PolyML.make "build.sml"