Skip to content

Commit aa81e1e

Browse files
committed
Include Native tools and deps in export --json
1 parent cd57741 commit aa81e1e

3 files changed

Lines changed: 77 additions & 6 deletions

File tree

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@ import com.github.plokhotnyuk.jsoniter_scala.macros.JsonCodecMaker
55

66
import java.io.PrintStream
77

8-
import scala.build.info.{BuildInfo, ExportDependencyFormat, ScopedBuildInfo}
8+
import scala.build.info.{BuildInfo, ExportDependencyFormat, NativeOptionsInfo, ScopedBuildInfo}
99
import scala.util.Using
1010

1111
final case class JsonProject(buildInfo: BuildInfo) extends Project {
1212
def sorted = this.copy(
1313
buildInfo = buildInfo.copy(
14-
scopes = buildInfo.scopes.map { case (k, v) => k -> v.sorted }
14+
scopes = buildInfo.scopes.map { case (k, v) => k -> v.sorted },
15+
nativeOptions = buildInfo.nativeOptions.map(_.sorted)
1516
)
1617
)
1718

@@ -49,6 +50,14 @@ final case class JsonProject(buildInfo: BuildInfo) extends Project {
4950
}
5051
}
5152

53+
extension (n: NativeOptionsInfo) {
54+
def sorted(using ord: Ordering[String]) = n.copy(
55+
compilerPlugins = n.compilerPlugins.sorted(using JsonProject.ordering),
56+
runtimeDependencies = n.runtimeDependencies.sorted(using JsonProject.ordering),
57+
toolingDependencies = n.toolingDependencies.sorted(using JsonProject.ordering)
58+
)
59+
}
60+
5261
extension (s: ScopedBuildInfo) {
5362
def sorted(using ord: Ordering[String]) = s.copy(
5463
s.sources.sorted,

modules/integration/src/test/scala/scala/cli/integration/ExportJsonTestDefinitions.scala

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,41 @@ abstract class ExportJsonTestDefinitions extends ScalaCliSuite with TestScalaVer
107107

108108
val jsonContents = readJson(exportJsonProc.out.text())
109109

110+
val nativeVersion = Constants.scalaNativeVersion
110111
val expectedJsonContents =
111112
s"""{
112113
|"scalaVersion":"3.2.2",
113114
|"platform":"Native",
114-
|"scalaNativeVersion":"${Constants.scalaNativeVersion}",
115+
|"scalaNativeVersion":"$nativeVersion",
116+
|"nativeOptions": {
117+
| "scalaNativeVersion":"$nativeVersion",
118+
| "compilerPlugins": [
119+
| {
120+
| "groupId":"org.scala-native",
121+
| "artifactId":{"name":"nscplugin","fullName":"nscplugin_3.2.2"},
122+
| "version":"$nativeVersion"
123+
| }
124+
| ],
125+
| "runtimeDependencies": [
126+
| {
127+
| "groupId":"org.scala-native",
128+
| "artifactId":{"name":"javalib_native0.5","fullName":"javalib_native0.5_3"},
129+
| "version":"$nativeVersion"
130+
| },
131+
| {
132+
| "groupId":"org.scala-native",
133+
| "artifactId":{"name":"scala3lib_native0.5","fullName":"scala3lib_native0.5_3"},
134+
| "version":"3.2.2+$nativeVersion"
135+
| }
136+
| ],
137+
| "toolingDependencies": [
138+
| {
139+
| "groupId":"org.scala-native",
140+
| "artifactId":{"name":"scala-native-cli","fullName":"scala-native-cli_2.12"},
141+
| "version":"$nativeVersion"
142+
| }
143+
| ]
144+
|},
115145
|"scopes": {
116146
| "main": {
117147
| "sources": ["${withEscapedBackslashes(root / "Main.scala")}"],

modules/options/src/main/scala/scala/build/info/BuildInfo.scala

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ import scala.build.info.BuildInfo.escapeBackslashes
66
import scala.build.internal.Constants
77
import scala.build.options.*
88

9+
final case class NativeOptionsInfo(
10+
scalaNativeVersion: String,
11+
compilerPlugins: Seq[ExportDependencyFormat] = Nil,
12+
runtimeDependencies: Seq[ExportDependencyFormat] = Nil,
13+
toolingDependencies: Seq[ExportDependencyFormat] = Nil
14+
)
15+
916
final case class BuildInfo(
1017
projectVersion: Option[String] = None,
1118
scalaVersion: Option[String] = None,
@@ -14,6 +21,7 @@ final case class BuildInfo(
1421
scalaJsVersion: Option[String] = None,
1522
jsEsVersion: Option[String] = None,
1623
scalaNativeVersion: Option[String] = None,
24+
nativeOptions: Option[NativeOptionsInfo] = None,
1725
mainClass: Option[String] = None,
1826
scopes: Map[String, ScopedBuildInfo] = Map.empty,
1927
scalaCliVersion: Option[String] = None
@@ -152,11 +160,35 @@ object BuildInfo {
152160
)
153161
}
154162

155-
private def scalaNativeSettings(options: ScalaNativeOptions): BuildInfo =
163+
private def scalaNativeSettings(options: BuildOptions): BuildInfo = {
164+
val nativeOptions = options.scalaNativeOptions
165+
val nativeVersion = nativeOptions.finalVersion
166+
val scalaParamsOpt = options.scalaParams.getOrElse(None)
167+
val sv = scalaParamsOpt.map(_.scalaVersion)
168+
.orElse(options.scalaOptions.defaultScalaVersion)
169+
.getOrElse(Constants.defaultScalaVersion)
170+
171+
val runtimeDeps = nativeOptions.nativeDependencies(sv)
172+
.map(ExportDependencyFormat(_, scalaParamsOpt))
173+
val compilerPluginDeps = nativeOptions.compilerPlugins
174+
.map(ExportDependencyFormat(_, scalaParamsOpt))
175+
val toolingDeps = Seq(ExportDependencyFormat(
176+
"org.scala-native",
177+
ArtifactId("scala-native-cli", "scala-native-cli_2.12"),
178+
nativeVersion
179+
))
180+
156181
BuildInfo(
157182
platform = Some(Platform.Native.repr),
158-
scalaNativeVersion = Some(options.finalVersion)
183+
scalaNativeVersion = Some(nativeVersion),
184+
nativeOptions = Some(NativeOptionsInfo(
185+
scalaNativeVersion = nativeVersion,
186+
compilerPlugins = compilerPluginDeps,
187+
runtimeDependencies = runtimeDeps,
188+
toolingDependencies = toolingDeps
189+
))
159190
)
191+
}
160192

161193
private def jvmSettings(options: BuildOptions): BuildInfo =
162194
BuildInfo(
@@ -173,7 +205,7 @@ object BuildInfo {
173205
case Some(Platform.JS) =>
174206
scalaJsSettings(options.scalaJsOptions)
175207
case Some(Platform.Native) =>
176-
scalaNativeSettings(options.scalaNativeOptions)
208+
scalaNativeSettings(options)
177209
case _ => jvmSettings(options)
178210
}
179211

0 commit comments

Comments
 (0)