Skip to content

Commit

Permalink
Add platform option
Browse files Browse the repository at this point in the history
  • Loading branch information
wleczny committed Sep 15, 2022
1 parent 540e7d5 commit 1cb2dc8
Show file tree
Hide file tree
Showing 25 changed files with 119 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,10 @@ final case class SharedOptions(
@Name("resourceDir")
resourceDirs: List[String] = Nil,

@HelpMessage("Specify platform")
@ValueDescription("scala-js|scala-native|jvm")
platform: Option[String] = None,

@Group("Scala")
@Hidden
scalaLibrary: Option[Boolean] = None,
Expand Down
5 changes: 3 additions & 2 deletions modules/cli/src/main/scala/scala/cli/commands/Bsp.scala
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ object Bsp extends ScalaCommand[BspOptions] {
val sharedOptions = getSharedOptions()
BspReloadableOptions(
buildOptions = buildOptions(sharedOptions),
bloopRifleConfig = sharedOptions.bloopRifleConfig(),
bloopRifleConfig = sharedOptions.bloopRifleConfig().orExit(sharedOptions.logger),
logger = sharedOptions.logging.logger,
verbosity = sharedOptions.logging.verbosity
)
Expand Down Expand Up @@ -96,7 +96,8 @@ object Bsp extends ScalaCommand[BspOptions] {
}

private def buildOptions(sharedOptions: SharedOptions): BuildOptions = {
val baseOptions = sharedOptions.buildOptions()
val logger = sharedOptions.logger
val baseOptions = sharedOptions.buildOptions().orExit(logger)
baseOptions.copy(
classPathOptions = baseOptions.classPathOptions.copy(
fetchSources = baseOptions.classPathOptions.fetchSources.orElse(Some(true))
Expand Down
6 changes: 3 additions & 3 deletions modules/cli/src/main/scala/scala/cli/commands/Compile.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ object Compile extends ScalaCommand[CompileOptions] {

def run(options: CompileOptions, args: RemainingArgs): Unit = {
maybePrintGroupHelp(options)
maybePrintSimpleScalacOutput(options, options.shared.buildOptions())
val logger = options.shared.logger
maybePrintSimpleScalacOutput(options, options.shared.buildOptions().orExit(logger))
CurrentParams.verbosity = options.shared.logging.verbosity
val inputs = options.shared.inputs(args.all).orExit(logger)
CurrentParams.workspaceOpt = Some(inputs.workspace)
Expand Down Expand Up @@ -76,10 +76,10 @@ object Compile extends ScalaCommand[CompileOptions] {
}
}

val buildOptions = options.shared.buildOptions()
val buildOptions = options.shared.buildOptions().orExit(logger)
val threads = BuildThreads.create()

val compilerMaker = options.shared.compilerMaker(threads)
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)
val configDb = ConfigDb.open(options.shared.directories.directories)
.orExit(logger)
val actionableDiagnostics =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ object DependencyUpdate extends ScalaCommand[DependencyUpdateOptions] {

val logger = options.shared.logger
val inputs = options.shared.inputs(args.all).orExit(logger)
val buildOptions = options.shared.buildOptions()
val buildOptions = options.shared.buildOptions().orExit(logger)

val (crossSources, _) =
CrossSources.forInputs(
Expand Down
7 changes: 4 additions & 3 deletions modules/cli/src/main/scala/scala/cli/commands/Doc.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ object Doc extends ScalaCommand[DocOptions] {
val inputs = options.shared.inputs(args.remaining).orExit(logger)
CurrentParams.workspaceOpt = Some(inputs.workspace)

val initialBuildOptions = options.shared.buildOptions(enableJmh = false, jmhVersion = None)
val threads = BuildThreads.create()
val initialBuildOptions =
options.shared.buildOptions(enableJmh = false, jmhVersion = None).orExit(logger)
val threads = BuildThreads.create()

val maker = options.shared.compilerMaker(threads)
val maker = options.shared.compilerMaker(threads).orExit(logger)
val compilerMaker = ScalaCompilerMaker.IgnoreScala2(maker)
val docCompilerMakerOpt = Some(SimpleScalaCompilerMaker("java", Nil, scaladoc = true))

Expand Down
2 changes: 1 addition & 1 deletion modules/cli/src/main/scala/scala/cli/commands/Export.scala
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ object Export extends ScalaCommand[ExportOptions] {
val inputs = options.shared.inputs(args.all).orExit(logger)
CurrentParams.workspaceOpt = Some(inputs.workspace)
val baseOptions =
options.shared.buildOptions()
options.shared.buildOptions().orExit(logger)
.copy(mainClass = options.mainClass.mainClass.filter(_.nonEmpty))

val (sourcesMain, optionsMain0) =
Expand Down
4 changes: 2 additions & 2 deletions modules/cli/src/main/scala/scala/cli/commands/Fmt.scala
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ object Fmt extends ScalaCommand[FmtOptions] {
}
CurrentParams.workspaceOpt = Some(workspace)
val (versionMaybe, dialectMaybe, pathMaybe) = readVersionAndDialect(workspace, options, logger)
val cache = options.shared.buildOptions().archiveCache
val buildOptions = options.buildOptions
val cache = options.shared.buildOptions().orExit(logger).archiveCache
val buildOptions = options.buildOptions

if (sourceFiles.isEmpty)
logger.debug("No source files, not formatting anything")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ object Metabrowse extends ScalaCommand[MetabrowseOptions] {
val inputs = options.shared.inputs(args.all).orExit(logger)
CurrentParams.workspaceOpt = Some(inputs.workspace)

val baseOptions = options.shared.buildOptions()
val baseOptions = options.shared.buildOptions().orExit(logger)
val initialBuildOptions = baseOptions.copy(
classPathOptions = baseOptions.classPathOptions.copy(
fetchSources = Some(true)
Expand All @@ -57,7 +57,7 @@ object Metabrowse extends ScalaCommand[MetabrowseOptions] {
)
val threads = BuildThreads.create()

val compilerMaker = options.shared.compilerMaker(threads)
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)
val configDb = ConfigDb.open(options.shared.directories.directories)
.orExit(logger)
val actionableDiagnostics =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ object Package extends ScalaCommand[PackageOptions] with BuildCommandHelpers {

val initialBuildOptions = buildOptions(options)
val threads = BuildThreads.create()
val compilerMaker = options.compilerMaker(threads)
val compilerMaker = options.compilerMaker(threads).orExit(logger)
val docCompilerMakerOpt = options.docCompilerMakerOpt

val cross = options.compileCross.cross.getOrElse(false)
Expand Down
5 changes: 3 additions & 2 deletions modules/cli/src/main/scala/scala/cli/commands/Repl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ object Repl extends ScalaCommand[ReplOptions] {
import ops.sharedRepl._
val ammoniteVersionOpt = ammoniteVersion.map(_.trim).filter(_.nonEmpty)

val logger = ops.shared.logger
val baseOptions = shared.copy(scalaVersion =
if (
ammonite.contains(true) &&
Expand All @@ -41,7 +42,7 @@ object Repl extends ScalaCommand[ReplOptions] {
Some("3.1.3")
}
else shared.scalaVersion
).buildOptions()
).buildOptions().orExit(logger)
baseOptions.copy(
javaOptions = baseOptions.javaOptions.copy(
javaOpts =
Expand Down Expand Up @@ -77,7 +78,7 @@ object Repl extends ScalaCommand[ReplOptions] {

val threads = BuildThreads.create()

val compilerMaker = options.shared.compilerMaker(threads)
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)

val directories = options.shared.directories.directories

Expand Down
5 changes: 3 additions & 2 deletions modules/cli/src/main/scala/scala/cli/commands/Run.scala
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,11 @@ object Run extends ScalaCommand[RunOptions] with BuildCommandHelpers {
def buildOptions(options: RunOptions): BuildOptions = {
import options.*
import options.sharedRun.*
val logger = options.shared.logger
val baseOptions = shared.buildOptions(
enableJmh = benchmarking.jmh.contains(true),
jmhVersion = benchmarking.jmhVersion
)
).orExit(logger)
baseOptions.copy(
mainClass = mainClass.mainClass,
javaOptions = baseOptions.javaOptions.copy(
Expand Down Expand Up @@ -115,7 +116,7 @@ object Run extends ScalaCommand[RunOptions] with BuildCommandHelpers {
CurrentParams.workspaceOpt = Some(inputs.workspace)
val threads = BuildThreads.create()

val compilerMaker = options.shared.compilerMaker(threads)
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)

def maybeRun(
build: Build.Successful,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,9 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T])
val candidates = arg.name.name match {
case "dependency" =>
state.flatMap(sharedOptions).toList.flatMap { sharedOptions =>
val cache = sharedOptions.coursierCache
val sv = sharedOptions.buildOptions()
val logger = sharedOptions.logger
val cache = sharedOptions.coursierCache
val sv = sharedOptions.buildOptions().orExit(logger)
.scalaParams
.toOption
.flatten
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ object SetupIde extends ScalaCommand[SetupIdeOptions] {
}

private def buildOptions(opts: SetupIdeOptions): BuildOptions =
opts.shared.buildOptions()
opts.shared.buildOptions().orExit(opts.shared.logger)

private def writeBspConfiguration(
options: SetupIdeOptions,
Expand Down
4 changes: 2 additions & 2 deletions modules/cli/src/main/scala/scala/cli/commands/Test.scala
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ object Test extends ScalaCommand[TestOptions] {

def buildOptions(opts: TestOptions): BuildOptions = {
import opts._
val baseOptions = shared.buildOptions()
val baseOptions = shared.buildOptions().orExit(opts.shared.logger)
baseOptions.copy(
javaOptions = baseOptions.javaOptions.copy(
javaOpts =
Expand Down Expand Up @@ -63,7 +63,7 @@ object Test extends ScalaCommand[TestOptions] {

val threads = BuildThreads.create()

val compilerMaker = options.shared.compilerMaker(threads)
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)

val cross = options.compileCross.cross.getOrElse(false)
val configDb = ConfigDb.open(options.shared.directories.directories)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ object Bloop extends ScalaCommand[BloopOptions] {
jvm = opts.jvm,
coursier = opts.coursier
)
val options = sharedOptions.buildOptions(false, None)
val options = sharedOptions.buildOptions(false, None).orExit(opts.logging.logger)
lazy val defaultJvmCmd =
sharedOptions.downloadJvm(OsLibc.baseDefaultJvm(OsLibc.jvmIndexOs, "17"), options)
val javaCmd = opts.compilationServer.bloopJvm
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ object Publish extends ScalaCommand[PublishOptions] with BuildCommandHelpers {
mainClass: MainClassOptions,
ivy2LocalLike: Option[Boolean]
): Either[BuildException, BuildOptions] = either {
val baseOptions = shared.buildOptions()
val baseOptions = shared.buildOptions().orExit(shared.logger)
val contextualOptions = PublishContextualOptions(
repository = publishRepo.publishRepository.filter(_.trim.nonEmpty),
repositoryIsIvy2LocalLike = ivy2LocalLike,
Expand Down Expand Up @@ -189,8 +189,8 @@ object Publish extends ScalaCommand[PublishOptions] with BuildCommandHelpers {
).orExit(logger)
val threads = BuildThreads.create()

val compilerMaker = options.shared.compilerMaker(threads)
val docCompilerMaker = options.shared.compilerMaker(threads, scaladoc = true)
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)
val docCompilerMaker = options.shared.compilerMaker(threads, scaladoc = true).orExit(logger)

val cross = options.compileCross.cross.getOrElse(false)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ object PublishLocal extends ScalaCommand[PublishLocalOptions] {
).orExit(logger)
val threads = BuildThreads.create()

val compilerMaker = options.shared.compilerMaker(threads)
val docCompilerMaker = options.shared.compilerMaker(threads, scaladoc = true)
val compilerMaker = options.shared.compilerMaker(threads).orExit(logger)
val docCompilerMaker = options.shared.compilerMaker(threads, scaladoc = true).orExit(logger)

val cross = options.compileCross.cross.getOrElse(false)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ object FmtOptionsUtil {
(url, !tag0.startsWith("v"))
}

def buildOptions: BuildOptions = shared.buildOptions()
def buildOptions: BuildOptions = shared.buildOptions().orExit(v.shared.logger)

def scalafmtCliOptions: List[String] =
scalafmtArg :::
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ object PackageOptionsUtil {
.left.map(CompositeBuildException(_))

def baseBuildOptions: BuildOptions = {
val baseOptions = shared.buildOptions()
val baseOptions = shared.buildOptions().orExit(v.shared.logger)
baseOptions.copy(
mainClass = mainClass.mainClass.filter(_.nonEmpty),
notForBloopOptions = baseOptions.notForBloopOptions.copy(
Expand Down Expand Up @@ -120,8 +120,8 @@ object PackageOptionsUtil {
)
}

def compilerMaker(threads: BuildThreads): ScalaCompilerMaker = {
val maker = shared.compilerMaker(threads)
def compilerMaker(threads: BuildThreads): Either[BuildException, ScalaCompilerMaker] = either {
val maker = value(shared.compilerMaker(threads))
if (forcedPackageTypeOpt.contains(PackageType.DocJar))
ScalaCompilerMaker.IgnoreScala2(maker)
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ import dependency.parser.DependencyParser

import java.io.{File, InputStream}

import scala.build.EitherCps.{either, value}
import scala.build.*
import scala.build.blooprifle.BloopRifleConfig
import scala.build.compiler.{BloopCompilerMaker, ScalaCompilerMaker, SimpleScalaCompilerMaker}
import scala.build.errors.BuildException
import scala.build.errors.{AmbiguousPlatformError, BuildException}
import scala.build.interactive.Interactive
import scala.build.interactive.Interactive.{InteractiveAsk, InteractiveNop}
import scala.build.internal.CsLoggerUtil.*
Expand Down Expand Up @@ -155,11 +156,20 @@ object SharedOptionsUtil extends CommandHelpers {
enableJmh: Boolean = false,
jmhVersion: Option[String] = None,
ignoreErrors: Boolean = false
): bo.BuildOptions = {
val platformOpt =
if (js.js) Some(Platform.JS)
else if (native.native) Some(Platform.Native)
else None
): Either[BuildException, bo.BuildOptions] = either {
val parsedPlatform = platform.map(Platform.normalize).flatMap(Platform.parse)
val platformOpt = value {
(parsedPlatform, js.js, native.native) match {
case (Some(p: Platform.JS.type), true, false) => Right(Some(p))
case (Some(p: Platform.Native.type), false, true) => Right(Some(p))
case (Some(p), _, _) if native.native || js.js => Left(new AmbiguousPlatformError)
case (Some(p), _, _) => Right(Some(p))
case (None, true, true) => Left(new AmbiguousPlatformError)
case (None, true, false) => Right(Some(Platform.JS))
case (None, false, true) => Right(Some(Platform.Native))
case (None, false, false) => Right(None)
}
}
bo.BuildOptions(
scalaOptions = bo.ScalaOptions(
scalaVersion = scalaVersion
Expand Down Expand Up @@ -292,9 +302,8 @@ object SharedOptionsUtil extends CommandHelpers {
javaCmd
}

def bloopRifleConfig(): BloopRifleConfig = {

val options = buildOptions(false, None)
def bloopRifleConfig(): Either[BuildException, BloopRifleConfig] = either {
val options = value(buildOptions(false, None))
lazy val defaultJvmCmd =
downloadJvm(OsLibc.baseDefaultJvm(OsLibc.jvmIndexOs, "17"), options)
val javaCmd = compilationServer.bloopJvm.map(downloadJvm(_, options)).orElse {
Expand All @@ -315,17 +324,21 @@ object SharedOptionsUtil extends CommandHelpers {
)
}

def compilerMaker(threads: BuildThreads, scaladoc: Boolean = false): ScalaCompilerMaker =
def compilerMaker(
threads: BuildThreads,
scaladoc: Boolean = false
): Either[BuildException, ScalaCompilerMaker] = either {
if (scaladoc)
SimpleScalaCompilerMaker("java", Nil, scaladoc = true)
else if (compilationServer.server.getOrElse(true))
new BloopCompilerMaker(
bloopRifleConfig(),
value(bloopRifleConfig()),
threads.bloop,
strictBloopJsonCheckOrDefault
)
else
SimpleScalaCompilerMaker("java", Nil)
}

def coursierCache = cached(v)(coursier.coursierCache(logging.logger.coursierLogger("")))

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package scala.build.errors

final class AmbiguousPlatformError extends BuildException(
"Ambiguous platform: more than one type of platform has been passed."
)
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,24 @@ abstract class RunTestDefinitions(val scalaVersionOpt: Option[String])
}
}

test("simple script JS via platform option") {
val message = "Hello"
val inputs = TestInputs(
os.rel / "simple.sc" ->
s"""//> using platform "scala-native"
|import scala.scalajs.js
|val console = js.Dynamic.global.console
|val msg = "$message"
|console.log(msg)
|""".stripMargin
)
inputs.fromRoot { root =>
val output =
os.proc(TestUtil.cli, extraOptions, ".", "--platform", "js").call(cwd = root).out.trim()
expect(output == message)
}
}

def platformNl: String = if (Properties.isWin) "\\r\\n" else "\\n"

def simpleNativeTests(): Unit = {
Expand Down
Loading

0 comments on commit 1cb2dc8

Please sign in to comment.