aboutsummaryrefslogtreecommitdiff
path: root/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniPackage.scala
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniPackage.scala')
-rw-r--r--plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniPackage.scala95
1 files changed, 95 insertions, 0 deletions
diff --git a/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniPackage.scala b/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniPackage.scala
new file mode 100644
index 0000000..b6b5100
--- /dev/null
+++ b/plugin/src/main/scala/ch/jodersky/sbt/jni/plugins/JniPackage.scala
@@ -0,0 +1,95 @@
+package ch.jodersky.sbt.jni
+package plugins
+
+import sbt._
+import sbt.Keys._
+import java.io.File
+
+/** Packages libraries built with JniNative. */
+object JniPackage extends AutoPlugin {
+
+ // JvmPlugin is required or else it will override resource generators when first included
+ override def requires = JniNative && plugins.JvmPlugin
+ override def trigger = allRequirements
+
+ object autoImport {
+
+ val enableNativeCompilation = settingKey[Boolean](
+ "Determines if native compilation is enabled. If not enabled, only pre-compiled libraries in " +
+ "`unmanagedNativeDirectories` will be packaged."
+ )
+
+ val unmanagedNativeDirectories = settingKey[Seq[File]](
+ "Unmanaged directories containing native libraries. The libraries must be regular files " +
+ "contained in a subdirectory corresponding to a platform. For example " +
+ "`<unamagedNativeDirectory>/x86_64-linux/libfoo.so` is an unmanaged library for machines having " +
+ "the x86_64 architecture and running the Linux kernel."
+ )
+
+ val unmanagedNativeLibraries = taskKey[Seq[(File, String)]](
+ "Reads `unmanagedNativeDirectories` and maps platforms to library files specified theirin."
+ )
+
+ val managedNativeLibraries = taskKey[Seq[(File, String)]](
+ "Maps locally built, platform-dependant libraries."
+ )
+
+ val nativeLibraries = taskKey[Seq[(File, String)]](
+ "All native libraries, managed and unmanaged."
+ )
+
+ }
+ import autoImport._
+ import JniNative.autoImport._
+
+ lazy val settings: Seq[Setting[_]] = Seq(
+
+ enableNativeCompilation := true,
+
+ unmanagedNativeDirectories := Seq(baseDirectory.value / "lib_native"),
+
+ unmanagedNativeLibraries := {
+ val baseDirs: Seq[File] = unmanagedNativeDirectories.value
+ val mappings: Seq[(File, String)] = unmanagedNativeDirectories.value.flatMap { dir =>
+ val files: Seq[File] = (dir ** "*").get
+ files pair rebase(dir, "/native")
+ }
+ mappings
+ },
+
+ managedNativeLibraries := Def.taskDyn[Seq[(File, String)]] {
+ val enableManaged = (enableNativeCompilation).value
+ if (enableManaged) Def.task {
+ val library: File = nativeCompile.value
+ val platform = nativePlatform.value
+
+ Seq(library -> s"/native/$platform/${library.name}")
+ }
+ else Def.task {
+ Seq.empty
+ }
+ }.value,
+
+ nativeLibraries := unmanagedNativeLibraries.value ++ managedNativeLibraries.value,
+
+ resourceGenerators += Def.task {
+ val libraries: Seq[(File, String)] = nativeLibraries.value
+ val resources: Seq[File] = for ((file, path) <- libraries) yield {
+
+ // native library as a managed resource file
+ val resource = resourceManaged.value / path
+
+ // copy native library to a managed resource, so that it is always available
+ // on the classpath, even when not packaged as a jar
+ IO.copyFile(file, resource)
+ resource
+ }
+ resources
+ }.taskValue
+
+ )
+
+ override lazy val projectSettings = inConfig(Compile)(settings) ++
+ Seq(crossPaths := false) // don't add scala version to native jars
+
+}