Как создать действие компилятора для SBT
Вопрос
Я хочу создать действие для автоматизации компиляции GCJ.С тех пор как Я не смог заставить это сработать с Ant, Я решил попробовать SBT.В документах говорится, как создать действие и как запустить внешний процесс.Чего я пока не вижу, так это как повторно использовать обход дерева каталогов, который существует для действий компилятора java и scala.В этом случае моими входными файлами были бы все файлы .class в определенной корневой папке.Мне также нужно было бы указать конкретный путь к классу для GCJ.Любые указания на это тоже были бы оценены.
Решение
Я вообще не часто использовал GCJ, и я все еще довольно новичок в SBT, но вот как, я полагаю, вы могли бы написать быструю задачу, чтобы сделать именно то, что вы ищете, с SBT 0.7.1.Вы можете использовать Следопыт чтобы захватить все файлы класса следующим образом:
val allClasses = (outputPath ##) ** "*.class"
Используя этот указатель пути и метод верхнего уровня "compileClasspath", вы можете создать подобную задачу, которая будет запускать gcj, используя classpath текущего проекта, и скомпоновать все файлы .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")