Skip to content

Commit

Permalink
Generate native launcher of scala-cli for M1
Browse files Browse the repository at this point in the history
  • Loading branch information
lwronski committed Sep 27, 2022
1 parent 6bc6cbf commit 89a0729
Show file tree
Hide file tree
Showing 10 changed files with 79 additions and 7 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,57 @@ jobs:
SCALA_CLI_IT_GROUP: 3
SCALA_CLI_SODIUM_JNI_ALLOW: false

generate-macos-m1-launcher:
timeout-minutes: 120
runs-on: "macOS-m1"
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: true
- uses: coursier/setup-action@f883d08305acbc28e5e5363bf5ec086397627021
with:
apps: ""
jvm: "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-darwin-aarch64-22.2.0.tar.gz"
- name: Generate native launcher
run: .github/scripts/generate-native-image.sh
# - run: ./mill -i ci.setShouldPublish
# - name: Build OS packages TODO generate os packages for M1
# if: env.SHOULD_PUBLISH == 'true'
# run: .github/scripts/generate-os-packages.sh
- name: Copy artifacts
run: ./mill -i copyDefaultLauncher artifacts/
- uses: actions/upload-artifact@v3
with:
name: macos-m1-launchers
path: artifacts/
if-no-files-found: error
retention-days: 2

native-macos-m1-tests:
needs: generate-macos-m1-launcher
timeout-minutes: 120
runs-on: "macOS-m1"
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
submodules: true
- uses: coursier/setup-action@f883d08305acbc28e5e5363bf5ec086397627021
with:
apps: ""
jvm: "https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-darwin-aarch64-22.2.0.tar.gz"
- uses: actions/download-artifact@v3
with:
name: macos-m1-launchers
path: artifacts/
- name: Native integration tests
run: ./mill -i nativeIntegrationTests
env:
UPDATE_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SCALA_CLI_IT_FORCED_LAUNCHER_DIRECTORY: artifacts/
SCALA_CLI_SODIUM_JNI_ALLOW: false

generate-windows-launcher:
timeout-minutes: 120
runs-on: "windows-latest"
Expand Down Expand Up @@ -809,6 +860,7 @@ jobs:
- native-macos-tests-1
- native-macos-tests-2
- native-macos-tests-3
- generate-macos-m1-launcher
- native-windows-tests-1
- native-windows-tests-2
- native-windows-tests-3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ object LibSodiumJni {
else sys.error(s"Unrecognized operating system: ${sys.props("os.name")}")

val dep =
dep"io.github.alexarchambault.tmp.libsodiumjni:libsodiumjni:$libsodiumjniVersion,intransitive,classifier=$classifier,ext=$ext,type=$ext"
dep"org.virtuslab.scala-cli:libsodiumjni:$libsodiumjniVersion,intransitive,classifier=$classifier,ext=$ext,type=$ext"
val fetch = coursier.Fetch()
.addDependencies(dep.toCs)
.addArtifactTypes(Type(ext))
Expand Down
2 changes: 2 additions & 0 deletions modules/core/src/main/scala/scala/build/Os.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ object Os {
os.Path(os.pwd.toIO.getCanonicalFile)
else
os.pwd
def isArmArchitecture: Boolean =
os.proc("uname", "-p").call(cwd = os.pwd).out.trim() == "arm"
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import coursier.jvm.{JavaHome, JvmIndex}
import java.io.IOException
import java.nio.charset.Charset

import scala.build.Os
import scala.build.blooprifle.VersionUtil.parseJavaVersion
import scala.util.{Properties, Try}

Expand Down Expand Up @@ -68,7 +69,8 @@ object OsLibc {
.forall(_ >= 17)
if (os == "linux-musl") s"liberica:$jvmVersion" // zulu could work too
else if (java17OrHigher) s"temurin:$jvmVersion"
else s"adopt:$jvmVersion"
else if (Os.isArmArchitecture) s"zulu:$jvmVersion" // adopt don't support arm for java 8
else s"temurin:$jvmVersion"
}

def defaultJvm(os: String): String = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class NativePackagerTests extends ScalaCliSuite {
val pkgAppPath = root / pkgAppFile
expect(os.isFile(pkgAppPath))

if (TestUtil.isCI) {
if (TestUtil.isCI && !TestUtil.isArmArchitecture) {
os.proc("installer", "-pkg", pkgAppFile, "-target", "CurrentUserHomeDirectory").call(
cwd = root,
stdin = os.Inherit,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ object TestUtil {
val detectCliPath = if (TestUtil.isNativeCli) TestUtil.cliPath else "scala-cli"
val cli: Seq[String] = cliCommand(cliPath)

def isArmArchitecture: Boolean =
os.proc("uname", "-p").call(cwd = os.pwd).out.trim() == "arm"

def cliCommand(cliPath: String): Seq[String] =
if (isNativeCli)
Seq(cliPath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import dependency.AnyDependency
import scala.build.internal.CsLoggerUtil._
import scala.build.internal.OsLibc
import scala.build.options.BuildOptions.JavaHomeInfo
import scala.build.{Position, Positioned}
import scala.build.{Os, Position, Positioned}
import scala.concurrent.ExecutionContextExecutorService
import scala.util.control.NonFatal

Expand Down Expand Up @@ -75,9 +75,14 @@ final case class JavaOptions(
val enforceLiberica =
finalJvmIndexOs == "linux-musl" &&
jvmId.forall(c => c.isDigit || c == '.' || c == '-')
val enforceZulu =
Os.isArmArchitecture &&
jvmId.forall(c => c.isDigit || c == '.' || c == '-')
val jvmId0 =
if (enforceLiberica)
s"liberica:$jvmId" // FIXME Workaround, until this is automatically handled by coursier-jvm
else if (enforceZulu) // default jvmId adopto doesn't support java 8 for M1
s"zulu:$jvmId"
else
jvmId
val javaHomeManager0 = javaHomeManager(archiveCache, cache, verbosity)
Expand Down
8 changes: 6 additions & 2 deletions project/deps.sc
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import coursier.mavenRepositoryString
import mill._, scalalib._

import scala.util.Properties
import $file.utils, utils.isArmArchitecture

object Scala {
def scala212 = "2.12.16"
Expand Down Expand Up @@ -103,7 +104,7 @@ object Deps {
def jsoniterMacrosJava8 =
ivy"com.github.plokhotnyuk.jsoniter-scala::jsoniter-scala-macros:${Versions.jsoniterScalaJava8}"
def libdaemonjvm = ivy"io.github.alexarchambault.libdaemon::libdaemon:0.0.10"
def libsodiumjni = ivy"io.github.alexarchambault.tmp.libsodiumjni:libsodiumjni:0.0.3"
def libsodiumjni = ivy"org.virtuslab.scala-cli:libsodiumjni:0.0.3"
def macroParadise = ivy"org.scalamacros:::paradise:2.1.1"
def metaconfigTypesafe =
ivy"com.geirsson::metaconfig-typesafe-config:0.11.1"
Expand Down Expand Up @@ -166,7 +167,10 @@ object BuildDeps {

def graalVmVersion = "22.2.0"
def graalVmJavaVersion = 17
def graalVmJvmId = s"graalvm-java$graalVmJavaVersion:$graalVmVersion"
def graalVmJvmId =
if (isArmArchitecture)
s"https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.2.0/graalvm-ce-java17-darwin-aarch64-22.2.0.tar.gz"
else s"graalvm-java$graalVmJavaVersion:$graalVmVersion"

def csDockerVersion = Deps.Versions.coursierCli

Expand Down
4 changes: 3 additions & 1 deletion project/settings.sc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import $ivy.`io.github.alexarchambault.mill::mill-native-image::0.1.19`
import $ivy.`io.github.alexarchambault.mill::mill-scala-cli::0.1.0`

import $file.deps, deps.{BuildDeps, Deps, Docker, alpineVersion, buildCsVersion, libsodiumVersion}
import $file.utils, utils.isArmArchitecture

import com.goyeau.mill.scalafix.ScalafixModule
import de.tobiasroeser.mill.vcs.version.VcsVersion
Expand Down Expand Up @@ -196,6 +197,7 @@ trait CliLaunchers extends SbtModule { self =>
case Some("x86_64" | "amd64") =>
if (Properties.isWin) ("x86_64-pc-win32", "lib")
else if (Properties.isLinux) ("x86_64-pc-linux", "a")
else if (Properties.isMac && isArmArchitecture) ("aarch64-apple-darwin", "a")
else if (Properties.isMac) ("x86_64-apple-darwin", "a")
else sys.error(s"Unsupported OS for x86_64 platform: ${sys.props("os.name")}")
case Some("aarch64") =>
Expand All @@ -210,7 +212,7 @@ trait CliLaunchers extends SbtModule { self =>
cs,
"fetch",
"--intransitive",
s"io.github.alexarchambault.tmp.libsodiumjni:libsodiumjni:$libsodiumjniVersion,classifier=$classifier,ext=$ext,type=$ext",
s"org.virtuslab.scala-cli:libsodiumjni:$libsodiumjniVersion,classifier=$classifier,ext=$ext,type=$ext",
"-A",
ext
).call()
Expand Down
2 changes: 2 additions & 0 deletions project/utils.sc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def isArmArchitecture: Boolean =
os.proc("uname", "-p").call(cwd = os.pwd).out.trim() == "arm"

0 comments on commit 89a0729

Please sign in to comment.