Я сомневаюсь, что вы найдете sbt-only решение для компиляции C-кода.Даже если бы вы нашли плагин sbt, который компилировал код на C, я был бы очень удивлен, если бы он сделал это хорошо.Компиляция собственных библиотек слишком сильно отличается от компиляции Scala.
Для компиляции вашей библиотеки C или C ++ я рекомендую CMake или Automake .Ни то, ни другое не является идеальным, но оба хорошо справляются с задачей, позволяя вам в основном объявить «скомпилировать эти .c или .cpp файлы в .so».Automake более популярен в проектах с открытым исходным кодом, но CMake немного проще.CMake также имеет хорошую поддержку для компиляции в Windows, если это необходимо.
Для доступа к вашей нативной библиотеке из Scala я рекомендую использовать JNA .Он позволяет вам получить доступ к собственному коду с любого языка JVM, включая Scala.И это происходит без клейкого слоя или генерации кода, требуемых JNI .
Я перенес пример JNA с Java на Scala.Следует отметить несколько вещей:
- Java varargs отличаются от Scala varargs.Если вы хотите вызвать переменную функцию C, вам придется написать интерфейс на Java вместо Scala.Но вы будете использовать этот интерфейс точно так же, как если бы он был написан на Scala.
- Я хотел, чтобы пример оставался строго в Scala, поэтому я использовал
puts
вместо printf
в примере
- Я сделал в значительной степени прямой порт.Возможно, вы захотите немного разобраться с Scala-esque.
И код:
import com.sun.jna.{Library, Native, Platform}
trait CLibrary extends Library {
def puts(s: String)
}
object CLibrary {
def Instance = Native.loadLibrary(
if (Platform.isWindows) "msvcrt" else "c",
classOf[CLibrary]).asInstanceOf[CLibrary]
}
object HelloWorld {
def main(args: Array[String]) {
CLibrary.Instance.puts("Hello, World");
for ((arg, i) <- args.zipWithIndex) {
CLibrary.Instance.puts(
"Argument %d: %s".format(i.asInstanceOf[AnyRef], arg))
}
}
}
Кстати, забавно, что вы упомянули, что не хотите, чтобы ScalaC компилятор.Была опубликована недавняя статья о компиляции Scala для LLVM, которая в значительной степени имела бы тот же эффект, что и компилятор Scala to C.