From a8f8e5c2b5e94f0e87ffe33e4f0a79d29273f295 Mon Sep 17 00:00:00 2001 From: "Bryn M." Date: Wed, 15 Jan 2025 08:20:16 -0500 Subject: [PATCH 1/7] Added CLI flag & directive for clang/LLVM target triples when using Scala Native Finished previous commit --- .../cli/commands/shared/ScalaNativeOptions.scala | 5 +++++ .../scala/cli/commands/shared/SharedOptions.scala | 1 + .../build/preprocessing/directives/ScalaNative.scala | 4 ++++ .../scala/build/options/ScalaNativeOptions.scala | 11 ++++++++++- 4 files changed, 20 insertions(+), 1 deletion(-) 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..4f530069c2 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.should) + 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..f190eb0977 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,13 @@ final case class ScalaNativeOptions( private def gcCliOption(): List[String] = List("--gc", gc().name) + private def targetTripleCliOption(): List[String] = + if (!targetTripleStr.isEmpty) { + return List("--target-triple", targetTripleStr.get) + } else { + return Nil + } + private def mode(): sn.Mode = modeStr.map(_.trim).filter(_.nonEmpty) match { case Some("default") | None => sn.Discover.mode() @@ -155,7 +163,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 +181,7 @@ final case class ScalaNativeOptions( gcCliOption() ++ modeCliOption() ++ ltoOptions() ++ + targetTripleCliOption() ++ clangCliOption() ++ clangppCliOption() ++ linkingCliOptions() ++ From 6244a52ede7fdcdb20d85839a03ee9fa13724781 Mon Sep 17 00:00:00 2001 From: "Bryn M." Date: Wed, 15 Jan 2025 12:00:32 -0500 Subject: [PATCH 2/7] Updated reference docs --- website/docs/reference/cli-options.md | 4 ++++ website/docs/reference/directives.md | 2 ++ website/docs/reference/scala-command/cli-options.md | 6 ++++++ website/docs/reference/scala-command/directives.md | 2 ++ 4 files changed, 14 insertions(+) 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..16b4de25fa 100644 --- a/website/docs/reference/directives.md +++ b/website/docs/reference/directives.md @@ -349,6 +349,8 @@ Add Scala Native options `//> using nativeLinking` _value1_ _value2_ … +`//> using nativeTargetTriple` _value_ + `//> using nativeClang` _value_ `//> using nativeClangPP` _value_ 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_ … From 06c65797a6d89bf3a49bdb2813cdcae6d044efac Mon Sep 17 00:00:00 2001 From: "Bryn M." Date: Wed, 15 Jan 2025 12:03:10 -0500 Subject: [PATCH 3/7] Used updated Scala 3 syntax per scalafmt --- .../main/scala/scala/build/options/ScalaNativeOptions.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) 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 f190eb0977..3fc512c228 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala @@ -80,11 +80,10 @@ final case class ScalaNativeOptions( List("--gc", gc().name) private def targetTripleCliOption(): List[String] = - if (!targetTripleStr.isEmpty) { + if (!targetTripleStr.isEmpty) return List("--target-triple", targetTripleStr.get) - } else { + else return Nil - } private def mode(): sn.Mode = modeStr.map(_.trim).filter(_.nonEmpty) match { From f4fd73e789e79e0094bcd4d09506f339a2114a46 Mon Sep 17 00:00:00 2001 From: "Bryn M." Date: Wed, 15 Jan 2025 12:25:13 -0500 Subject: [PATCH 4/7] Corrected order of Scala Native directives in docs --- website/docs/reference/directives.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/reference/directives.md b/website/docs/reference/directives.md index 16b4de25fa..3a931706d2 100644 --- a/website/docs/reference/directives.md +++ b/website/docs/reference/directives.md @@ -343,14 +343,14 @@ Add Scala Native options `//> using nativeLto` _value_ +`//> using nativeTargetTriple` _value_ + `//> using nativeVersion` _value_ `//> using nativeCompile` _value1_ _value2_ … `//> using nativeLinking` _value1_ _value2_ … -`//> using nativeTargetTriple` _value_ - `//> using nativeClang` _value_ `//> using nativeClangPP` _value_ From d379a324a33fa670ff62d50a6ff814dba451bfcb Mon Sep 17 00:00:00 2001 From: "Bryn M." Date: Wed, 15 Jan 2025 12:51:17 -0500 Subject: [PATCH 5/7] Adjusted CLI option return per Scalafix recommendation --- .../main/scala/scala/build/options/ScalaNativeOptions.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 3fc512c228..e7ca1211a8 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala @@ -81,9 +81,9 @@ final case class ScalaNativeOptions( private def targetTripleCliOption(): List[String] = if (!targetTripleStr.isEmpty) - return List("--target-triple", targetTripleStr.get) + List("--target-triple", targetTripleStr.get) else - return Nil + Nil private def mode(): sn.Mode = modeStr.map(_.trim).filter(_.nonEmpty) match { From 0837ebb86046a3bf3851a2ebefb45be4295a1cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bryn=20=E2=99=AB?= Date: Thu, 16 Jan 2025 12:37:59 -0500 Subject: [PATCH 6/7] Update modules/cli/src/main/scala/scala/cli/commands/shared/ScalaNativeOptions.scala Co-authored-by: Piotr Chabelski --- .../scala/scala/cli/commands/shared/ScalaNativeOptions.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4f530069c2..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 @@ -33,7 +33,7 @@ final case class ScalaNativeOptions( @Group(HelpGroup.ScalaNative.toString) @HelpMessage("Set a target triple to which Scala Native can cross-compile") - @Tag(tags.should) + @Tag(tags.experimental) nativeTargetTriple: Option[String] = None, @Group(HelpGroup.ScalaNative.toString) From 2f3ada13601db1b0119935c3fba45284349898fb Mon Sep 17 00:00:00 2001 From: "Bryn M." Date: Sat, 18 Jan 2025 16:04:22 -0500 Subject: [PATCH 7/7] Fix: System libs no longer searched w/ target triple When --native-target-triple is invoked, the compiler will no longer pull in local libraries, which can mess with cross-compilation. --- .../main/scala/scala/build/options/ScalaNativeOptions.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 e7ca1211a8..d56bfd7497 100644 --- a/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala +++ b/modules/options/src/main/scala/scala/build/options/ScalaNativeOptions.scala @@ -108,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))