diff --git a/modules/cli/src/main/scala/scala/cli/commands/shared/ScalaNativeOptions.scala b/modules/cli/src/main/scala/scala/cli/commands/shared/ScalaNativeOptions.scala index eaf89821c8..871f49c4aa 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/shared/ScalaNativeOptions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/shared/ScalaNativeOptions.scala @@ -23,6 +23,10 @@ final case class ScalaNativeOptions( @Tag(tags.should) nativeMode: Option[String] = None, @Group(HelpGroup.ScalaNative.toString) + @HelpMessage("Link-time optimisation mode") + @Tag(tags.should) + nativeLto: Option[String] = None, + @Group(HelpGroup.ScalaNative.toString) @HelpMessage("Set the Scala Native garbage collector") @Tag(tags.should) nativeGc: Option[String] = None, diff --git a/modules/cli/src/main/scala/scala/cli/commands/shared/SharedOptions.scala b/modules/cli/src/main/scala/scala/cli/commands/shared/SharedOptions.scala index cbb7fb4ac2..d6c9dd75de 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/shared/SharedOptions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/shared/SharedOptions.scala @@ -245,6 +245,7 @@ final case class SharedOptions( options.ScalaNativeOptions( nativeVersion, nativeMode, + nativeLto, nativeGc, nativeClang, nativeClangpp, diff --git a/modules/directives/src/main/scala/scala/build/preprocessing/directives/ScalaNative.scala b/modules/directives/src/main/scala/scala/build/preprocessing/directives/ScalaNative.scala index 0fc7d95a4c..6a0e899803 100644 --- a/modules/directives/src/main/scala/scala/build/preprocessing/directives/ScalaNative.scala +++ b/modules/directives/src/main/scala/scala/build/preprocessing/directives/ScalaNative.scala @@ -14,6 +14,8 @@ import scala.cli.commands.SpecificationLevel | |`//> using nativeMode` _value_ | + |`//> using nativeLto` _value_ + | |`//> using nativeVersion` _value_ | |`//> using nativeCompile` _value1_, _value2_ @@ -32,6 +34,7 @@ import scala.cli.commands.SpecificationLevel final case class ScalaNative( nativeGc: Option[String] = None, nativeMode: Option[String] = None, + nativeLto: Option[String] = None, nativeVersion: Option[String] = None, nativeCompile: List[String] = Nil, nativeLinking: List[String] = Nil, @@ -45,6 +48,7 @@ final case class ScalaNative( val nativeOptions = ScalaNativeOptions( gcStr = nativeGc, modeStr = nativeMode, + ltoStr = nativeLto, version = nativeVersion, compileOptions = nativeCompile, linkingOptions = nativeLinking, diff --git a/modules/integration/src/test/scala/scala/cli/integration/RunScalaNativeTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/RunScalaNativeTestDefinitions.scala index d20529fac0..3cb580381a 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/RunScalaNativeTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/RunScalaNativeTestDefinitions.scala @@ -33,6 +33,28 @@ trait RunScalaNativeTestDefinitions { _: RunTestDefinitions => simpleNativeTests() } + def scalaNativeLtoTests(): Unit = { + val fileName = "hello.sc" + val message = "Hello" + val inputs = TestInputs( + os.rel / fileName -> + s"""//> using nativeLto "thin" + |println("$message") + |""".stripMargin + ) + inputs.fromRoot { root => + val output = + os.proc(TestUtil.cli, extraOptions, fileName, "--native") + .call(cwd = root) + .out.trim() + expect(output == message) + } + } + + test("scala native with lto optimisation") { + scalaNativeLtoTests() + } + test("simple script native command") { val fileName = "simple.sc" val message = "Hello" diff --git a/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala b/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala index 0fa305a4b1..415a9650a5 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala @@ -6,11 +6,13 @@ import dependency._ import java.nio.file.Paths import scala.build.internal.Constants +import scala.scalanative.build.LTO import scala.scalanative.{build => sn} final case class ScalaNativeOptions( version: Option[String] = None, modeStr: Option[String] = None, + ltoStr: Option[String] = None, gcStr: Option[String] = None, clang: Option[String] = None, clangpp: Option[String] = None, @@ -65,7 +67,10 @@ final case class ScalaNativeOptions( private def compileCliOptions(): List[String] = finalCompileOptions().flatMap(option => List("--compile-option", option)) - + private def ltoOptions(): List[String] = + ltoStr.map(_.trim).filter(_.nonEmpty) + .map(lto => LTO.apply(lto)) + .map(lto => List("--lto", lto.name)).getOrElse(Nil) private def resourcesCliOptions(resourcesExist: Boolean): List[String] = if (embedResources.getOrElse(true)) (numeralVersion, resourcesExist) match { @@ -113,6 +118,7 @@ final case class ScalaNativeOptions( def configCliOptions(resourcesExist: Boolean): List[String] = gcCliOption() ++ modeCliOption() ++ + ltoOptions() ++ clangCliOption() ++ clangppCliOption() ++ linkingCliOptions() ++ diff --git a/website/docs/reference/cli-options.md b/website/docs/reference/cli-options.md index 55ffc6b6e8..8f79394c0f 100644 --- a/website/docs/reference/cli-options.md +++ b/website/docs/reference/cli-options.md @@ -1285,12 +1285,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` ### `--native-version` -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). ### `--native-mode` Set Scala Native compilation mode +### `--native-lto` + +Link-time optimisation mode + ### `--native-gc` Set the Scala Native garbage collector diff --git a/website/docs/reference/directives.md b/website/docs/reference/directives.md index 3124ca7907..f0f3917c7f 100644 --- a/website/docs/reference/directives.md +++ b/website/docs/reference/directives.md @@ -242,6 +242,8 @@ Add Scala Native options `//> using nativeMode` _value_ +`//> using nativeLto` _value_ + `//> using nativeVersion` _value_ `//> using nativeCompile` _value1_, _value2_ diff --git a/website/docs/reference/scala-command/cli-options.md b/website/docs/reference/scala-command/cli-options.md index bada63a99d..7926be7491 100644 --- a/website/docs/reference/scala-command/cli-options.md +++ b/website/docs/reference/scala-command/cli-options.md @@ -794,7 +794,7 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` `SHOULD have` per Scala Runner specification -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). ### `--native-mode` @@ -802,6 +802,12 @@ Set the Scala Native version (0.4.9 by default). Set Scala Native compilation mode +### `--native-lto` + +`SHOULD have` per Scala Runner specification + +Link-time optimisation mode + ### `--native-gc` `SHOULD have` per Scala Runner specification diff --git a/website/docs/reference/scala-command/directives.md b/website/docs/reference/scala-command/directives.md index 66a84fb851..02ac998bd6 100644 --- a/website/docs/reference/scala-command/directives.md +++ b/website/docs/reference/scala-command/directives.md @@ -187,6 +187,8 @@ Add Scala Native options `//> using nativeMode` _value_ +`//> using nativeLto` _value_ + `//> using nativeVersion` _value_ `//> using nativeCompile` _value1_, _value2_ diff --git a/website/docs/reference/scala-command/runner-specification.md b/website/docs/reference/scala-command/runner-specification.md index 2fe60d1ddb..03b27f3ca1 100644 --- a/website/docs/reference/scala-command/runner-specification.md +++ b/website/docs/reference/scala-command/runner-specification.md @@ -158,12 +158,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -864,12 +868,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -1387,12 +1395,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -1936,12 +1948,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -2504,12 +2520,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -3048,12 +3068,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -3629,12 +3653,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -4255,12 +4283,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector @@ -5094,12 +5126,16 @@ Enable Scala Native. To show more options for Scala Native pass `--help-native` **--native-version** -Set the Scala Native version (0.4.9 by default). +Set the Scala Native version (0.4.12 by default). **--native-mode** Set Scala Native compilation mode +**--native-lto** + +Link-time optimisation mode + **--native-gc** Set the Scala Native garbage collector