mac下編譯openjdk8?so easy!

寫在最前面的話:建議第一次編譯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, slowdebugslowdebug 含有最豐富的調試信息,沒有這些信息,不少執行可能被優化掉,咱們單步執行時,可能看不到一些變量的值。因此最好指定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

https://www.jianshu.com/p/d9a1e1072f37

相關文章
相關標籤/搜索