介绍了本人在Windows 7下编译OpenJDK的过程。
一、获取JDK源码
在http://download.java.net/openjdk/jdk7/下载最新的OpenJDK7源码openjdk-7-fcs-src-b147-27_jun_2011.zip,将其解压到E:盘目录下。
由于该openjdk的jaxp和jaxws目录下并不包含JAXP和JAX-WS的源码(它们分别可以在JAXP和JAX-WS的主页上下载),在
http://download.java.net/jaxp/1.4.5
下载jaxp-1_4_5-unittests.zip和jaxp145_01.zip,
在http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7
下载jdk7-jaxws2_2_4-b03-2011_05_27.zip
在https://java.net/downloads/jax-ws/JDK7/
下载jdk7-jaf-2010_08_19.zip
将这四个压缩包放到openjdk\java\devtools\share\jdk7-drops目录下,设置ALT_DROPS_DIR指向该目录,构建jaxp和jaxws的ANT脚本会尝试从该目录查找这些zip。
你还可以使用make ALLOW_DOWNLOADS=true来允许ANT下载需要的zip,不过这会产生太多不确定性,因此不推荐此做法。
二、配置环境
安装CYGWIN,需要手工选择安装以下工具:
文件名 |
分类 |
包 |
描述 |
ar.exe |
Devel |
binutils |
The GNU assembler, linker and binary utilities |
make.exe |
Devel |
make |
The GNU version of the 'make' utility built for CYGWIN |
m4.exe |
Interpreters |
m4 |
GNU implementation of the traditional Unix macro processor |
cpio.exe |
Utils |
cpio |
A program to manage archives of files |
gawk.exe |
Base |
awk |
Pattern-directed scanning and processing language |
file.exe |
Utils |
file |
Determines file type using 'magic' numbers |
zip.exe |
Archive |
zip |
Package and compress (archive) files |
unzip.exe |
Archive |
unzip |
Extract compressed files in a ZIP archive |
free.exe |
System |
procps |
Display amount of free and used memory in the system |
从http://ftp.gnu.org/pub/gnu/make下载make-3.82.tar.gz,在CYGWIN中解压,运行./configure && make安装。由于该make版本不支持C:/ style形式的路径,我从http://www.cmake.org/files/cygwin/make.exe下载了make.exe放到了CYGWIN的bin目录下。
安装JDK6,设置ALT_BOOTDIR,ALT_JDK_IMPORT_PATH指向该bootstrap JDK。注意不要设置JAVA_HOME和CLASSPATH。
安装ANT1.8.1,在Path中添加bin目录,设置ANT_HOME。
安装freetype-2.3.5-1-setup,设置ALT_FREETYPE_LIB_PATH 和ALT_FREETYPE_HEADERS_PATH,分别指向lib和include目录。
安装DirectX 9.0 SDK (Summer 2004),SDK的位置可以设置为ALT_DXSDK_PATH,不过通常由DirectX环境变量DXSDK_DIR就可以找到。
安装编译器VS2010,设置环境变量(在设置环境变量时,首先使用cygpath将路径转换为short路径,如cygpath –s –m D:\\Program\Files\\Microsoft\ SDKs\\Windows\\v7.0A,下面的设置直接按我当时的设置来,VS2010装在了系统D:盘和F:盘):
WINDOWSSDKDIR = D:/PROGRA~1/MICROS~4/Windows/v7.0A
INCLUDE = %WINDOWSSDKDIR%/include;F:/PROGRA~1/MICROS~1.0/VC/include;
LIB=% WINDOWSSDKDIR %/lib;F:/PROGRA~1/MICROS~1.0/VC/lib;
ALT_COMPILER_PATH= F:/PROGRA~1/MICROS~1.0/VC/bin
ALT_MSVCRNN_DLL_PATH 指向msvcr100.dll位置
Path中添加
F:/PROGRA~1/MICROS~1.0/VC/bin;%WINDOWSSDKDIR%/bin/NETFX4~1.0TO;%WINDOWSSDKDIR%/bin;F:/PROGRA~1/MICROS~1.0/Common7/IDE;D:/PROGRA~1/GnuWin32/bin;
在CYGWIN中,
echo $PATH
需要将/cygdrive/d/PROGRA~1/MICROS~4/Windows/v7.0A/bin/NETFX4~1.0TO:/cygdrive/d/PROGRA~1/MICROS~4/Windows/v7.0A/bin:移到
/usr/local/bin:/usr/bin之前,以使用VS中的工具命令进行编译。
TMP TEMP VS100COMNTOOLS VS90COMNTOOLS需要已经设置。
三、文件修改
FreeType 2.3.5版,库已经更名,不再叫freetype.dll,而是叫freetype6.dll,同时,多了一个依赖库zlib1.dll。将bin中freetype6.dll和zlib1.dll拷到lib下。
修改相关的makefile文件和java源文件:
/jdk/make/sun/font/Makefile:
126
FREETYPE_LIB =$(LIB_LOCATION)/$(LIB_PREFIX)freetype.$(LIBRARY_SUFFIX)
FREETYPE_LIB =$(LIB_LOCATION)/$(LIB_PREFIX)freetype6.$(LIBRARY_SUFFIX)
ZLIB1_LIB =$(LIB_LOCATION)/$(LIB_PREFIX)zlib1.$(LIBRARY_SUFFIX)
137,138
$(FREETYPE_LIB):
$(CP)$(FREETYPE_LIB_PATH)/$(LIB_PREFIX)freetype.$(LIBRARY_SUFFIX) $@
$(FREETYPE_LIB): $(ZLIB1_LIB)
$(CP)$(FREETYPE_LIB_PATH)/$(LIB_PREFIX)freetype6.$(LIBRARY_SUFFIX) $@
$(install-module-file)
$(ZLIB1_LIB):
$(CP) $(FREETYPE_LIB_PATH)/$(LIB_PREFIX)zlib1.$(LIBRARY_SUFFIX)$@
jdk/make/tools/freetypecheck/Makefile
41
FREETYPE_DLL =$(FREETYPE_LIB_PATH)/freetype.dll
FREETYPE_DLL =$(FREETYPE_LIB_PATH)/freetype6.dll
ZLIB1_DLL = $(FREETYPE_LIB_PATH)/zlib1.dll
72
$(CP) $(ZLIB1_DLL) $(@D)/
jdk/src/share/classes/sun/font/FontManagerNativeLibrary.java
59
System.loadLibrary("freetype");
System.loadLibrary("freetype6");
OpenJDK的部分java文件注释是中文的。javac却指定了ascii编码方式(添加了参数-encoding ascii)。遇到包含中文的java文件,javac会报错。因此需要将-encoding编译选项去掉。
/corba/make/common/shared/Defs-java.gmk
133
JAVACFLAGS += -encoding ascii
# JAVACFLAGS += -encoding ascii
194
BOOT_JAVACFLAGS += -encoding ascii -source$(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION)
BOOT_JAVACFLAGS += -source $(BOOT_SOURCE_LANGUAGE_VERSION)-target $(BOOT_TARGET_CLASS_VERSION)
/jdk/make/common/shared/Defs-java.gmk
134
JAVACFLAGS += -encoding ascii
# JAVACFLAGS += -encoding ascii
212
BOOT_JAVACFLAGS += -encoding ascii -source$(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION)
BOOT_JAVACFLAGS += -source$(BOOT_SOURCE_LANGUAGE_VERSION) -target $(BOOT_TARGET_CLASS_VERSION)
/hotspot/make/windows/makefiles/rules.make
48
JAVAC_FLAGS=-g -encoding ascii
JAVAC_FLAGS=-g
OpenJDK启用了VC的“将警告视为错误”(warnings as errors)选项。如果链接器生成警告,/WX 将不会生成任何输出文件。
/hotspot/make/windows/makefiles/compile.make
53
CPP_FLAGS=/nologo /W3 /WX
CPP_FLAGS=/nologo /W3 /WX-
/hotspot/src/share/tools/hsdis/Makefile
92
CFLAGS += /nologo /MD /W3 /WX /O2 /Fo$(@:.dll=.obj) /Gi-
CFLAGS += /nologo /MD /W3 /WX- /O2 /Fo$(@:.dll=.obj) /Gi-
OpenJDK分析VC版本是按英文版本来进行的,对于中文版VS2010需要修改。
/hotspot/make/windows/get_msc_ver.sh
61
MSC_VER_RAW=`cl 2>&1 |"$HEAD" -n 1 | "$SED" 's/.*Version[\]*\([0-9][0-9.]*\).*/\1/'`
if [ "${ALT_MSC_VER_RAW}" !="" ] ; then
MSC_VER_RAW=${ALT_MSC_VER_RAW}
else
MSC_VER_RAW=`cl 2>&1 |"$HEAD" -n 1 | "$SED" 's/.*Version[\]*\([0-9][0-9.]*\).*/\1/'`
fi
/jdk/make/common/shared/Compiler-msvc.gmk
49
CC_VER := $(shell $(CC) 2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/'| $(NAWK) '{print $$2}')
ifdef ALT_CC_VER
CC_VER := $(ALT_CC_VER)
else
CC_VER := $(shell $(CC)2>&1 | $(HEAD) -n 1 | $(SED) 's/.*\(Version.*\)/\1/' | $(NAWK) '{print$$2}')
endif
设置ALT_CC_VER和ALT_MSC_VER_RAW变量
ALT_CC_VER = 16.00.30319.01
ALT_MSC_VER_RAW = 16.00.30319.01
四、编译
进入openjdk根目录,执行“make sanity”检查我们前面所做的设置是否正确,如果看到“Sanity check passed.”说明检查过程通过,接下来输入“make”执行整个Makefile,等待不到一个小时的时间,JDK就可以编译成功了。