Fedora 16下编译OpenJDK 7
由于最近需要研究JVM,所以打算先自己build一个openjdk试试,hllvm群组里主要提供的都是基于Xubuntu环境,没有RedHat系的,与我的需求不尽相符,只好自己摸索,好在有RednaxelaFX等大神提供的诸多资料,确实提供了许多帮助,下述如有错误纰漏还望各位大神指正。
废话不多说,环境选择了Fedora 16 (64-bit),OpenJDK的版本是openjdk-7-fcs-src-b147-27_jun_2011.zip,源码下载地址http://download.java.net/openjdk/jdk7/
从一个干净的Fedora 16开始build需要不少准备工作,这里强烈建议直接查看OpenJDK Build README,网上有些帖子说的乱七八糟的而且来源还都是同一篇,十分误事,我接下来就把我的经验share一下,操作基本来自于这篇build README,我对linux不是很熟,过程中还是废了不少事儿,另外下面所有的都是在root权限下操作的。
- 首先当然必须有最基本的GNU make,最低版本要求是3.81以上,Fedora 16自带的是3.82的版本,所以这个无需操心。
- 我在安装fedora的时候,选择了安装Java开发工具,因此系统默认给我装好了openjdk 1.6.0_24版本,如果没有的话用yum-builddep java-1.6.0-openjdk,用网上帖子的话说:“这是安装一个 jdk 6 在 /usr/lib/jvm/java-openjdk 这个位置。这个JDK 就是所谓的bootstrap jdk了. 因为在编译openjdk7 的时候java 部分的代码就是这个来编译的了。”
- 修改 /root/openjdk/hotspot/make/linux下的Makefile文件,注释掉以下内容
check_os_version:
#ifeq ($(DISABLE_HOTSPOT_OS_VERSION_CHECK)$(EMPTY_IF_NOT_SUPPORTED),)
# $(QUIETLY) >&2 echo "*** This OS is not supported:" `uname -a`; exit 1;
#endif
这一部分我是在最开始的时候就按照这里说的把这几行给注释掉了,没有亲测,所以也不知道不注释的话到底会不会发生问题。
- 设置环境变量,进入你下载的openjdk7解压后的文件夹,在shell里输入. jdk/make/jdk_generic_profile.sh,这个是你的bash/sh/ksh的setup文件,执行这条命令之后那些LANG、ALT_BOOTDIR等环境变量都会为你设置好,就不用再自己一条一条地export了。
- 接下来按照Basic Linux System Setup部分给出的Basic Linux Check List
Basic Linux Check List
1. Install the Bootstrap JDK, set ALT_BOOTDIR.
2. Optional Import JDK, set ALT_JDK_IMPORT_PATH.
3. Install or upgrade the FreeType development package.
4. Install Ant 1.7.1 or newer, make sure it is in your PATH.
第一条是指构建openjdk的工作需要一个预先安装好的JDK环境用来做引导,由于我们已经的系统里已经装好了openjdk 6,而且环境变量已设置好,所以就不用管了。
第二条里的ALT_JDK_IMPORT_PATH环境变量是在你不需要build整个JDK的时候用到,比如你之前编过整个JDK,这次你不想再build Hotspot虚拟机了,那么你就可以通过这个来设置。
第三条是要求安装FreeType,README里提供的是源码安装的方法,但是通过yum提供了FreeType软件包,所以用yum安装会更方便一些,安装命令:yum install freetype-devel.x86_64
第四条是要求安装Apache Ant,README给的方法是下载源码安装,具体的可以到Ant的官网http://ant.apache.org/去看,源码和安装方法都能找到,我由于之前安装系统是勾选了Java开发那栏,因此Ant貌似已经有了,我没有再手动安装。
- 弄完了这些你以为就已经完成了吗?No,太naïve了!我以为这些就是Linux Fedora需要的全部dependency了,于是进入到openjdk目录下,执行命令make sanity检查build dependency,结果报出的错误是少了ALSA、CUPS的一些头文件。我擦,CUPS不是明明列在了Solaris的Basic Check List下吗!好吧,那就一个个解决吧。
- 安装ALSA:yum install alsa-lib-devel.x86_64
- 从CUPS(Common UNIX Printing System)官网下载了cups-1.6.1-source.tar.bz2源码,把解压后的目录下的cups文件夹copy到/usr/include/下
接下来make sanity,出现Sanity check passed.通过!终于可以make了,是不是很激动?别急,蛋疼的在后面呢。于是我执行命令make all,它就开始编译了,很久之后,如你所料了,挂了,看问题,貌似是x11没有安装,这是个啥啊,于是我到README里去找,结果发现原来是XRender这玩意,这不是也是在Solaris的Basic Check List里的吗…
没辙,README里推荐的方法是“使用各特定的Linux版本所提供的包安装”。好吧,yum search xrender,没有精确匹配的,于是找了个最像的安装,yum install libXrender-devel.x86_64。
然后继续make,很久之后,down了,报错是“X11/Intrinsic.h: No such file or directory”,这你妈,又是x11的问题…好吧,一定是我安装的方式不对,于是各种yum search,没有啊!无奈google之,找了半天在一个fedora论坛的一篇帖子里看到可能是少了一个叫libXt-devel的包,search之,果然有,于是yum install libXt-devel.x86_64。
继续make,很久之后,没错你懂的,down了,报错“X11/extensions/shape.h: No such file or directory”。小弟很淡定,一定是我make的诚意不够,google之,发现这次可能是少了个libXtst-devel的包,小事,装之,yum install libXtst-devel.x86_64。
继续make,这次过了更久,不过,成功了~
-- Build times ----------
Target debug_build
Start 2013-01-06 19:27:18
End 2013-01-06 20:56:11
00:06:14 corba
00:17:04 hotspot
00:15:16 jaxp
00:15:32 jaxws
00:32:47 jdk
00:01:59 langtools
01:28:53 TOTAL
-------------------------
make[1]: Leaving directory `/root/openjdk'
因此上面的步骤可以总结为:
yum install libXrender-devel.x86_64
yum install libXt-devel.x86_64
yum install libXtst-devel.x86_64
- 编译成功之后在openjdk目录下会产生一个build文件夹,cd ./build/linux-amd64/bin/,运行./java –version:
openjdk version "1.7.0-internal-debug"
OpenJDK Runtime Environment (build 1.7.0-internal-debug-yuyinyang_2013_01_06_19_08-b00)
OpenJDK 64-Bit Server VM (build 21.0-b17-jvmg, mixed mode)
上一篇: 爆笑之逗B剧场第156季