Skip to content

Commit

Permalink
Resolve typelevel#1549. Enable all cross modules for Scala Native. De…
Browse files Browse the repository at this point in the history
  • Loading branch information
arashi01 committed Jan 31, 2021
1 parent ac3e754 commit e46eb12
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 25 deletions.
33 changes: 28 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,39 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.12, 2.13.4, 3.0.0-M2, 3.0.0-M3]
scala: [2.12.13, 2.13.4, 3.0.0-M2, 3.0.0-M3]
java:
- adopt@1.8
- adopt@1.11
- adopt@1.15
- graalvm-ce-java8@20.2.0
platform: [jvm, js]
platform: [jvm, js, native]
exclude:
- platform: js
java: adopt@1.11
- platform: native
java: adopt@1.11
- platform: js
java: adopt@1.15
- platform: native
java: adopt@1.15
- platform: js
java: graalvm-ce-java8@20.2.0
- platform: native
java: graalvm-ce-java8@20.2.0
- platform: jvm
java: adopt@1.15
scala: 3.0.0-M2
- platform: js
java: adopt@1.15
scala: 3.0.0-M2
- platform: native
java: adopt@1.15
scala: 3.0.0-M2
- platform: native
scala: 3.0.0-M2
- platform: native
scala: 3.0.0-M3
runs-on: ${{ matrix.os }}
steps:
- name: Checkout current branch (full)
Expand Down Expand Up @@ -67,6 +86,10 @@ jobs:
if: matrix.platform == 'js'
run: sbt ++${{ matrix.scala }} validateAllJS

- name: Validate Scala Native
if: matrix.platform == 'native'
run: sbt ++${{ matrix.scala }} validateAllNative

- name: Setup Python
if: matrix.platform == 'jvm' && (matrix.scala != '3.0.0-M2' && matrix.scala != '3.0.0-M3')
uses: actions/setup-python@v2
Expand Down Expand Up @@ -98,7 +121,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.12, 2.13.4, 3.0.0-M2, 3.0.0-M3]
scala: [2.12.13, 2.13.4, 3.0.0-M2, 3.0.0-M3]
java: [adopt@1.8]
runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -134,7 +157,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.12, 2.13.4, 3.0.0-M2, 3.0.0-M3]
scala: [2.12.13, 2.13.4, 3.0.0-M2, 3.0.0-M3]
java: [adopt@1.8]
runs-on: ${{ matrix.os }}
steps:
Expand Down Expand Up @@ -169,7 +192,7 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest]
scala: [2.12.12]
scala: [2.12.13]
java: [adopt@1.8]
runs-on: ${{ matrix.os }}
steps:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package alleycats.tests

import org.scalacheck.Test.Parameters

trait TestSettings {

lazy val checkConfiguration: Parameters =
Parameters.default
.withMinSuccessfulTests(50)
.withMaxDiscardRatio(5.0f)
.withMaxSize(10)
.withMinSize(0)
.withWorkers(1)
}
114 changes: 97 additions & 17 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ val GraalVM8 = "graalvm-ce-java8@20.2.0"

ThisBuild / githubWorkflowJavaVersions := Seq(PrimaryJava, LTSJava, LatestJava, GraalVM8)

val Scala212 = "2.12.12"
val Scala212 = "2.12.13"
val Scala213 = "2.13.4"
val DottyOld = "3.0.0-M2"
val DottyNew = "3.0.0-M3"
Expand All @@ -52,24 +52,37 @@ ThisBuild / scalaVersion := Scala213
ThisBuild / githubWorkflowPublishTargetBranches := Seq() // disable publication for now

ThisBuild / githubWorkflowBuildMatrixAdditions +=
"platform" -> List("jvm", "js")
"platform" -> List("jvm", "js", "native")

ThisBuild / githubWorkflowBuildMatrixExclusions ++=
githubWorkflowJavaVersions.value.filterNot(Set(PrimaryJava)).map { java =>
MatrixExclude(Map("platform" -> "js", "java" -> java))
githubWorkflowJavaVersions.value.filterNot(Set(PrimaryJava)).flatMap { java =>
Seq(MatrixExclude(Map("platform" -> "js", "java" -> java)), MatrixExclude(Map("platform" -> "native", "java" -> java)))
}

ThisBuild / githubWorkflowBuildMatrixExclusions ++=
Seq("jvm", "js", "native").map { platform =>
MatrixExclude(
Map("platform" -> platform, "java" -> LatestJava, "scala" -> DottyOld)
) // 3.0.0-M1 doesn't work on JDK 14+
}

ThisBuild / githubWorkflowBuildMatrixExclusions ++= Seq(DottyOld, DottyNew).map {
dottyVersion => MatrixExclude(Map("platform" -> "native", "scala" -> dottyVersion))
} // Dotty is not yet supported by Scala Native

// we don't need this since we aren't publishing
ThisBuild / githubWorkflowArtifactUpload := false

val JvmCond = s"matrix.platform == 'jvm'"
val JsCond = s"matrix.platform == 'js'"
val NativeCond = s"matrix.platform == 'native'"

val Scala2Cond = s"(matrix.scala != '$DottyOld' && matrix.scala != '$DottyNew')"
val Scala3Cond = s"(matrix.scala == '$DottyOld' || matrix.scala == '$DottyNew')"

ThisBuild / githubWorkflowBuild := Seq(
WorkflowStep.Sbt(List("validateAllJS"), name = Some("Validate JavaScript"), cond = Some(JsCond)),
WorkflowStep.Sbt(List("validateAllNative"), name = Some("Validate Scala Native"), cond = Some(NativeCond)),
WorkflowStep.Use(UseRef.Public("actions", "setup-python", "v2"),
name = Some("Setup Python"),
params = Map("python-version" -> "3.x"),
Expand Down Expand Up @@ -153,6 +166,7 @@ lazy val commonSettings = Seq(
resolvers ++= Seq(Resolver.sonatypeRepo("releases"), Resolver.sonatypeRepo("snapshots")),
parallelExecution in Test := false,
testFrameworks += new TestFramework("munit.Framework"),
doctestTestFramework := DoctestTestFramework.Munit,
scalacOptions in (Compile, doc) := (scalacOptions in (Compile, doc)).value.filter(_ != "-Xfatal-warnings"),
Compile / doc / sources := {
val old = (Compile / doc / sources).value
Expand Down Expand Up @@ -216,6 +230,15 @@ lazy val commonJsSettings = Seq(
coverageEnabled := false
)

lazy val commonNativeSettings = Seq(
// currently sbt-doctest doesn't work in Native/JS builds
// https://github.com/tkawachi/sbt-doctest/issues/52
doctestGenTests := Seq.empty,
coverageEnabled := false,
// Currently scala-native does not support Dotty
crossScalaVersions := { crossScalaVersions.value filterNot Seq(DottyOld, DottyNew).contains }
)

lazy val commonJvmSettings = Seq(
testOptions in Test += {
val flag = if (githubIsWorkflowBuild.value) "-oCI" else "-oDF"
Expand Down Expand Up @@ -514,8 +537,8 @@ lazy val cats = project
.settings(moduleName := "root")
.settings(publishSettings) // these settings are needed to release all aggregated modules under this root module
.settings(noPublishSettings) // this is to exclude the root module itself from being published.
.aggregate(catsJVM, catsJS)
.dependsOn(catsJVM, catsJS, tests.jvm % "test-internal -> test")
.aggregate(catsJVM, catsJS, catsNative)
.dependsOn(catsJVM, catsJS, catsNative, tests.jvm % "test-internal -> test")

lazy val catsJVM = project
.in(file(".catsJVM"))
Expand Down Expand Up @@ -582,7 +605,40 @@ lazy val catsJS = project
)
.enablePlugins(ScalaJSPlugin)

lazy val kernel = crossProject(JSPlatform, JVMPlatform)
lazy val catsNative = project
.in(file(".catsNative"))
.settings(moduleName := "cats")
.settings(noPublishSettings)
.settings(catsSettings)
.settings(commonNativeSettings)
.aggregate(kernel.native,
kernelLaws.native,
core.native,
laws.native,
free.native,
testkit.native,
tests.native,
alleycatsCore.native,
alleycatsLaws.native,
alleycatsTests.native,
native
)
.dependsOn(
kernel.native,
kernelLaws.native,
core.native,
laws.native,
free.native,
testkit.native,
tests.native % "test-internal -> test",
alleycatsCore.native,
alleycatsLaws.native,
alleycatsTests.native % "test-internal -> test",
native
)
.enablePlugins(ScalaNativePlugin)

lazy val kernel = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.in(file("kernel"))
.settings(moduleName := "cats-kernel", name := "Cats kernel")
Expand All @@ -593,11 +649,12 @@ lazy val kernel = crossProject(JSPlatform, JVMPlatform)
.settings(includeGeneratedSrc)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-kernel"))
.nativeSettings(commonNativeSettings)
.settings(
libraryDependencies += "org.scalacheck" %%% "scalacheck" % scalaCheckVersion % Test
)

lazy val kernelLaws = crossProject(JSPlatform, JVMPlatform)
lazy val kernelLaws = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("kernel-laws"))
.settings(moduleName := "cats-kernel-laws", name := "Cats kernel laws")
.settings(commonSettings)
Expand All @@ -610,8 +667,9 @@ lazy val kernelLaws = crossProject(JSPlatform, JVMPlatform)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-kernel-laws", includeCats1 = false))
.jsSettings(coverageEnabled := false)
.dependsOn(kernel)
.nativeSettings(commonNativeSettings)

lazy val core = crossProject(JSPlatform, JVMPlatform)
lazy val core = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(kernel)
.settings(moduleName := "cats-core", name := "Cats core")
Expand All @@ -631,8 +689,10 @@ lazy val core = crossProject(JSPlatform, JVMPlatform)
)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-core"))
.settings(testingDependencies)
.nativeSettings(commonNativeSettings)

lazy val laws = crossProject(JSPlatform, JVMPlatform)
lazy val laws = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(kernel, core, kernelLaws)
.settings(moduleName := "cats-laws", name := "Cats laws")
Expand All @@ -642,16 +702,18 @@ lazy val laws = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-laws", includeCats1 = false))
.jsSettings(coverageEnabled := false)
.nativeSettings(commonNativeSettings)

lazy val free = crossProject(JSPlatform, JVMPlatform)
lazy val free = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(core, tests % "test-internal -> test")
.settings(moduleName := "cats-free", name := "Cats Free")
.settings(catsSettings)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-free"))
.nativeSettings(commonNativeSettings)

lazy val tests = crossProject(JSPlatform, JVMPlatform)
lazy val tests = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(testkit % Test)
.settings(moduleName := "cats-tests")
Expand All @@ -661,8 +723,9 @@ lazy val tests = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings)
.settings(scalacOptions in Test := (scalacOptions in Test).value.filter(_ != "-Xfatal-warnings"))
.nativeSettings(commonNativeSettings)

lazy val testkit = crossProject(JSPlatform, JVMPlatform)
lazy val testkit = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.dependsOn(core, laws)
.enablePlugins(BuildInfoPlugin)
Expand All @@ -673,8 +736,9 @@ lazy val testkit = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("cats-testkit", includeCats1 = false))
.settings(scalacOptions := scalacOptions.value.filter(_ != "-Xfatal-warnings"))
.nativeSettings(commonNativeSettings)

lazy val alleycatsCore = crossProject(JSPlatform, JVMPlatform)
lazy val alleycatsCore = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.in(file("alleycats-core"))
.dependsOn(core)
Expand All @@ -685,8 +749,9 @@ lazy val alleycatsCore = crossProject(JSPlatform, JVMPlatform)
.settings(includeGeneratedSrc)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("alleycats-core", includeCats1 = false))
.nativeSettings(commonNativeSettings)

lazy val alleycatsLaws = crossProject(JSPlatform, JVMPlatform)
lazy val alleycatsLaws = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.crossType(CrossType.Pure)
.in(file("alleycats-laws"))
.dependsOn(alleycatsCore, laws)
Expand All @@ -699,8 +764,9 @@ lazy val alleycatsLaws = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings ++ mimaSettings("alleycats-laws", includeCats1 = false))
.jsSettings(coverageEnabled := false)
.nativeSettings(commonNativeSettings)

lazy val alleycatsTests = crossProject(JSPlatform, JVMPlatform)
lazy val alleycatsTests = crossProject(JSPlatform, JVMPlatform, NativePlatform)
.in(file("alleycats-tests"))
.dependsOn(alleycatsLaws, tests % "test-internal -> test")
.settings(moduleName := "alleycats-tests")
Expand All @@ -709,6 +775,7 @@ lazy val alleycatsTests = crossProject(JSPlatform, JVMPlatform)
.jsSettings(commonJsSettings)
.jvmSettings(commonJvmSettings)
.settings(scalacOptions in Test := (scalacOptions in Test).value.filter(_ != "-Xfatal-warnings"))
.nativeSettings(commonNativeSettings)

// bench is currently JVM-only

Expand Down Expand Up @@ -754,6 +821,14 @@ lazy val js = project
.settings(commonJsSettings)
.enablePlugins(ScalaJSPlugin)

// cats-native is Native-only
lazy val native = project
.dependsOn(core.native, tests.native % "test-internal -> test")
.settings(moduleName := "cats-native")
.settings(catsSettings)
.settings(commonNativeSettings)
.enablePlugins(ScalaNativePlugin)

// cats-jvm is JVM-only
lazy val jvm = project
.dependsOn(core.jvm, tests.jvm % "test-internal -> test")
Expand Down Expand Up @@ -865,7 +940,12 @@ addCommandAlias("validateKernelJS", "kernelLawsJS/test")
addCommandAlias("validateFreeJS", "freeJS/test")
addCommandAlias("validateAlleycatsJS", "alleycatsTestsJS/test")
addCommandAlias("validateAllJS", "all testsJS/test js/test kernelLawsJS/test freeJS/test alleycatsTestsJS/test")
addCommandAlias("validate", ";clean;validateJS;validateKernelJS;validateFreeJS;validateJVM")
addCommandAlias("validateNative", ";testsNative/test;native/test")
addCommandAlias("validateKernelNative", "kernelLawsNative/test")
addCommandAlias("validateFreeNative", "freeNative/test")
addCommandAlias("validateAlleycatsNative", "alleycatsTestsNative/test")
addCommandAlias("validateAllNative", "all testsNative/test native/test kernelLawsNative/test freeNative/test alleycatsTestsNative/test")
addCommandAlias("validate", ";clean;validateJS;validateKernelJS;validateFreeJS;validateNative;validateKernelNative;validateFreeNative;validateJVM")

addCommandAlias("prePR", "fmt")

Expand Down
1 change: 1 addition & 0 deletions kernel-laws/js/src/main/scala/cats/platform/Platform.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ private[cats] object Platform {
// $COVERAGE-OFF$
final val isJvm = false
final val isJs = true
final val isNative = false
// $COVERAGE-ON$
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ private[cats] object Platform {
// $COVERAGE-OFF$
final val isJvm = true
final val isJs = false
final val isNative = false
// $COVERAGE-ON$
}
10 changes: 10 additions & 0 deletions kernel-laws/native/src/main/scala/cats/platform/Platform.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package cats.platform

private[cats] object Platform {
// using `final val` makes compiler constant-fold any use of these values, dropping dead code automatically
// $COVERAGE-OFF$
final val isJvm = false
final val isJs = false
final val isNative = true
// $COVERAGE-ON$
}
Loading

0 comments on commit e46eb12

Please sign in to comment.