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 79286e3b94..eeb4bdaa5c 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 @@ -31,6 +31,11 @@ final case class ScalaNativeOptions( @Tag(tags.should) nativeGc: Option[String] = None, + @Group(HelpGroup.ScalaNative.toString) + @HelpMessage("Set a target triple to which Scala Native can cross-compile") + @Tag(tags.experimental) + nativeTargetTriple: Option[String] = None, + @Group(HelpGroup.ScalaNative.toString) @HelpMessage("Path to the Clang command") @Tag(tags.implementation) 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 e5dbb62197..8e466861c7 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 @@ -282,6 +282,7 @@ final case class SharedOptions( modeStr = nativeMode, ltoStr = nativeLto, gcStr = nativeGc, + targetTripleStr = nativeTargetTriple, clang = nativeClang, clangpp = nativeClangpp, linkingOptions = nativeLinking, 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 e9aae78f90..bb2f7aee1e 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 @@ -16,6 +16,8 @@ import scala.cli.commands.SpecificationLevel | |`//> using nativeLto` _value_ | + |`//> using nativeTargetTriple` _value_ + | |`//> using nativeVersion` _value_ | |`//> using nativeCompile` _value1_ _value2_ … @@ -38,6 +40,7 @@ final case class ScalaNative( nativeGc: Option[String] = None, nativeMode: Option[String] = None, nativeLto: Option[String] = None, + nativeTargetTriple: Option[String] = None, nativeVersion: Option[String] = None, nativeCompile: List[String] = Nil, nativeLinking: List[String] = Nil, @@ -54,6 +57,7 @@ final case class ScalaNative( gcStr = nativeGc, modeStr = nativeMode, ltoStr = nativeLto, + targetTripleStr = nativeTargetTriple, version = nativeVersion, compileOptions = nativeCompile, linkingOptions = nativeLinking, 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 0857a0fd18..d56bfd7497 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala @@ -32,6 +32,7 @@ final case class ScalaNativeOptions( modeStr: Option[String] = None, ltoStr: Option[String] = None, gcStr: Option[String] = None, + targetTripleStr: Option[String] = None, clang: Option[String] = None, clangpp: Option[String] = None, linkingOptions: List[String] = Nil, @@ -78,6 +79,12 @@ final case class ScalaNativeOptions( private def gcCliOption(): List[String] = List("--gc", gc().name) + private def targetTripleCliOption(): List[String] = + if (!targetTripleStr.isEmpty) + List("--target-triple", targetTripleStr.get) + else + Nil + private def mode(): sn.Mode = modeStr.map(_.trim).filter(_.nonEmpty) match { case Some("default") | None => sn.Discover.mode() @@ -101,9 +108,9 @@ final case class ScalaNativeOptions( List("--clang-pp", clangppPath().toString()) private def finalLinkingOptions(): List[String] = - linkingOptions ++ (if (linkingDefaults.getOrElse(true)) sn.Discover.linkingOptions() else Nil) + linkingOptions ++ (if (linkingDefaults.getOrElse(true) && targetTripleStr.isEmpty) sn.Discover.linkingOptions() else Nil) private def finalCompileOptions(): List[String] = - compileOptions ++ (if (compileDefaults.getOrElse(true)) sn.Discover.compileOptions() else Nil) + compileOptions ++ (if (compileDefaults.getOrElse(true) && targetTripleStr.isEmpty) sn.Discover.compileOptions() else Nil) private def linkingCliOptions(): List[String] = finalLinkingOptions().flatMap(option => List("--linking-option", option)) @@ -155,7 +162,7 @@ final case class ScalaNativeOptions( BloopConfig.LinkerMode.Release else BloopConfig.LinkerMode.Debug, gc = gc().name, - targetTriple = None, + targetTriple = targetTripleStr, clang = clangPath(), clangpp = clangppPath(), toolchain = Nil, @@ -173,6 +180,7 @@ final case class ScalaNativeOptions( gcCliOption() ++ modeCliOption() ++ ltoOptions() ++ + targetTripleCliOption() ++ clangCliOption() ++ clangppCliOption() ++ linkingCliOptions() ++ diff --git a/website/docs/reference/cli-options.md b/website/docs/reference/cli-options.md index 398c5a81c2..38481fc9a8 100644 --- a/website/docs/reference/cli-options.md +++ b/website/docs/reference/cli-options.md @@ -1434,6 +1434,10 @@ Link-time optimisation mode (none by default): none, full, thin Set the Scala Native garbage collector (immix by default): immix, commix, boehm, none +### `--native-target-triple` + +Set a target triple to which Scala Native can cross-compile + ### `--native-clang` Path to the Clang command diff --git a/website/docs/reference/directives.md b/website/docs/reference/directives.md index c4ac593b20..3a931706d2 100644 --- a/website/docs/reference/directives.md +++ b/website/docs/reference/directives.md @@ -343,6 +343,8 @@ Add Scala Native options `//> using nativeLto` _value_ +`//> using nativeTargetTriple` _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 fb502dd1f0..365581eeab 100644 --- a/website/docs/reference/scala-command/cli-options.md +++ b/website/docs/reference/scala-command/cli-options.md @@ -874,6 +874,12 @@ Link-time optimisation mode (none by default): none, full, thin Set the Scala Native garbage collector (immix by default): immix, commix, boehm, none +### `--native-target-triple` + +`SHOULD have` per Scala Runner specification + +Set a target triple to which Scala Native can cross-compile + ### `--native-clang` `IMPLEMENTATION specific` per Scala Runner specification diff --git a/website/docs/reference/scala-command/directives.md b/website/docs/reference/scala-command/directives.md index 3d903a5f6e..211f6e9b32 100644 --- a/website/docs/reference/scala-command/directives.md +++ b/website/docs/reference/scala-command/directives.md @@ -233,6 +233,8 @@ Add Scala Native options `//> using nativeLto` _value_ +`//> using nativeTargetTriple` _value_ + `//> using nativeVersion` _value_ `//> using nativeCompile` _value1_ _value2_ …