系统: 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查看是否异常。