Come creare un compilatore per azione SBT
Domanda
Voglio creare un'azione per automatizzare la compilazione GCJ. Dal momento che non riuscivo a farlo funzionare con Ant , ho deciso di provare SBT . La documentazione dicono come creare un azione e come eseguire un processo esterno. Quello che ancora non vedo è come riutilizzare l'albero di directory traversal che esiste per Java e compilatore Scala azioni. In questo caso i miei file di input sarebbero tutti i file .class sotto di una certa cartella principale. Vorrei anche necessario specificare un percorso di classe specifica per GCJ. Tutti gli indicatori di questo sarebbe apprezzato troppo.
Soluzione
Non ho usato GCJ molto a tutti e sono ancora abbastanza nuovo a SBT, ma questo è come credo che si potrebbe scrivere un compito veloce per fare esattamente quello che stai cercando con SBT 0.7.1. È possibile utilizzare un PathFinder per afferrare tutti i file di classe in questo modo:
val allClasses = (outputPath ##) ** "*.class"
Utilizzando che PathFinder e il "compileClasspath" metodo di livello superiore, si può costruire un compito come questo che si protrarrà gcj usando classpath del progetto corrente e comporre tutti i file .class in uno 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")