Ubuntu12.04 i386 编译OpenJDK7 记录

1.系统环境

在vmware上安装ubuntu12.04,32位系统。

2.下载源码

本想使用博客中提到的 mercurial 从库中clone 源码,但是试了几次没有成功,于是从http://download.java.net/openjdk/jdk7/ 上手动下载openjdk-7-fcs-src-b147-27_jun_2011.zip ,下载到ubuntu 中解压。我是解压在了自己的 ~/workspace/openjdk中。

3.安装相关软件,参考了网上很多博客,把里面提到的基本都安装了。大部分都是采用了sudo apt-get方式,包括openjdk6以及ant。

安装的各种软件如下(可能多安装了一些,不过只多不少):

sudo apt-get install build-essential

sudo apt-get install mercurial gawk g++ libcups2-dev libasound2-dev libfreetype6-dev libx11-dev libxt-dev libxext-dev libxrender-dev libxtst-dev libfontconfig1-dev

sudo apt-get install xorg-dev

然后需要预装一个JDK和ant,使用的是openjdk 6和ant 8

sudo apt-get install openjdk-6-jdk 

sudo apt-get install ant

有博客还提到需要安装freetype,下载了freetype,但是有博客说不需要安装,会在编译时自动下载,手动下载链接 :http://ncu.dl.sourceforge.net/project/freetype/freetype2/2.4.4/freetype-2.4.4.tar.gz 之后解压,进入其目录 ./configure 运行configure。然后输入 make 编译,然后sudo make install 进行安装。

4.编写配置环境的脚本

#!/bin/bash
export LANG=C
export ALT_BOOTDIR="/usr/lib/jvm/java-1.6.0-openjdk-i386"
export ALT_JDK_IMPORT_PATH="/usr/lib/jvm/java-1.6.0-openjdk-i386"
export ANT_HOME="/usr/share/ant"
export ALLOW_DOWNLOADS=true
export USE_PRECOMPILED_HEADER=true    
export SKIP_DEBUG_BUILD=false    
export SKIP_FASTDEBUG_BUILD=true    
export DISABLE_HOTSPOT_OS_VERSION_CHECK=true    
export DEBUG_NAME=debug 
export PATH="/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/share/ant/bin"
#export ALT_FREETYPE_HEADERS_PATH=/usr/local/include/freetype2
#export ALT_FREETYPE_LIB_PATH=/usr/lib/
如果不是sudo apt-get install方式安装的jdk,并且配置了JAVA_HOME,需要unset JAVA_HOME。

运行脚本后,可以在openjdk的根目录输入 make sanity 进行检查。

5.编译中遇到的问题

(1). 不支持的内核版本,ubuntu 12.04的内核版本是3.2,需要在 hotspot/make/linux/Makefile 中,在末尾添加自己的内核版本,对于ubuntu12.04就是3.2

SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 2.7% 3.2%
(2). __LEAF宏定义重复。很多博客提到需要修改g++中的6个地方,但是我找不到他们都在哪。冲突发生在 hotspot/src/share/vm/runtime/interfaceSupport.hpp这个头文件中,为 __LEAF 增加一个undefine

 // LEAF routines do not lock, GC or throw exceptions

#ifdef __LEAF

#undef __LEAF

#define __LEAF(result_type, header)                                  \

  TRACE_CALL(result_type, header)                                    \

  debug_only(NoHandleMark __hm;)                                     \

#endif

(3). 在编译时会遇到和"javax/sound/jsoundalsa"相关的一个错误,网上搜了一下这个貌似是openjdk的一个bug,有人提供了补丁http://mail.openjdk.java.net/pipermail/build-dev/2012-January/005382.html。只需要修改openjdk/jdk/make/javax/sound/jsoundalsa目录下的Makefile文件,找到LDFLAGS += -lasound 

修改为:OTHER_LDLIBS += -lasound

(4). 提示找不到 cannot stat `/usr/local/freetype-2.4.6/bin/libfreetype.so': No such file or directory。搜了一些博客说是编译时自动下载,我把编译脚本中最后的两个环境变量

ALT_FREETYPE_HEADERS_PATH 和 ALT_FREETYPE_LIB_PATH 给unset,就可以顺利编译了。
6. 最后纪念一下成功编译

########################################################################
##### Leaving jdk for target(s) sanity all docs images             #####
########################################################################
##### Build time 00:20:09 jdk for target(s) sanity all docs images #####
########################################################################

-- Build times ----------
Target debug_build
Start 2014-07-26 23:36:39
End   2014-07-27 00:47:24
00:02:37 corba
00:39:25 hotspot
00:02:08 jaxp
00:05:24 jaxws
00:20:09 jdk
00:01:01 langtools
01:10:45 TOTAL
-------------------------
make[1]: Leaving directory `/home/nightwish/workspace/openjdk'

7. 如果需要单独编译Hotspot。进入openjdk的hotspot/make目录下,设置环境变量 export HOTSPOT_BUILD_JOBS=5 以及 export ALT_OUTPUTDIR=../build/hotspot_debug 。 执行 make jvmg jvmg1 2>&1 | tee ~/hotspot-in-action/hotspot/build/hotspot_debug.log 。编译完成后在hotspot目录下就有了build文件夹,编译最后阶段会给出一个八皇后问题的解作为测试。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值