编译Open-JDK-7详细记录

  本次编译的系统环境是Ubuntu Linux 64-bit,编译用户root。需要以下软件包的依赖,如果是新的环境直接复制粘贴到终端即可,如果系统有了也不会重复安装的,建议安装之前把软件仓库update一次。

apt-get install mercurial build-essential gawk m4 openjdk-6-jdk ant 
libasound2-dev libcups2-dev libxrender-dev xutils-dev binutils libmotif3 
libmotif-dev zip libfreetype6-dev xorg-dev x11proto-print-dev

1、下载OpenJDK的源代码

hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
cd jdk7u-dev/
chmod 755 get_source.sh
./get_source.sh

2、设置环境变量

#语言选项
export LANG=C

#bootstrap jdk路径
export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64

#允许自动下载依赖
export ALLOW_DOWNLOADS=true

#并行编译的线程数,按CPU核数配置就可以了,我这机器是i7 8核
export HOTSPOT_BUILD_JOBS=8
export ALT_PARALLEL_COMPILE_JOBS=8

#与之前编译的版本做比较,没意义,跳过即可
export SKIP_COMPARE_IMAGES=true

#使用预编译的头文件,不加慢些
export USE_PRECOMPILED_HEADER=true

#要编译的内容,这里只编译了JDK和LANGTOOLS。
export BUILD_LANGTOOLS=true
export BUILD_JDK=true

#不需要打包
export BUILD_DEPLOY=false
export BUILD_INSTALL=false

#设置编译输出的目录
export ALT_OUTPUTDIR=/root/jdk7u-bin

#取消系统java环境变量
unset JAVA_HOME
unset CLASSPATH

  这里要求系统先装一个JDK环境,编译OpenJDK7至少要求OpenJDK6以上,因为编译期间有很多java语言写的过程,这个叫做“Bootstrap JDK”,我这是用apt-get安装的,所以默认路径如此。更多配置信息可以参考源代码目录下的README-builds.html。

3、编译

  用env确认下变量没错的话就可以进行编译了,如果有错误,依据错误提示修正后用make clean清理一次,再执行编译。

make 2>&1 | tee $ALT_OUTPUTDIR/build.log

  这样可以记录下编译的日志,不需要也可以直接make all,我这里编译大概需要15分钟就可以了,看到以下信息表示成功。

#-- Build times ----------
Target all_product_build
Start 2013-12-24 13:04:19
End   2013-12-24 13:21:02
00:01:41 corba
00:04:18 hotspot
00:00:16 jaxp
00:00:19 jaxws
00:09:34 jdk
00:00:32 langtools
00:16:43 TOTAL

4、运行检测

  进入之前配置的输出目录下的bin,执行java -version可以看到build里面加入了用户机器名

root@dorole.com:~/jdk7u-bin/bin# ./java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-stevenyang_2013_12_24_13_04-b00)
OpenJDK 64-Bit Server VM (build 24.60-b04, mixed mode)

  Java的编译和解释就算ok了,接下来还要测试下jvm是否正常。进入jdk7u-bin/hotspot/outputdir目录,可以发现有子目录linux_amd64_compiler2/,前面的linux是根据宿主系统来决定的,我们这里是linux,amd64不用多说,compiler2表示Server VM,compiler1表示Client VM。进入后又有子目录分别对应了不同的优化级别,优化级别越高,性能越牛叉,生成的代码越难以调式,具体哪个目录下有内容得看make的参数,我这里是在product/下面。

  虚拟机的启动器名字叫gamma,先编辑目录下的env.sh,可以看到默认的JAVA_HOME并不是我们自己编译的,修改下即可。可以执行目录下的test_gamma脚本来进行测试,这个脚本主要是调用javac去编译jdk7u-dev/hotspot/make/test/Queens.java,并执行解八皇后问题。

  直接执行gamma可能会失败,因为找不到新编译出来的libjvm.so文件,没关系加入到系统就好了。在/etc/ld.so.conf.d中建立java.conf,内容为libjvm.so所在目录。再执行ldconfig即可。

root@dorole.com:/etc/ld.so.conf.d# cat java.conf
/root/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product

root@dorole.com:/etc/ld.so.conf.d# ldconfig
root@dorole.com:/etc/ld.so.conf.d# ldconfig -p | grep jvm
        libjvm.so (libc6,x86-64) => /root/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product/libjvm.so

  看到有最后一行的输出就可以了,再回到gamma目录,执行就可以了。

root@dorole.com:~/jdk7u-bin/hotspot/outputdir/linux_amd64_compiler2/product# ./gamma -version
Using java runtime at: /root/jdk7u-bin
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-stevenyang_2013_12_24_13_04-b00)
OpenJDK 64-Bit Server VM (build 24.60-b04, mixed mode)

  到此,整个编译OpenJDK就算完成了。