JVM

在MAC系统上编译JVM

编译JVM

Posted by Walklown on August 20, 2020

这个专题很多大神都有写过,这里一方面是做记录,另一方面是补充一些个人的踩坑

一、获取源码包

方法一,通过mercurial获取。

1
2
3
$ hg clone http://hg.openjdk.java.net/jdk/jdk11 YourOpenJDK
$ cd YourOpenJDK
$ bash ./get_source.sh

下载时经常中断,可能是因为墙吧。

方法二,从 openjdk 网站下载获取。

打开http://hg.openjdk.java.net/,在左侧选择版本,10+的版本作为jdk目录下的子目录,如果下载11,最终地址是http://hg.openjdk.java.net/jdk/jdk11,方法一的地址也是如此获取的。到达目录后点击左侧zip按钮开始下载。

这种方法下载很慢,而且经常缺少文件,导致解压缩出错,或者缺少源码包。

方法三,从 java 官网下载获取。

打开http://jdk.java.net,在选择所需版本,点击RI Source Code目录下的zip file链接下载。

从 openjdk 网站下载获取

二、准备环境

根据openjdk/doc/building.htmlopenjdk/doc/building.md预安装系统环境,作者使用的mac系统,系统版本足够新,需要的原生工具链是Xcode。

Operating system Supported toolchain
Linux gcc, clang
macOS Apple Xcode (using clang)
Solaris Oracle Solaris Studio
AIX IBM XL C/C++
Windows Microsoft Visual Studio

安装了Xcode,GUN Make 4.2.1,使用brew安装了Autoconf 2.69,GUN Bash 5.0.18,并配置了相应环境变量。

版本要求、版本查看方法都在 openjdk 文档里写了,这里不多重复。

需要注意,编译 jdk11 时,不能使用 GUN Make 4.3,需要安装 4.2.1。使用 brew 通过历史版本 homebrew-core 的提交来安装4.2.1版本也不可行,新版本 brew 运行 install 会失败。建议手动安装。

三、开始编译

配置编译参数,网上扒拉到的命令里--with-freetype={本地 freetype 地址},执行时提示要么选system,要么选bundled,应该是版本的原因,事实上只能用bundled

1
$ bash ./configure --with-target-bits=64 --with-freetype=bundled --enable-ccache --with-jvm-variants=server,client --with-boot-jdk-jvmargs="-Xlint:deprecation -Xlint:unchecked" --disable-warnings-as-errors --with-debug-level=slowdebug 2>&1 | tee configure_mac_x64.log

然后执行编译命令。

1
2
3
$ export LANG=C

$ make all LOG=debug  2>&1 | tee make_mac_x64.log

如果出现异常则根据 log 提示寻找问题。

作者在编译异常后根据提示去找第一个 Error 的上下文,只找到这个:

1
make[2]: *** [make/Main.gmk:73: buildtools-langtools] Error 2`

没有任何有用信息,找了很久发现有一个老哥跟我一样,是因为 GUN make 版本的问题,GUN make 4.3 编译 jdk11 会失败,GUN make 4.2.1 就可以。

成功后日志内容是这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
/usr/bin/printf  -- "----- Build times -------\nStart %s\nEnd   %s\n%s\n%s\n-------------------------\n" "`/bin/cat /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/make-support/build-times/build_time_start_TOTAL_human_readable`" "`/bin/cat /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/make-support/build-times/build_time_end_TOTAL_human_readable`" "`/bin/ls /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/make-support/build-times/build_time_diff_* | /usr/bin/grep -v _TOTAL | /usr/bin/xargs /bin/cat | /usr/bin/sort -k 2`" "`/bin/cat /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/make-support/build-times/build_time_diff_TOTAL`" > >(/usr/bin/tee -a /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/build.log) 2> >(/usr/bin/tee -a /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/build.log >&2) && wait
----- Build times -------
Start 2020-08-20 17:23:02
End   2020-08-20 17:48:28

00:25:26 TOTAL
-------------------------
if test -f /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/make-support/exit-with-error ; then \
    exit 1 ; \
  fi
/usr/bin/printf "Finished building target 'all' in configuration 'macosx-x86_64-normal-serverANDclient-slowdebug'\n" > >(/usr/bin/tee -a /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/build.log) 2> >(/usr/bin/tee -a /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/build.log >&2) && wait
Finished building target 'all' in configuration 'macosx-x86_64-normal-serverANDclient-slowdebug'
make[1]: 离开目录“/Users/**********/workspace/openjdk11”

然后就可以验证编译结果啦:

1
2
3
4
5
$ cd /Users/**********/workspace/openjdk11/build/macosx-x86_64-normal-serverANDclient-slowdebug/jdk/bin
$ ./java -version
openjdk version "11-internal" 2018-09-25
OpenJDK Runtime Environment (slowdebug build 11-internal+0-adhoc.zhangzhipei.openjdk11)
OpenJDK 64-Bit Server VM (slowdebug build 11-internal+0-adhoc.zhangzhipei.openjdk11, mixed mode)