如何为SBT创建编译器操作

5
我想创建一个自动化GCJ编译的Action。由于在Ant中无法实现我决定尝试SBT。文档说明了如何创建Action以及如何运行外部进程。但我还没有看到如何重用为Java和Scala编译器Actions存在的目录树遍历。在这种情况下,我的输入文件将是某个根文件夹下所有.class文件。我还需要为GCJ指定特定的类路径。如果有任何指针也将不胜感激。
1个回答

4

我对GCJ的使用不多,而且在SBT方面还很新,但是我相信你可以使用SBT 0.7.1编写一个快速任务来完成你所需要的功能。你可以使用PathFinder来获取所有的类文件,如下:

val allClasses = (outputPath ##) ** "*.class"

使用PathFinder和“compileClasspath”顶级方法,您可以构建这样的任务,它将使用当前项目的类路径运行gcj,并将所有.class文件组合成一个gcjFile:
val gcj = "/usr/local/bin/gcj"
val gcjFile = "target/my_executable.o"

val allClasses = (outputPath ##) ** "*.class"

lazy val gcjCompile = execTask {
  <x>{gcj} --classpath={compileClasspath.get.map(_.absolutePath).mkString(":")}  -c {allClasses.get.map(_.absolutePath).mkString("-c ")} -o {gcjFile}</x>
} dependsOn(compile) describedAs("Create a GCJ executable object")

我会尝试这个...还有一个问题,这是为scala编译定义classpath吗?我想使用一个特定于gcj的。 - Germán
这确实使用了为Scala编译定义的类路径。如果您想使用不同的路径,那么您可以硬编码它,或者将所有JAR文件放入某个目录中,并使用PathFinder来引入这些文件。 - Aaron
太好了。我需要导入Process._才能使xml转换工作,并进行了一些调整。这个答案真的帮了我很多,谢谢。 - Germán

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接