From 575f8889de4acbabf2c7be50173cd5000ede79fb Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Wed, 28 Feb 2024 16:35:20 +0100 Subject: [PATCH 01/15] Support Scala Native 0.5.0-RC1 --- build.sc | 21 +++++++++++++++++-- .../scalanativelib/ScalaNativeModule.scala | 10 +++++---- .../HelloNativeWorldTests.scala | 16 +++++++++----- .../worker/ScalaNativeWorkerImpl.scala | 11 +++------- 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/build.sc b/build.sc index 3b65aedf441..c5ff6f8585a 100644 --- a/build.sc +++ b/build.sc @@ -86,6 +86,14 @@ object Deps { val scalanativeTestRunner = ivy"org.scala-native::test-runner:${scalanativeVersion}" } + object Scalanative_0_5 { + val scalanativeVersion = "0.5.0-RC1" + val scalanativeTools = ivy"org.scala-native::tools:${scalanativeVersion}" + val scalanativeUtil = ivy"org.scala-native::util:${scalanativeVersion}" + val scalanativeNir = ivy"org.scala-native::nir:${scalanativeVersion}" + val scalanativeTestRunner = ivy"org.scala-native::test-runner:${scalanativeVersion}" + } + trait Play { def playVersion: String def playBinVersion: String = playVersion.split("[.]").take(2).mkString(".") @@ -395,7 +403,8 @@ trait MillBaseTestsModule extends MillJavaModule with TestModule { s"-DTEST_SCALA_3_2_VERSION=${Deps.testScala32Version}", s"-DTEST_SCALA_3_3_VERSION=${Deps.testScala33Version}", s"-DTEST_SCALAJS_VERSION=${Deps.Scalajs_1.scalaJsVersion}", - s"-DTEST_SCALANATIVE_VERSION=${Deps.Scalanative_0_4.scalanativeVersion}", + s"-DTEST_SCALANATIVE_0_4_VERSION=${Deps.Scalanative_0_4.scalanativeVersion}", + s"-DTEST_SCALANATIVE_0_5_VERSION=${Deps.Scalanative_0_5.scalanativeVersion}", s"-DTEST_UTEST_VERSION=${Deps.utest.dep.version}", s"-DTEST_SCALATEST_VERSION=${Deps.TestDeps.scalaTest.dep.version}", s"-DTEST_TEST_INTERFACE_VERSION=${Deps.sbtTestInterface.dep.version}", @@ -954,7 +963,7 @@ object scalanativelib extends MillStableScalaModule { def ivyDeps = Agg(Deps.sbtTestInterface) } - object worker extends Cross[WorkerModule]("0.4") + object worker extends Cross[WorkerModule]("0.4", "0.5") trait WorkerModule extends MillPublishScalaModule with Cross.Module[String] { def scalaNativeWorkerVersion = crossValue @@ -962,6 +971,14 @@ object scalanativelib extends MillStableScalaModule { def testDepPaths = T { Seq(compile().classes) } def moduleDeps = Seq(scalanativelib.`worker-api`) def ivyDeps = scalaNativeWorkerVersion match { + case "0.5" => + Agg( + Deps.osLib, + Deps.Scalanative_0_5.scalanativeTools, + Deps.Scalanative_0_5.scalanativeUtil, + Deps.Scalanative_0_5.scalanativeNir, + Deps.Scalanative_0_5.scalanativeTestRunner + ) case "0.4" => Agg( Deps.osLib, diff --git a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala index faaa6a2fd67..1e94fe7a8bc 100644 --- a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala +++ b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala @@ -66,10 +66,12 @@ trait ScalaNativeModule extends ScalaModule { outer => def nativeIvyDeps: T[Agg[Dep]] = T { val scalaVersionSpecific = - if (ZincWorkerUtil.isScala3(scalaVersion())) - Agg(ivy"org.scala-native::scala3lib::${scalaNativeVersion()}") - else - Agg(ivy"org.scala-native::scalalib::${scalaNativeVersion()}") + if (ZincWorkerUtil.isScala3(scalaVersion())) { + if (scalaNativeVersion().startsWith("0.4")) + Agg(ivy"org.scala-native::scala3lib::${scalaNativeVersion()}") + else + Agg(ivy"org.scala-native::scala3lib::${scalaVersion()}+${scalaNativeVersion()}") + } else Agg(ivy"org.scala-native::scalalib::${scalaNativeVersion()}") Agg( ivy"org.scala-native::nativelib::${scalaNativeVersion()}", diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index 618320d60af..a3bf98f6d1e 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -30,18 +30,24 @@ object HelloNativeWorldTests extends TestSuite { override def mainClass = Some("hello.Main") } - val scala213 = "2.13.6" - val scalaNative04 = "0.4.2" + val scala213 = sys.props.getOrElse("TEST_SCALA_2_13_VERSION", ???) + val scala31 = sys.props.getOrElse("TEST_SCALA_3_1_VERSION", ???) + val scala33 = sys.props.getOrElse("TEST_SCALA_3_3_VERSION", ???) + val scalaNative04Old = "0.4.2" + val scalaNative04 = sys.props.getOrElse("TEST_SCALANATIVE_0_4_VERSION", ???) + val scalaNative05 = sys.props.getOrElse("TEST_SCALANATIVE_0_5_VERSION", ???) object HelloNativeWorld extends TestUtil.BaseModule { implicit object ReleaseModeToSegments extends Cross.ToSegments[ReleaseMode](v => List(v.toString)) val matrix = for { - scala <- Seq("3.2.1", "3.1.3", scala213, "2.12.13", "2.11.12") - scalaNative <- Seq(scalaNative04, "0.4.9") + scala <- Seq(scala33, scala31, scala213, "2.12.13", "2.11.12") + scalaNative <- Seq(scalaNative04Old, scalaNative04, scalaNative05) mode <- List(ReleaseMode.Debug, ReleaseMode.ReleaseFast) - if !(ZincWorkerUtil.isScala3(scala) && scalaNative == scalaNative04) + if !(ZincWorkerUtil.isScala3(scala) && scalaNative == scalaNative04Old) + if !(scala.startsWith("2.11") && scalaNative == scalaNative05) + if !(scala.startsWith("2.12") && scalaNative == scalaNative05) } yield (scala, scalaNative, mode) object helloNativeWorld extends Cross[RootModule](matrix) diff --git a/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala b/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala index db356fd0c29..39a36b7f777 100644 --- a/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala +++ b/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala @@ -20,15 +20,10 @@ import scala.scalanative.build.{ import scala.scalanative.nir.Versions import scala.scalanative.testinterface.adapter.TestAdapter -import scala.util.{Success, Try} - class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWorkerApi { - private def patchIsGreaterThanOrEqual(number: Int) = { - val patch = Versions.current.stripPrefix("0.4.") - Try(patch.toInt) match { - case Success(n) if n < number => false - case _ => true - } + private def patchIsGreaterThanOrEqual(number: Int) = Versions.current match { + case s"0.4.$n" if n.toIntOption.exists(_ < number) => false + case _ => true } def logger(level: NativeLogLevel): Logger = From 1e74ffc54fcc7868fb8cb6402be1a5b52eb31f05 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Wed, 28 Feb 2024 16:53:57 +0100 Subject: [PATCH 02/15] Fix tests --- .../src/mill/scalanativelib/HelloNativeWorldTests.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index a3bf98f6d1e..42cab367b96 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -135,7 +135,7 @@ object HelloNativeWorldTests extends TestSuite { val Right((result, evalCount)) = helloWorldEvaluator(HelloNativeWorld.helloNativeWorld( scala213, - scalaNative04, + scalaNative04Old, ReleaseMode.Debug ).jar) val jar = result.path @@ -161,7 +161,7 @@ object HelloNativeWorldTests extends TestSuite { } "artifactId_040" - testArtifactId( scala213, - scalaNative04, + scalaNative04Old, ReleaseMode.Debug, "hello-native-world_native0.4_2.13" ) @@ -268,7 +268,7 @@ object HelloNativeWorldTests extends TestSuite { ) val scalaNativeVersionSpecific = - if (scalaNativeVersion == scalaNative04) Set.empty + if (scalaNativeVersion == scalaNative04Old) Set.empty else Set("Main.nir", "ArgsParser.nir") common ++ scalaVersionSpecific ++ scalaNativeVersionSpecific From b5397b599678189dc8c1085174951a7538ffb36e Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Wed, 28 Feb 2024 16:56:15 +0100 Subject: [PATCH 03/15] Add Scala Native worker 0.5 to test deps of scalanativelib --- build.sc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sc b/build.sc index c5ff6f8585a..2e0c46af17b 100644 --- a/build.sc +++ b/build.sc @@ -957,7 +957,7 @@ object contrib extends Module { object scalanativelib extends MillStableScalaModule { def moduleDeps = Seq(scalalib, scalanativelib.`worker-api`) - def testTransitiveDeps = super.testTransitiveDeps() ++ Seq(worker("0.4").testDep()) + def testTransitiveDeps = super.testTransitiveDeps() ++ Seq(worker("0.4").testDep(), worker("0.5").testDep()) object `worker-api` extends MillPublishScalaModule { def ivyDeps = Agg(Deps.sbtTestInterface) From 9f37cf80319f5946eff530582505ca8135c5782e Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Wed, 28 Feb 2024 17:09:59 +0100 Subject: [PATCH 04/15] Add worker implementation for Scala Native 0.5 --- .../worker/ScalaNativeWorkerImpl.scala | 11 +- .../worker/ScalaNativeWorkerImpl.scala | 161 ++++++++++++++++++ .../worker/scala/scalanative/Utils.scala | 6 + 3 files changed, 175 insertions(+), 3 deletions(-) create mode 100644 scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala create mode 100644 scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala diff --git a/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala b/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala index 39a36b7f777..db356fd0c29 100644 --- a/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala +++ b/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala @@ -20,10 +20,15 @@ import scala.scalanative.build.{ import scala.scalanative.nir.Versions import scala.scalanative.testinterface.adapter.TestAdapter +import scala.util.{Success, Try} + class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWorkerApi { - private def patchIsGreaterThanOrEqual(number: Int) = Versions.current match { - case s"0.4.$n" if n.toIntOption.exists(_ < number) => false - case _ => true + private def patchIsGreaterThanOrEqual(number: Int) = { + val patch = Versions.current.stripPrefix("0.4.") + Try(patch.toInt) match { + case Success(n) if n < number => false + case _ => true + } } def logger(level: NativeLogLevel): Logger = diff --git a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala new file mode 100644 index 00000000000..2898030e9cc --- /dev/null +++ b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala @@ -0,0 +1,161 @@ +package mill.scalanativelib.worker + +import java.io.File +import java.lang.System.{err, out} + +import mill.scalanativelib.worker.api._ +import scala.scalanative.util.Scope +import scala.scalanative.build.{ + Build, + BuildTarget => ScalaNativeBuildTarget, + Config, + Discover, + GC, + Logger, + LTO, + Mode, + NativeConfig => ScalaNativeNativeConfig, + MillUtils +} +import scala.scalanative.nir.Versions +import scala.scalanative.testinterface.adapter.TestAdapter + +import scala.util.{Success, Try} + +class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWorkerApi { + private def patchIsGreaterThanOrEqual(number: Int) = { + val patch = Versions.current.stripPrefix("0.5.") + Try(patch.toInt) match { + case Success(n) if n < number => false + case _ => true + } + } + + def logger(level: NativeLogLevel): Logger = + Logger( + traceFn = msg => if (level.value >= NativeLogLevel.Trace.value) err.println(s"[trace] $msg"), + debugFn = msg => if (level.value >= NativeLogLevel.Debug.value) out.println(s"[debug] $msg"), + infoFn = msg => if (level.value >= NativeLogLevel.Info.value) out.println(s"[info] $msg"), + warnFn = msg => if (level.value >= NativeLogLevel.Warn.value) out.println(s"[warn] $msg"), + errorFn = msg => if (level.value >= NativeLogLevel.Error.value) err.println(s"[error] $msg") + ) + + def discoverClang(): File = Discover.clang().toFile + def discoverClangPP(): File = Discover.clangpp().toFile + def discoverCompileOptions(): Seq[String] = Discover.compileOptions() + def discoverLinkingOptions(): Seq[String] = Discover.linkingOptions() + def defaultGarbageCollector(): String = GC.default.name + + def config( + mainClass: Either[String, String], + classpath: Seq[File], + nativeWorkdir: File, + nativeClang: File, + nativeClangPP: File, + nativeTarget: Option[String], + nativeCompileOptions: Seq[String], + nativeLinkingOptions: Seq[String], + nativeGC: String, + nativeLinkStubs: Boolean, + nativeLTO: String, + releaseMode: String, + nativeOptimize: Boolean, + nativeEmbedResources: Boolean, + nativeIncrementalCompilation: Boolean, + nativeDump: Boolean, + logLevel: NativeLogLevel, + buildTarget: BuildTarget + ): Either[String, Config] = { + val nativeConfig = + ScalaNativeNativeConfig.empty + .withClang(nativeClang.toPath) + .withClangPP(nativeClangPP.toPath) + .withTargetTriple(nativeTarget) + .withCompileOptions(nativeCompileOptions) + .withLinkingOptions(nativeLinkingOptions) + .withGC(GC(nativeGC)) + .withLinkStubs(nativeLinkStubs) + .withMode(Mode(releaseMode)) + .withOptimize(nativeOptimize) + .withLTO(LTO(nativeLTO)) + .withDump(nativeDump) + .withBuildTarget(buildTarget match { + case BuildTarget.Application => ScalaNativeBuildTarget.application + case BuildTarget.LibraryDynamic => ScalaNativeBuildTarget.libraryDynamic + case BuildTarget.LibraryStatic => ScalaNativeBuildTarget.libraryStatic + }) + .withEmbedResources(nativeEmbedResources) + .withIncrementalCompilation(nativeIncrementalCompilation) + + var config = Config.empty + .withClassPath(classpath.map(_.toPath)) + .withWorkdir(nativeWorkdir.toPath) + .withCompilerConfig(nativeConfig) + .withLogger(logger(logLevel)) + + if (buildTarget == BuildTarget.Application) { + mainClass match { + case Left(error) => return Left(error) + case Right(mainClass) => config = config.withMainClass(mainClass) + } + } + + Right(config) + } + + def nativeLink(nativeConfig: Object, outDirectory: File): File = { + val config = nativeConfig.asInstanceOf[Config] + val compilerConfig = config.compilerConfig + + val name = { + val isWindows = MillUtils.targetsWindows(config) + val isMac = MillUtils.targetsMac(config) + + val ext = if (compilerConfig.buildTarget == ScalaNativeBuildTarget.application) { + if (MillUtils.targetsWindows(config)) ".exe" else "" + } else if (compilerConfig.buildTarget == ScalaNativeBuildTarget.libraryDynamic) { + if (isWindows) ".dll" + else if (isMac) ".dylib" + else ".so" + } else if (compilerConfig.buildTarget == ScalaNativeBuildTarget.libraryStatic) { + if (isWindows) ".lib" + else ".a" + } else { + throw new RuntimeException(s"Unknown buildTarget ${compilerConfig.buildTarget}") + } + + val namePrefix = if (compilerConfig.buildTarget == ScalaNativeBuildTarget.application) "" + else { + if (isWindows) "" else "lib" + } + s"${namePrefix}out${ext}" + } + + val outPath = new File(outDirectory, name) + Build.build(config, outPath.toPath)(Scope.unsafe()) + outPath + } + + def getFramework( + testBinary: File, + envVars: Map[String, String], + logLevel: NativeLogLevel, + frameworkName: String + ): (() => Unit, sbt.testing.Framework) = { + val config = TestAdapter.Config() + .withBinaryFile(testBinary) + .withEnvVars(envVars) + .withLogger(logger(logLevel)) + + val adapter = new TestAdapter(config) + + ( + () => adapter.close(), + adapter + .loadFrameworks(List(List(frameworkName))) + .flatten + .headOption + .getOrElse(throw new RuntimeException("Failed to get framework")) + ) + } +} diff --git a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala new file mode 100644 index 00000000000..58c6009c3bf --- /dev/null +++ b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala @@ -0,0 +1,6 @@ +package scala.scalanative.build + +object MillUtils { + def targetsWindows(config: Config): Boolean = config.targetsWindows + def targetsMac(config: Config): Boolean = config.targetsMac +} From a7469527674992c0b3a02cedb9bfdf8706092b0d Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Wed, 28 Feb 2024 21:05:54 +0100 Subject: [PATCH 05/15] Fix nativeLink on Scala Native 0.5 --- .../worker/ScalaNativeWorkerImpl.scala | 50 +++++++------------ 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala index 2898030e9cc..9e593d77524 100644 --- a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala +++ b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala @@ -20,9 +20,15 @@ import scala.scalanative.build.{ import scala.scalanative.nir.Versions import scala.scalanative.testinterface.adapter.TestAdapter +import scala.concurrent.Await +import scala.concurrent.duration.Duration +import scala.concurrent.ExecutionContext.Implicits.global import scala.util.{Success, Try} +import java.nio.file.Files class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWorkerApi { + implicit val scope: Scope = Scope.forever + private def patchIsGreaterThanOrEqual(number: Int) = { val patch = Versions.current.stripPrefix("0.5.") Try(patch.toInt) match { @@ -86,54 +92,34 @@ class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWo }) .withEmbedResources(nativeEmbedResources) .withIncrementalCompilation(nativeIncrementalCompilation) + .withBaseName("out") - var config = Config.empty + val config = Config.empty .withClassPath(classpath.map(_.toPath)) - .withWorkdir(nativeWorkdir.toPath) + .withBaseDir(nativeWorkdir.toPath) .withCompilerConfig(nativeConfig) .withLogger(logger(logLevel)) if (buildTarget == BuildTarget.Application) { mainClass match { - case Left(error) => return Left(error) - case Right(mainClass) => config = config.withMainClass(mainClass) + case Left(error) => + Left(error) + case Right(mainClass) => + Right(config.withMainClass(Some(mainClass))) } - } - - Right(config) + } else Right(config) } def nativeLink(nativeConfig: Object, outDirectory: File): File = { val config = nativeConfig.asInstanceOf[Config] val compilerConfig = config.compilerConfig - val name = { - val isWindows = MillUtils.targetsWindows(config) - val isMac = MillUtils.targetsMac(config) - - val ext = if (compilerConfig.buildTarget == ScalaNativeBuildTarget.application) { - if (MillUtils.targetsWindows(config)) ".exe" else "" - } else if (compilerConfig.buildTarget == ScalaNativeBuildTarget.libraryDynamic) { - if (isWindows) ".dll" - else if (isMac) ".dylib" - else ".so" - } else if (compilerConfig.buildTarget == ScalaNativeBuildTarget.libraryStatic) { - if (isWindows) ".lib" - else ".a" - } else { - throw new RuntimeException(s"Unknown buildTarget ${compilerConfig.buildTarget}") - } + val result = Await.result(Build.buildCached(config), Duration.Inf) - val namePrefix = if (compilerConfig.buildTarget == ScalaNativeBuildTarget.application) "" - else { - if (isWindows) "" else "lib" - } - s"${namePrefix}out${ext}" - } + val resultInOutDirectory = + Files.move(result, outDirectory.toPath().resolve(result.getFileName())) - val outPath = new File(outDirectory, name) - Build.build(config, outPath.toPath)(Scope.unsafe()) - outPath + resultInOutDirectory.toFile() } def getFramework( From 47e66b35b7b9b5bf9e04e486cf44bebf501262f1 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Wed, 28 Feb 2024 21:39:33 +0100 Subject: [PATCH 06/15] Fix scalalib version for Scala 2 --- .../mill/scalanativelib/ScalaNativeModule.scala | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala index 1e94fe7a8bc..a55673b98a7 100644 --- a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala +++ b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala @@ -65,13 +65,15 @@ trait ScalaNativeModule extends ScalaModule { outer => } def nativeIvyDeps: T[Agg[Dep]] = T { - val scalaVersionSpecific = - if (ZincWorkerUtil.isScala3(scalaVersion())) { - if (scalaNativeVersion().startsWith("0.4")) - Agg(ivy"org.scala-native::scala3lib::${scalaNativeVersion()}") - else - Agg(ivy"org.scala-native::scala3lib::${scalaVersion()}+${scalaNativeVersion()}") - } else Agg(ivy"org.scala-native::scalalib::${scalaNativeVersion()}") + val scalaVersionSpecific = { + val version = + if(scalaNativeVersion().startsWith("0.4")) scalaNativeVersion() + else s"${scalaVersion()}+${scalaNativeVersion()}" + + if (ZincWorkerUtil.isScala3(scalaVersion())) + Agg(ivy"org.scala-native::scala3lib::$version") + else Agg(ivy"org.scala-native::scalalib::$version") + } Agg( ivy"org.scala-native::nativelib::${scalaNativeVersion()}", From cce2c4815ddb7c973c168fe3706f9ae3d429de83 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 10:45:43 +0100 Subject: [PATCH 07/15] Skip utest tests on Scala Native 0.5 --- .../src/mill/scalanativelib/HelloNativeWorldTests.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index 42cab367b96..403493e0220 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -36,6 +36,7 @@ object HelloNativeWorldTests extends TestSuite { val scalaNative04Old = "0.4.2" val scalaNative04 = sys.props.getOrElse("TEST_SCALANATIVE_0_4_VERSION", ???) val scalaNative05 = sys.props.getOrElse("TEST_SCALANATIVE_0_5_VERSION", ???) + val utestVersion = sys.props.getOrElse("TEST_UTEST_VERSION", ???) object HelloNativeWorld extends TestUtil.BaseModule { implicit object ReleaseModeToSegments @@ -70,7 +71,7 @@ object HelloNativeWorldTests extends TestSuite { object test extends ScalaNativeTests with TestModule.Utest { override def sources = T.sources { millSourcePath / "src" / "utest" } override def ivyDeps = super.ivyDeps() ++ Agg( - ivy"com.lihaoyi::utest::0.7.6" + ivy"com.lihaoyi::utest::$utestVersion" ) } } @@ -208,14 +209,14 @@ object HelloNativeWorldTests extends TestSuite { testAllMatrix( (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), - skipScala = ZincWorkerUtil.isScala3 // Remove this once utest is released for Scala 3 + skipScalaNative = _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } "testCached" - { val cached = true testAllMatrix( (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), - skipScala = ZincWorkerUtil.isScala3 // Remove this once utest is released for Scala 3 + skipScalaNative = _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } From d7133ead749fca03d727424d94c06ebec214d876 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 10:56:08 +0100 Subject: [PATCH 08/15] Use new env variable name --- contrib/bloop/test/src/mill/contrib/bloop/BloopTests.scala | 2 +- .../test/src/mill/scalanativelib/ScalaTestsErrorTests.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/bloop/test/src/mill/contrib/bloop/BloopTests.scala b/contrib/bloop/test/src/mill/contrib/bloop/BloopTests.scala index 6a00aa86bcf..e5eb1428cc0 100644 --- a/contrib/bloop/test/src/mill/contrib/bloop/BloopTests.scala +++ b/contrib/bloop/test/src/mill/contrib/bloop/BloopTests.scala @@ -63,7 +63,7 @@ object BloopTests extends TestSuite { val sv = sys.props.getOrElse("TEST_SCALA_2_13_VERSION", ???) override def skipBloop: Boolean = isWin override def scalaVersion = sv - override def scalaNativeVersion = sys.props.getOrElse("TEST_SCALANATIVE_VERSION", ???) + override def scalaNativeVersion = sys.props.getOrElse("TEST_SCALANATIVE_0_4_VERSION", ???) override def releaseMode = T(ReleaseMode.Debug) } diff --git a/scalanativelib/test/src/mill/scalanativelib/ScalaTestsErrorTests.scala b/scalanativelib/test/src/mill/scalanativelib/ScalaTestsErrorTests.scala index fcc13540fcd..37336c2d7da 100644 --- a/scalanativelib/test/src/mill/scalanativelib/ScalaTestsErrorTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/ScalaTestsErrorTests.scala @@ -10,7 +10,7 @@ object ScalaTestsErrorTests extends TestSuite { object ScalaTestsError extends TestUtil.BaseModule { object scalaTestsError extends ScalaNativeModule { def scalaVersion = sys.props.getOrElse("TEST_SCALA_3_3_VERSION", ???) - def scalaNativeVersion = sys.props.getOrElse("TEST_SCALANATIVE_VERSION", ???) + def scalaNativeVersion = sys.props.getOrElse("TEST_SCALANATIVE_0_4_VERSION", ???) object test extends ScalaTests with TestModule.Utest object testDisabledError extends ScalaTests with TestModule.Utest { override def hierarchyChecks(): Unit = {} From c721d519c2f022e73f54afcd7881b2eb2d144701 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 11:11:06 +0100 Subject: [PATCH 09/15] Fix Scala Native utest tests for Scala 3 --- .../test/src/utest/tests/ArgsParserTests.scala | 4 ++-- .../hello-native-world/test/src/utest/tests/MainTests.scala | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/ArgsParserTests.scala b/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/ArgsParserTests.scala index 7929f94783f..f1f43a188bf 100644 --- a/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/ArgsParserTests.scala +++ b/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/ArgsParserTests.scala @@ -6,14 +6,14 @@ import utest._ object ArgsParserTests extends TestSuite { def tests: Tests = Tests { - 'one - { + "one" - { val result = ArgsParser.parse("hello:world") assert( result.length == 2, result == Seq("hello", "world") ) } - 'two - { // we fail this test to check testing in scala.js + "two" - { // we fail this test to check testing in Scala Native val result = ArgsParser.parse("hello:world") assert( result.length == 80 diff --git a/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/MainTests.scala b/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/MainTests.scala index d0498f314e0..eb1b1b19415 100644 --- a/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/MainTests.scala +++ b/scalanativelib/test/resources/hello-native-world/test/src/utest/tests/MainTests.scala @@ -6,13 +6,13 @@ import utest._ object MainTests extends TestSuite { val tests: Tests = Tests { - 'vmName - { - 'containNative - { + "vmName" - { + "containNative" - { assert( Main.vmName.contains("Native") ) } - 'containScala - { + "containScala" - { assert( Main.vmName.contains("Scala") ) From bada9b02ee0b43c883e8f4bf081b67f1f196a5be Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 11:27:24 +0100 Subject: [PATCH 10/15] Run Scalafix and Scalafmt --- .../src/mill/scalanativelib/ScalaNativeModule.scala | 2 +- .../worker/ScalaNativeWorkerImpl.scala | 12 +----------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala index a55673b98a7..02fa7c6da26 100644 --- a/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala +++ b/scalanativelib/src/mill/scalanativelib/ScalaNativeModule.scala @@ -67,7 +67,7 @@ trait ScalaNativeModule extends ScalaModule { outer => def nativeIvyDeps: T[Agg[Dep]] = T { val scalaVersionSpecific = { val version = - if(scalaNativeVersion().startsWith("0.4")) scalaNativeVersion() + if (scalaNativeVersion().startsWith("0.4")) scalaNativeVersion() else s"${scalaVersion()}+${scalaNativeVersion()}" if (ZincWorkerUtil.isScala3(scalaVersion())) diff --git a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala index 9e593d77524..33b7d57c805 100644 --- a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala +++ b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala @@ -14,8 +14,7 @@ import scala.scalanative.build.{ Logger, LTO, Mode, - NativeConfig => ScalaNativeNativeConfig, - MillUtils + NativeConfig => ScalaNativeNativeConfig } import scala.scalanative.nir.Versions import scala.scalanative.testinterface.adapter.TestAdapter @@ -29,14 +28,6 @@ import java.nio.file.Files class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWorkerApi { implicit val scope: Scope = Scope.forever - private def patchIsGreaterThanOrEqual(number: Int) = { - val patch = Versions.current.stripPrefix("0.5.") - Try(patch.toInt) match { - case Success(n) if n < number => false - case _ => true - } - } - def logger(level: NativeLogLevel): Logger = Logger( traceFn = msg => if (level.value >= NativeLogLevel.Trace.value) err.println(s"[trace] $msg"), @@ -112,7 +103,6 @@ class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWo def nativeLink(nativeConfig: Object, outDirectory: File): File = { val config = nativeConfig.asInstanceOf[Config] - val compilerConfig = config.compilerConfig val result = Await.result(Build.buildCached(config), Duration.Inf) From cc389b378c44ab9e1282061b75aec88126b15397 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 11:31:39 +0100 Subject: [PATCH 11/15] Skip Scala 2.11 on newer Scala Native --- .../src/mill/scalanativelib/HelloNativeWorldTests.scala | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index 403493e0220..9862f2ccbdb 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -47,7 +47,7 @@ object HelloNativeWorldTests extends TestSuite { scalaNative <- Seq(scalaNative04Old, scalaNative04, scalaNative05) mode <- List(ReleaseMode.Debug, ReleaseMode.ReleaseFast) if !(ZincWorkerUtil.isScala3(scala) && scalaNative == scalaNative04Old) - if !(scala.startsWith("2.11") && scalaNative == scalaNative05) + if !(scala.startsWith("2.11") && scalaNative != scalaNative04Old) if !(scala.startsWith("2.12") && scalaNative == scalaNative05) } yield (scala, scalaNative, mode) @@ -209,14 +209,16 @@ object HelloNativeWorldTests extends TestSuite { testAllMatrix( (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), - skipScalaNative = _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 + skipScalaNative = + _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } "testCached" - { val cached = true testAllMatrix( (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), - skipScalaNative = _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 + skipScalaNative = + _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } From 304b7ad5d31aa5565098f3c70e8abc40d01789af Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 11:42:43 +0100 Subject: [PATCH 12/15] Run Scalafix --- .../src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala | 2 -- 1 file changed, 2 deletions(-) diff --git a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala index 33b7d57c805..891c90bde69 100644 --- a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala +++ b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/ScalaNativeWorkerImpl.scala @@ -16,13 +16,11 @@ import scala.scalanative.build.{ Mode, NativeConfig => ScalaNativeNativeConfig } -import scala.scalanative.nir.Versions import scala.scalanative.testinterface.adapter.TestAdapter import scala.concurrent.Await import scala.concurrent.duration.Duration import scala.concurrent.ExecutionContext.Implicits.global -import scala.util.{Success, Try} import java.nio.file.Files class ScalaNativeWorkerImpl extends mill.scalanativelib.worker.api.ScalaNativeWorkerApi { From 14051c1bd77237e526ed5a9814fe19f86c56296d Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 11:47:17 +0100 Subject: [PATCH 13/15] Skip utest on older Scala Native --- .../mill/scalanativelib/HelloNativeWorldTests.scala | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index 9862f2ccbdb..f7251b1a493 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -209,16 +209,18 @@ object HelloNativeWorldTests extends TestSuite { testAllMatrix( (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), - skipScalaNative = - _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 + skipScalaNative = v => + v == scalaNative04Old || + v.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } "testCached" - { val cached = true testAllMatrix( (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), - skipScalaNative = - _.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 + skipScalaNative = v => + v == scalaNative04Old || + v.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } From 37f4591439a338bc2c8f2575fcc14cde3ca26b80 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Thu, 29 Feb 2024 11:53:34 +0100 Subject: [PATCH 14/15] Run Scalafmt --- .../test/src/mill/scalanativelib/HelloNativeWorldTests.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala index f7251b1a493..74ce743a57e 100644 --- a/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala +++ b/scalanativelib/test/src/mill/scalanativelib/HelloNativeWorldTests.scala @@ -211,7 +211,7 @@ object HelloNativeWorldTests extends TestSuite { (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), skipScalaNative = v => v == scalaNative04Old || - v.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 + v.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } "testCached" - { @@ -220,7 +220,7 @@ object HelloNativeWorldTests extends TestSuite { (scala, scalaNative, releaseMode) => checkUtest(scala, scalaNative, releaseMode, cached), skipScalaNative = v => v == scalaNative04Old || - v.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 + v.startsWith("0.5.") // Remove this once utest is released for Scala Native 0.5 ) } From d39937d6b3b2321abc7efed03fb0d4db277e11b9 Mon Sep 17 00:00:00 2001 From: Lorenzo Gabriele Date: Sat, 2 Mar 2024 09:34:22 +0100 Subject: [PATCH 15/15] Align file names with packages Remove unused MillUtils for Scala Native 0.5 --- .../Utils.scala => scala/scalanative/build/MillUtils.scala} | 0 .../scalanativelib/worker/scala/scalanative/Utils.scala | 6 ------ 2 files changed, 6 deletions(-) rename scalanativelib/worker/0.4/src/{mill/scalanativelib/worker/scala/scalanative/Utils.scala => scala/scalanative/build/MillUtils.scala} (100%) delete mode 100644 scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala diff --git a/scalanativelib/worker/0.4/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala b/scalanativelib/worker/0.4/src/scala/scalanative/build/MillUtils.scala similarity index 100% rename from scalanativelib/worker/0.4/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala rename to scalanativelib/worker/0.4/src/scala/scalanative/build/MillUtils.scala diff --git a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala b/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala deleted file mode 100644 index 58c6009c3bf..00000000000 --- a/scalanativelib/worker/0.5/src/mill/scalanativelib/worker/scala/scalanative/Utils.scala +++ /dev/null @@ -1,6 +0,0 @@ -package scala.scalanative.build - -object MillUtils { - def targetsWindows(config: Config): Boolean = config.targetsWindows - def targetsMac(config: Config): Boolean = config.targetsMac -}