mac下编译JDK12

    我的macOS版本是10.15.x,Xcode版本是12.2(看到别人说高版本有bug,实测可行)。
    编译主要有三个步骤:

  1. 准备好一份编译好JDK 11和一份未编译JDK 12的源码。
  2. 构建编译环境
  3. 编译
1. 准备好一份编译好JDK 11和一份未编译JDK 12的源码

    JDK 11:添加链接描述

OpenJDK由多个部分(HotSpot、JDK类库、JAXWS、JAXP······)构成,其中一部分(HotSpot)代码使用C、C++编写,而更多的代码则是使用Java语言来实现,因此编译这些Java代码就需要用到另一个编译期可用的JDK,官方称这个JDK为“BootStrap JDK”。编译OpenJDK 12时,Bootstrap JDK必须使用JDK 11及之后的版本。

    JDK 12源码:添加链接描述
mac下编译JDK12_第1张图片
    这个我下载的很慢,也可以去github上下载:添加链接描述

    完成后解压,我电脑上有一个JDK 8,为了之后编译方便就把JAVA_HOME改成JDK 11的地址了。之后可以都改回去。

vi ~/.bash_profile

在这里插入图片描述
    这里需要特别注意一个地方,JDK 9.0.4引入模块,CLASSPATH变量不再需要了,如果没有把这行注释的话,就会报找不到tools.jar,dt.jar的错误

2. 构建编译环境

    首先通过brew命令安装编译时需要的依赖

brew install autoconf #生成shell脚本的工具
brew install freetype #字体引擎
brew install ccache #编译加速

    配合Xcode的Command Line Tools也是要的:

xcode-select --install

    然后进入到JDK 12源码的解压目录,执行

bash configure --enable-debug --with-jvm-variants=server

就可以成功配置FastDebug版、仅含Server模式的HostSpot虚拟机。执行过程中如果检查到缺少依赖,使用brew命令下载依赖即可。

3. 编译

    本来在当前目录下再执行

make images

就可以了,但是巨坑的是JDK 12的源码里有bug,会导致编译失败,这里列举我遇到的bug。(假设JDK 12源码解压文件夹名字是jdk12)


  • …/src/hotspot/share/runtime/arguments.cpp:1452:35: error: result of comparison against a string literal is unspecified (use an explicit string comparison function instead) [-Werror,-Wstring-compare].

    解决方法是找到…/jdk12/src/hotspot/share/runtime/arguments.cpp的1452行,将

if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {
     
// 替换为
if (strcmp(old_java_vendor_url_bug, DEFAULT_VENDOR_URL_BUG) != 0) {
     

  • …/test/hotspot/gtest/classfile/test_symbolTable.cpp:62:6: error: explicitly assigning value of variable of type ‘TempNewSymbol’ to itself [-Werror,-Wself-assign-overloaded].
        解决方法是找到…/jdk12/test/hotspot/gtest/classfile/test_symbolTable.cpp的62行,将
s1 = s1; // self assignment
// 注释掉
// s1 = s1; // self assignment

  • /src/hotspot/share/runtime/sharedRuntime.cpp:2873:85: error: expression does not compute the number of elements in this array; element type is ‘double’, not ‘relocInfo’ [-Werror,-Wsizeof-array-div].
        解决方法是找到…/jdk12/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)));

  • /src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m:134:9: error: converting the result of ‘?:’ with integer constants to a boolean always evaluates to ‘true’ [-Werror,-Wtautological-constant-compare].
        解决方法是找到…/jdk12/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)) {
     

    看到还有人说/jdk12/src/jdk.base/share/native/libfdlibm/e_asin.c的106行也有错误,将eles缺少的花括号补上就可以了。


    bug修复完后再执行 make images 命令,等一段时间就可以了(期间电脑很烫)。

    在CLion中查看源码并调试。首先下载CLion安装,打开后选择 New CMake Project from Sources,选到src目录,
mac下编译JDK12_第2张图片
点ok,等加载完成后右上角下拉框选择Edit Configurations,
mac下编译JDK12_第3张图片
Executable要选择编译好的java命令,比如我的就是…/jdk12/build/macosx-x86_64-server-fastdebug/jdk/bin/java,还有Before launch里面的要删掉。

    打上断点点击调试就可以开始了。

    这次就到这里了,欢迎大家分享意见。

你可能感兴趣的:(Java,jdk,java,macos,compiler)