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就可以編譯成功了。



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