我的macOS版本是10.15.x,Xcode版本是12.2(看到别人说高版本有bug,实测可行)。
编译主要有三个步骤:
JDK 11:添加链接描述
OpenJDK由多个部分(HotSpot、JDK类库、JAXWS、JAXP······)构成,其中一部分(HotSpot)代码使用C、C++编写,而更多的代码则是使用Java语言来实现,因此编译这些Java代码就需要用到另一个编译期可用的JDK,官方称这个JDK为“BootStrap JDK”。编译OpenJDK 12时,Bootstrap JDK必须使用JDK 11及之后的版本。
JDK 12源码:添加链接描述
这个我下载的很慢,也可以去github上下载:添加链接描述
完成后解压,我电脑上有一个JDK 8,为了之后编译方便就把JAVA_HOME改成JDK 11的地址了。之后可以都改回去。
vi ~/.bash_profile
这里需要特别注意一个地方,JDK 9.0.4引入模块,CLASSPATH变量不再需要了,如果没有把这行注释的话,就会报找不到tools.jar,dt.jar的错误。
首先通过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命令下载依赖即可。
本来在当前目录下再执行
make images
就可以了,但是巨坑的是JDK 12的源码里有bug,会导致编译失败,这里列举我遇到的bug。(假设JDK 12源码解压文件夹名字是jdk12)
解决方法是找到…/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) {
s1 = s1; // self assignment
// 注释掉
// s1 = s1; // self assignment
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)));
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目录,
点ok,等加载完成后右上角下拉框选择Edit Configurations,
Executable要选择编译好的java命令,比如我的就是…/jdk12/build/macosx-x86_64-server-fastdebug/jdk/bin/java,还有Before launch里面的要删掉。
打上断点点击调试就可以开始了。
这次就到这里了,欢迎大家分享意见。