A.5 进行编译

现在需要下载的编译环境和依赖项目都准备齐全了,最后我们还需要对系统做一些设置以便编译能够顺利通过。

首先执行VS2010中的VCVARS32.BAT,这个批处理文件的目的主要是设置INCLUDE、LIB和PATH这几个环境变量,如果和笔者一样只是下载了编译器的话则需要手工设置它们,各个环境变量的设置值可以参考下面给出的代码清单A-1中的内容。批处理运行完之后建立“ALT_COMPILER_PATH”环境变量让Makefile知道在哪里可以找到编译器。

再建立“ALT_BOOTDIR”和“ALT_JDK_IMPORT_PATH”两个环境变量指向前面提到的JDK 1.6的安装目录。建立“ANT_HOME”指向Apache ANT的安装目录。建立的环境变量很多,为了避免遗漏,笔者写了一个批处理文件以供读者参考,如代码清单A-1所示。

代码清单A-1 环境变量设置


SET ALT_BOOTDIR=D:/_DevSpace/JDK 1.6.0_21

SET ALT_BINARY_PLUGS_PATH=D:/jdkBuild/jdk7plug/openjdk-binary-plugs

SET ALT_JDK_IMPORT_PATH=D:/_DevSpace/JDK 1.6.0_21

SET ANT_HOME=D:/jdkBuild/apache-ant-1.7.0

SET ALT_MSVCRNN_DLL_PATH=D:/jdkBuild/msvcr100

SET ALT_DXSDK_PATH=D:/jdkBuild/msdxsdk

SET ALT_COMPILER_PATH=D:/jdkBuild/vcpp2010.x86/bin

SET ALT_FREETYPE_HEADERS_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/include

SET ALT_FREETYPE_LIB_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/bin

SET INCLUDE=D:/jdkBuild/vcpp2010.x86/include;D:/jdkBuild/vcpp2010.x86/sdk/Include;%INCLUDE%

SET LIB=D:/jdkBuild/vcpp2010.x86/lib;D:/jdkBuild/vcpp2010.x86/sdk/Lib;%LIB%

SET LIBPATH=D:/jdkBuild/vcpp2010.x86/lib;%LIB%

SET PATH=D:/jdkBuild/vcpp2010.x86/bin;D:/jdkBuild/vcpp2010.x86/dll/x86;D:/Software/OpenSource/cygwin/bin;%ALT_FREETYPE_LIB_PATH%;%PATH%


最后还需要进行两项调整,虽然,官方文档没有说明这两项,但是必须要做完才能保证编译过程的顺利通过:一项是取消环境变量JAVA_HOME,这点很简单;另外一项是尽量在英文的操作系统上编译,如果不能在英文的系统上编译就把系统的文字格式调整为“英语(美国)”,在控制面板-区域和语言选项的第一个页签中可以设置。如果这个设置还不能更改就建立一个“BUILD_CORBA”的环境变量,将值设置为false,取消编译CORBA部分,否则Java IDL(idlj.exe)为*.idl文件生成CORBA适配器代码的时候会产生中文注释,而这些中文注释会因为字符集的问题而导致编译失败。

完成了上述的准备工作之后,我们终于可以开始编译了。进入控制台(Cmd.exe)后运行刚才准备好的设置环境变量的批处理文件,然后输入bash进入Bourne Again Shell环境(sh或ksh也可以)。如果JDK的安装源码中存在“jdk_generic_profile.sh”这个Shell脚本,先执行它,笔者下载的OpenJDK 7 B121版没有这个文件了,所以直接输入make sanity来检查我们前面所做的设置是否全部正确。如果一切顺利,那么几秒钟之后会有类似代码清单A-2所示的输出。

代码清单A-2 make sanity检查


D:\jdkBuild\openjdk7>bash

bash-3.2$make sanity

cygwin warning:

MS-DOS style path detected:C:/Windows/system32/wscript.exe

Preferred POSIX equivalent is:/cygdrive/c/Windows/system32/wscript.exe

CYGWIN environment variable option"nodosfilewarning"turns off this warning.

Consult the user's guide for more details about POSIX paths:

http://cygwin.com/cygwin-ug-net/using.html#using-pathnames

(cd./jdk/make&&\

……因篇幅关系,中间省略了大量的输出内容……

OpenJDK-specific settings:

FREETYPE_HEADERS_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/include

ALT_FREETYPE_HEADERS_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/include

FREETYPE_LIB_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/bin

ALT_FREETYPE_LIB_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/bin

OPENJDK Import Binary Plug Settings:

IMPORT_BINARY_PLUGS=true

BINARY_PLUGS_JARFILE=D:/jdkBuild/jdk7plug/openjdk-binary-plugs/jre/lib/rt-closed.jar

ALT_BINARY_PLUGS_JARFILE=

BINARY_PLUGS_PATH=D:/jdkBuild/jdk7plug/openjdk-binary-plugs

ALT_BINARY_PLUGS_PATH=D:/jdkBuild/jdk7plug/openjdk-binary-plugs

BUILD_BINARY_PLUGS_PATH=J:/re/jdk/1.7.0/promoted/latest/openjdk/binaryplugs

ALT_BUILD_BINARY_PLUGS_PATH=

PLUG_LIBRARY_NAMES=

Previous JDK Settings:

PREVIOUS_RELEASE_PATH=USING-PREVIOUS_RELEASE_IMAGE

ALT_PREVIOUS_RELEASE_PATH=

PREVIOUS_JDK_VERSION=1.6.0

ALT_PREVIOUS_JDK_VERSION=

PREVIOUS_JDK_FILE=

ALT_PREVIOUS_JDK_FILE=

PREVIOUS_JRE_FILE=

ALT_PREVIOUS_JRE_FILE=

PREVIOUS_RELEASE_IMAGE=D:/_DevSpace/JDK 1.6.0_21

ALT_PREVIOUS_RELEASE_IMAGE=

Sanity check passed.


Makefile的Sanity检查过程输出了编译所需的所有环境变量,如果看到“Sanity check passed.”,说明检查过程通过了,可以输入“make”执行整个Makefile,笔者使用Core i5/4GB RAM的机器编译整个JDK大概需要半个多小时。如果失败则需要根据系统输出的失败原因,回头再检查一下对应的设置。并且最好在下一次编译之前先执行“make clean”来清理掉上次编译遗留的文件。

编译完成之后,打开OpenJDK源码下的build目录,看看是不是已经有一个编译好的JDK在那里等着了?执行一下“java-version”,看到以自己机器命名的JDK了吧,很有成就感吧!