Skip to content

Commit

Permalink
Link Scala.JS with scala-js-cli
Browse files Browse the repository at this point in the history
So that we don't have to embed the whole scala-js linker in the Scala
CLI native image.
  • Loading branch information
alexarchambault committed Mar 21, 2022
1 parent 88097bd commit 16a42db
Show file tree
Hide file tree
Showing 13 changed files with 332 additions and 157 deletions.
6 changes: 3 additions & 3 deletions build.sc
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,6 @@ class Build(val crossScalaVersion: String)
Deps.osLib,
Deps.pprint,
Deps.scalaJsEnvNodeJs,
Deps.scalaJsLinkerInterface,
Deps.scalaJsTestAdapter,
Deps.scalametaTrees,
Deps.scalaparse,
Expand Down Expand Up @@ -248,9 +247,11 @@ class Build(val crossScalaVersion: String)
| def version = "${publishVersion()}"
| def detailedVersion: Option[String] = $detailedVersionValue
|
| def scalaJsVersion = "${Deps.scalaJsLinker.dep.version}"
| def scalaJsVersion = "${Scala.scalaJs}"
| def scalaNativeVersion = "${Deps.nativeTools.dep.version}"
|
| def scalaJsCliVersion = "${InternalDeps.Versions.scalaJsCli}"
|
| def stubsOrganization = "${stubs.pomSettings().organization}"
| def stubsModuleName = "${stubs.artifactName()}"
| def stubsVersion = "${stubs.publishVersion()}"
Expand Down Expand Up @@ -361,7 +362,6 @@ trait Cli extends SbtModule with CliLaunchers with ScalaCliPublishModule with Fo
Deps.jimfs, // scalaJsEnvNodeJs pulls jimfs:1.1, whose class path seems borked (bin compat issue with the guava version it depends on)
Deps.jniUtils,
Deps.jsoniterCore,
Deps.scalaJsLinker,
Deps.scalaPackager,
Deps.metaconfigTypesafe
)
Expand Down
49 changes: 47 additions & 2 deletions modules/build/src/main/scala/scala/build/Artifacts.scala
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ final case class Artifacts(
extraJavacPlugins: Seq[os.Path],
userDependencies: Seq[AnyDependency],
internalDependencies: Seq[AnyDependency],
scalaJsCli: Seq[os.Path],
scalaNativeCli: Seq[os.Path],
detailedArtifacts: Seq[(CsDependency, csCore.Publication, csUtil.Artifact, os.Path)],
extraClassPath: Seq[os.Path],
Expand Down Expand Up @@ -79,6 +80,7 @@ object Artifacts {
addJsTestBridge: Option[String],
addNativeTestInterface: Option[String],
addJmhDependencies: Option[String],
scalaJsCliVersion: Option[String],
scalaNativeCliVersion: Option[String],
extraRepositories: Seq[String],
cache: FileCache[Task],
Expand Down Expand Up @@ -133,6 +135,15 @@ object Artifacts {
Nil
}

val scalaJsCliDependency =
scalaJsCliVersion.map { version =>
import coursier.moduleString
val mod =
if (version.contains("-sc-")) mod"org.scala-js:scalajs-cli_2.13"
else mod"io.github.alexarchambault.tmp:scalajs-cli_2.13"
Seq(coursier.Dependency(mod, version))
}

val scalaNativeCliDependency =
scalaNativeCliVersion.map { version =>
import coursier.moduleString
Expand Down Expand Up @@ -201,6 +212,7 @@ object Artifacts {
Positioned.none(dependency),
allExtraRepositories,
None,
Nil,
logger,
cache.withMessage("Downloading Scala Native CLI"),
None
Expand All @@ -217,6 +229,35 @@ object Artifacts {
}
}

val fetchedScalaJsCli = scalaJsCliDependency match {
case Some(dependency) =>
import coursier.moduleString
val forcedVersions = Seq(
mod"org.scala-js:scalajs-linker_2.13" -> scalaJsVersion
)
Some(
value {
fetch0(
Positioned.none(dependency),
allExtraRepositories,
None,
forcedVersions,
logger,
cache.withMessage("Downloading Scala.JS CLI"),
None
)
}
)
case None =>
None
}

val scalaJsCli = fetchedScalaJsCli.toSeq.flatMap { fetched =>
fetched.fullDetailedArtifacts.collect { case (_, _, _, Some(f)) =>
os.Path(f, Os.pwd)
}
}

val extraStubsJars =
if (addStubs)
value {
Expand Down Expand Up @@ -269,6 +310,7 @@ object Artifacts {
extraJavacPlugins,
dependencies.map(_.value),
internalDependencies.map(_.value),
scalaJsCli,
scalaNativeCli,
fetchRes.fullDetailedArtifacts.collect { case (d, p, a, Some(f)) =>
(d, p, a, os.Path(f, Os.pwd))
Expand Down Expand Up @@ -315,6 +357,7 @@ object Artifacts {
dependencies.map(_.map(_.toCs(params))),
extraRepositories,
Some(params.scalaVersion),
Nil,
logger,
cache,
classifiersOpt
Expand All @@ -324,6 +367,7 @@ object Artifacts {
dependencies: Positioned[Seq[coursier.Dependency]],
extraRepositories: Seq[String],
forceScalaVersionOpt: Option[String],
forcedVersions: Seq[(coursier.Module, String)],
logger: Logger,
cache: FileCache[Task],
classifiersOpt: Option[Set[String]]
Expand All @@ -339,7 +383,7 @@ object Artifacts {
.left.map(errors => new RepositoryFormatError(errors))
}

val forceVersions = forceScalaVersionOpt match {
val forceScalaVersions = forceScalaVersionOpt match {
case None => Nil
case Some(sv) =>
import coursier.moduleString
Expand Down Expand Up @@ -367,7 +411,8 @@ object Artifacts {
.addRepositories(extraRepositories0: _*)
.addDependencies(dependencies.value: _*)
.mapResolutionParams { params =>
params.addForceVersion(forceVersions: _*)
params
.addForceVersion(forceScalaVersions ++ forcedVersions: _*)
}
for (classifiers <- classifiersOpt) {
if (classifiers("_"))
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package scala.build.errors

final class ScalaJsLinkingError extends BuildException("Error linking Scala.JS")

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package scala.build.internal

final case class ScalaJsLinkerConfig(
// trying to have the same defaults as org.scalajs.linker.interface.StandardConfig here
moduleKind: String = ScalaJsLinkerConfig.ModuleKind.NoModule,
checkIR: Boolean = false,
sourceMap: Boolean = true,
moduleSplitStyle: String = ScalaJsLinkerConfig.ModuleSplitStyle.FewestModules,
esFeatures: ScalaJsLinkerConfig.ESFeatures = ScalaJsLinkerConfig.ESFeatures(),
jsHeader: Option[String] = None,
prettyPrint: Boolean = false,
relativizeSourceMapBase: Option[String] = None,
semantics: ScalaJsLinkerConfig.Semantics = ScalaJsLinkerConfig.Semantics()
)

object ScalaJsLinkerConfig {
object ModuleKind {
val NoModule = "NoModule"
val ESModule = "ESModule"
val CommonJSModule = "CommonJSModule"
}

object ModuleSplitStyle {
val FewestModules = "FewestModules"
val SmallestModules = "SmallestModules"
}

final case class ESFeatures(
allowBigIntsForLongs: Boolean = false,
avoidClasses: Boolean = true,
avoidLetsAndConsts: Boolean = true,
esVersion: String = ESVersion.default
)

object ESVersion {
val ES5_1 = "ES5_1"
val ES2015 = "ES2015"
val ES2016 = "ES2016"
val ES2017 = "ES2017"
val ES2018 = "ES2018"
val ES2019 = "ES2019"
val ES2020 = "ES2020"
val ES2021 = "ES2021"

def default = ES2015
}

final case class Semantics(
asInstanceOfs: String = CheckedBehavior.Compliant
)

object CheckedBehavior {
val Compliant = "Compliant"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,8 @@ final case class BuildOptions(
extraJavacPlugins = javaOptions.javacPlugins.map(_.value),
dependencies = value(dependencies),
extraClassPath = allExtraJars,
scalaJsCliVersion =
if (platform.value == Platform.JS) Some(scalaJsCliVersion) else None,
scalaNativeCliVersion =
if (platform.value == Platform.Native) Some(scalaNativeOptions.finalVersion) else None,
extraCompileOnlyJars = allExtraCompileOnlyJars,
Expand Down
Loading

0 comments on commit 16a42db

Please sign in to comment.