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