Ubuntu 下编译 openJDK7

特此声明:

       这种经验性的心得不具备通用性,大家参考下罢了。以下是我的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版本惹的祸吧。解决方法不用多说了~~

你可能感兴趣的:(07,工具环境,->,编译实战)