Cross-Compiling Iceadtea(OpenJDK)

      经过1个多月的奋斗与煎熬,终于成功在X86体系结构上交叉编译出了Icedtea(Zero部分)。在编译的过程中,遇到了一些困难,希望能将这些解决方法分享出来,希望对正在纠结的你有一定帮助。也希望和你继续深一步的讨论。

      由于LLVM的版本较低,所以不能支持Icedtea(Shark部分),但是交叉编译Zero和Shark的方法大同小异。

      在交叉编译前,请仔细阅读icedtea目录下INSTALL文件和configure --help。

      笔者采用icedtea6-1.9.1+openjdk-6-src-b20-21_jun_2010的组合进行交叉编译。

编译的一些问题:

      由于OpenJDK设计初衷并没有考虑交叉编译,OpenJDK的make脚本会通过检查编译环境自动指定编译环境,我们在Icedtea的configure中配置的工具链环境变量会被修改。我们需要在OpenJDK的make脚本中手动修改。

       OpenJDK编译的过程是通过GNU Classpath/GCJ+ECJ(X86) ----> Bootstrap JDK(X86) ----->final JDK(UniCore32)。Icedtea编译过程封装了这一过程,通过make实际上执行了这两个编译步骤,但是由于第二步编译需要使用修改工具链,我们需要通过make icedtea-against-ecj和make icedtea-against-icedtea来分离这两个编译步骤。

       在OpenJDK编译过程中,会使用到交叉编译出来的可执行文件(sizer.32和test_gamma),但这显然是行不通的,sizer.32需要在UniCore32体系结构上手动运行,然后拷贝sizes.32到x86上,通过修改这部分的脚本重新实现。

       还有一些细节的地方,我记不很清楚了,如果你遇到了,希望我们能一起解决。

具体步骤:

1.修改configure脚本,在case "${host_CPU}"in后添加以下内容:
       目标体系结构)
       BUILD_ARCH_DIR= 

      INSTALL_ARCH_DIR=

       JRE_ARCH_DIR=

       CROSS_TARGET_ARCH=

2.编写configure脚本配置文件conf_bootstrap.sh,其中,--host与--build选项设置为i686-pc-linux-gnu,禁用zero和shark选项,不设置环境变量。
3.通过运行#conf_bootstrap.sh生成icedtea的makefile文件,通过#make icedtea-against-ecj生成bootstrap JDK
4. 修改OpenJDK的makefile文件,使编译过程使用交叉编译工具链,具体修改文件如下:
openjdk/corba/make/common/shared/Compiler-gcc.gmk
openjdk/jdk/make/common/shared/Compiler-gcc.gmk
openjdk/hotspot/make/linuxmakefiles/gcc.make
5. 修改OpenJDK的其他文件,使其支持目标体系结构,具体修改文件如下:
openjdk/corba/make/common/shared/Platform.gmk
openjdk/hotspot/src/os/linux/vm/os_linux.cpp
openjdk/jdk/make/common/shared/Platform.gmk
openjdk/jdk/make/javax/sound/SoundDefs.gmk
openjdk/jdk/make/jdk_generic_profile.sh
openjdk/jdk/src/share/native/com/sun/media/sound/SoundDefs.h
6.修改OpenJDK使其不使用自己生成的可执行文件:
openjdk/jdk/make/sun/xawt/Makefile

openjdk/hotspot/make/linux/Makefile
7.修改OpenJDK源码
openjdk/hotspot/src/os_cpu/linux_zero/vm/atomic_linux_zero.inline.hpp(支持目标体系结构原子操作)
8.将步骤4-7修改内容制作补丁文件,并且编写打补丁和还原的脚本文件patch.sh和cleanpatch.sh
9.打补丁#patch.sh
10.编写configure脚本配置文件conf.sh,其中--host修改为目标体系结构-unknown-linux,使能zero
11.编写pkgconfig程序需要的.pc文件
12.链接交叉工具链工具链上。设置环境变量PATH与PKG_CONFIG_PATH
13.通过运行#conf.sh重新生成icedtea的makefile文件,通过#make icedtea-against-icedtea生成final JDK

 

你可能感兴趣的:(Linux,makefile,脚本,jdk,工具,x86,path)