2010-03-09 81 views
5

我想創建一個Action來自動執行GCJ編譯。由於I couldn't make it work with Ant,我決定嘗試SBT。文檔說明如何創建一個Action以及如何運行一個外部過程。我還沒有看到的是如何重用java和scala編譯器Actions所存在的目錄樹遍歷。在這種情況下,我的輸入文件將是某個根文件夾下的所有.class文件。我還需要爲GCJ指定一個特定的類路徑。任何指針,這將不勝感激。如何爲SBT創建編譯器操作

回答

4

我還沒有使用GCJ,我在SBT上還是很新的,但這是我相信你可以寫一個快速的任務來完成你正在用SBT 0.7.1來查找的內容。您可以使用PathFinder抓住所有的類文件,像這樣:

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

使用路徑查找器和「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") 
+0

我會試試這個...還有一個問題,這是獲取爲scala編譯定義的類路徑嗎?我想用一個特定的gcj。 – 2010-03-11 15:49:59

+0

這確實使用爲Scala編譯定義的類路徑。如果你想使用一個不同的代碼,那麼你可以對它進行硬編碼,或者你可以把所有的JAR放到一個特定的目錄中,然後使用路徑查找器將其全部拉入。 – Aaron 2010-03-11 16:15:56

+0

太好了。我需要導入Process._以便xml轉換工作,並且我調整了一些。答案很有幫助,謝謝。 – 2010-03-12 01:07:14