0%

OpenJDK编译

近日想深入了解一下Java虚拟机,于是阅读《深入理解Java虚拟机》这本书;在编译openjdk的时候遇到一些问题。记录如下,以供参考;

0. 编译环境(Linux底下可以用sudo lshw -short命令查看):

  1. Ubuntu 14.04LTS i386
  2. 4GB内存;
  3. Intel Core i3 cpu;

1. 获取OpenJDK源码

有如下两种方式:

  • 下载源码包
    • Source Bundle Release页面下载打包好的源码,在本地解压即可;(注:我用这种方法试了一下,总是报各种错误,遂弃而不用)
  • 从Repository中直接获取源码(推荐,我就是用这种方法编译成功的,这种方法可以获取最新的源码,会修复之前版本的一些bug,但是就是下载下来的时间比较长,总共有400多M,因文件较多,故所需时间比较长,自己大概用了1个多小时的时间)

2. 构建编译环境

# Ubuntu下使用如下命令一次安装完成:
sudo apt-get install build-essential gawk m4 openjdk6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev x11proto-print-dev binutils libmotif3 libmotif-dev ant

3. 编译前的一些设置

# 语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错误;
export LANG=C
# jdk的安装路径,必须设置,注:jvm后面的目录根据个人电脑而异;
export ALT_BOOTDIR=/usr/lib/jvm/java-1.6.0-openjdk-i386/
# 允许自动下载
export ALLOW_DOWNLOADS=true
# 比较本次build出来的映像与先前版本的差异。这对我们来说没有意义,必须设置成false
export SKIP_COMPARE_IMAGES=true
# 使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true
# 编译结果存放的路径,可以随意设置
export ALT_OUTPUTDIR=/home/wmk/JVM/jdkbuild
# 如下两个环境变量必须去掉,不然会有诡异的事情发生(:-O)
unset JAVA_HOME
unset CLASSPATH

# 之后可以执行
# 下面这行命令不明其意,或许可以不执行;
sh ./jdk/make/jdk_generic_profile.sh
# 检查之前的设置是否全部正确
make sanity

还有一些需要改动的地方:

vim hotspot/make/linux/makefiles/gcc.make

#将其中的 WARNINGS_ARE_ERRORS = -Werror 注释掉
vim hotspot/make/linux/Makefile

#将其中的test_gamma全部干掉;不然会出现错误;

4. 编译

make 2>&1 | tee build.log
# 注:命令的意思是将标准错误重定向到标准输出,同时输出到控制台和文件;自己大概编译了一个多小时;

编译成功后大概会有类似这样的输出:

-- Build times ———-
Target all_product_build
Start 2012-05-06 23:07:41
End 2012-05-06 23:12:30
00:00:04 corba
00:00:14 hotspot
00:00:02 jaxp
00:00:06 jaxws
00:04:19 jdk
00:00:04 langtools
00:04:49 TOTAL
-------------------------

5. 其他一些可能的错误

#然后,就到sound出错了
cd jdk/make/javax/sound/jsoundalsa
vim Makefile

#找到CPPFLAGS ,在其结尾,添加 -lasound

#如果再次make还是失败在这里,那么 ,先还原上一个修改, 并拷贝出错的最后一条gcc命令,添加-lasound后执行,应该无错误地pass

#OK,你会遇到最后的错误, corba的什么什么类找不到?!注:/opt/openjdk应该需要根据自己的情况实际进行修改一下;
cp -r /opt/openjdk/build/linux-amd64/corba/classes/* /opt/openjdk/build/linux-amd64/classes/

6. 参考文献