首页 > 技术文章 > Mac上编译OpenJDK过程记录

micrari 2017-06-15 16:22 原文

编译OpenJDK主要为了学习HotSpot,编译过程在很多相关书籍中都有所涉及,但由于机型、机子具体环境的不同,很难有资料能够一步到位。还是得碰到具体问题通过上网查来一个个解决。

下载OpenJDK

由于网络环境还不错,所以这里采用通过版本管理来下代码。
安装mercurial版本管理

brew install mercurial

接下来clone源码

hg clone http://hg.openjdk.java.net/jdk8/jdk8
cd jdk8 && sh get_source.sh

安装一些依赖

安装FreeType,否则会出现configure: error: Could not find freetype!

brew install freetype

如果遇到

configure: error: GCC compiler is required. Try setting --with-tools-dir.

安装gcc48

$ brew install gcc48

$ sudo mkdir /usr/bin/backup && sudo mv /usr/bin/gcc /usr/bin/g++ /usr/bin/backup
$ sudo ln -s /usr/local/bin/gcc-4.8 /usr/bin/gcc
$ sudo ln -s /usr/local/bin/g++-4.8 /usr/bin/g++

安装ccache加速编译

$ brew install ccache

安装x11,地址https://www.xquartz.org/

$ ln -s /opt/X11/include/X11 /usr/local/include/X11

修改一些配置

hotspot/make/bsd/makefiles/gcc.make

我们需要干掉下面的代码,否则warnings会无法编译下去

# Compiler warnings are treated as errors
ifneq ($(COMPILER_WARNINGS_FATAL),false)
  WARNINGS_ARE_ERRORS = -Werror
endif

这一段也要干掉,否则在后续编译中可能会出现clang: error: unknown argument: '-fpch-deps'

ifeq ($(USE_CLANG),)
  ifneq ($(CC_VER_MAJOR), 2)
    DEPFLAGS += -fpch-deps
  endif
endif

加上下面这句话,否则在编译adlc时可能会出错

LFLAGS += -stdlib=libstdc++

common/autoconf/generate-config.sh

找到as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5出现的位置干掉,否则在config的时候可能会出现configure: error: GCC compiler is required

编译

配置configure

sudo sh ./configure --enable-debug

可以看到出现类似如下的内容

A new configuration has been successfully created in
/Users/robin/Code/cpp/jdk/jdk8/build/macosx-x86_64-normal-server-fastdebug
using configure arguments '--enable-debug'.

Configuration summary:
* Debug level:    fastdebug
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64

Tools summary:
* Boot JDK:       java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)  (at /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home)
* C Compiler:      version  (at /usr/bin/gcc)
* C++ Compiler:    version  (at /usr/bin/g++)

Build performance summary:
* Cores to use:   4
* Memory limit:   16384 MB
* ccache status:  installed, but disabled (version older than 3.1.4)

开始编译

$ make

在成功之后可以看到如下提示

Finished building OpenJDK for target 'default'

调试

在编译好我们的OpenJDK后,我们可以开始调试了,这里我用的是Jetbrains的CLion作为IDE,Clion对makefile支持不是太好,不过就阅读和调试C++程序而言已经相当强大了。


加上一个调试hotspot的配置,在这里的Executable选择我们编译出来的jdk的java程序,路径如OpenJDK路径/build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java

接下来我们便可以从java命令开始调试hotspot学习了

后记

由于编译过程因为OpenJDK版本、个人机型、软件环境等众多因素影响,以上流程、配置仅供参考。在遇到问题时多查查StackOverflow等网站,大多情况下都有人碰到过。

参考

《HotSpot实战》

推荐阅读