mac下編譯openjdk8?so easy!


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM