diff --git a/modules/build/src/main/scala/scala/build/Build.scala b/modules/build/src/main/scala/scala/build/Build.scala index ece5738572..a47a718daf 100644 --- a/modules/build/src/main/scala/scala/build/Build.scala +++ b/modules/build/src/main/scala/scala/build/Build.scala @@ -890,7 +890,7 @@ object Build { val javacReleaseV = releaseFlagVersion.map(v => List("--release", v)).getOrElse(Nil) - javacReleaseV ++ semanticDbJavacOptions ++ options.javaOptions.javacOptions + javacReleaseV ++ semanticDbJavacOptions ++ options.javaOptions.javacOptions.map(_.value) } // `test` scope should contains class path to main scope diff --git a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala index f1a306b161..96e8bb4148 100644 --- a/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala +++ b/modules/build/src/main/scala/scala/build/preprocessing/ScalaPreprocessor.scala @@ -46,6 +46,7 @@ case object ScalaPreprocessor extends Preprocessor { UsingCustomJarDirectiveHandler, UsingDependencyDirectiveHandler, UsingJavaHomeDirectiveHandler, + UsingJavacOptionsDirectiveHandler, UsingJavaOptionsDirectiveHandler, UsingJavaPropsDirectiveHandler, UsingMainClassDirectiveHandler, diff --git a/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala b/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala index c140e179dc..13b31b094d 100644 --- a/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala +++ b/modules/build/src/test/scala/scala/build/tests/DirectiveTests.scala @@ -55,4 +55,20 @@ class DirectiveTests extends munit.FunSuite { } } + test("should parse javac options") { + val testInputs = TestInputs( + os.rel / "simple.sc" -> + """//> using javacOpt "source", "1.8", "target", "1.8" + |""".stripMargin + ) + testInputs.withBuild(baseOptions, buildThreads, bloopConfigOpt) { + (_, _, maybeBuild) => + val build = maybeBuild.orThrow + val javacOpt = build.options.javaOptions.javacOptions + + val expectedJavacOpt = Seq("source", "1.8", "target", "1.8") + expect(javacOpt.map(_.value) == expectedJavacOpt) + } + } + } diff --git a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala index fb21db2efd..9124f5f79a 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/ScalaCommand.scala @@ -144,7 +144,7 @@ abstract class ScalaCommand[T](implicit myParser: Parser[T], help: Help[T]) scalaVersion = scalaArtifacts.params.scalaVersion compileClassPath = artifacts.compileClassPath simpleScalaCompiler = SimpleScalaCompiler("java", Nil, scaladoc = false) - javacOptions = buildOptions.javaOptions.javacOptions + javacOptions = buildOptions.javaOptions.javacOptions.map(_.value) javaHome = buildOptions.javaHomeLocation().value } { val exitCode = simpleScalaCompiler.runSimpleScalacLike( diff --git a/modules/cli/src/main/scala/scala/cli/commands/util/JvmUtils.scala b/modules/cli/src/main/scala/scala/cli/commands/util/JvmUtils.scala index c2c8818145..cbb7c0869c 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/util/JvmUtils.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/util/JvmUtils.scala @@ -58,7 +58,7 @@ object JvmUtils { ignoreErrors = false ), javacPlugins = javacFilePlugins.map(s => Positioned.none(os.Path(s, Os.pwd))), - javacOptions = javacOption + javacOptions = javacOption.map(Positioned.commandLine) ) } } diff --git a/modules/directives/src/main/scala/scala/build/preprocessing/directives/UsingJavaOptionsDirectiveHandler.scala b/modules/directives/src/main/scala/scala/build/preprocessing/directives/UsingJavaOptionsDirectiveHandler.scala index 4b81f72bae..a7db53ec66 100644 --- a/modules/directives/src/main/scala/scala/build/preprocessing/directives/UsingJavaOptionsDirectiveHandler.scala +++ b/modules/directives/src/main/scala/scala/build/preprocessing/directives/UsingJavaOptionsDirectiveHandler.scala @@ -5,7 +5,7 @@ import scala.build.options.{BuildOptions, JavaOpt, JavaOptions, ShadowingSeq} case object UsingJavaOptionsDirectiveHandler extends UsingDirectiveHandler { def name = "Java options" - def description = "Add Java options" + def description = "Add Java options which will be passed when running an application." def usage = "//> using java-opt _options_ | //> using javaOpt _options_" override def usageMd = """`//> using java-opt `_options_ diff --git a/modules/directives/src/main/scala/scala/build/preprocessing/directives/UsingJavacOptionsDirectiveHandler.scala b/modules/directives/src/main/scala/scala/build/preprocessing/directives/UsingJavacOptionsDirectiveHandler.scala new file mode 100644 index 0000000000..cff66250a6 --- /dev/null +++ b/modules/directives/src/main/scala/scala/build/preprocessing/directives/UsingJavacOptionsDirectiveHandler.scala @@ -0,0 +1,35 @@ +package scala.build.preprocessing.directives + +import scala.build.Logger +import scala.build.errors.BuildException +import scala.build.options.{BuildOptions, JavaOpt, JavaOptions, ShadowingSeq} + +case object UsingJavacOptionsDirectiveHandler extends UsingDirectiveHandler { + def name = "Javac options" + def description = "Add Javac options which will be passed when compiling sources." + def usage = "//> using javac-opt _options_ | //> using javacOpt _options_" + override def usageMd = + """`//> using javac-opt `_options_ + | + |`//> using javacOpt `_options_""".stripMargin + override def examples = Seq( + "//> using javacOpt \"source\", \"1.8\"", + "\"target\", \"1.8\"" + ) + override def isRestricted = false + def keys = Seq("javacOpt", "javacOptions", "javac-opt", "javac-options") + def handleValues( + scopedDirective: ScopedDirective, + logger: Logger + ): Either[BuildException, ProcessedUsingDirective] = + checkIfValuesAreExpected(scopedDirective).map { groupedValuesContainer => + val javacOptions = groupedValuesContainer.scopedStringValues + val options = BuildOptions( + javaOptions = JavaOptions( + javacOptions = javacOptions.map(_.positioned) + ) + ) + ProcessedDirective(Some(options), Seq.empty) + } + +} diff --git a/modules/options/src/main/scala/scala/build/options/JavaOptions.scala b/modules/options/src/main/scala/scala/build/options/JavaOptions.scala index 770c3e1cb8..feeaf540a6 100644 --- a/modules/options/src/main/scala/scala/build/options/JavaOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/JavaOptions.scala @@ -12,6 +12,11 @@ import scala.build.{Os, Position, Positioned} import scala.concurrent.ExecutionContextExecutorService import scala.util.control.NonFatal +/** @javaOpts + * java options which will be passed when compiling sources. + * @javacOptions + * java options which will be passed when running an application. + */ final case class JavaOptions( javaHomeOpt: Option[Positioned[os.Path]] = None, jvmIdOpt: Option[String] = None, @@ -21,7 +26,7 @@ final case class JavaOptions( javaOpts: ShadowingSeq[Positioned[JavaOpt]] = ShadowingSeq.empty, javacPluginDependencies: Seq[Positioned[AnyDependency]] = Nil, javacPlugins: Seq[Positioned[os.Path]] = Nil, - javacOptions: Seq[String] = Nil + javacOptions: Seq[Positioned[String]] = Nil ) { private def finalJvmIndexOs = jvmIndexOs.getOrElse(OsLibc.jvmIndexOs) diff --git a/website/docs/commands/compile.md b/website/docs/commands/compile.md index dc98ef1c27..5fdf5715b3 100644 --- a/website/docs/commands/compile.md +++ b/website/docs/commands/compile.md @@ -269,3 +269,16 @@ java -cp "$(scala-cli compile --print-class-path Hello.scala)" Hello Note that you should favor the [`run`](./run.md) command to run your code, rather than running `java -cp`. The class path obtained this way is only meant for scenarios where `scala-cli` doesn't offer a more convenient option. + +### JVM options + +`--javac-opt` lets you add `javac` options which will be passed when compiling sources. + +```bash +scala-cli Hello.scala --javac-opt source --javac-opt 1.8 --javac-opt target --javac-opt 1.8 +``` + +You can also add javac options with the using directive `//> using javacOpt`: +``` +//> using javacOpt "source", "1.8", "target", "1.8" +``` \ No newline at end of file diff --git a/website/docs/commands/run.md b/website/docs/commands/run.md index 661b221340..2169798347 100644 --- a/website/docs/commands/run.md +++ b/website/docs/commands/run.md @@ -64,6 +64,20 @@ JVMs are [managed by coursier](https://get-coursier.io/docs/cli-java#managed-jvm (New JVM versions are automatically checked daily, and updates for those are - manually - merged swiftly.) +### JVM options + +`--java-opt` lets you add `java` options which will be passed when running an application: + +```bash +scala-cli Hello.scala --java-opt -Xmx1g --java-opt -Dfoo=bar +``` + +You can also add java options with the using directive `//> using javaOpt`: +``` +//> using javaOpt "-Xmx1g", "-Dfoo=bar" +``` + + ## Define source files in using directives You can also add source files with the using directive `//> using file`: diff --git a/website/docs/reference/directives.md b/website/docs/reference/directives.md index 23ac860696..f7a714d46c 100644 --- a/website/docs/reference/directives.md +++ b/website/docs/reference/directives.md @@ -77,7 +77,7 @@ Sets Java home used to run your application or tests ### Java options -Add Java options +Add Java options which will be passed when running an application. `//> using java-opt `_options_ @@ -96,6 +96,19 @@ Add Java properties #### Examples `//> using javaProp "foo1=bar", "foo2"` +### Javac options + +Add Javac options which will be passed when compiling sources. + +`//> using javac-opt `_options_ + +`//> using javacOpt `_options_ + +#### Examples +`//> using javacOpt "source", "1.8"` + +`"target", "1.8"` + ### Main class Specify default main class diff --git a/website/docs/reference/scala-command/directives.md b/website/docs/reference/scala-command/directives.md index 304b8e587a..6b8c49719e 100644 --- a/website/docs/reference/scala-command/directives.md +++ b/website/docs/reference/scala-command/directives.md @@ -77,7 +77,7 @@ Sets Java home used to run your application or tests ### Java options -Add Java options +Add Java options which will be passed when running an application. `//> using java-opt `_options_ @@ -96,6 +96,19 @@ Add Java properties #### Examples `//> using javaProp "foo1=bar", "foo2"` +### Javac options + +Add Javac options which will be passed when compiling sources. + +`//> using javac-opt `_options_ + +`//> using javacOpt `_options_ + +#### Examples +`//> using javacOpt "source", "1.8"` + +`"target", "1.8"` + ### Main class Specify default main class