介紹了本人在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就可以編譯成功了。