aboutsummaryrefslogtreecommitdiff
path: root/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala')
-rw-r--r--plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala68
1 files changed, 68 insertions, 0 deletions
diff --git a/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala b/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala
new file mode 100644
index 0000000..edda1fc
--- /dev/null
+++ b/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniJavah.scala
@@ -0,0 +1,68 @@
+package ch.jodersky.sbt.jni
+package plugins
+
+import sbt._
+import sbt.Keys._
+import util.BytecodeUtil
+
+/** Adds `javah` header-generation functionality to projects. */
+object JniJavah extends AutoPlugin {
+
+ override def requires = plugins.JvmPlugin
+ override def trigger = allRequirements
+
+ object autoImport {
+
+ val javahClasses = taskKey[Set[String]](
+ "Finds fully qualified names of classes containing native declarations."
+ )
+
+ val javah = taskKey[File](
+ "Generate JNI headers. Returns the directory containing generated headers."
+ )
+
+ }
+ import autoImport._
+
+ lazy val mainSettings: Seq[Setting[_]] = Seq(
+
+ javahClasses in javah := {
+ val compiled: inc.Analysis = (compile in Compile).value
+ val classFiles: Set[File] = compiled.relations.allProducts.toSet
+ val nativeClasses = classFiles flatMap { file =>
+ BytecodeUtil.nativeClasses(file)
+ }
+ nativeClasses
+ },
+
+ target in javah := target.value / "native" / "include",
+
+ javah := {
+ val out = (target in javah).value
+ val jcp: Seq[File] = { (compile in Compile).value; Seq((classDirectory in Compile).value) }
+ val cp = jcp.mkString(sys.props("path.separator"))
+ val log = streams.value.log
+
+ val classes = (javahClasses in javah).value
+ if (!classes.isEmpty) {
+ log.info("Headers will be generated to " + out.getAbsolutePath)
+ }
+ for (clazz <- classes) {
+ log.info("Generating header for " + clazz)
+ val parts = Seq(
+ "javah",
+ "-d", out.getAbsolutePath,
+ "-classpath", cp,
+ clazz
+ )
+ val cmd = parts.mkString(" ")
+ val ev = Process(cmd) ! streams.value.log
+ if (ev != 0) sys.error(s"Error occured running javah. Exit code: ${ev}")
+ }
+ out
+ }
+ )
+
+ override lazy val projectSettings = mainSettings
+
+}