本人和書上的作者一樣,編譯的是openjdk 7. 過程中也是遇到了不少坑,查閱了很多資料,嘗試了使用jdk8,jdk7,jdk6,最終使用jdk7u71編譯成功,下面紀錄一下流程,以便他人能夠借鑑。
一、準備工作:
1.安裝Xcode,直接在App Store上下載即可,還有命令行工具
2.下載ant,Mac會自帶ant,在/usr/local/Cellar/ant/1.9.7,如果沒有就去官網下一個,我是自己下了一個。然後,因爲jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj和jdk/make/java/jobjc/Makefile文件中ant路徑寫死爲/usr/bin/ant,所以要在usr/bin下面做一個軟連接,被坑了好久:
ln -s /Users/jiangchao08/Downloads/apache-ant-1.9.7/bin/ant /usr/bin/ant
3.下載openjdk 7的zip文件,然後解壓縮,地址:https://jdk7.java.net/source.html
4.下載oracle jdk 7,我下載的是7u71 版本,地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
5.安裝XQuartz
6.不要設置JAVA_HOME、CLASSPATH環境變量,可以在最後一行用unset JAVA_HOME、unset CLASSPATH來註釋掉
二、環境變量設置:
下面是我的環境變量的配置,在~/.bash_profile文件裏配置;
export M2_HOME=/Users/jiangchao08/Downloads/apache-maven-3.3.9
export ANT_HOME=/Users/jiangchao08/Downloads/apache-ant-1.9.7
export PATH=$PATH:$M2_HOME/bin:$ANT_HOME/bin:/usr/bin
export ALT_BOOTDIR=/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home
export LANG=C
export COMPILER_WARNINGS_FATAL=false
export CC=clang
export COMPILER_WARNINGS_FATAL=false
export USE_CLANG=true
export LP64=1
export BUILD_DEPLOY=false
export ARCH_DATA_MODEL=64
export LFLAGS='-Xlinker -lc++ -lstdc++'
export HOTSPOT_BUILD_JOBS=8
export USE_PRECOMPILED_HEADER=true
export SHOW_ALL_WARNINGS=false
export INCREMENTAL_BUILD=true
export SKIP_DEBUG_BUILD=false
export SKIP_FASTDEBUG_BUILD=true
unset JAVA_HOME
在正式編譯之前,先make sanity一下,如何成功,再正式編譯在openjdk路徑下使用命令: make debug_build
三、遇到的問題:
因爲我嘗試了很多版本的jdk,在這裏我將所有出現的bug都紀錄下來,如果你編譯的是openjdk7,那麼非常不建議使用oracle jdk8 ,因爲最後會出現很多的類找不到,或者方法找不到,畢竟openjdk7已經好多年了。所以推薦使用oracle jdk6和oracle jdk7來進行編譯openjdk 7:
1.ERROR: The Compiler version is undefined.
ERROR: FreeType version 2.3.0 or higher is required.
(1)第一個error,是因爲現在Xcode裏面沒有自帶gcc,所以進行鏈接:
sudo ln -s gcc /Applications/Xcode.app/Contents/Developer/usr/bin/llvm-gcc
(2)第二個error,是因爲FreeType版本太低,所以我是直接安裝了XQuartz
2. BUILD FAILED
/home/xlf/jdk7u-dev/langtools/make/build.xml:452: The following error occurred while executing this line:
/home/xlf/jdk7u-dev/langtools/make/build.xml:795: Compile failed; see the compiler error output for details.
# 具體報錯 openjdk/build/../build-debug/corba/gensrc/org/omg/PortableServer/AdapterActivatorOperations.java:8: ´íÎó: ±àÂëasciiµÄ ²»¿ÉÓ³Éä×Ö·û * 2016??7??12?? ?????? ????05??39??22?? CST # 解決辦法 find build-debug/corba/gensrc/org/ -name '*.java' | while read p; do native2ascii -encoding UTF-8 $p > tmpj; mv tmpj $p; done export _JAVA_OPTIONS=-Dfile.encoding=ASCII4.clang不支持參數
-fpch-deps
# 具體報錯 clang: error: unknown argument: '-fpch-deps' # 解決方法 1. 首先查找對應的配置文件 find . -type f ! -name "*.java" | xargs grep -r "\-fpch\-deps" 1.1 匹配的查找結果如下(Mac來源於BSD,選擇BSD) ./hotspot/make/bsd/makefiles/gcc.make:DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) ./hotspot/make/linux/makefiles/gcc.make:DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) ./hotspot/make/solaris/makefiles/gcc.make:DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) 2 修改hotspot/make/bsd/makefiles/gcc.make 2.1 註釋216-218行 # Flags for generating make dependency flags. # ifneq ("${CC_VER_MAJOR}", "2") # DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) # endif 2.2 在218行下添加下面代碼 DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d) ifeq ($(USE_CLANG),) ifneq ($(CC_VER_MAJOR), 2) DEPFLAGS += -fpch-deps endif endif5.
形參默認值
問題
# 具體報錯 openjdk/hotspot/src/share/vm/code/relocInfo.hpp:374:27: error: friend declaration specifying a default argument must be a definition inline friend relocInfo prefix_relocInfo(int datalen = 0); openjdk/hotspot/src/share/vm/code/relocInfo.hpp:469:18: error: friend declaration specifying a default argument must be the only declaration inline relocInfo prefix_relocInfo(int datalen) { openjdk/hotspot/src/share/vm/code/relocInfo.hpp:470:21: error: 'fits_into_immediate' is a protected member of 'reloc Info' assert(relocInfo::fits_into_immediate(datalen), "datalen in limits"); openjdk/hotspot/src/share/vm/code/relocInfo.hpp:471:59: error: 'RAW_BITS' is a protected member of 'relocInfo' return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen); openjdk/hotspot/src/share/vm/code/relocInfo.hpp:471:10: error: calling a protected constructor of class 'relocInfo' return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen); # 解決辦法 # 修改relocInfo.hpp(路徑:hotspot/src/share/vm/code/relocInfo.hpp) 修改374行 inline friend relocInfo prefix_relocInfo(int datalen); 修改469行 inline relocInfo prefix_relocInfo(int datalen = 0) { assert(relocInfo::fits_into_immediate(datalen), "datalen in limits"); return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen); }
十年
問題
# 具體報錯 Error: time is more than 10 years from present: 1136059200000 java.lang.RuntimeException: time is more than 10 years from present: 1136059200000 at build.tools.generatecurrencydata.GenerateCurrencyData.makeSpecialCaseEntry(GenerateCurrencyData.java:285) at build.tools.generatecurrencydata.GenerateCurrencyData.buildMainAndSpecialCaseTables(GenerateCurrencyData.java:225) at build.tools.generatecurrencydata.GenerateCurrencyData.main(GenerateCurrencyData.java:154) # 解決辦法 # 修改CurrencyData.properties(路徑:jdk/src/share/classes/java/util/CurrencyData.properties) 修改108行 AZ=AZM;2009-12-31-20-00-00;AZN 修改381行 MZ=MZM;2009-06-30-22-00-00;MZN 修改443行 RO=ROL;2009-06-30-21-00-00;RON 修改535行 TR=TRL;2009-12-31-22-00-00;TRY 修改561行 VE=VEB;2009-01-01-04-00-00;VEF7.
非空函數不返回值
的問題一
# 具體報錯 ../../../src/solaris/native/java/net/net_util_md.c:117:9: error: non-void function 'getDefaultScopeID' should return a value [-Wreturn-type] CHECK_NULL(c); ^ ../../../src/share/native/java/net/net_util.h:45:40: note: expanded from macro 'CHECK_NULL' #define CHECK_NULL(x) if ((x) == NULL) return; ^ ../../../src/solaris/native/java/net/net_util_md.c:119:9: error: non-void function 'getDefaultScopeID' should return a value [-Wreturn-type] CHECK_NULL(c); ^ ../../../src/share/native/java/net/net_util.h:45:40: note: expanded from macro 'CHECK_NULL' #define CHECK_NULL(x) if ((x) == NULL) return; # 解決辦法 # 修改net_util_md.c(路徑:jdk/src/solaris/native/java/net/net_util_md.c) 修改117、119行 CHECK_NULL_RETURN(c , 0);8.
權限
問題
# 具體報錯 Permission denied - ./src/core/PrimitiveCoder.hs (Errno::EACCES) # 解決辦法 chmod 755 jdk/src/macosx/native/jobjc/src/core/PrimitiveCoder.hs9.clang不支持
GC
的問題
# 具體報錯 clang: error: garbage collection is no longer supported # 解決辦法 1. 首先查找相應的配置文件 find . -type f ! -name "*.log" | xargs grep -r "GCC_ENABLE_OBJC_GC" 1.1 匹配的查找結果如下 nary file ./build-debug/JObjC.dst/dgph matches ./jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj: GCC_ENABLE_OBJC_GC = supported; ./jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj: GCC_ENABLE_OBJC_GC = supported; 2. 修改project.pbxproj(路徑:./jdk/src/macosx/native/jobjc/JObjC.xcodeproj/project.pbxproj) 修改705、713行 GCC_ENABLE_OBJC_GC = "";
返回值大於返回類型精度
的問題
# 具體報錯 openjdk/build-debug/JObjC.build/src/jobjc/com/apple/jobjc/appkit/AppKitFramework.java:355: ????? public final float NSEventDurationForever(){ return 1.797693134862316E+308f; } # 解決辦法 1. 修改bridgesupport.gmk(路徑:jdk/src/macosx/native/jobjc/bridgesupport.gmk) 修改54行 all: 2. 修改AppKitFull.bridgesupport(路徑:build-debug/stable_bridge_metadata/AppKitFull.bridgesupport) 修改1485行 <enum name='NSEventDurationForever' value='3.40282E+38'/> 3. 修改AppKitFramework.java(路徑:build-debug/JObjC.build/src/jobjc/com/apple/jobjc/appkit/AppKitFramework.java) 修改355行 public final double NSEventDurationForever(){ return 3.40282E+38d; }
非空函數不返回值
的問題二
# 具體報錯 openjdk/jdk/src/macosx/native/sun/awt/AWTEvent.m:385:24: error: non-void function 'NsGetDeadKeyChar' should return a value [-Wreturn-type] if (uchr == nil) { return; } # 解決辦法 # 修改AWTEvent.m(路徑:jdk/src/macosx/native/sun/awt/AWTEvent.m) 修改385行 if (uchr == nil) { return 0; }
類似這幾種:
equality comparison with extraneous parentheses
[-Werror,-Wparentheses-equality]
'this' pointer cannot be null in well-defined C++ code; pointer may be
assumed to always convert to true [-Werror,-Wundefined-bool-conversion]
'&&' within '||' [-Werror,-Wlogical-op-parentheses]
因爲一開始沒有在環境變量面去設置,解決方法:在環境變量裏面加上:export COMPILER_WARNINGS_FATAL=false
13.test_gamma報錯:
沒找到原因,個人認爲由於我原來的JDK爲oracle JDK7,而編譯出的爲OpenJDK7,所以導致了這個問題;
我採用的做法是註釋build/macosx-x86_64-debug/hotspot/outputdir/bsd_amd64_compiler2/jvmg/test_gamma中的測試代碼,在最後一行
#./${GAMMA_PROG} -Xbatch -showversion Queens < /dev/null
14.找不到相應的類庫和方法
Error occurred during initialization of VM
Unable to load native library: dlopen(/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/libjava.dylib, 1): Symbol not found: __cg_jpeg_resync_to_restart
Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib
Expected in: /Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/jre/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/libTIFF.dylib
和
Exception in thread "main" java.lang.NoSuchMethodError: sun.util.calendar.ZoneInfoFile.getFileName(Ljava/lang/String;)Ljava/lang/String;
at build.tools.javazic.Gen.processZoneinfo(Gen.java:60)
at build.tools.javazic.Main.compile(Main.java:120)
at build.tools.javazic.Main.main(Main.java:151)
解決方法:將oracle jdk 8換成oracle jdk 7
15.還有一個bug是類似提示bash/sh: ant : /usr/bin/ant no found,記不清了
解決方法:回到最上面看,就是準備工作步驟中的2,在/usr/bin/下面做一個ant的軟連接
16.奇怪的錯誤
openjdk/jdk/src/macosx/native/jobjc/build.xml:187: exec returned: 1
解決方法:將oracle jdk6換成了oracle jdk7
最後成功用oracle jdk7u71版本編譯了openjdk 7,一路艱辛啊~~~,附編譯成功的截圖:
參考文章:
《Mac編譯OpenJDK7(8)和Eclipse調試Hotspot》http://blog.csdn.net/csujiangyu/article/details/52045443#reply
《os x環境編譯jdk7》http://www.jianshu.com/p/a7ac81d38bb1
oracle jdk 7的下載地址:http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html