系统: WindowsXP SP3
一、软件安装
我所安装的软件版本下载地址: http://pan.baidu.com/s/1gzeV0 密码: 2pb4
注意所有的软件安装路径不要有空格,如果已经安装的软件路径有空格的可以使用junction.exe 工具,在cmd下cd到junction目录执行:junction D:\BuildOpenJDK\MicrosoftSDKs “C:\Program Files\Microsoft SDKs”
1、OpenJDK7源码
openjdk-7-fcs-src-b147-27_jun_2011.zip 下载地址
http://download.java.net/openjdk/jdk7/ 密码: 2pb4
2、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
将这4个压缩包放到D:/BuildOpenJDK/jdk7-drops目录下,设置set ALT_DROPS_DIR=该目录,构建jaxp和jaxws的ANT脚本会尝试从该目录查找这些zip。
3、cygwin-2.85,需手动安装一下包
文件名 |
分类 |
包 |
描述 |
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 |
另外还需搜索安装:libintl3,
下载cygintl-3.dll放到cygwin安装目录bin下。
注意:安装的make.exe为3.82版,导致编译不能成功,需要从cygwin网站上下载3.80版本的make.exe放到bin目录下,将原来的覆盖。
4、Sun JDK 1.6 u14以上
5、Microsoft DirecxX SDK(sum2004)
建立ALT_DXSDK_PATH环境变量,指向安装目录。
6、Microsoft Visual Studio C++ 2010 (正式版或者Express版均可)
junction D:\BuildOpenJDK\MicrosoftSDKs “C:\Program Files\Microsoft SDKs”
建立WINDOWSSDKDIR环境变量,指向D:\BuildOpenJDK\MicrosoftSDKs\Windows\v7.0A 路径
msvcr100.dll,并建立ALT_MSVCRNN_DLL_PATH 环境变量指向该文件所在的目录。
7、Apache Ant 1.7.1以上
8、Freetype-2.3.5-1
建立ALT_FREETYPE_LIB_PATH 和ALT_FREETYPE_HEADERS_PATH环境变量,分别指向freetype安装目录下的lib目录和include目录。
将bin目录下的freetype6.dll和zlib1.dll复制到lib目录下。
二、环境变量
用批处理来设置环境变量,将以下命令复制到cmd窗口下执行,该环境变量的设置只对当前窗口生效,然后运行bash命令,在bash中执行:echo $PATH,查看环境变量是否设置正确。
SET JAVA_HOME=
SET classpath=
set ALT_BOOTDIR=D:/BuildOpenJDK/ProgramFiles/Java/jdk1.6.0_20
set ALT_CC_VER=16.00.30319.01
set ALT_MSC_VER_RAW=16.00.30319.01
set ALT_COMPILER_PATH=D:/VS2010/VC/bin
set ALT_DROPS_DIR=D:/BuildOpenJDK/jdk7-drops
set ALT_DXSDK_PATH=D:/BuildOpenJDK/DirectX9SDKSum2004
set ALT_FREETYPE_HEADERS_PATH=D:/BuildOpenJDK/FreeType/GnuWin32/include
set ALT_FREETYPE_LIB_PATH=D:/BuildOpenJDK/FreeType/GnuWin32/bin
set ALT_JDK_IMPORT_PATH=%ALT_BOOTDIR%
set ALT_MSVCRNN_DLL_PATH=D:/BuildOpenJDK/msvcr100
set ALT_MSVCRT_DLL_PATH=D:/BuildOpenJDK/msvcr100
set ALT_WINDOWSSDKDIR=D:/BuildOpenJDK/MicrosoftSDKs/Windows/v7.0A
set ANT_HOME=D:/BuildOpenJDK/apache-ant-1.9.2
set BUILD_CORBA=false
set COMPILER_VERSION=VS2010
set DXSDK_DIR=D:/BuildOpenJDK/DirectX9SDKSum2004/
set INCLUDE=D:/VS2010/VC/include;D:/BuildOpenJDK/MicrosoftSDKs/Windows/v7.0A/Include
set LANG=C
set LC_ALL=C
set LIB=D:/VS2010/VC/lib;D:/BuildOpenJDK/MicrosoftSDKs/Windows/v7.0A/Lib
set PATH=D:/BuildOpenJDK/MicrosoftSDKs/NETFX4.0Tools;D:/BuildOpenJDK/MicrosoftSDKs/Windows/v7.0A/bin;D:/VS2010/VC/bin;D:/VS2010/Common7/IDE;D:/cygwin/bin;%SystemRoot%/system32;%SystemRoot%;%SystemRoot%/System32/Wbem;%ANT_HOME%/bin;%ALT_FREETYPE_LIB_PATH%
set RC=D:/BuildOpenJDK/MicrosoftSDKs/Windows/v7.0A
set REBASE=D:/BuildOpenJDK/MicrosoftSDKs/Windows/v7.0A
set WINDOWSSDKDIR=D:/BuildOpenJDK/MicrosoftSDKs/Windows/v7.0A
路径中的分割符采用斜线(/)而不是反斜线(\)。
cygwin的bin目录在PATH中的位置应该在系统的System32目录之前(脚本中会用到cygwin的find命令,否则会用windows的find命令导致出错)。而VC++的bin目录应该在cygwin之前(同样的原因,编译需要用到的是VC++中的link.exe)。
三、Openjdk中的文件修改
文件: /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"); 文件:/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- 文件:/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 第48行 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
四、编译
进入openjdk目录进行编译了。首先在设置环境变量的cmd窗口输入bash进入cygwin环境,然后输入make sanity进行环境变量检查,如果回显输出make sanity pass就可以继续,如果出错那么需要回头检查一下之前的设置是否正确。最后输入make进行编译即可。当然还有可能出错,那就要仔细查看错误输出再尝试解决了。
五、问题
1、ERROR: Cannot find the RC utility from path:
This is normally obtained from the WINDOWSSDKDIR.
查看环境变量WINDOWSSDKDIR 对应的路径是否有空格。
2、NMAKE : fatal error U1077: 'if' : return code '0x1'
a、查看环境变量PATH中的环境变量是否都正确,且路径不能重复配置。
b、操作系统或者VS安装问题。可以自己写一个简单的makefile文件如:
all:
@echo test...
保存为t.mak,然后在doc下设置set PATH=D:/VS2010/VC/bin;
执行nmake t.mak查看是否异常。