我的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源码:添加链接描述

    这个我下载的很慢,也可以去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 命令,等一段时间就可以了(期间电脑很烫

mac下编译JDK12相关推荐

  1. iOS架构-C/C++lame库在Mac下编译通用静态库.a库(13)

    C/C++ 有很多成熟的库,还有很多特殊功能的库,有时候iOS 平台开发一些比较前沿或者冷门的功能时,iOS并没有提供解决方案,这时候就可以研究C/C++的一些库,为我们使用.但是在Xcode编译C/ ...

  2. mac下编译hadoop-3.0.3

    文章目录 1.编译前准备 2. 源码目录下执行 3.编译 5.错误集锦 5.1 Apache Hadoop Pipes编译失败 5.1.2 解决: 5.2 hadoop-client-check-te ...

  3. mac下编译安卓源码

    资源 Mac OS10.12 编译Android源码8.1 aosp编译-需翻墙 Mac下编译安卓源码 手把手教你在Mac OS下载.编译及导入Android源码 步骤 准备 磁盘空间大于180G 安 ...

  4. 在Mac下编译ijkplayer os文件

    在Mac下编译ijkplayer os文件 第一步: 1.安装homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com ...

  5. Mac下编译ffmpeg出现“ERROR: x265 not found using pkg-config”

    x265已经编译成功,但是ffmpeg/configure出现错误 ERROR: x265 not found using pkg-config 看了一下config.log,出了一坨"Un ...

  6. mac下编译安装grafana 4.2.0

    go语言在开发效率和运行效率中的优势让很多人青睐,所以有倾向打算转向go语言的开发. 下面介绍在Mac OS X中golang的开发环境配置. 1.安装brew brew是一个mac下的由ruby开发 ...

  7. Mac 下编译 libmono.so 和 DLL 加密详解

    Unity 打出的安卓包为了防止反编译,需要对 Assembly-CSharp.dll 加密处理.Assembly-CSharp.dll 是由 libmono.so 运行时读取然后在 mono 虚拟机 ...

  8. Mac下编译太阳神三国杀源码

    Mac系统版本是10.13.2,Qt版本是5.11,参考官方博文:太阳神三国杀 Mac 版构建指南 安装Qt5 下载最新的Qt5安装包qt-opensource-mac-x64-5.11.0.dmg, ...

  9. mac下编译android源码避坑指南(新)

    截至目前mac环境下android源码编译最新避坑指南 避坑方法 配置(不说配置的都是耍流氓) 下载 编译 烧录 注意事项 避坑方法 源码.SDK.机型版本一定要清楚,有些特殊的版本需要特殊的方法,官 ...

最新文章

  1. .统计日志中攻击的IP次数然后加IP屏蔽
  2. Windows 8最值得期待的8大特性
  3. Net性能分析与调试培训资料
  4. 公式 有效值_纯电阻电路电功率公式
  5. MFC+GDI+绘制出雷达余晖效果
  6. 18 4Sum(寻找四个数之和为指定数的集合Medium)
  7. esd防护_电路级ESD防护方法
  8. Linux学习之C语言的进程与线程编程
  9. 我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)
  10. 充满艺术范儿!艺术感在线的界面欣赏
  11. oracle sql如何剔除周末,Oracle 跳过周末的sql
  12. python软件下载3版本-【python3下载】python3下载安装 中文版-七喜软件园
  13. vivado中FIFO IP核的Standard FIFO和First-word-Fall-Through模式的仿真比较
  14. 万能地图下载器X3版本终止升级维护
  15. How to Create Your Own HDR Environment Maps
  16. 微信小程序周记(第一周 7.19-7.25)
  17. 为什么要制定项目计划?
  18. 推荐几款极简的手机浏览器
  19. 浏览器中显示PPT的展示效果
  20. i1U机架服务器做系统,微星MS-9211 1U 机架式服务器准系统

热门文章

  1. node项目部署以及搭建nginx服务器
  2. ODS与EDW的区别
  3. 2018第九届蓝桥杯个人赛省赛(软件类)C++A组试题第九题
  4. 数据化管理助力传统制造业,实现供应链上游生产车间可视化监控
  5. 后疫情时代,云计算人才太紧缺了
  6. S5PV210刷机问题汇总(部分)
  7. 物联网商机惊人 SoC大厂跨界淘金
  8. oracle 归档日期,Oracle中归档日期满报错解决方法
  9. CSUST 8.5 早训
  10. 【学习笔记】《网络安全态势感知》第五章:网络安全态势感知本体体系