Skip to content

Add CLI flag & directive for clang/LLVM target triples when using Scala Native #3424

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ final case class SharedOptions(
modeStr = nativeMode,
ltoStr = nativeLto,
gcStr = nativeGc,
targetTripleStr = nativeTargetTriple,
clang = nativeClang,
clangpp = nativeClangpp,
linkingOptions = nativeLinking,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import scala.cli.commands.SpecificationLevel
|
|`//> using nativeLto` _value_
|
|`//> using nativeTargetTriple` _value_
|
|`//> using nativeVersion` _value_
|
|`//> using nativeCompile` _value1_ _value2_ …
Expand All @@ -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,
Expand All @@ -54,6 +57,7 @@ final case class ScalaNative(
gcStr = nativeGc,
modeStr = nativeMode,
ltoStr = nativeLto,
targetTripleStr = nativeTargetTriple,
version = nativeVersion,
compileOptions = nativeCompile,
linkingOptions = nativeLinking,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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()
Expand All @@ -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))
Expand Down Expand Up @@ -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,
Expand All @@ -173,6 +180,7 @@ final case class ScalaNativeOptions(
gcCliOption() ++
modeCliOption() ++
ltoOptions() ++
targetTripleCliOption() ++
clangCliOption() ++
clangppCliOption() ++
linkingCliOptions() ++
Expand Down
4 changes: 4 additions & 0 deletions website/docs/reference/cli-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions website/docs/reference/directives.md
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,8 @@ Add Scala Native options

`//> using nativeLto` _value_

`//> using nativeTargetTriple` _value_

`//> using nativeVersion` _value_

`//> using nativeCompile` _value1_ _value2_ …
Expand Down
6 changes: 6 additions & 0 deletions website/docs/reference/scala-command/cli-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions website/docs/reference/scala-command/directives.md
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,8 @@ Add Scala Native options

`//> using nativeLto` _value_

`//> using nativeTargetTriple` _value_

`//> using nativeVersion` _value_

`//> using nativeCompile` _value1_ _value2_ …
Expand Down
Loading