|
1 | 1 | package scala.build.options
|
2 | 2 |
|
| 3 | +import bloop.rifle.VersionUtil.jvmRelease |
3 | 4 | import coursier.cache.{ArchiveCache, FileCache}
|
4 | 5 | import coursier.jvm.{JavaHome, JvmCache, JvmIndex}
|
5 | 6 | import coursier.util.Task
|
@@ -62,47 +63,53 @@ final case class JavaOptions(
|
62 | 63 | cache: FileCache[Task],
|
63 | 64 | verbosity: Int
|
64 | 65 | ): Option[Positioned[os.Path]] =
|
| 66 | + lazy val javaHomeManager0 = javaHomeManager(archiveCache, cache, verbosity) |
| 67 | + |
| 68 | + implicit val ec: ExecutionContextExecutorService = cache.ec |
| 69 | + |
| 70 | + def isJvmVersion(jvmId: String): Boolean = |
| 71 | + jvmId.forall(c => c.isDigit || c == '.' || c == '-') |
| 72 | + |
65 | 73 | javaHomeOpt
|
66 | 74 | .orElse {
|
67 | 75 | if (jvmIdOpt.isEmpty)
|
68 |
| - Option(System.getenv("JAVA_HOME")).map(p => |
69 |
| - Positioned(Position.Custom("JAVA_HOME env"), os.Path(p, os.pwd)) |
70 |
| - ).orElse( |
71 |
| - sys.props.get("java.home").map(p => |
72 |
| - Positioned(Position.Custom("java.home prop"), os.Path(p, os.pwd)) |
73 |
| - ) |
74 |
| - ).orElse( |
75 |
| - if (Properties.isMac) |
76 |
| - Try(os.proc("/usr/libexec/java_home").call(os.pwd, check = false).out.text().trim()) |
77 |
| - .toOption |
78 |
| - .flatMap(p => Try(os.Path(p, os.pwd)).toOption) |
79 |
| - .filter(os.exists(_)) |
80 |
| - .map(p => Positioned(Position.Custom("/usr/libexec/java_home"), p)) |
81 |
| - else None |
| 76 | + findLocalDefaultJava() |
| 77 | + else if ( |
| 78 | + Properties.isMac && jvmIdOpt.exists(jvmId => |
| 79 | + isJvmVersion(jvmId.value.stripPrefix("system|")) |
82 | 80 | )
|
| 81 | + ) |
| 82 | + val jvmVersionOpt = for { |
| 83 | + jvmId <- jvmIdOpt |
| 84 | + maybeJvmVersion = jvmId.value.stripPrefix("system|") |
| 85 | + jvmVersion <- jvmRelease(maybeJvmVersion) |
| 86 | + } yield jvmVersion.toString |
| 87 | + |
| 88 | + findLocalJavaOnMacOs(jvmVersionOpt) |
83 | 89 | else None
|
84 | 90 | }
|
85 | 91 | .orElse {
|
86 | 92 | jvmIdOpt.map(_.value).map { jvmId =>
|
87 |
| - implicit val ec: ExecutionContextExecutorService = cache.ec |
| 93 | + |
88 | 94 | cache.logger.use {
|
89 | 95 | val enforceLiberica =
|
90 | 96 | finalJvmIndexOs == "linux-musl" &&
|
91 |
| - jvmId.forall(c => c.isDigit || c == '.' || c == '-') |
| 97 | + isJvmVersion(jvmId) |
92 | 98 | val enforceZulu =
|
93 | 99 | Os.isArmArchitecture &&
|
94 |
| - jvmId.forall(c => c.isDigit || c == '.' || c == '-') |
| 100 | + isJvmVersion(jvmId) |
95 | 101 | val jvmId0 =
|
96 | 102 | if (enforceLiberica)
|
97 | 103 | s"liberica:$jvmId" // FIXME Workaround, until this is automatically handled by coursier-jvm
|
98 | 104 | else if (enforceZulu) // default jvmId adoptium doesn't support java 8 for M1
|
99 | 105 | s"zulu:$jvmId"
|
100 | 106 | else
|
101 | 107 | jvmId
|
102 |
| - val javaHomeManager0 = javaHomeManager(archiveCache, cache, verbosity) |
103 |
| - .withMessage(s"Downloading JVM $jvmId0") |
| 108 | + |
104 | 109 | val path =
|
105 |
| - try javaHomeManager0.get(jvmId0).unsafeRun() |
| 110 | + try javaHomeManager0 |
| 111 | + .withMessage(s"Downloading JVM $jvmId0") |
| 112 | + .get(jvmId0).unsafeRun() |
106 | 113 | catch {
|
107 | 114 | case NonFatal(e) => throw new Exception(e)
|
108 | 115 | }
|
@@ -141,6 +148,34 @@ final case class JavaOptions(
|
141 | 148 | JavaHomeInfo(javaHome, javaCmd, javaVersion)
|
142 | 149 | }
|
143 | 150 |
|
| 151 | + private def findLocalDefaultJava(): Option[Positioned[os.Path]] = |
| 152 | + Option(System.getenv("JAVA_HOME")).map(p => |
| 153 | + Positioned(Position.Custom("JAVA_HOME env"), os.Path(p, os.pwd)) |
| 154 | + ).orElse( |
| 155 | + sys.props.get("java.home").map(p => |
| 156 | + Positioned(Position.Custom("java.home prop"), os.Path(p, os.pwd)) |
| 157 | + ) |
| 158 | + ).orElse( |
| 159 | + if (Properties.isMac) |
| 160 | + findLocalJavaOnMacOs(None) |
| 161 | + else None |
| 162 | + ) |
| 163 | + private def findLocalJavaOnMacOs(jvmIdOpt: Option[String]): Option[Positioned[os.Path]] = |
| 164 | + Try { |
| 165 | + jvmIdOpt.fold(os.proc("/usr/libexec/java_home")) { jvmId => |
| 166 | + os.proc( |
| 167 | + "/usr/libexec/java_home", |
| 168 | + "-v", |
| 169 | + jvmId.stripPrefix("system|"), |
| 170 | + "--failfast" |
| 171 | + ) |
| 172 | + }.call(os.pwd, check = true, mergeErrIntoOut = true) |
| 173 | + .out.text().trim() |
| 174 | + } |
| 175 | + .toOption |
| 176 | + .flatMap(p => Try(os.Path(p, os.pwd)).toOption) |
| 177 | + .filter(os.exists(_)) |
| 178 | + .map(p => Positioned(Position.Custom("/usr/libexec/java_home -v"), p)) |
144 | 179 | }
|
145 | 180 |
|
146 | 181 | object JavaOptions {
|
|
0 commit comments