MacOS编译OpenJDK12

学习《深入理解Java虚拟机》第三版过程中,记录在MacOS环境编译OpenJDK12的过程。

1.下载OpenJDK源码

访问https://hg.openjdk.java.net/jdk/jdk12/,然后点击左边菜单中的Browse,下载zip包

ps:该过程中一直遇到下载失败的问题,通过配置谷歌的多线程下载解决:

  1. 访问chrome://flags/
    2.在搜索框中输入 Parallel downloading,选择enabled,重启浏览器

2. Bootstrap JDK

​ 假设要编译大版本号为N的JDK,我们还要另外准备一个大版本号至少为N-1的、已经编译好的JDK,这是因为OpenJDK由多个部分(HotSpot、JDK类库、JAXWS、JAXP……)构成,其中一部分(HotSpot)代码使用C、C++编写,而更多的代码则是使用Java语言来实现,因此编译这些Java代码就需要用到另一个编译期可用的JDK,官方称这个JDK为“Bootstrap JDK”。编译OpenJDK 12时,Bootstrap JDK必须使用JDK 11及之后的版本。

3. 使用homebrew安装依赖

1
2
brew install ccache //加速编译
brew install freetype //字体引擎,编译过程中会被依赖到

4.自动检测依赖

以下命令均在openjdk12路径下执行

1
bash ./configure

报错如下

解决方法

1
brew install autoconf
1
2
#继续执行
bash ./configure

报错如下

解决方法

1
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
1
2
#继续执行
bash ./configure

成功,可以看到生成了build路径

5.开始编译

依赖检查通过后便可以输入“make images”执行整个OpenJDK编译,这里“images”是“product-images”编译目标(Target)的简写别名,这个目标的作用是编译出整个JDK镜像

1
2
make images
#报错如下

解决方法:将本地的jdk8替换为jdk11

继续 make images,会遇到几个JDK 12的源码里的bug,分别记录如下:

1.src/hotspot/share/runtime/arguments.cpp 1452

1
2
3
4
// 找到jdk12-06222165c35f/src/hotspot/share/runtime/arguments.cpp1452行,将
if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {
// 替换为
if (strcmp(old_java_vendor_url_bug, DEFAULT_VENDOR_URL_BUG) != 0) {
2.test/hotspot/gtest/classfile/test_symbolTable.cpp 62

1
2
3
4
//找到jdk12-06222165c35f/test/hotspot/gtest/classfile/test_symbolTable.cpp的62行,将
s1 = s1; // self assignment
// 注释掉
// s1 = s1; // self assignment
3.src/hotspot/share/runtime/sharedRuntime.cpp 2873

1
2
3
4
//找到/Users/anluyao/workspace/openjdk/jdk12-06222165c35f/src/hotspot/share/runtime/sharedRuntime.cpp的2873行,将
buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
// 替换为
buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, (sizeof(locs_buf)) / sizeof(relocInfo));
4.src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m 134

1
2
3
4
// 找到/Users/anluyao/workspace/openjdk/jdk12-06222165c35f/src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m的134行,将
if (colorIndex < (useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS) {
// 替换为
if (colorIndex < ((useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS)) {

以上bug fix之后继续执行make images ,成功

ps:大概7分钟,期间电脑持续90℃+

1
2
3
4
 ~/workspace/openjdk/jdk12-06222165c35f/build/macosx-x86_64-server-release/jdk/bin  ./java -version                                     
openjdk version "12-internal" 2019-03-19
OpenJDK Runtime Environment (build 12-internal+0-adhoc.anluyao.jdk12-06222165c35f)
OpenJDK 64-Bit Server VM (build 12-internal+0-adhoc.anluyao.jdk12-06222165c35f, mixed mode)

至此,OpenJDK12已编译完成。

-------------本文结束感谢您的阅读-------------