macOS 编译 OpenJDK 10

最近在阅读 《深入理解 Java 虚拟机》 一书,于是就想跟书中一样编译一个自己的 JDK 出来。

前期准备

开始前建议阅读一下 OpenJDK 的官方构建文档 Building OpenJDK

下载 OpenJDK 源码

因为 OpenJDK 源码是用的 Mercurial 管理的,所以需要先安装一下 Mercurial 工具。

1
brew install mercurial

安装完成后按顺序执行下面的命令。

1
2
3
hg clone http://hg.openjdk.java.net/jdk10/jdk10
cd jdk10
bash ./get_source.sh (或 chmod +x get_source.sh && ./get_source.sh)

注意 get_source.sh 脚本下载时间较长,而且容易中断。需要多次执行 bash ./get_source.sh 命令。

execute ./get_source.sh before

execute ./get_source.sh complete

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
2
3
cd build/macosx-x86_64-normal-server-slowdebug/jdk/bin
./java -version
java -version

总结

  • 不要放弃
    • 如果今天编译不出来,那就明天再来。
    • 如果 OpenJDK 10 编译不出来,那就换 OpenJDK 9。还不行,那就用 9u。我自己就是从 7 一直试到了 10。

  • 不要用 Xcode 10,建议用 Xcode 9
    • 因为 10 中将 c++ 相关的依赖库由 stdlibc++ 替换成了 libc++。我自己还没有解决这个依赖问题,干脆就重新下载了 Xcode 9.4.1。
  • 善用 Google
    • 这只是在我的环境中编译成功了,在你们的环境中也许还会遇到其它的问题,这时候就要自己去问 Google。

引用