Skip to content

Commit fee1a26

Browse files
Use JVM-based substitutes when external binaries are not available
1 parent 99f4284 commit fee1a26

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+509
-217
lines changed

build.sc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,8 @@ trait Core extends ScalaCliSbtModule with ScalaCliPublishModule with HasTests
355355
| def millVersion = "${InternalDeps.Versions.mill}"
356356
| def lefouMillwRef = "${InternalDeps.Versions.lefouMillwRef}"
357357
|
358+
| def scalafmtOrganization = "${Deps.scalafmtCli.dep.module.organization.value}"
359+
| def scalafmtName = "${Deps.scalafmtCli.dep.module.name.value}"
358360
| def defaultScalafmtVersion = "${Deps.scalafmtCli.dep.version}"
359361
|
360362
| def defaultScalaVersion = "${Scala.defaultUser}"
@@ -366,7 +368,11 @@ trait Core extends ScalaCliSbtModule with ScalaCliPublishModule with HasTests
366368
| def defaultGraalVMJavaVersion = ${deps.graalVmJavaVersion}
367369
| def defaultGraalVMVersion = "${deps.graalVmVersion}"
368370
|
371+
| def scalaCliSigningOrganization = "${Deps.signingCli.dep.module.organization.value}"
372+
| def scalaCliSigningName = "${Deps.signingCli.dep.module.name.value}"
369373
| def scalaCliSigningVersion = "${Deps.signingCli.dep.version}"
374+
| def javaClassNameOrganization = "${Deps.javaClassName.dep.module.organization.value}"
375+
| def javaClassNameName = "${Deps.javaClassName.dep.module.name.value}"
370376
| def javaClassNameVersion = "${Deps.javaClassName.dep.version}"
371377
|
372378
| def libsodiumVersion = "${deps.libsodiumVersion}"

modules/build/src/main/java/scala/build/internal/JavaParserProxyMakerSubst.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.oracle.svm.core.annotate.Substitute;
44
import com.oracle.svm.core.annotate.TargetClass;
55

6+
import java.util.function.Supplier;
7+
68
/**
79
* This makes [[JavaParserProxyMaker.get]] provide a [[JavaParserProxyBinary]]
810
* rather than a [[JavaParserProxyJvm]], from native launchers.
@@ -15,8 +17,9 @@ public final class JavaParserProxyMakerSubst {
1517
public JavaParserProxy get(
1618
Object archiveCache,
1719
scala.Option<String> javaClassNameVersionOpt,
18-
scala.build.Logger logger
20+
scala.build.Logger logger,
21+
Supplier<String> javaCommand
1922
) {
20-
return new JavaParserProxyBinary(archiveCache, logger, javaClassNameVersionOpt);
23+
return new JavaParserProxyBinary(archiveCache, logger, javaClassNameVersionOpt, javaCommand);
2124
}
2225
}

modules/build/src/main/scala/scala/build/Build.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ object Build {
219219
Sources.defaultPreprocessors(
220220
options.scriptOptions.codeWrapper.getOrElse(CustomCodeWrapper),
221221
options.archiveCache,
222-
options.internal.javaClassNameVersionOpt
222+
options.internal.javaClassNameVersionOpt,
223+
() => options.javaHome().value.javaCommand
223224
),
224225
logger
225226
)

modules/build/src/main/scala/scala/build/Sources.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,12 @@ object Sources {
8787
def defaultPreprocessors(
8888
codeWrapper: CodeWrapper,
8989
archiveCache: ArchiveCache[Task],
90-
javaClassNameVersionOpt: Option[String]
90+
javaClassNameVersionOpt: Option[String],
91+
javaCommand: () => String
9192
): Seq[Preprocessor] =
9293
Seq(
9394
ScriptPreprocessor(codeWrapper),
94-
JavaPreprocessor(archiveCache, javaClassNameVersionOpt),
95+
JavaPreprocessor(archiveCache, javaClassNameVersionOpt, javaCommand),
9596
ScalaPreprocessor,
9697
DataPreprocessor
9798
)

modules/build/src/main/scala/scala/build/bsp/BspImpl.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ final class BspImpl(
9595
Sources.defaultPreprocessors(
9696
buildOptions.scriptOptions.codeWrapper.getOrElse(CustomCodeWrapper),
9797
buildOptions.archiveCache,
98-
buildOptions.internal.javaClassNameVersionOpt
98+
buildOptions.internal.javaClassNameVersionOpt,
99+
() => buildOptions.javaHome().value.javaCommand
99100
),
100101
persistentLogger,
101102
maybeRecoverOnError(Scope.Main)

modules/build/src/main/scala/scala/build/internal/JavaParserProxyBinary.scala

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package scala.build.internal
22

33
import coursier.cache.ArchiveCache
44
import coursier.util.Task
5+
import dependency._
6+
7+
import java.util.function.Supplier
58

69
import scala.build.EitherCps.{either, value}
710
import scala.build.Logger
@@ -12,7 +15,8 @@ import scala.util.Properties
1215
class JavaParserProxyBinary(
1316
archiveCache: ArchiveCache[Task],
1417
javaClassNameVersionOpt: Option[String],
15-
logger: Logger
18+
logger: Logger,
19+
javaCommand: () => String
1620
) extends JavaParserProxy {
1721

1822
/** For internal use only
@@ -23,9 +27,15 @@ class JavaParserProxyBinary(
2327
def this(
2428
archiveCache: Object,
2529
logger: Logger,
26-
javaClassNameVersionOpt: Option[String]
30+
javaClassNameVersionOpt: Option[String],
31+
javaCommand0: Supplier[String]
2732
) =
28-
this(archiveCache.asInstanceOf[ArchiveCache[Task]], javaClassNameVersionOpt, logger)
33+
this(
34+
archiveCache.asInstanceOf[ArchiveCache[Task]],
35+
javaClassNameVersionOpt,
36+
logger,
37+
() => javaCommand0.get()
38+
)
2939

3040
def className(content: Array[Byte]): Either[BuildException, Option[String]] = either {
3141

@@ -38,19 +48,28 @@ class JavaParserProxyBinary(
3848
val url =
3949
s"https://github.com/scala-cli/java-class-name/releases/download/$tag/java-class-name-$platformSuffix$ext"
4050

51+
val params = ExternalBinaryParams(
52+
url,
53+
changing,
54+
"java-class-name",
55+
Seq(
56+
dep"${Constants.javaClassNameOrganization}:${Constants.javaClassNameName}:${Constants.javaClassNameVersion}"
57+
),
58+
"scala.cli.javaclassname.JavaClassName" // FIXME I'd rather not hardcode that, but automatic detection is cumbersome to setup…
59+
)
4160
val binary =
42-
value(FetchExternalBinary.fetch(url, changing, archiveCache, logger, "java-class-name"))
61+
value(FetchExternalBinary.fetch(params, archiveCache, logger, javaCommand))
4362

4463
val source =
4564
os.temp(content, suffix = ".java", perms = if (Properties.isWin) null else "rw-------")
65+
val command = binary.command
4666
val output =
4767
try {
48-
logger.debug(s"Running $binary $source")
49-
val res = os.proc(binary, source).call()
68+
logger.debug(s"Running $command $source")
69+
val res = os.proc(command, source).call()
5070
res.out.text().trim
5171
}
5272
finally os.remove(source)
53-
5473
if (output.isEmpty) None
5574
else Some(output)
5675
}

modules/build/src/main/scala/scala/build/internal/JavaParserProxyMaker.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package scala.build.internal
22

3+
import java.util.function.Supplier
4+
35
import scala.build.Logger
46

57
/** On the JVM, provides [[JavaParserProxyJvm]] as [[JavaParserProxy]] instance.
@@ -18,7 +20,8 @@ class JavaParserProxyMaker {
1820
def get(
1921
archiveCache: Object, // Actually a ArchiveCache[Task], but having issues with the higher-kind type param from Java…
2022
javaClassNameVersionOpt: Option[String],
21-
logger: Logger
23+
logger: Logger,
24+
javaCommand: Supplier[String]
2225
): JavaParserProxy =
2326
new JavaParserProxyJvm
2427
}

modules/build/src/main/scala/scala/build/preprocessing/JavaPreprocessor.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import scala.build.{Inputs, Logger}
2828
*/
2929
final case class JavaPreprocessor(
3030
archiveCache: ArchiveCache[Task],
31-
javaClassNameVersionOpt: Option[String]
31+
javaClassNameVersionOpt: Option[String],
32+
javaCommand: () => String
3233
) extends Preprocessor {
3334
def preprocess(
3435
input: Inputs.SingleElement,
@@ -72,7 +73,8 @@ final case class JavaPreprocessor(
7273
.get(
7374
archiveCache,
7475
javaClassNameVersionOpt,
75-
logger
76+
logger,
77+
() => javaCommand()
7678
)
7779
.className(v.content)
7880
}

modules/build/src/test/scala/scala/build/tests/SourcesTests.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ class SourcesTests extends munit.FunSuite {
2929
def ec = sys.error("shouldn't be used")
3030
}
3131
),
32-
None
32+
None,
33+
() => sys.error("shouldn't be used")
3334
)
3435

3536
test("dependencies in .scala - $ivy") {

modules/cli-options/src/main/scala/scala/cli/commands/config/ConfigOptions.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ package scala.cli.commands.config
22

33
import caseapp._
44

5-
import scala.cli.commands.{CoursierOptions, LoggingOptions, SharedDirectoriesOptions}
5+
import scala.cli.commands.{
6+
CoursierOptions,
7+
LoggingOptions,
8+
SharedDirectoriesOptions,
9+
SharedJvmOptions
10+
}
611

712
// format: off
813
final case class ConfigOptions(
@@ -12,6 +17,8 @@ final case class ConfigOptions(
1217
directories: SharedDirectoriesOptions = SharedDirectoriesOptions(),
1318
@Recurse
1419
coursier: CoursierOptions = CoursierOptions(),
20+
@Recurse
21+
jvm: SharedJvmOptions = SharedJvmOptions(),
1522

1623
@Group("Config")
1724
@HelpMessage("Dump config DB as JSON")

0 commit comments

Comments
 (0)