如何编译整个Frege源代码树

时间:2013-09-15 12:25:03

标签: frege

在回答how to use multiple inline assertions in Frege之后,我学会了如何编译两个Frege模块A和B,其中B依赖于A:你必须编译B.如果给出了-make选项,编译器会发现B取决于在A上,将在源路径(-sp标志)上找到A,并将首先编译A然后编译B.

但是,我不能只将我关心的所有文件都提供给编译器。将 B同时提供给编译器失败,并出现“循环依赖”错误。而且我也发现没有办法给编译器一个目录(它什么都没做)。

这看起来我必须知道依赖图的根,以便对所有需要编译的文件进行适当的编译。但

  • 我可能不知道根。
  • 可能有很多。
  • 以这种方式进行正确的构建自动化非常困难。

是否有编译器选项的组合,我可以让编译器编译源树中的所有文件?

2 个答案:

答案 0 :(得分:2)

编辑:使用更新的编译器版本,您确实可以编译整个树:

java -jar fregec.jar -d classes/ -make directory1/ directory2/

就此而言,以下答案已经过时。


简短的回答是“不”。

答案很长:

  1. 如果你有一个应用程序,你应该知道根,它是包含main函数的模块。可以使用-make选项一次编译所有这些,只要它们不相互依赖。
  2. 如果是库,您可以创建一个伪模块,只导入属于该库的所有模块并编译该模块。
  3. 如果上述方法都没有帮助,而您只需要编译“那里的所有内容”,您可以通过使用-make选项传递所有文件名来实现(见下文)。缺点是某些文件可能会被编译两次。
  4. eclipse插件的Frege构建器在完整版本中以正确的顺序编译所有文件。
  5. 似乎命令行编译器也需要这样的功能。

    顺便说一下,我无法回溯你的“循环依赖”错误。我使用了以下命令:

    java -jar ~/frege/fregec.jar  -d bin -make -sp Real_World_Frege-master/ $(find . -type f -name '*.fr' -print)
    

    事实上,只有当A导入B而B(或B导入的东西)导入A时,才会标记此错误。

答案 1 :(得分:2)

现在frege-maven-plugin解决了这个问题:

https://github.com/Frege/frege-maven-plugin

可在maven central中找到。