「OpenJDK」- OpenJDK7u6的编译(ubuntu 10.10)

  CREATED BY JENKINSBOT

Download: http://www.java.net/download/openjdk/jdk7u40/promoted/b43/openjdk-7u40-fcs-src-b43-26_aug_2013.zip

Wiki: https://wiki.openjdk.java.net/display/jdk7u/Main

系统环境及其创建

类型1:`virtualbox‘ + `ubuntu 10.10 server amd64’
为了更好的发挥硬件资源,并提高编译速度,我选择「类型2」。

类型2:`chroot‘ + `ubuntu 10.10 server amd64’
有关chroot环境的制作参考:「任意Linux发行版的chroot环境」

如果需要ubuntu 10.10的源,参考:Linux Package Manager:z.Source List

#!/bin/bash

############################################################
# 进入chroot环境
############################################################

# 定义新的根目录
LFS=/mnt/uui/chos/ubuntu-10.10

# 先挂载「虚拟文件系统」
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620

mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run

# 进入chroot环境
chroot $LFS env -i \
	HOME=/root     \
	TERM="$TERM"   \
	PATH=/bin:/usr/bin:/sbin:/usr/sbin \
	/bin/bash --login +h

包依赖

阅读源码目录下的README-builds.html文件,及《深入理解Java虚拟机:JVM高级特性与最佳实践》

以文档指引为主。

源码获取

Source: https://jdk7.java.net/source.html
以下内容取自源码目录下README-builds.html#get_source部分:

从OpenJDK的Mercurial仓库中下载源码

#!/bin/bash

# 获取整套的源码,包括Forest Extension
hg fclone http://hg.openjdk.java.net/jdk7u/jdk7u6 YourOpenJDK

# 获取整套的源码,但不包括Forest Extension
hg clone http://hg.openjdk.java.net/jdk7/jdk7 YourOpenJDK

进入源码目录,执行get_source.sh

#!/bin/bash

cd YourOpenJDK
sh ./get_source.sh

执行结束后,源码的检出就完成了。

如果在多个仓库中同时执行hg命令?
一旦拥有所有的仓库,脚本make/scripts/hgforest.sh就可以用来在每个仓库上重复相同的hg命令,例如:

#!/bin/bash

cd YourOpenJDK
sh ./make/scripts/hgforest.sh pull -u

您可能会发现此脚本make/scripts/hgforest.sh比由Forest Extension提供的hg forest命令更快。

编译

请仔细阅读源码目录下的README-builds.html;
编译主要有两大步骤:

构建需要的依赖
构建的依赖部分在README-builds.html#SDBE章节有说明。

构建脚本及环境变量

#!/bin/bash
#

export LANG=C
export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk
export ANT_HOME=/usr/share/ant/

export BUILD_HOTSPOT=true
export BUILD_CORBA=true
export BUILD_JAXP=true
export BUILD_JAXWS=true
export BUILD_JDK=true
export BUILD_LANGTOOLS=true

export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=false

unset JAVA_HOME
unset LD_LIBRARY_PATH

# 执行检查;
make sanity

# make,输出并保存日志
make 2>&1 | tee build.log

编译结果

编译产生的JDK位于:build/linux-amd64/j2sdk-image

Error List

#1 Error: time is more than 10 years from present

自2015年开始一般会出现如下异常

< ../../../src/share/classes/java/util/CurrencyData.properties

Error: time is more than 10 years from present: 1136059200000

java.lang.RuntimeException: time is more than 10 years from present: 1136059200000

at build.tools.generatecurrencydata.GenerateCurrencyData.makeSpecialCaseEntry(GenerateCurrencyData.java:285)

……

解决:
通过修改 jdk/src/share/classes/java/util/CurrencyData.properties 文件,找到以下两行(大约在第 534 行):

	# TURKEY
	TR=TRL;2004-12-31-22-00-00;TRY

修改10年之前的时间修改为10年之内即可:

	# TURKEY
	TR=TRL;2014-12-31-22-00-00;TRY

该文件里,其他几处也涉及到的时间问题,都改掉吧!!!
我一共修改了 5 处,下面是修改以后的结果:

	AZ=AZM;2014-12-31-20-00-00;AZN
	MZ=MZM;2014-06-30-22-00-00;MZN
	RO=ROL;2014-06-30-21-00-00;RON
	TR=TRL;2014-12-31-22-00-00;TRY
	VE=VEB;2014-01-01-04-00-00;VEF

(这么做并不严谨, 正确的做法是 1136059200000 对应的“日期”在文件中找到,然后修改对应的日期,修改为10年之内:)

#2 This OS is not supported

>&2 echo “*** This OS is not supported:” `uname -a`; exit 1;

原因:操作系统不支持,我使用的内核版本 4.x 的;
解决:修改hotspot/make/linux/Makefile文件,第 234 行:

	**SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%**

	**SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%**