Как создать компилятор Action для SBT - PullRequest
5 голосов
/ 09 марта 2010

Я хочу создать действие для автоматизации компиляции GCJ. Поскольку я не мог заставить его работать с Ant , я решил попробовать SBT. В документах рассказывается, как создать действие и как запустить внешний процесс. Чего я пока не вижу, так это как повторно использовать обход дерева каталогов, который существует для действий компилятора java и scala. В этом случае мои входные файлы будут все файлы .class в определенной корневой папке. Мне также нужно указать конкретный путь к классу для GCJ. Любые указатели для этого также будут оценены.

1 Ответ

4 голосов
/ 09 марта 2010

Я совсем не много использовал GCJ, и я все еще довольно новичок в SBT, но я уверен, что вы могли бы написать быстрое задание, чтобы точно выполнить то, что вы ищете, с SBT 0.7.1. Вы можете использовать PathFinder , чтобы получить все файлы классов следующим образом:

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

Используя этот PathFinder и метод верхнего уровня "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")
...