Skip to content

Commit 3e59ef1

Browse files
authored
Merge pull request #2862 from scala-steward/update/test-runner-0.5.1
Update Scala Native to 0.5.1
2 parents 81acfaf + f959111 commit 3e59ef1

File tree

27 files changed

+628
-397
lines changed

27 files changed

+628
-397
lines changed

build.sc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ trait Core extends ScalaCliCrossSbtModule
433433
| def ammoniteVersion = "${Deps.ammonite.dep.version}"
434434
| def millVersion = "${InternalDeps.Versions.mill}"
435435
| def lefouMillwRef = "${InternalDeps.Versions.lefouMillwRef}"
436+
| def maxScalaNativeForMillExport = "${Deps.Versions.maxScalaNativeForMillExport}"
436437
|
437438
| def scalafmtOrganization = "${Deps.scalafmtCli.dep.module.organization.value}"
438439
| def scalafmtName = "${Deps.scalafmtCli.dep.module.name.value}"
@@ -442,9 +443,11 @@ trait Core extends ScalaCliCrossSbtModule
442443
| def toolkitName = "${Deps.toolkit.dep.module.name.value}"
443444
| def toolkitTestName = "${Deps.toolkitTest.dep.module.name.value}"
444445
| def toolkitDefaultVersion = "${Deps.toolkitVersion}"
446+
| def toolkitMaxScalaNative = "${Deps.Versions.maxScalaNativeForToolkit}"
445447
|
446448
| def typelevelOrganization = "${Deps.typelevelToolkit.dep.module.organization.value}"
447449
| def typelevelToolkitDefaultVersion = "${Deps.typelevelToolkitVersion}"
450+
| def typelevelToolkitMaxScalaNative = "${Deps.Versions.maxScalaNativeForTypelevelToolkit}"
448451
|
449452
| def defaultScalaVersion = "${Scala.defaultUser}"
450453
| def defaultScala212Version = "${Scala.scala212}"
@@ -473,6 +476,7 @@ trait Core extends ScalaCliCrossSbtModule
473476
| def libsodiumjniVersion = "${Deps.libsodiumjni.dep.version}"
474477
|
475478
| def scalaPyVersion = "${Deps.scalaPy.dep.version}"
479+
| def scalaPyMaxScalaNative = "${Deps.Versions.maxScalaNativeForScalaPy}"
476480
|
477481
| def giter8Organization = "${Deps.giter8.dep.module.organization.value}"
478482
| def giter8Name = "${Deps.giter8.dep.module.name.value}"
@@ -983,6 +987,7 @@ trait CliIntegration extends SbtModule with ScalaCliPublishModule with HasTests
983987
| def defaultGraalVMJavaVersion = "${deps.graalVmJavaVersion}"
984988
| def defaultGraalVMVersion = "${deps.graalVmVersion}"
985989
| def scalaPyVersion = "${Deps.scalaPy.dep.version}"
990+
| def scalaPyMaxScalaNative = "${Deps.Versions.maxScalaNativeForScalaPy}"
986991
| def bloopVersion = "${Deps.bloopRifle.dep.version}"
987992
| def pprintVersion = "${TestDeps.pprint.dep.version}"
988993
| def munitVersion = "${TestDeps.munit.dep.version}"
@@ -998,8 +1003,10 @@ trait CliIntegration extends SbtModule with ScalaCliPublishModule with HasTests
9981003
| def libsodiumVersion = "${deps.libsodiumVersion}"
9991004
| def dockerArchLinuxImage = "${TestDeps.archLinuxImage}"
10001005
|
1001-
| def toolkitVersion = "${Deps.toolkitVersion}"
1002-
| def typelevelToolkitVersion = "${Deps.typelevelToolkitVersion}"
1006+
| def toolkitVersion = "${Deps.toolkitVersion}"
1007+
| def toolkiMaxScalaNative = "${Deps.Versions.maxScalaNativeForToolkit}"
1008+
| def typelevelToolkitVersion = "${Deps.typelevelToolkitVersion}"
1009+
| def typelevelToolkitMaxScalaNative = "${Deps.Versions.maxScalaNativeForTypelevelToolkit}"
10031010
|
10041011
| def ghOrg = "$ghOrg"
10051012
| def ghName = "$ghName"

gifs/scenarios/universal_tool.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ if [[ -z "${ASCIINEMA_REC}" ]]; then
1212
# Warm up scala-cli
1313
echo "println(1)" | scala-cli -
1414
echo "println(1)" | scala-cli --js - &&
15-
echo "println(1)" | scala-cli --native -S 2.13.6 -
15+
echo "println(1)" | scala-cli --native -S 2.13 -
1616

1717
# or do other preparation (e.g. create code)
1818
else
@@ -38,7 +38,7 @@ object Native extends App {
3838
EOF
3939

4040
pe "# Scala Native works only with Scala 2.x so far"
41-
pe "scala-cli --native -S 2.13.6 native.scala"
41+
pe "scala-cli --native -S 2.13 native.scala"
4242
doSleep 3
4343

4444
echo " " && echo "ok" > status.txt

modules/cli/src/main/scala/scala/cli/commands/export0/Export.scala

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,20 @@ object Export extends ScalaCommand[ExportOptions] {
148148
val inputs = options.shared.inputs(args.all).orExit(logger)
149149
CurrentParams.workspaceOpt = Some(inputs.workspace)
150150
val baseOptions =
151-
initialBuildOptions.copy(mainClass = options.mainClass.mainClass.filter(_.nonEmpty))
151+
initialBuildOptions
152+
.copy(
153+
scalaNativeOptions = initialBuildOptions.scalaNativeOptions.copy(
154+
maxDefaultNativeVersions =
155+
initialBuildOptions.scalaNativeOptions.maxDefaultNativeVersions ++
156+
(if shouldExportToMill && Constants.scalaNativeVersion != Constants.maxScalaNativeForMillExport
157+
then
158+
val warningMsg =
159+
s"Mill export does not support Scala Native ${Constants.scalaNativeVersion}, ${Constants.maxScalaNativeForMillExport} should be used instead."
160+
List(Constants.maxScalaNativeForMillExport -> warningMsg)
161+
else Nil)
162+
),
163+
mainClass = options.mainClass.mainClass.filter(_.nonEmpty)
164+
)
152165

153166
val (sourcesMain, optionsMain0) =
154167
prepareBuild(

modules/cli/src/main/scala/scala/cli/commands/shared/SharedOptions.scala

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import scala.build.internal.{Constants, FetchExternalBinary, OsLibc, Util}
2929
import scala.build.options.ScalaVersionUtil.fileWithTtl0
3030
import scala.build.options.{BuildOptions, ComputeVersion, Platform, ScalacOpt, ShadowingSeq}
3131
import scala.build.preprocessing.directives.ClasspathUtils.*
32-
import scala.build.preprocessing.directives.Toolkit
32+
import scala.build.preprocessing.directives.{Python, Toolkit}
3333
import scala.build.options as bo
3434
import scala.cli.ScalaCli
3535
import scala.cli.commands.publish.ConfigUtil.*
@@ -265,21 +265,25 @@ final case class SharedOptions(
265265
)
266266
}
267267

268-
private def scalaNativeOptions(opts: ScalaNativeOptions): options.ScalaNativeOptions = {
268+
private def scalaNativeOptions(
269+
opts: ScalaNativeOptions,
270+
maxDefaultScalaNativeVersions: List[(String, String)]
271+
): options.ScalaNativeOptions = {
269272
import opts._
270273
options.ScalaNativeOptions(
271-
nativeVersion,
272-
nativeMode,
273-
nativeLto,
274-
nativeGc,
275-
nativeClang,
276-
nativeClangpp,
277-
nativeLinking,
278-
nativeLinkingDefaults,
279-
nativeCompile,
280-
nativeCompileDefaults,
281-
embedResources,
282-
nativeTarget
274+
version = nativeVersion,
275+
modeStr = nativeMode,
276+
ltoStr = nativeLto,
277+
gcStr = nativeGc,
278+
clang = nativeClang,
279+
clangpp = nativeClangpp,
280+
linkingOptions = nativeLinking,
281+
linkingDefaults = nativeLinkingDefaults,
282+
compileOptions = nativeCompile,
283+
compileDefaults = nativeCompileDefaults,
284+
embedResources = embedResources,
285+
buildTargetStr = nativeTarget,
286+
maxDefaultNativeVersions = maxDefaultScalaNativeVersions
283287
)
284288
}
285289

@@ -324,7 +328,15 @@ final case class SharedOptions(
324328
s"""[${Console.YELLOW}warn${Console.RESET}] Jars with the ${ScalaCliConsole.GRAY}*-sources.jar${Console.RESET} name suffix are assumed to be source jars.
325329
|The following jars were assumed to be source jars and will be treated as such: $assumedSourceJarsString""".stripMargin
326330
)
327-
val resolvedToolkitDependency = SharedOptions.resolveToolkitDependency(withToolkit, logger)
331+
val (resolvedToolkitDependency, toolkitMaxDefaultScalaNativeVersions) =
332+
SharedOptions.resolveToolkitDependencyAndScalaNativeVersionReqs(withToolkit, logger)
333+
val scalapyMaxDefaultScalaNativeVersions =
334+
if sharedPython.python.contains(true) then
335+
List(Constants.scalaPyMaxScalaNative -> Python.maxScalaNativeWarningMsg)
336+
else Nil
337+
val maxDefaultScalaNativeVersions =
338+
toolkitMaxDefaultScalaNativeVersions.toList ++ scalapyMaxDefaultScalaNativeVersions
339+
val snOpts = scalaNativeOptions(native, maxDefaultScalaNativeVersions)
328340
bo.BuildOptions(
329341
sourceGeneratorOptions = bo.SourceGeneratorOptions(
330342
useBuildInfo = sourceGenerator.useBuildInfo,
@@ -382,7 +394,7 @@ final case class SharedOptions(
382394
forceObjectWrapper = objectWrapper
383395
),
384396
scalaJsOptions = scalaJsOptions(js),
385-
scalaNativeOptions = scalaNativeOptions(native),
397+
scalaNativeOptions = snOpts,
386398
javaOptions = value(scala.cli.commands.util.JvmUtils.javaOptions(jvm)),
387399
jmhOptions = bo.JmhOptions(
388400
addJmhDependencies =
@@ -727,10 +739,10 @@ object SharedOptions {
727739

728740
// TODO: remove this state after resolving https://github.com/VirtusLab/scala-cli/issues/2658
729741
private val loggedDeprecatedToolkitWarning: AtomicBoolean = AtomicBoolean(false)
730-
private def resolveToolkitDependency(
742+
private def resolveToolkitDependencyAndScalaNativeVersionReqs(
731743
toolkitVersion: Option[String],
732744
logger: Logger
733-
): Seq[Positioned[AnyDependency]] = {
745+
): (Seq[Positioned[AnyDependency]], Seq[(String, String)]) = {
734746
if (
735747
(toolkitVersion.contains("latest")
736748
|| toolkitVersion.contains(Toolkit.typelevel + ":latest")
@@ -743,7 +755,28 @@ object SharedOptions {
743755
)
744756
)
745757

746-
toolkitVersion.toList.map(Positioned.commandLine)
747-
.flatMap(Toolkit.resolveDependenciesWithRequirements(_).map(_.value))
758+
val (dependencies, toolkitDefaults) =
759+
toolkitVersion.toList.map(Positioned.commandLine)
760+
.flatMap(Toolkit.resolveDependenciesWithRequirements(_).map((wbr, td) => wbr.value -> td))
761+
.unzip
762+
val maxScalaNativeVersions =
763+
toolkitDefaults.flatMap {
764+
case Toolkit.ToolkitDefaults(isScalaToolkitDefault, isTypelevelToolkitDefault) =>
765+
val st = if (isScalaToolkitDefault)
766+
Seq(Constants.toolkitMaxScalaNative -> Toolkit.maxScalaNativeWarningMsg(
767+
"Scala Toolkit",
768+
Constants.toolkitMaxScalaNative
769+
))
770+
else Nil
771+
val tlt =
772+
if (isTypelevelToolkitDefault)
773+
Seq(Constants.typelevelToolkitMaxScalaNative -> Toolkit.maxScalaNativeWarningMsg(
774+
"TypeLevel Toolkit",
775+
Constants.typelevelToolkitMaxScalaNative
776+
))
777+
else Nil
778+
st ++ tlt
779+
}
780+
dependencies -> maxScalaNativeVersions
748781
}
749782
}

modules/cli/src/main/scala/scala/cli/exportCmd/MillProjectDescriptor.scala

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,8 @@ final case class MillProjectDescriptor(
7070
)
7171
}
7272

73-
private def scalaNativeSettings(options: ScalaNativeOptions): MillProject = {
74-
val scalaNativeVersion = Some(options.version.getOrElse(Constants.scalaNativeVersion))
75-
MillProject(scalaNativeVersion = scalaNativeVersion)
76-
}
73+
private def scalaNativeSettings(options: ScalaNativeOptions): MillProject =
74+
MillProject(scalaNativeVersion = Some(options.finalVersion))
7775

7876
private def dependencySettings(
7977
mainOptions: BuildOptions,

modules/directives/src/main/scala/scala/build/preprocessing/directives/Python.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ package scala.build.preprocessing.directives
22

33
import scala.build.directives.*
44
import scala.build.errors.BuildException
5-
import scala.build.options.{BuildOptions, PostBuildOptions}
5+
import scala.build.internal.Constants
6+
import scala.build.options.{BuildOptions, PostBuildOptions, ScalaNativeOptions}
67
import scala.build.preprocessing.ScopePath
78
import scala.cli.commands.SpecificationLevel
89

@@ -17,6 +18,10 @@ final case class Python(
1718
val options = BuildOptions(
1819
notForBloopOptions = PostBuildOptions(
1920
python = Some(true)
21+
),
22+
scalaNativeOptions = ScalaNativeOptions(
23+
maxDefaultNativeVersions =
24+
List(Constants.scalaPyMaxScalaNative -> Python.maxScalaNativeWarningMsg)
2025
)
2126
)
2227
Right(options)
@@ -25,4 +30,6 @@ final case class Python(
2530

2631
object Python {
2732
val handler: DirectiveHandler[Python] = DirectiveHandler.derive
33+
val maxScalaNativeWarningMsg =
34+
s"ScalaPy does not support Scala Native ${Constants.scalaNativeVersion}, ${Constants.scalaPyMaxScalaNative} should be used instead."
2835
}

modules/directives/src/main/scala/scala/build/preprocessing/directives/Toolkit.scala

Lines changed: 70 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,7 @@ import scala.build.errors.BuildException
88
import scala.build.internal.Constants
99
import scala.build.options.BuildRequirements.ScopeRequirement
1010
import scala.build.options.WithBuildRequirements.*
11-
import scala.build.options.{
12-
BuildOptions,
13-
BuildRequirements,
14-
ClassPathOptions,
15-
Scope,
16-
ShadowingSeq,
17-
WithBuildRequirements
18-
}
11+
import scala.build.options._
1912
import scala.cli.commands.SpecificationLevel
2013

2114
@DirectiveGroupName("Toolkit")
@@ -42,42 +35,63 @@ final case class Toolkit(
4235

4336
object Toolkit {
4437
val typelevel = "typelevel"
38+
val scala = "scala"
39+
40+
def maxScalaNativeWarningMsg(toolkitName: String, maxNative: String): String =
41+
s"$toolkitName does not support Scala Native ${Constants.scalaNativeVersion}, $maxNative should be used instead."
4542

4643
object TypelevelToolkit {
4744
def unapply(s: Option[String]): Boolean =
4845
s.contains(typelevel) || s.contains(Constants.typelevelOrganization)
4946
}
5047

48+
object ScalaToolkit {
49+
def unapply(s: Option[String]): Boolean =
50+
s.isEmpty || s.contains(Constants.toolkitOrganization) || s.contains(scala)
51+
}
52+
53+
case class ToolkitDefaults(
54+
isScalaToolkitDefault: Boolean = false,
55+
isTypelevelToolkitDefault: Boolean = false
56+
)
57+
5158
/** @param toolkitCoords
5259
* the toolkit coordinates
5360
* @return
5461
* the `toolkit` and `toolkit-test` dependencies with the appropriate build requirements
5562
*/
56-
def resolveDependenciesWithRequirements(toolkitCoords: Positioned[String])
57-
: List[WithBuildRequirements[Positioned[DependencyLike[NameAttributes, NameAttributes]]]] =
63+
def resolveDependenciesWithRequirements(toolkitCoords: Positioned[String]): List[(
64+
WithBuildRequirements[Positioned[DependencyLike[NameAttributes, NameAttributes]]],
65+
ToolkitDefaults
66+
)] =
5867
toolkitCoords match
5968
case Positioned(positions, coords) =>
6069
val tokens = coords.split(':')
6170
val rawVersion = tokens.last
6271
def isDefault = rawVersion == "default"
6372
val notDefaultVersion = if rawVersion == "latest" then "latest.release" else rawVersion
6473
val flavor = tokens.dropRight(1).headOption
65-
val (org, v) = flavor match {
66-
case TypelevelToolkit() => Constants.typelevelOrganization -> {
74+
val (org, v, trv: ToolkitDefaults) = flavor match {
75+
case TypelevelToolkit() => (
76+
Constants.typelevelOrganization,
6777
if isDefault then Constants.typelevelToolkitDefaultVersion
68-
else notDefaultVersion
69-
}
70-
case Some(org) => org -> notDefaultVersion
71-
case None => Constants.toolkitOrganization -> {
78+
else notDefaultVersion,
79+
ToolkitDefaults(isTypelevelToolkitDefault = isDefault)
80+
)
81+
case ScalaToolkit() | None =>
82+
(
83+
Constants.toolkitOrganization,
7284
if isDefault then Constants.toolkitDefaultVersion
73-
else notDefaultVersion
74-
}
85+
else notDefaultVersion,
86+
ToolkitDefaults(isScalaToolkitDefault = isDefault)
87+
)
88+
case Some(org) => (org, notDefaultVersion, ToolkitDefaults())
7589
}
7690
List(
7791
Positioned(positions, dep"$org::${Constants.toolkitName}::$v,toolkit")
78-
.withEmptyRequirements,
92+
.withEmptyRequirements -> trv,
7993
Positioned(positions, dep"$org::${Constants.toolkitTestName}::$v,toolkit")
80-
.withScopeRequirement(Scope.Test)
94+
.withScopeRequirement(Scope.Test) -> trv
8195
)
8296
val handler: DirectiveHandler[Toolkit] = DirectiveHandler.derive
8397

@@ -105,20 +119,43 @@ object Toolkit {
105119
): List[Either[BuildException, WithBuildRequirements[BuildOptions]]] = t
106120
.toList
107121
.flatMap(resolveDependenciesWithRequirements) // resolve dependencies
108-
.map { case WithBuildRequirements(requirements, positionedDep) =>
109-
positionedDep
110-
.withBuildRequirements {
111-
if requirements.scope.isEmpty then // if the scope is not set, set it to the default
112-
requirements.copy(scope = defaultScope.map(_.asScopeRequirement))
113-
else requirements
114-
}
115-
.map { dep =>
116-
BuildOptions(
117-
classPathOptions = ClassPathOptions(
118-
extraDependencies = ShadowingSeq.from(List(dep))
122+
.map {
123+
case (
124+
WithBuildRequirements(requirements, positionedDep),
125+
ToolkitDefaults(isScalaToolkitDefault, isTypelevelToolkitDefault)
126+
) =>
127+
val scalaToolkitMaxNativeVersions =
128+
if isScalaToolkitDefault then
129+
List(Constants.toolkitMaxScalaNative -> maxScalaNativeWarningMsg(
130+
"Scala Toolkit",
131+
Constants.toolkitMaxScalaNative
132+
))
133+
else Nil
134+
val typelevelToolkitMaxNativeVersions =
135+
if isTypelevelToolkitDefault then
136+
List(Constants.typelevelToolkitMaxScalaNative -> maxScalaNativeWarningMsg(
137+
"TypeLevel Toolkit",
138+
Constants.typelevelToolkitMaxScalaNative
139+
))
140+
else Nil
141+
val maxNativeVersions =
142+
(scalaToolkitMaxNativeVersions ++ typelevelToolkitMaxNativeVersions).distinct
143+
positionedDep
144+
.withBuildRequirements {
145+
if requirements.scope.isEmpty then // if the scope is not set, set it to the default
146+
requirements.copy(scope = defaultScope.map(_.asScopeRequirement))
147+
else requirements
148+
}
149+
.map { dep =>
150+
BuildOptions(
151+
classPathOptions = ClassPathOptions(
152+
extraDependencies = ShadowingSeq.from(List(dep))
153+
),
154+
scalaNativeOptions = ScalaNativeOptions(
155+
maxDefaultNativeVersions = maxNativeVersions
156+
)
119157
)
120-
)
121-
}
158+
}
122159
}
123160
.groupBy(_.requirements.scope.map(_.scope))
124161
.toList

0 commit comments

Comments
 (0)