diff options
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.scala | 68 |
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 + +} |