Windows 7下构建OpenJDK7

        介绍了本人在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就可以编译成功了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章