forked from I2P_Developers/i2p.i2p

sbt-native-packager for future rpm/deb/windows and maybe even OSX packages. Also, the macosx sbt project now has a task named buildAppBundleTask and which will produce an I2P.app and copy over needed directories/jars/wars which later needs to be extracted to an writeable area which would be i2p base directory in runtime. The MacOSXRouterLauncherApp contains more information about how the executable in the OS X bundle will locate our R/O i2pbase so it can copy it to a writable area. The R/O is also to ensure valid signature on the bundle. At last, this approach is done casue letting an Mach-O binary load libjvm.dylib was proved unstable, so MacOSXRouterLauncherApp will rather use an JNI module to load the needed glue with the Mac OS X system.
55 lines
2.4 KiB
Scala
55 lines
2.4 KiB
Scala
import sbtassembly.AssemblyPlugin.defaultShellScript
|
|
import sbt._
|
|
import Keys._
|
|
import sbt.io.IO
|
|
import java.io.File
|
|
|
|
lazy val i2pVersion = "0.9.34"
|
|
|
|
lazy val buildAppBundleTask = taskKey[Unit](s"Build an Mac OS X bundle for I2P ${i2pVersion}.")
|
|
lazy val bundleBuildPath = file("./output")
|
|
|
|
|
|
// Pointing the resources directory to the "installer" directory
|
|
resourceDirectory in Compile := baseDirectory.value / ".." / ".." / "installer" / "resources"
|
|
lazy val resDir = new File("./../installer/resources")
|
|
lazy val i2pBuildDir = new File("./../build")
|
|
lazy val warsForCopy = i2pBuildDir.list.filter { f => f.endsWith(".war") }
|
|
lazy val jarsForCopy = i2pBuildDir.list.filter { f => f.endsWith(".jar") }
|
|
|
|
buildAppBundleTask := {
|
|
println(s"Building Mac OS X bundle for I2P version ${i2pVersion}.")
|
|
bundleBuildPath.mkdir()
|
|
val paths = Map[String,File](
|
|
"execBundlePath" -> new File(bundleBuildPath, "I2P.app/Contents/MacOS"),
|
|
"resBundlePath" -> new File(bundleBuildPath, "I2P.app/Contents/Resources"),
|
|
"i2pbaseBunldePath" -> new File(bundleBuildPath, "I2P.app/Contents/Resources/i2pbase"),
|
|
"i2pJarsBunldePath" -> new File(bundleBuildPath, "I2P.app/Contents/Resources/i2pbase/lib"),
|
|
"webappsBunldePath" -> new File(bundleBuildPath, "I2P.app/Contents/Resources/i2pbase/webapps")
|
|
)
|
|
paths.map { case (s,p) => p.mkdirs() }
|
|
val dirsToCopy = List("certificates","locale","man")
|
|
dirsToCopy.map { d => IO.copyDirectory( new File(resDir, d), new File(paths.get("i2pbaseBunldePath").get, d) ) }
|
|
warsForCopy.map { w => IO.copyFile( new File(i2pBuildDir, w), new File(paths.get("webappsBunldePath").get, w) ) }
|
|
warsForCopy.map { j => IO.copyFile( new File(i2pBuildDir, j), new File(paths.get("i2pJarsBunldePath").get, j) ) }
|
|
}
|
|
|
|
// Unmanaged classpath will be available at compile time
|
|
unmanagedClasspath in Compile ++= Seq(
|
|
baseDirectory.value / ".." / ".." / "build" / "*.jar",
|
|
baseDirectory.value / ".." / ".." / "router" / "java" / "src"
|
|
)
|
|
|
|
// Please note the difference between browserbundle, this has
|
|
// the "in Compile" which limit it's scope to that.
|
|
//unmanagedBase in Compile := baseDirectory.value / ".." / ".." / "build"
|
|
|
|
libraryDependencies ++= Seq(
|
|
"net.i2p" % "router" % i2pVersion % Compile
|
|
)
|
|
|
|
|
|
assemblyOption in assembly := (assemblyOption in assembly).value.copy(prependShellScript = Some(defaultShellScript))
|
|
|
|
assemblyJarName in assembly := s"${name.value}-${version.value}"
|