寫在最前面的話:建議第一次編譯jdk的朋友,查閱任何博客都不如認真讀一遍源碼中的README-builds.html
環境:macOS High Sierra(10.13.5)
編譯jdk:openjdk8
操作流程就不多寫了,README-builds.html寫的很清晰,當然,即使跟着README-builds.html操作不代表就不會遇到任何問題,但網上很多教程(mac環境的)都偏過時,並且在解決問題上本人有不同的想法,因此本文只針對編譯過程中遇到的問題以及解決問題的思考總結;
在開始之前先進行環境變量配置:
vi ~/.bash_profile
在.bash_profile文件底部插入:
# 設定語言選項,必須設置 export LANG=C # Mac平台,C編譯器不再是GCC,是clang export CC=gcc #如果想使用clang,這里把gcc換成clang即可 export CXX=g++ # 跳過clang的一些嚴格的語法檢查,不然會將N多的警告作為Error export COMPILER_WARNINGS_FATAL=false # 鏈接時使用的參數 export LFLAGS='-Xlinker -lstdc++' # 是否使用clang export USE_CLANG=false # 使用64位數據模型 export LP64=1 # 告訴編譯平台是64位,不然會按32位來編譯 export ARCH_DATA_MODEL=64 # 允許自動下載依賴 export ALLOW_DOWNLOADS=true # 並行編譯的線程數,編譯時間長,為了不影響其他工作,我選擇為2 export HOTSPOT_BUILD_JOBS=2 # 是否跳過與先前版本的比較 export SKIP_COMPARE_IMAGES=true # 是否使用預編譯頭文件,加快編譯速度 export USE_PRECOMPILED_HEADER=true # 是否使用增量編譯 export INCREMENTAL_BUILD=true # 編譯內容 export BUILD_LANGTOOLS=true export BUILD_JAXP=true export BUILD_JAXWS=true export BUILD_CORBA=true export BUILD_HOTSPOT=true export BUILD_JDK=true # 編譯版本 export SKIP_DEBUG_BUILD=true export SKIP_FASTDEBUG_BUILD=false export DEBUG_NAME=debug # 避開javaws和瀏覽器Java插件之類的部分的build export BUILD_DEPLOY=false export BUILD_INSTALL=false unset JAVA_HOME
輸入完記得執行以下命令讓剛剛的修改生效:
source ~/.bash_profile
遇到的問題:
一、在執行(在configure時,一共可以指定三種級別: release, fastdebug, slowdebug
, slowdebug
含有最豐富的調試信息,沒有這些信息,很多執行可能被優化掉,我們單步執行時,可能看不到一些變量的值。所以最好指定slowdebug
為編譯級別):
bash ./configure --with-debug-level=slowdebug--with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
的時候報:configure: error: GCC compiler is required
遇到的第一個報錯:
原因:從XCode 4.2開始,Clang已經取代GCC成為macOS的默認的編譯器:http://clang.llvm.org/get_started.html
解決過程(不想換jdk9或者裝舊版XCode ):
沒有GCC,那就安裝一個唄(可以選擇注釋掉GCC compiler 報錯的代碼,這樣就可以不必安裝gcc,並用clang編譯),不要安裝編譯器版本高於5的,因為默認啟用c++14 導致編譯中斷,我選擇安裝的是gcc4.9:
brew install gcc@4.9
安裝完需要把安裝的gcc4.9指向系統默認調的gcc:
sudo ln -s /usr/local/Cellar/gcc@4.9/4.9.4_1/bin/gcc-4.9 /usr/bin/gcc
sudo ln -s /usr/local/Cellar/gcc@4.9/4.9.4_1/bin/g++-4.9 /usr/bin/g++
這時遇到一個問題:ln: /usr/bin/gcc: Operation not permitted,搜了一下,原來mac從El Capitan開始啟用了SIP,目的是提高系統安全性,避免第三方軟件對系統級別目錄進行修改。針對以下目錄即使root用戶也有權限限制:
根據官網的提示,推薦用戶使用以下路徑代替:
網上普遍的做法是無腦粗暴的關閉SIP,不給用/usr/bin 可以用/usr/local/bin 的嘛,變通一下不就可以跳過這個報錯了:
sudo ln -s /usr/local/Cellar/gcc@4.9/4.9.4_1/bin/gcc-4.9 /usr/local/bin/gcc sudo ln -s /usr/local/Cellar/gcc@4.9/4.9.4_1/bin/g++-4.9 /usr/local/bin/g++ alias gcc='/usr/local/bin/gcc' alias g++='/usr/local/bin/g++'
配置完再運行configure,這次沒報GCC的問題了,但報了:configure: error: Could not find freetype!,缺少字體庫就裝個字體庫:
brew install freetype
安裝完再運行configure,這次返回:
表示配置沒問題了,但最好裝個ccache提速,fine,再裝個ccache:
brew install ccache
二、配置沒問題后,開始執行make all,報下面這個錯誤:
報錯:error: ordered comparison between pointer and zero ('char *' and 'int')
這個報錯是因為編譯器環境不同導致,XCode的編譯器是LLVM,而openjdk8默認使用的是GCC。因此只要把報這個錯的代碼從pointer>0改成pointer!=NULL 即可,例如:
只要把 base()>0 改成 base!=NULL 即可
三、報錯:'X11/Xlib.h' file not found
查了一下,需要安裝XQuartz。見:https://support.apple.com/zh-cn/HT201341
安裝完需要配置:
ln -s /opt/X11/include/X11 /usr/local/include/X11
接着就編譯完成了:
最后驗證一波編譯出來的jdk:
build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java -version
輸出以下內容表示編譯成功:
參考:
https://www.ibm.com/developerworks/cn/opensource/os-cn-clang/
https://gvsmirnov.ru/blog/tech/2014/02/07/building-openjdk-8-on-osx-maverick.html
https://www.jianshu.com/p/d9a1e1072f37