Skip to content

Commit

Permalink
Don't require scalalib to depend on javalib in the build. (#3566)
Browse files Browse the repository at this point in the history
* Don't require scalalib to depend on javalib in the build.
  • Loading branch information
WojciechMazur committed Oct 12, 2023
1 parent 70c1ff0 commit 3bf21e9
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 70 deletions.
39 changes: 20 additions & 19 deletions project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -302,9 +302,9 @@ object Build {
)
.dependsOn(nir, util)
.dependsOn(testInterface % "test", junitRuntime % "test")
.zippedSettings(Seq("nscplugin", "nativelib", "scalalib")) {
case Seq(nscPlugin, nativelib, scalalib) =>
toolsBuildInfoSettings(nscPlugin, nativelib, scalalib)
.zippedSettings(Seq("nscplugin", "javalib", "scalalib")) {
case Seq(nscPlugin, javalib, scalalib) =>
toolsBuildInfoSettings(nscPlugin, javalib, scalalib)
}

lazy val toolsJVM =
Expand All @@ -317,15 +317,15 @@ object Build {
// Running tests in parallel results in `FileSystemAlreadyExistsException`
Test / parallelExecution := false
)
.zippedSettings(Seq("nscplugin", "nativelib", "scalalib")) {
case Seq(nscPlugin, nativelib, scalalib) =>
toolsBuildInfoSettings(nscPlugin, nativelib, scalalib)
.zippedSettings(Seq("nscplugin", "javalib", "scalalib")) {
case Seq(nscPlugin, javalib, scalalib) =>
toolsBuildInfoSettings(nscPlugin, javalib, scalalib)
}
.dependsOn(nirJVM, utilJVM)

private def toolsBuildInfoSettings(
nscPlugin: LocalProject,
nativelib: LocalProject,
javalib: LocalProject,
scalalib: LocalProject
) = {
buildInfoKeys ++= Seq[BuildInfoKey](
Expand All @@ -345,18 +345,17 @@ object Build {
case (_, v) =>
"pluginJar" -> v.getAbsolutePath()
},
BuildInfoKey.map(nativelib / Compile / fullClasspath) {
case (_, v) =>
"nativelibCp" ->
v.files
.map(_.getAbsolutePath)
.mkString(pathSeparator)
},
BuildInfoKey.map(scalalib / Compile / fullClasspath) {
BuildInfoKey.map(
for {
scalalibCp <- (scalalib / Compile / fullClasspath).taskValue
javalibCp <- (javalib / Compile / fullClasspath).taskValue
} yield scalalibCp ++ javalibCp
) {
case (_, v) =>
"scalalibCp" ->
"nativeRuntimeClasspath" ->
v.files
.map(_.getAbsolutePath)
.distinct
.mkString(pathSeparator)
}
)
Expand Down Expand Up @@ -547,7 +546,8 @@ object Build {
.enablePlugins(MyScalaNativePlugin)
.settings(
publishSettings(Some(VersionScheme.BreakOnMajor)),
commonJavalibSettings,
NIROnlySettings,
recompileAllOrNothingSettings,
disabledDocsSettings
)
.dependsOn(nativelib, clib)
Expand Down Expand Up @@ -617,7 +617,7 @@ object Build {
.value
)
}
.dependsOn(auxlib, javalib)
.dependsOn(auxlib)

// Tests ------------------------------------------------
lazy val tests = MultiScalaProject("tests", file("unit-tests") / "native")
Expand Down Expand Up @@ -703,7 +703,7 @@ object Build {
.enablePlugins(MyScalaNativePlugin)
.withNativeCompilerPlugin
.withJUnitPlugin
.dependsOn(scalalib, testInterface % "test")
.dependsOn(scalalib, javalib, testInterface % "test")

// Testing infrastructure ------------------------------------------------
lazy val testingCompilerInterface =
Expand Down Expand Up @@ -757,6 +757,7 @@ object Build {
.withJUnitPlugin
.dependsOn(
scalalib,
javalib,
testInterfaceSbtDefs,
junitRuntime,
junitAsyncNative % "test"
Expand Down
13 changes: 8 additions & 5 deletions project/Settings.scala
Original file line number Diff line number Diff line change
Expand Up @@ -619,11 +619,7 @@ object Settings {
incOptions ~= { _.withRecompileAllFraction(0.0001) }
)

lazy val commonJavalibSettings = Def.settings(
recompileAllOrNothingSettings,
Compile / scalacOptions ++= scalaNativeCompilerOptions(
"genStaticForwardersForNonTopLevelObjects"
),
lazy val NIROnlySettings = Def.settings(
// Don't include classfiles for javalib in the packaged jar.
Compile / packageBin / mappings := {
val previous = (Compile / packageBin / mappings).value
Expand All @@ -634,6 +630,13 @@ object Settings {
},
exportJars := true
)
lazy val commonJavalibSettings = Def.settings(
recompileAllOrNothingSettings,
Compile / scalacOptions ++= scalaNativeCompilerOptions(
"genStaticForwardersForNonTopLevelObjects"
),
NIROnlySettings
)

// Calculates all prefixes of the current Scala version
// (including the empty prefix) to construct Scala version depenent
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,48 +44,53 @@ object ScalaNativePluginInternal {
val nativeWarnOldJVM =
taskKey[Unit]("Warn if JVM 7 or older is used.")

private val nativeStandardLibraries =
Seq("nativelib", "clib", "posixlib", "windowslib", "javalib", "auxlib")

lazy val scalaNativeDependencySettings: Seq[Setting[_]] = Seq(
libraryDependencies ++= Seq(
"org.scala-native" %%% "test-interface" % nativeVersion % Test
),
libraryDependencies += CrossVersion
.partialVersion(scalaVersion.value)
.fold(throw new RuntimeException("Unsupported Scala Version")) {
// Add only dependency to scalalib, nativeStanardLibraries would be added transitively
case (2, _) =>
"org.scala-native" %%% "scalalib" % scalalibVersion(
scalaVersion.value,
nativeVersion
)
case (3, _) =>
"org.scala-native" %%% "scala3lib" % scalalibVersion(
scalaVersion.value,
nativeVersion
)
},
excludeDependencies ++= {
// Exclude cross published version dependencies leading to conflicts in Scala 3 vs 2.13
// When using Scala 3 exclude Scala 2.13 standard native libraries,
// when using Scala 2.13 exclude Scala 3 standard native libraries
// Use full name, Maven style published artifacts cannot use artifact/cross version for exclusion rules
nativeStandardLibraries.map { lib =>
val scalaBinVersion =
if (scalaVersion.value.startsWith("3.")) "2.13"
else "3"
ExclusionRule()
.withOrganization("org.scala-native")
.withName(
s"${lib}_native${ScalaNativeCrossVersion.currentBinaryVersion}_${scalaBinVersion}"
)
}
},
addCompilerPlugin(
"org.scala-native" % "nscplugin" % nativeVersion cross CrossVersion.full
)
)
lazy val scalaNativeDependencySettings: Seq[Setting[_]] = {
val organization = "org.scala-native"
val nativeStandardLibraries =
Seq("nativelib", "clib", "posixlib", "windowslib", "javalib", "auxlib")

Seq(
libraryDependencies ++= Seq(
organization %%% "test-interface" % nativeVersion % Test
),
libraryDependencies += CrossVersion
.partialVersion(scalaVersion.value)
.fold(throw new RuntimeException("Unsupported Scala Version")) {
case (2, _) =>
organization %%% "scalalib" % scalalibVersion(
scalaVersion.value,
nativeVersion
)
case (3, _) =>
organization %%% "scala3lib" % scalalibVersion(
scalaVersion.value,
nativeVersion
)
},
libraryDependencies ++= nativeStandardLibraries.map(
organization %%% _ % nativeVersion
),
excludeDependencies ++= {
// Exclude cross published version dependencies leading to conflicts in Scala 3 vs 2.13
// When using Scala 3 exclude Scala 2.13 standard native libraries,
// when using Scala 2.13 exclude Scala 3 standard native libraries
// Use full name, Maven style published artifacts cannot use artifact/cross version for exclusion rules
nativeStandardLibraries.map { lib =>
val scalaBinVersion =
if (scalaVersion.value.startsWith("3.")) "2.13"
else "3"
ExclusionRule()
.withOrganization(organization)
.withName(
s"${lib}_native${ScalaNativeCrossVersion.currentBinaryVersion}_${scalaBinVersion}"
)
}
},
addCompilerPlugin(
organization % "nscplugin" % nativeVersion cross CrossVersion.full
)
)
}

lazy val scalaNativeBaseSettings: Seq[Setting[_]] = Seq(
crossVersion := ScalaNativeCrossVersion.binary,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ class IncCompilationTest extends codegen.CodeGenSpec {

private def makeClasspath(outDir: Path)(implicit in: Scope) = {
val parts: Array[Path] =
ScalaNativeBuildInfo.scalalibCp
ScalaNativeBuildInfo.nativeRuntimeClasspath
.split(File.pathSeparator)
.map(Paths.get(_))

Expand Down
2 changes: 1 addition & 1 deletion tools/src/test/scala/scala/scalanative/LinkerSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ abstract class LinkerSpec {

private def makeClasspath(outDir: Path)(implicit in: Scope) = {
val parts: Array[Path] =
ScalaNativeBuildInfo.scalalibCp
ScalaNativeBuildInfo.nativeRuntimeClasspath
.split(File.pathSeparator)
.map(Paths.get(_))

Expand Down
2 changes: 1 addition & 1 deletion tools/src/test/scala/scala/scalanative/NIRCompiler.scala
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class NIRCompiler(outDir: Path) {
"-d",
outPath.toString(),
"-cp",
ScalaNativeBuildInfo.compileClasspath + File.pathSeparator + ScalaNativeBuildInfo.nativelibCp,
ScalaNativeBuildInfo.compileClasspath + File.pathSeparator + ScalaNativeBuildInfo.nativeRuntimeClasspath,
s"-Xplugin:${ScalaNativeBuildInfo.pluginJar}"
) ++ fileArgs
val procBuilder = new ProcessBuilder(args: _*)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ trait ReachabilitySuite {

private def makeClasspath(outDir: Path)(implicit in: Scope) = {
val parts: Array[Path] =
ScalaNativeBuildInfo.scalalibCp
ScalaNativeBuildInfo.nativeRuntimeClasspath
.split(File.pathSeparator)
.map(Paths.get(_))

Expand Down

0 comments on commit 3bf21e9

Please sign in to comment.