由于公司最近的项目都统一使用Jdk8,因此打算在自己的机器上搭建open jdk的调试环境;
jdk8的编译方式发生了比较大的变化,不再依赖ant,而是采用configure&make的方式;
下面是具体的编译步骤:
- 安装mercurial(openjdk源码由hg管理),我选择的是3.8.2版本:
sudo brew install mercurial
- 下载源码:
hg clone http://hg.openjdk.java.net/jdk8/jdk8 java-source
cd java-source
chmod +x get_source.sh
./get_source.sh
jdk源码下载中,发现网络极其不稳定,我重试了很多次才将源码全部下载到本地;
- 安装依赖
brew install freetype #2.6.3版本
- 编译前准备
- 修改relocInfo.hpp的367行(hotspot/src/share/vm/code/relocInfo.hpp):
修改前为:
- 修改relocInfo.hpp的367行(hotspot/src/share/vm/code/relocInfo.hpp):
inline friend relocInfo prefix_relocInfo(int datalen=0);
修改后 为:
inline friend relocInfo prefix_relocInfo(int datalen);
- 修改generated-configure.sh的20061和21640行(common/autoconf/generated-configure.sh),解决
configure: error: GCC compiler is required
错误:
修改前为:
as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
修改后为:
#as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
我本机的xcode为7.3.1,编译器为clang,版本为Apple LLVM version 7.3.0 (clang-703.0.31);而jdk编译默认需要gcc编译器,由于clang703已经支持大部分的gcc语法,因此此处我是直接注释掉编译器检查,当然也可以安装gcc编译器进行编译;
注意:编译器的版本很重要,否则会报一大堆语法错误;如果采用gcc,要求>=3.81
- 编译
./configure --with-debug-level=slowdebug --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home --with-target-bits=64 --with-jvm-variants=server --with-jdk-variant=normal --with-milestone=internal --with-num-cores=2 --with-jobs=4 CC=clang CXX=clang++
make COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' CC=clang USE_CLANG=true LP64=1
一般而言,编译jdk8要求boot-jdk的版本为jdk1.7,此处我设置的with-boot-jdk
为jdk1.7.0.79;
- 编译完成之后,可以通gdb进行调试:
export JAVA_ROOT_PATH=~/java-source/jdk8/build/macosx-x86_64-normal-server-slowdebug
export ALT_JAVA_HOME=${JAVA_ROOT_PATH}/jdk
${ALT_JAVA_HOME}/bin/javac -g Hello.java
${JAVA_ROOT_PATH}/hotspot/bsd_amd64_compiler2/debug/hotspot -gdb HelloWorld
备注:编译jdk8还依赖其他,比如cups, pulse, alsa等,都可以通过brew进行安装