寫在最前面的話:建議第一次編譯jdk的朋友,查閱任何博客都不如認真讀一遍源碼中的README-builds.htmlhtml
環境:macOS High Sierra(10.13.5)java
編譯jdk:openjdk8c++
操做流程就很少寫了,README-builds.html寫的很清晰,固然,即便跟着README-builds.html操做不表明就不會遇到任何問題,但網上不少教程(mac環境的)都偏過期,而且在解決問題上本人有不一樣的想法,所以本文只針對編譯過程當中遇到的問題以及解決問題的思考總結;macos
在開始以前先進行環境變量配置:api
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
遇到的問題:bash
1、在執行(在configure時,一共能夠指定三種級別: release, fastdebug, slowdebug
, slowdebug
含有最豐富的調試信息,沒有這些信息,不少執行可能被優化掉,咱們單步執行時,可能看不到一些變量的值。因此最好指定slowdebug
爲編譯級別):app
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
2、配置沒問題後,開始執行make all,報下面這個錯誤:
報錯:error: ordered comparison between pointer and zero ('char *' and 'int')
這個報錯是由於編譯器環境不一樣致使,XCode的編譯器是LLVM,而openjdk8默認使用的是GCC。所以只要把報這個錯的代碼從pointer>0改爲pointer!=NULL 便可,例如:
只要把 base()>0 改爲 base!=NULL 便可
3、報錯:'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