特此声明:
这种经验性的心得不具备通用性,大家参考下罢了。以下是我的jdk7编译过程,在Ubuntu12.10(64位)操作系统。
源码下载:http://download.java.net/openjdk/jdk7/
1 安装准备:
A 安装基本依赖软件:
百度搜吧,最后我少安装了个g++,耽误了好多时间排错
B OS版本支持,有两种方法,我用的后者:
a uname -a命令查看本机内核版本,然后修改hotspot/make/linux/Makefile,把本机内核版本加入到支持列表中,
b 直接注释掉该文件中对于OS版本的检查。
C 处理lasound:
修改jdk/make/javax/sound/jsoundalsa/下的Makefile文件,将LDFLAGS += -lasound改成EXTRA_LIBS += -lasound
2 进入源码目录,执行安装脚本:
脚本内容是从网上各种贴汇总的:
#!/bin/bash
export LANG=C
export ARCH_DATA_MODEL=64
export DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
export ALT_BOOTDIR=/usr/lib/jvm/java-6-openjdk-amd64 jvmg
export ALLOW_DOWNLOADS=true
export USE_PRECOMPILED_HEADER=true
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
export DEBUG_NAME=debug
unset CLASSPATH
unset JAVA_HOME
make sanity && make
注意上面的debug选项,这样才能生成debug版本,不能只是执行make命令。
3 解决安装过程中出现问题:
N多问题,怀疑下载的源码版本问题,但是从官网下的,应该不会有错。问题如下:
A 问题:遭遇一个bug
../generated/dependencies/precompiled.hpp.gch.d -x c++-header /openjdk/hotspot/src/share/vm/precompiled.hpp -o precompiled.hpp.gch
In file included from /openjdk/hotspot/src/share/vm/prims/methodHandles.hpp:32:0,
from /openjdk/hotspot/src/share/vm/ci/ciMethod.hpp:33,
from /openjdk/hotspot/src/share/vm/code/debugInfoRec.hpp:30,
from /openjdk/hotspot/src/share/vm/ci/ciEnv.hpp:31,
from /openjdk/hotspot/src/share/vm/ci/ciUtilities.hpp:28,
from /openjdk/hotspot/src/share/vm/ci/ciNullObject.hpp:30,
from /openjdk/hotspot/src/share/vm/ci/ciConstant.hpp:29,
from /openjdk/hotspot/src/share/vm/precompiled.hpp:36:
/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp:430:0: error: "__LEAF" redefined [-Werror]
In file included from /usr/include/features.h:357:0,
解决办法:
这个是一个bug,http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/a6eef545f1a2http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/a6eef545f1a2,从这个链接进去页面后,发现该bug已经被fix了,但是我下载的里面还有这个bug,涉及的几个源码文件。我用的是比较笨的方法,按照网上differ提示,找到对应源文件手动修改的。
B 问题:
rm -f constantPoolOop.o
g++ -DLINUX -D_GNU_SOURCE -DAMD64 -DASSERT -DDEBUG -I. -I/openjdk/hotspot/src/share/vm/prims -I/openjdk/hotspot/src/share/vm -I/openjdk/hotspot/src/cpu/x86/vm -I/openjdk/hotspot/src/os_cpu/linux_x86/vm -I/openjdk/hotspot/src/os/linux/vm -I/openjdk/hotspot/src/os/posix/vm -I../generated -DHOTSPOT_RELEASE_VERSION="\"21.0-b17\"" -DHOTSPOT_BUILD_TARGET="\"jvmg\"" -DHOTSPOT_BUILD_USER="\"root\"" -DHOTSPOT_LIB_ARCH=\"amd64\" -DJRE_RELEASE_VERSION="\"1.7.0-internal-debug-root_2012_11_25_17_29-b00\"" -DHOTSPOT_VM_DISTRO="\"OpenJDK\"" -DTARGET_OS_FAMILY_linux -DTARGET_ARCH_x86 -DTARGET_ARCH_MODEL_x86_64 -DTARGET_OS_ARCH_linux_x86 -DTARGET_OS_ARCH_MODEL_linux_x86_64 -DTARGET_COMPILER_gcc -DCOMPILER2 -DCOMPILER1 -fPIC -fno-rtti -fno-exceptions -D_REENTRANT -fcheck-new -fvisibility=hidden -m64 -pipe -g -DVM_LITTLE_ENDIAN -D_LP64=1 -fno-omit-frame-pointer -Werror -Wpointer-arith -Wsign-compare -c -MMD -MP -MF ../generated/dependencies/constantPoolOop.o.d -o constantPoolOop.o /openjdk/hotspot/src/share/vm/oops/constantPoolOop.cpp
/openjdk/hotspot/src/share/vm/oops/constantPoolOop.cpp: In static member function 'static methodOopDesc* constantPoolOopDesc::method_at_if_loaded(constantPoolHandle, int, Bytecodes::Code)':
/openjdk/hotspot/src/share/vm/oops/constantPoolOop.cpp:272:39: error: converting 'false' to pointer type 'methodOop' [-Werror=conversion-null]
cc1plus: all warnings being treated as errors
解决办法:
看到这个错误我忽然怀疑我下载的源码版本不行。简单的将,就是某个if-else分支返回的值类型与该方法返回值类型不一致导致的。此时有两种解决方法:
1 return (methodOop)false;
2 return NULL;
C 问题:
gcc: error: unrecognized command line option '-mimpure-text'
make[5]: *** [/openjdk/build/linux-amd64/../linux-amd64-debug/lib/amd64/libverify.so] Error 1
解决办法:
gcc版本问题,这个命令在本机所用的4.7.2版的gcc中已经去除,既然不能降低gcc版本(本机ubuntu12.10内核用4.7.2版gcc编译),那就在 /openjdk/jdk/make/common/shared/Compiler-gcc.gmk 中去掉 -mimpure-text 命令
D 问题:
make[6]: g++: Command not found
make[6]: *** [../generated/adfiles/adlparse.o] Error 127
解决办法:
其实是g++没有安装,sudo apt-get install g++ 就OK了
E 问题:
提示空间不够。。。。
这个确实没有预料到,编译完竟然达4个G!主要是debug版本惹的祸吧。解决方法不用多说了~~