Skip to content

Commit

Permalink
Merge pull request #1529 from olafurpg/rocket
Browse files Browse the repository at this point in the history
Cross-build for Scala Native.
  • Loading branch information
olafurpg committed May 11, 2018
2 parents afbd949 + 829720a commit 6a8d24b
Show file tree
Hide file tree
Showing 16 changed files with 542 additions and 334 deletions.
11 changes: 8 additions & 3 deletions .travis.yml
@@ -1,3 +1,7 @@
sudo: required
os: linux
dist: trusty
jdk: oraclejdk8
language: scala
git:
depth: 9999
Expand All @@ -6,8 +10,9 @@ install:
- rm -rf ~/.nvm && git clone https://github.com/creationix/nvm.git ~/.nvm && (cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`) && source ~/.nvm/nvm.sh && nvm install 8
script:
- ./bin/runci.sh $CI_TEST
jdk:
- oraclejdk8
addons:
apt:
update: true

matrix:
include:
Expand All @@ -26,7 +31,7 @@ matrix:
- CI_SCALA_VERSION: 2.11.12
- CI_SCALA_NATIVE: true
before_install:
- bin/travis_before_install
- curl https://raw.githubusercontent.com/scala-native/scala-native/master/scripts/travis_setup.sh | bash -x
- env:
- CI_TEST: ci-fast
- CI_SCALA_VERSION: 2.12.4
Expand Down
11 changes: 0 additions & 11 deletions bin/travis_before_install

This file was deleted.

87 changes: 68 additions & 19 deletions build.sbt
Expand Up @@ -46,7 +46,9 @@ commands += Command.command("ci-fast") { s =>
s
}
commands += Command.command("ci-native") { s =>
"metapNative/nativeLink" :: s
"metapNative/nativeLink" ::
"ci-fast" ::
s
}
commands += CiCommand("ci-publish")(
"publishSigned" :: Nil
Expand Down Expand Up @@ -198,50 +200,58 @@ lazy val metapJS = metap.js
lazy val metapNative = metap.native

/** ======================== SCALAMETA ======================== **/
lazy val common = crossProject(JSPlatform, JVMPlatform)
lazy val common = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/common"))
.settings(
publishableSettings,
libraryDependencies += "com.lihaoyi" %%% "sourcecode" % "0.1.3",
libraryDependencies += "com.lihaoyi" %%% "sourcecode" % "0.1.4",
description := "Bag of private and public helpers used in scalameta APIs and implementations",
enableMacros
)
.nativeSettings(nativeSettings)
.dependsOn(semanticdb3)
lazy val commonJVM = common.jvm
lazy val commonJS = common.js
lazy val commonNative = common.native

lazy val io = crossProject(JSPlatform, JVMPlatform)
lazy val io = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/io"))
.settings(
publishableSettings,
description := "Scalameta APIs for input/output"
)
.nativeSettings(nativeSettings)
.dependsOn(common)

lazy val ioJVM = io.jvm
lazy val ioJS = io.js
lazy val ioNative = io.native

lazy val dialects = crossProject(JSPlatform, JVMPlatform)
lazy val dialects = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/dialects"))
.settings(
publishableSettings,
description := "Scalameta dialects",
enableMacros
)
.nativeSettings(nativeSettings)
.dependsOn(common)
lazy val dialectsJVM = dialects.jvm
lazy val dialectsJS = dialects.js
lazy val dialectsNative = dialects.native

lazy val inputs = crossProject(JSPlatform, JVMPlatform)
lazy val inputs = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/inputs"))
.settings(
publishableSettings,
description := "Scalameta APIs for source code",
enableMacros
)
.nativeSettings(nativeSettings)
.dependsOn(common, io)
lazy val inputsJVM = inputs.jvm
lazy val inputsJS = inputs.js
lazy val inputsNative = inputs.native

lazy val interactive = project
.in(file("scalameta/interactive"))
Expand All @@ -253,64 +263,74 @@ lazy val interactive = project
)
.dependsOn(semanticdbScalacCore)

lazy val parsers = crossProject(JSPlatform, JVMPlatform)
lazy val parsers = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/parsers"))
.settings(
publishableSettings,
description := "Scalameta APIs for parsing and their baseline implementation",
scalaJSModuleKind := ModuleKind.CommonJSModule
)
.nativeSettings(nativeSettings)
.dependsOn(common, dialects, inputs, tokens, tokenizers, trees)
lazy val parsersJVM = parsers.jvm
lazy val parsersJS = parsers.js
lazy val parsersNative = parsers.native

lazy val quasiquotes = crossProject(JSPlatform, JVMPlatform)
lazy val quasiquotes = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/quasiquotes"))
.settings(
publishableSettings,
description := "Scalameta quasiquotes for abstract syntax trees",
enableHardcoreMacros
)
.nativeSettings(nativeSettings)
.dependsOn(common, dialects, inputs, trees, parsers)
lazy val quasiquotesJVM = quasiquotes.jvm
lazy val quasiquotesJS = quasiquotes.js
lazy val quasiquotesNative = quasiquotes.native

lazy val tokenizers = crossProject(JSPlatform, JVMPlatform)
lazy val tokenizers = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/tokenizers"))
.settings(
publishableSettings,
description := "Scalameta APIs for tokenization and their baseline implementation",
libraryDependencies += "com.lihaoyi" %%% "fastparse" % "1.0.0",
enableMacros
)
.nativeSettings(nativeSettings)
.dependsOn(common, dialects, inputs, tokens)
lazy val tokenizersJVM = tokenizers.jvm
lazy val tokenizersJS = tokenizers.js
lazy val tokenizersNative = tokenizers.native

lazy val tokens = crossProject(JSPlatform, JVMPlatform)
lazy val tokens = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/tokens"))
.settings(
publishableSettings,
description := "Scalameta tokens and token-based abstractions (inputs and positions)",
enableMacros
)
.nativeSettings(nativeSettings)
.dependsOn(common, dialects, inputs)
lazy val tokensJVM = tokens.jvm
lazy val tokensJS = tokens.js
lazy val tokensNative = tokens.native

lazy val transversers = crossProject(JSPlatform, JVMPlatform)
lazy val transversers = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/transversers"))
.settings(
requiresMacrosSetting,
publishableSettings,
description := "Scalameta traversal and transformation infrastructure for abstract syntax trees",
enableMacros
)
.nativeSettings(nativeSettings)
.dependsOn(common, trees)
lazy val traversersJVM = transversers.jvm
lazy val traversersJS = transversers.js
lazy val traversersNative = transversers.native

lazy val trees = crossProject(JSPlatform, JVMPlatform)
lazy val trees = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/trees"))
.settings(
publishableSettings,
Expand All @@ -319,26 +339,31 @@ lazy val trees = crossProject(JSPlatform, JVMPlatform)
// scalacOptions += "-Xprint:typer",
enableMacros
)
.nativeSettings(nativeSettings)
.dependsOn(common, dialects, inputs, tokens, tokenizers) // NOTE: tokenizers needed for Tree.tokens when Tree.pos.isEmpty
lazy val treesJVM = trees.jvm
lazy val treesJS = trees.js
lazy val treesNative = trees.native

lazy val semanticdb = crossProject(JSPlatform, JVMPlatform)
lazy val semanticdb = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/semanticdb"))
.settings(
publishableSettings,
description := "Scalameta semantic database APIs"
)
.nativeSettings(nativeSettings)
.dependsOn(common)
lazy val semanticdbJVM = semanticdb.jvm
lazy val semanticdbJS = semanticdb.js
lazy val semanticdbNative = semanticdb.native

lazy val scalameta = crossProject(JSPlatform, JVMPlatform)
lazy val scalameta = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/scalameta"))
.settings(
publishableSettings,
description := "Scalameta umbrella module that includes all public APIs"
)
.nativeSettings(nativeSettings)
.dependsOn(
common,
dialects,
Expand All @@ -353,16 +378,19 @@ lazy val scalameta = crossProject(JSPlatform, JVMPlatform)
)
lazy val scalametaJVM = scalameta.jvm
lazy val scalametaJS = scalameta.js
lazy val scalametaNative = scalameta.native

lazy val contrib = crossProject(JSPlatform, JVMPlatform)
lazy val contrib = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("scalameta/contrib"))
.settings(
publishableSettings,
description := "Incubator for Scalameta APIs"
)
.nativeSettings(nativeSettings)
.dependsOn(scalameta)
lazy val contribJVM = contrib.jvm
lazy val contribJS = contrib.js
lazy val contribNative = contrib.native

/** ======================== TESTS ======================== **/
lazy val semanticdbIntegration = project
Expand Down Expand Up @@ -395,7 +423,7 @@ lazy val testkit = project
publishableSettings,
hasLargeIntegrationTests,
libraryDependencies ++= Seq(
"org.scalatest" %%% "scalatest" % "3.0.1",
"org.scalatest" %% "scalatest" % "3.2.0-SNAP10",
"com.lihaoyi" %% "geny" % "0.1.1",
// These are used to download and extract a corpus tar.gz
"org.rauschig" % "jarchivelib" % "0.7.1",
Expand All @@ -407,7 +435,7 @@ lazy val testkit = project
)
.dependsOn(contribJVM)

lazy val tests = crossProject(JSPlatform, JVMPlatform)
lazy val tests = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("tests"))
.settings(
sharedSettings,
Expand All @@ -429,19 +457,37 @@ lazy val tests = crossProject(JSPlatform, JVMPlatform)
),
buildInfoPackage := "scala.meta.tests",
libraryDependencies += "com.lihaoyi" %%% "fansi" % "0.2.5" % "test",
libraryDependencies += "org.scalatest" %%% "scalatest" % "3.0.1" % "test"
libraryDependencies += "org.scalatest" %%% "scalatest" % "3.2.0-SNAP10" % "test"
)
.jvmSettings(
// TODO: Workaround for what seems to be a bug in ScalaTest 3.2.0-SNAP10.
// Without adding scalacheck to library dependencies, we get the following error:
// > testsJVM/test
// [info] Compiling 79 Scala sources to /Users/eburmako/Projects/scalameta/tests/jvm/target/scala-2.12/test-classes...
// [trace] Stack trace suppressed: run last testsJVM/test:executeTests for the full output.
// [error] (testsJVM/test:executeTests) java.lang.NoClassDefFoundError: org/scalacheck/Test$TestCallback
// [error] Total time: 19 s, completed Feb 1, 2018 3:12:34 PM
libraryDependencies += "org.scalacheck" %% "scalacheck" % "1.13.5",
libraryDependencies ++= List(
"io.get-coursier" %% "coursier" % coursier.util.Properties.version,
"io.get-coursier" %% "coursier-cache" % coursier.util.Properties.version
)
)
.jvmConfigure(_.dependsOn(testkit, interactive, metac, metacp))
.nativeSettings(
nativeSettings,
// TODO: set nativeLinkStubs := false
// discussion: https://github.com/scalameta/scalameta/pull/1243/files#r165529377
// [error] cannot link: @java.lang.Thread::getStackTrace_scala.scalanative.runtime.ObjectArray
// [error] unable to link
nativeLinkStubs := true,
nativeMode := "debug"
)
.enablePlugins(BuildInfoPlugin)
.dependsOn(scalameta, contrib, metap)
lazy val testsJVM = tests.jvm
lazy val testsJS = tests.js
lazy val testsNative = tests.native

/** ======================== BENCHES ======================== **/
lazy val bench = project
Expand Down Expand Up @@ -788,7 +834,10 @@ def macroDependencies(hardcore: Boolean) = libraryDependencies ++= {

lazy val isTagPush = sys.env.get("TRAVIS_TAG").exists(_.nonEmpty)
lazy val isCiPublish = sys.env.contains("CI_PUBLISH")
lazy val ciPlatform = if (sys.env.contains("CI_SCALA_JS")) "JS" else "JVM"
lazy val ciPlatform =
if (sys.env.contains("CI_SCALA_JS")) "JS"
else if (sys.env.contains("CI_SCALA_NATIVE")) "Native"
else "JVM"
lazy val ciScalaVersion = sys.env("CI_SCALA_VERSION")
def CiCommand(name: String)(commands: List[String]): Command = Command.command(name) { initState =>
commands.foldLeft(initState) {
Expand Down
14 changes: 7 additions & 7 deletions project/plugins.sbt
@@ -1,9 +1,3 @@
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.21")

addSbtPlugin("org.portable-scala" % "sbt-crossproject" % "0.4.0")

addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.3.1")

// exclude is a workaround for https://github.com/sbt/sbt-assembly/issues/236#issuecomment-294452474
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6" exclude("org.apache.maven", "maven-plugin-api"))

Expand Down Expand Up @@ -32,6 +26,12 @@ addSbtPlugin("com.dwijnand" % "sbt-dynver" % "2.0.0")

addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.1.18")

addSbtPlugin("org.scala-native" %% "sbt-scala-native" % "0.3.7")
addSbtPlugin("org.portable-scala" % "sbt-crossproject" % "0.4.0")

addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "0.4.0")

addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.4.0")

addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.22")

addSbtPlugin("org.scala-native" %% "sbt-scala-native" % "0.3.7")
Expand Up @@ -3,4 +3,5 @@ package scala.meta.internal
package object platform {
final val isJS = false
final val isJVM = true
final val isNative = false
}
@@ -0,0 +1,7 @@
package scala.meta.internal

package object platform {
final val isJS = false
final val isJVM = false
final val isNative = true
}

0 comments on commit 6a8d24b

Please sign in to comment.