Skip to content

Commit 15666b6

Browse files
Merge pull request #673 from alexarchambault/tweaking
Tweaking
2 parents 45cc754 + dae28ba commit 15666b6

File tree

15 files changed

+138
-121
lines changed

15 files changed

+138
-121
lines changed

.github/workflows/ci.yml

Lines changed: 23 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,6 @@ concurrency:
1313
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
1414

1515
jobs:
16-
bloop-memory-footprint:
17-
timeout-minutes: 120
18-
runs-on: ${{ matrix.OS }}
19-
strategy:
20-
fail-fast: false
21-
matrix:
22-
OS: ["ubuntu-latest"]
23-
steps:
24-
- uses: actions/checkout@v2
25-
with:
26-
fetch-depth: 0
27-
submodules: true
28-
- uses: coursier/[email protected]
29-
- uses: coursier/[email protected]
30-
with:
31-
jvm: "temurin:17"
32-
- name: Java Version
33-
run: java -version
34-
- name: Java Home
35-
run: echo "$JAVA_HOME"
36-
- name: Build Scala CLI
37-
run: ./mill copyJvmLauncher build
38-
- name: Build Benchmark
39-
run: java -jar ./build/scala-cli package --standalone gcbenchmark/gcbenchmark.scala -o gc
40-
- name: Run Benchmark
41-
run: ./gc $(realpath ./build/scala-cli)
42-
4316
jvm-tests:
4417
timeout-minutes: 120
4518
runs-on: ${{ matrix.OS }}
@@ -269,6 +242,29 @@ jobs:
269242
exit 1
270243
)
271244
245+
bloop-memory-footprint:
246+
timeout-minutes: 120
247+
runs-on: ubuntu-latest
248+
steps:
249+
- uses: actions/checkout@v2
250+
with:
251+
fetch-depth: 0
252+
submodules: true
253+
- uses: coursier/[email protected]
254+
- uses: coursier/[email protected]
255+
with:
256+
jvm: "temurin:17"
257+
- name: Java Version
258+
run: java -version
259+
- name: Java Home
260+
run: echo "$JAVA_HOME"
261+
- name: Build Scala CLI
262+
run: ./mill copyJvmLauncher build
263+
- name: Build Benchmark
264+
run: java -jar ./build/scala-cli package --standalone gcbenchmark/gcbenchmark.scala -o gc
265+
- name: Run Benchmark
266+
run: ./gc $(realpath ./build/scala-cli)
267+
272268
vc-redist:
273269
timeout-minutes: 15
274270
runs-on: windows-latest

build.sc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ object integration extends Module {
6565
}
6666
def forkEnv = super.forkEnv() ++ Seq(
6767
"SCALA_CLI_TMP" -> tmpDirBase().path.toString,
68-
"SCALA_CLI_IMAGE" -> "scala-cli"
68+
"SCALA_CLI_IMAGE" -> "scala-cli",
69+
"CI" -> "1"
6970
)
7071
}
7172
}
@@ -79,7 +80,8 @@ object integration extends Module {
7980
}
8081
def forkEnv = super.forkEnv() ++ Seq(
8182
"SCALA_CLI_TMP" -> tmpDirBase().path.toString,
82-
"SCALA_CLI_IMAGE" -> "scala-cli-slim"
83+
"SCALA_CLI_IMAGE" -> "scala-cli-slim",
84+
"CI" -> "1"
8385
)
8486
}
8587
}
@@ -414,7 +416,8 @@ trait CliIntegrationBase extends SbtModule with ScalaCliPublishModule with HasTe
414416
def forkEnv = super.forkEnv() ++ Seq(
415417
"SCALA_CLI" -> testLauncher().path.toString,
416418
"SCALA_CLI_KIND" -> cliKind(),
417-
"SCALA_CLI_TMP" -> tmpDirBase().path.toString
419+
"SCALA_CLI_TMP" -> tmpDirBase().path.toString,
420+
"CI" -> "1"
418421
)
419422
def sources = T.sources {
420423
val name = mainArtifactName().stripPrefix(prefix)

modules/cli/src/main/java/scala/cli/internal/ScalaJSLinkerSubst.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.oracle.svm.core.annotate.TargetClass;
55
import org.graalvm.nativeimage.Platform;
66
import org.graalvm.nativeimage.Platforms;
7+
import org.scalajs.logging.Logger;
78
import scala.build.internal.ScalaJsConfig;
89

910
import java.nio.file.Path;
@@ -18,7 +19,8 @@ void link(
1819
String mainClassOrNull,
1920
boolean addTestInitializer,
2021
ScalaJsConfig config,
21-
Path dest
22+
Path dest,
23+
Logger logger
2224
) {
2325
throw new RuntimeException("Scala.JS linking unsupported on Windows");
2426
}

modules/cli/src/main/scala/scala/cli/commands/Package.scala

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import scala.build.options.{PackageType, Platform}
2525
import scala.build.{Build, Inputs, Logger, Os}
2626
import scala.cli.CurrentParams
2727
import scala.cli.commands.OptionsHelper._
28+
import scala.cli.errors.ScalaJsLinkingError
2829
import scala.cli.internal.{ProcUtil, ScalaJsLinker}
2930
import scala.util.Properties
3031

@@ -180,7 +181,7 @@ object Package extends ScalaCommand[PackageOptions] {
180181
assembly(build, destPath, value(mainClass), () => alreadyExistsCheck())
181182

182183
case PackageType.Js =>
183-
buildJs(build, destPath, value(mainClass), logger)
184+
value(buildJs(build, destPath, value(mainClass), logger))
184185

185186
case PackageType.Native =>
186187
buildNative(inputs, build, destPath, value(mainClass), logger)
@@ -413,9 +414,9 @@ object Package extends ScalaCommand[PackageOptions] {
413414
destPath: os.Path,
414415
mainClass: String,
415416
logger: Logger
416-
): Unit = {
417+
): Either[BuildException, Unit] = {
417418
val linkerConfig = build.options.scalaJsOptions.linkerConfig(logger)
418-
linkJs(build, destPath, Some(mainClass), addTestInitializer = false, linkerConfig)
419+
linkJs(build, destPath, Some(mainClass), addTestInitializer = false, linkerConfig, logger)
419420
}
420421

421422
private def buildNative(
@@ -544,17 +545,31 @@ object Package extends ScalaCommand[PackageOptions] {
544545
dest: os.Path,
545546
mainClassOpt: Option[String],
546547
addTestInitializer: Boolean,
547-
config: StandardConfig
548-
): Unit =
548+
config: StandardConfig,
549+
logger: Logger
550+
): Either[BuildException, Unit] =
549551
withLibraryJar(build, dest.last.toString.stripSuffix(".jar")) { mainJar =>
550-
val classPath = mainJar +: build.artifacts.classPath
552+
val classPath = mainJar +: build.artifacts.classPath
553+
val linkingDir = os.temp.dir(prefix = "scala-cli-js-linking")
551554
(new ScalaJsLinker).link(
552555
classPath.toArray,
553556
mainClassOpt.orNull,
554557
addTestInitializer,
555558
new ScalaJsConfig(config),
556-
dest.toNIO
559+
linkingDir.toNIO,
560+
logger.scalaJsLogger
557561
)
562+
val relMainJs = os.rel / "main.js"
563+
val mainJs = linkingDir / relMainJs
564+
if (os.exists(mainJs)) {
565+
os.copy(mainJs, dest, replaceExisting = true)
566+
os.remove.all(linkingDir)
567+
Right(())
568+
}
569+
else {
570+
val found = os.walk(linkingDir).map(_.relativeTo(linkingDir))
571+
Left(new ScalaJsLinkingError(relMainJs, found))
572+
}
558573
}
559574

560575
def buildNative(

modules/cli/src/main/scala/scala/cli/commands/Run.scala

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ object Run extends ScalaCommand[RunOptions] {
130130
val (finalMainClass, finalArgs) =
131131
if (jvmRunner) (Constants.runnerMainClass, mainClass +: verbosity +: args)
132132
else (mainClass, args)
133-
runOnce(
133+
val res = runOnce(
134134
root,
135135
projectName,
136136
build,
@@ -140,6 +140,7 @@ object Run extends ScalaCommand[RunOptions] {
140140
allowExecve,
141141
exitOnError
142142
)
143+
value(res)
143144
}
144145

145146
private def runOnce(
@@ -151,19 +152,22 @@ object Run extends ScalaCommand[RunOptions] {
151152
logger: Logger,
152153
allowExecve: Boolean,
153154
exitOnError: Boolean
154-
): Boolean = {
155+
): Either[BuildException, Boolean] = either {
155156

156157
val retCode = build.options.platform.value match {
157158
case Platform.JS =>
158159
val linkerConfig = build.options.scalaJsOptions.linkerConfig(logger)
159-
withLinkedJs(build, Some(mainClass), addTestInitializer = false, linkerConfig) { js =>
160-
Runner.runJs(
161-
js.toIO,
162-
args,
163-
logger,
164-
allowExecve = allowExecve
165-
)
166-
}
160+
val res =
161+
withLinkedJs(build, Some(mainClass), addTestInitializer = false, linkerConfig, logger) {
162+
js =>
163+
Runner.runJs(
164+
js.toIO,
165+
args,
166+
logger,
167+
allowExecve = allowExecve
168+
)
169+
}
170+
value(res)
167171
case Platform.Native =>
168172
withNativeLauncher(
169173
build,
@@ -207,11 +211,11 @@ object Run extends ScalaCommand[RunOptions] {
207211
build: Build.Successful,
208212
mainClassOpt: Option[String],
209213
addTestInitializer: Boolean,
210-
config: StandardConfig
211-
)(f: os.Path => T): T = {
214+
config: StandardConfig,
215+
logger: Logger
216+
)(f: os.Path => T): Either[BuildException, T] = {
212217
val dest = os.temp(prefix = "main", suffix = ".js")
213-
try {
214-
Package.linkJs(build, dest, mainClassOpt, addTestInitializer, config)
218+
try Package.linkJs(build, dest, mainClassOpt, addTestInitializer, config, logger).map { _ =>
215219
f(dest)
216220
}
217221
finally if (os.exists(dest)) os.remove(dest)

modules/cli/src/main/scala/scala/cli/commands/Test.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ object Test extends ScalaCommand[TestOptions] {
140140
case Platform.JS =>
141141
val linkerConfig = build.options.scalaJsOptions.linkerConfig(logger)
142142
value {
143-
Run.withLinkedJs(build, None, addTestInitializer = true, linkerConfig) { js =>
143+
Run.withLinkedJs(build, None, addTestInitializer = true, linkerConfig, logger) { js =>
144144
Runner.testJs(
145145
build.fullClassPath,
146146
js.toIO,
@@ -149,7 +149,7 @@ object Test extends ScalaCommand[TestOptions] {
149149
testFrameworkOpt,
150150
logger
151151
)
152-
}
152+
}.flatMap(e => e)
153153
}
154154
case Platform.Native =>
155155
value {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package scala.cli.errors
2+
3+
import scala.build.errors.BuildException
4+
5+
final class ScalaJsLinkingError(
6+
val expected: os.RelPath,
7+
val foundFiles: Seq[os.RelPath]
8+
) extends BuildException(
9+
s"Error: $expected not found after Scala.JS linking " +
10+
(if (foundFiles.isEmpty) "(no files found)" else s"(found ${foundFiles.mkString(", ")})")
11+
)

modules/cli/src/main/scala/scala/cli/internal/ScalaJsLinker.scala

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package scala.cli.internal
22

3-
import org.scalajs.linker.interface.{LinkerOutput, ModuleInitializer}
4-
import org.scalajs.linker.{PathIRContainer, PathOutputFile, StandardImpl}
5-
import org.scalajs.logging.{Level, ScalaConsoleLogger}
3+
import org.scalajs.linker.interface.ModuleInitializer
4+
import org.scalajs.linker.{PathIRContainer, PathOutputDirectory, StandardImpl}
5+
import org.scalajs.logging.Logger
66
import org.scalajs.testing.adapter.{TestAdapterInitializer => TAI}
77

8-
import java.net.URI
98
import java.nio.file.Path
109

1110
import scala.build.internal.ScalaJsConfig
11+
import scala.concurrent.Await
12+
import scala.concurrent.ExecutionContext.{global => ec}
13+
import scala.concurrent.duration.Duration
1214

1315
final class ScalaJsLinker {
1416

@@ -17,21 +19,15 @@ final class ScalaJsLinker {
1719
mainClassOrNull: String,
1820
addTestInitializer: Boolean,
1921
config: ScalaJsConfig,
20-
dest: Path
22+
linkingDir: Path,
23+
logger: Logger
2124
): Unit = {
2225

2326
// adapted from https://github.com/scala-js/scala-js-cli/blob/729824848e25961a3d9a1cfe6ac0260745033148/src/main/scala/org/scalajs/cli/Scalajsld.scala#L158-L193
2427

2528
val linker = StandardImpl.linker(config.config)
2629

27-
def relURI(f: Path) =
28-
new URI(null, null, f.getFileName.toString, null)
29-
30-
val sm = dest.resolveSibling(dest.getFileName.toString + ".map")
31-
val output = LinkerOutput(PathOutputFile(dest))
32-
.withSourceMap(PathOutputFile(sm))
33-
.withSourceMapURI(relURI(sm))
34-
.withJSFileURI(relURI(dest))
30+
val output = PathOutputDirectory(linkingDir)
3531

3632
val cache = StandardImpl.irFileCache().newCache
3733

@@ -46,11 +42,7 @@ final class ScalaJsLinker {
4642

4743
val moduleInitializers = mainInitializers ++ testInitializers
4844

49-
val logger = new ScalaConsoleLogger(Level.Info)
50-
51-
import scala.concurrent.Await
52-
import scala.concurrent.duration.Duration
53-
import scala.concurrent.ExecutionContext.Implicits.global
45+
implicit val ec0 = ec
5446
val futureResult = PathIRContainer
5547
.fromClasspath(classPath)
5648
.flatMap(containers => cache.cached(containers._1))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ abstract class CompileTestDefinitions(val scalaVersionOpt: Option[String])
269269
)
270270
)
271271
}
272-
if (TestUtil.canRunNative && actualScalaVersion.startsWith("2.12"))
272+
if (actualScalaVersion.startsWith("2.12"))
273273
test("JVM options only for JVM platform") {
274274
val inputs = TestInputs(
275275
Seq(os.rel / "Main.scala" -> "//> using `java-opt` \"-Xss1g\"")

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ abstract class ExportMillTestDefinitions(val scalaVersionOpt: Option[String])
7979
simpleTest(ExportTestProjects.jsTest(actualScalaVersion))
8080
}
8181

82-
if (runExportTests && TestUtil.canRunNative && !actualScalaVersion.startsWith("3."))
82+
if (runExportTests && !actualScalaVersion.startsWith("3."))
8383
test("Scala Native") {
8484
simpleTest(ExportTestProjects.nativeTest(actualScalaVersion))
8585
}

0 commit comments

Comments
 (0)