最近在阅读 《深入理解 Java 虚拟机》 一书,想跟着书编译一个自己的 JDK 出来。
前期准备
开始前建议阅读一下 OpenJDK 的官方构建文档 Building OpenJDK。
下载 OpenJDK 源码
因为 OpenJDK 源码是用的 Mercurial 管理的,所以需要先安装一下 Mercurial 工具。
1 | brew install mercurial |
安装完成后按顺序执行下面的命令。
1 | hg clone http://hg.openjdk.java.net/jdk10/jdk10 |
注意 get_source.sh 脚本下载时间较长,而且容易中断。需要多次执行 bash ./get_source.sh
命令。
执行 ./get_source.sh 脚本之前的目录
执行 ./get_source.sh 脚本之后的目录
boot JDK
Paradoxically, building OpenJDK requires a pre-existing JDK. This is called the “boot JDK”. The boot JDK does not have to be OpenJDK, though.
这里准备的 boot JDK 是 Oracle JDK 8u191。
boot JDK
Xcode
因为之前没用过 Xcode,于是就去 AppStore 中下载了一个最新版的 Xcode(10.1),结果就被坑了。原来 c++ 相关的 stdlibc++
库被替换成了 libc++
,只能再去 官网 重新下载了 Xcode(9.4.1)。
freetype
FreeType2 from The FreeType Project is required on all platforms. At least version 2.3 is required.
1 | brew install freetype |
1 | brew reinstall freetype |
环境描述
- OS: macOS Mojave 10.14.1
- Boot JDK: 1.8.0_191
- freetype: 2.9.1
- Xcode: 9.4.1
开始编译
初始化
先清理一下之前的编译结果,如果是第一次编译的话可以跳过这步。
1 | make clean |
配置参数
1 | sh configure --with-debug-level=slowdebug --disable-warnings-as-errors --with-freetype-include=/usr/local/Cellar/freetype/2.9.1/include/freetype2 --with-freetype-lib=/usr/local/Cellar/freetype/2.9.1/lib |
- 这里我用的 freetype 版本是 2.9.1,记得替换版本号。
- 具体的编译参数通过
sh configure -h
查看,可以自行定义。
编译
1 | make all |
验证
1 | cd build/macosx-x86_64-normal-server-slowdebug/jdk/bin |
总结
- 不要放弃。
- 如果今天编译不出来,那就明天再来。
- 如果 OpenJDK 10 编译不出来,那就换 OpenJDK 9。还不行,那就用 9u。我自己就是从 7 一直试到了 10。
- 不要用 Xcode 10,建议用 Xcode 9。
- 因为 10 中将 c++ 相关的依赖库由 stdlibc++ 替换成了 libc++。我自己还没有解决这个依赖问题,干脆就重新下载了 Xcode 9.4.1。
- 善用搜索引擎。
- 这只是在我的环境中编译成功了,在你们的环境中也许还会遇到其它的问题,这时候就要用到 Google。