osx环境编译jdk8

由于公司最近的项目都统一使用Jdk8,因此打算在自己的机器上搭建open jdk的调试环境;

jdk8的编译方式发生了比较大的变化,不再依赖ant,而是采用configure&make的方式;

下面是具体的编译步骤:

  1. 安装mercurial(openjdk源码由hg管理),我选择的是3.8.2版本:
   sudo brew install mercurial
  1. 下载源码:
hg clone http://hg.openjdk.java.net/jdk8/jdk8 java-source
cd java-source
chmod +x get_source.sh
./get_source.sh

jdk源码下载中,发现网络极其不稳定,我重试了很多次才将源码全部下载到本地;

  1. 安装依赖
brew install freetype #2.6.3版本
  1. 编译前准备
    • 修改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

  1. 编译
./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;

  1. 编译完成之后,可以通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进行安装

推荐阅读更多精彩内容