diff options
author | Katrin Shechtman <katrin.shechtman@gmail.com> | 2016-06-13 01:23:45 -0400 |
---|---|---|
committer | Katrin Shechtman <katrin.shechtman@gmail.com> | 2016-06-13 11:48:05 -0400 |
commit | 59c9e1e4bfc45f843f89da22e0190d19403b4dc6 (patch) | |
tree | c754e73fa8ac7f7363dd5a66521e17ef1dbab03d /plugins/scalajs/ScalaJs.scala | |
parent | b69826c7bc44573f01366ef472a59def6e4f1fc5 (diff) | |
download | cbt-59c9e1e4bfc45f843f89da22e0190d19403b4dc6.tar.gz cbt-59c9e1e4bfc45f843f89da22e0190d19403b4dc6.tar.bz2 cbt-59c9e1e4bfc45f843f89da22e0190d19403b4dc6.zip |
scalajs cross project support as plugin
Diffstat (limited to 'plugins/scalajs/ScalaJs.scala')
-rw-r--r-- | plugins/scalajs/ScalaJs.scala | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/plugins/scalajs/ScalaJs.scala b/plugins/scalajs/ScalaJs.scala new file mode 100644 index 0000000..bde3307 --- /dev/null +++ b/plugins/scalajs/ScalaJs.scala @@ -0,0 +1,82 @@ +import java.io.File + +import cbt._ + +import scala.collection.immutable.Seq + +trait ScalaJsSbtDependencyDsl extends SbtDependencyDsl { self: ScalaJsBuild => + + //Note: We make same assumption about scala version. + //In order to be able to choose different scala version, one has to use %. + implicit class ScalaJsDependencyBuilder(groupId: String){ + def %%%(artifactId: String) = new DependencyBuilder2( + groupId, artifactId + artifactIdSuffix, Some(scalaMajorVersion)) + } +} + +trait ScalaJsBuild extends BasicBuild with ScalaJsSbtDependencyDsl with ScalaJsInformation { outer => + + def sharedFolder = projectDirectory ++ "/shared" + def jvmFolder = projectDirectory ++ "/jvm" + def jsFolder = projectDirectory ++ "/js" + + private lazy val jvmBuild = new BasicBuild(outer.context){ + override def sources = Seq(sharedFolder ++ "/src/main/scala", jvmFolder ++ "/src/main/scala") + override def target = jvmFolder ++ "/target" + override def dependencies = outer.dependencies ++ jvmDependencies + } + private lazy val jsBuild = new BasicBuild(outer.context){ + override def sources = Seq(sharedFolder ++ "/src/main/scala", jsFolder ++ "/src/main/scala") + override def target = jsFolder ++ "/target" + override def dependencies = outer.dependencies :+ scalaJsLibDep + override def scalacOptions = super.scalacOptions ++ + Seq(s"-Xplugin:${scalaJsCompilerDep.jar.getAbsolutePath}", "-Xplugin-require:scalajs") + } + + def jvmDependencies = Seq.empty[Dependency] + //TODO: implement + def jsDependencies = Seq.empty[Dependency] + def jvmCompile: Option[File] = jvmBuild.compile + def jsCompile: Option[File] = jsBuild.compile + override def compile = { + jvmCompile + jsCompile + } + + trait JsOutputMode { + def option: String + def fileSuffix: String + } + case object FastOptJS extends JsOutputMode{ + override val option = "-f" + override val fileSuffix = "fastopt" + } + case object FullOptJS extends JsOutputMode{ + override val option = "-u" + override val fileSuffix = "fullopt" + } + + private def output(mode: JsOutputMode) = s"${jsBuild.target.getAbsolutePath}/$projectName-${mode.fileSuffix}.js" + + //TODO: should process all options that Scalajsld recognizes? + private def link(mode: JsOutputMode, outputPath: String) = { + lib.runMain( + "org.scalajs.cli.Scalajsld", + Seq( + mode.option, + "-s", + "--stdlib", s"${scalaJsLibDep.jar.getAbsolutePath}", + "-o", outputPath, + jsBuild.target.getAbsolutePath) ++ + jsBuild.dependencies.collect{case d: BoundMavenDependency => d.jar.getAbsolutePath}, + scalaJsCliDep.classLoader(jsBuild.context.classLoaderCache)) + } + def fastOptJS = link(FastOptJS, fastOptOutput) + def fullOptJS = link(FullOptJS, fullOptOutput) + def fastOptOutput: String = output(FastOptJS) + def fullOptOutput: String = output(FullOptJS) +} + + + + |