【问题标题】:How to create a compiler Action for SBT如何为 SBT 创建编译器操作
【发布时间】:2011-01-25 13:05:48
【问题描述】:

我想创建一个动作来自动化 GCJ 编译。由于I couldn't make it work with Ant,我决定尝试SBT。文档说明了如何创建操作以及如何运行外部进程。我还没有看到如何重用存在于 java 和 scala 编译器操作的目录树遍历。在这种情况下,我的输入文件将是某个根文件夹下的所有 .class 文件。我还需要为 GCJ 指定一个特定的类路径。对此的任何指示也将不胜感激。

【问题讨论】:

    标签: scala gcj sbt


    【解决方案1】:

    我根本没怎么用过 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 编译定义的类路径吗?我想为 gcj 使用一个特定的。
    • 这确实使用了为 Scala 编译定义的类路径。如果你想使用不同的,那么你可以硬编码或者你可以把所有的 JAR 放到一个特定的目录中,然后使用 PathFinder 把它们全部拉进去。
    • 太棒了。我需要导入 Process._ 以使 xml 转换工作,并且我进行了更多调整。答案很有帮助,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 2014-06-22
    • 1970-01-01
    • 2011-04-06
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多