参考

http://gvsmirnov.ru/blog/tech/2014/02/07/building-openjdk-8-on-osx-maverick.html

前言

最近面试经常被文档java垃圾回收,虚拟机相关的问题,想想自己早前买了一本《深入理解Java虚拟机》从来没有好好看过,现在开始带着问题把它好好读读。不过按照书中的方法编译openjdk不成功。参考了上面的链接终于完成了编译。

步骤

一.源码安装包准备

  • homebrew,mac系统的包管理器
  • mercurial,openJDK的代码版本管理工具,从来没用过。。。

    可以使用brew安装。

      brew install mercurial
    

    有了代码管理工具就可以下载源码了

    	hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk8
    

    全部clone到本地后,进入openjdk8目录,打开README文件,发现上面语句下载的只是java根资源下面的内容,按照提示还需要继续下载其他资源

    	cd openjdk8 && sh ./get_source.sh
      
    继续看README的介绍
      	
    编译java还需要:
      	
    * make的版本再3.81以上
    * 需要jdk7u7版本以上的Jdk
    

    更详细的一些信息需要看README-builds.html文件。

二.配置环境准备

README-builds.html文件里面说明了在linux,solaris,windows,mac4种主要系统种编译Java的环境参考。 其中对mac的说明很少

Install XCode 4.5.2 and also install the "Command line tools" found under the preferences pane "Downloads"

只有上面这一句,看似很简单其实不然,因为xcode 4.5是很老的mac系统使用的,目前新的系统已经无法安装了。。。而最新版本的xcode因为gcc版本的问题,无法编译java源码,直接编译会出现下面的错误。

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

所以我们需要使用其他的gcc来代替默认的,

brew install homebrew/dupes/apple-gcc42
sudo mkdir /usr/bin/backup && sudo mv /usr/bin/gcc /usr/bin/g++ /usr/bin/backup
$ sudo ln -s /usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/gcc-4.2 /usr/bin/gcc
$ sudo ln -s /usr/local/Cellar/apple-gcc42/4.2.1-5666.3/bin/g++-4.2 /usr/bin/g++

之后执行

bash ./configure

可能会出现这个错误

configure: error: Could not find freetype!
configure exiting with result code 1

这个需要你下载xquartz,这个是绘图相关的一个软件。

安装好后继续执行

bash ./configure

配置成功!

接下来我们可以正式编译了

三.编译过程

执行

make

发现和参考的网页中出现同样的错误

hotspot/src/os/bsd/vm/os_bsd.cpp:1150:7: error: "__FreeBSD__" is not defined [-Werror=undef]
hotspot/src/os/bsd/vm/os_bsd.cpp:1152:7: error: "__OpenBSD__" is not defined [-Werror=undef]
hotspot/src/os/bsd/vm/os_bsd.cpp:1154:7: error: "__NetBSD__" is not defined [-Werror=undef]

按照如下步骤解决

pushd hotspot
curl https://gist.githubusercontent.com/gvsmirnov/8664413/raw > saproc_make_fobjc_exceptions_flag_fix.patch
hg import saproc_make_fobjc_exceptions_flag_fix.patch
popd

继续执行

make
…
----- Build times -------
Start 2014-02-06 21:20:36
End   2014-02-06 21:30:50
00:00:18 corba
00:06:57 hotspot
00:00:13 jaxp
00:00:18 jaxws
00:02:03 jdk
00:00:25 langtools
00:10:14 TOTAL
-------------------------
Finished building OpenJDK for target 'default'

成功了!参考得网页里面还遇到了其他得问题,应该是不同系统和不同源码版本导致得,如果各位遇到上面描述以外得问题可以去看下。

之后可以配置下环境变量使电脑使用你刚刚编译的java

vim ~/.bash_profile

export JAVA_HOME=/Users/mls-pc/projects/YourOpenJDKPath/build/macosx-x86_64-normal-server-release/jdk

source ~/.bash_profile

java -version

openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-mlspc_2016_04_02_09_03-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70, mixed mode)

自己编译的jdk会显示你编译的时间在本版后面