关于java:在maxosxaarch64上编译JDK源码

8次阅读

共计 1642 个字符,预计需要花费 5 分钟才能阅读完成。

尝试间接编译 JDK 8(能够间接略过此局部)

筹备工作

  • 在 jdk.java.net 上下载了 JDK 8 源码
  • build.html 文档,不同的 JDK 版本,地位不一样。须要仔细阅读

    • Boot JDK 编译 JDK,须要 JDK 的上一个版本,所以这里须要装置 JDK 7(brew install –cask homebrew/cask-versions/zulu7)

configure

bash configure --with-debug-level=slowdebug --with-jvm-variants=server --enable-dtrace --disable-warnings-as-errors

make

在 make 中可能会遇到各种依赖装置。

总结

新版的 macbook pro 应用了 m1 芯片,所以老版本的不反对编译。如果是 Intel 芯片的 MAC OS,应该问题不大。

在 Linux(mint os)上编译 JDK

我抉择的是 JDK 12 的源码,

  • 装置 JDK 11
  • 依据 build.html
  • 依据 bash configure 中提醒,装置短少的文件

这个过程很简略,没有呈现什么问题

在 macosx-aarch64 上 编译 JDK 18

目前来说只有 JDK 版本 17,18,19 是能够在 macosx-aarch64 上装置的。具体参考 Support Build Platforms。因为 JDK 17 是稳固版本,所以编译 JDK 18 GA。

遇到的问题

error: parameter ‘SizeOfTag’ set but not used

这个问题是在 JDK-8283221 曾经有人发现了。目前优先级不是很高,有个 workaround 办法 –disable-warnings-as-error

guarantee(val < (1ULL << nbits)) failed: Field too big for insn

这个问题是在 JDK-8280476 曾经有人发现了。我看了目前只批改了 11,17,19 没有批改 18。能够依据 commit 批改一下 src/hotspot/cpu/aarch64/immediate_aarch64.cpp

// src/hotspot/cpu/aarch64/immediate_aarch64.cpp 
uint64_t replicate(uint64_t bits, int nbits, int count)
{
  // 在函数结尾,增加下 main 代码 
  assert(count > 0, "must be");
  assert(nbits > 0, "must be");
  assert(count * nbits <= 64, "must be");

  // Special case nbits == 64 since the shift below with that nbits value
  // would result in undefined behavior.
  if (nbits == 64) {return bits;}
  //-----------------------

  uint64_t result = 0;
  uint64_t mask = ones(nbits);

编译

  1. configure

    bash configure --with-debug-level=slowdebug --with-jvm-variants=server --enable-dtrace --disable-warnings-as-errors
  2. make

如果遇到各种依赖装置,用 brew 装置即可。

后果

java -v
openjdk 18-internal 2022-03-22
OpenJDK Runtime Environment (slowdebug build 18-internal+0-adhoc.chenpei.jdk-jdk-18-ga)
OpenJDK 64-Bit Server VM (slowdebug build 18-internal+0-adhoc.chenpei.jdk-jdk-18-ga, mixed mode)

总结

目前对于 macosx-aarch64 的反对还能够,应该随着当前的版本,在 macos 应该会比较简单。

正文完
 0