1. 程式人生 > >如何在macOS中編譯OpenJDK10原始碼

如何在macOS中編譯OpenJDK10原始碼

這段時間準備開始學習《深入理解Java虛擬機器》,先搭個可以除錯的環境出來。按照書中的配置,感覺有許多問題的,這篇文章就用來記錄成功編譯OpenJDK原始碼的一些過程,以及其中的一些配置。

配置資訊綜述

系統版本:macOS 10.14 Beta
這裡寫圖片描述
OpenJDK版本:jdk-10+46,TAG連結zip包下載連結

何處下載OpenJDK原始碼

地方有兩個,

其一,是書中所說的通過Mercurial程式碼管理版本管理工具從Repository中直接獲取原始碼(Repository為http://hg.openjdk.java.net),這種方法不是特別爽,聽說有速度問題;

自動檢測依賴

進入解壓後的資料夾,然後執行bash ./configure。這是一項檢測所需要的依賴是否安裝好了的指令碼。只需要根據其提供的錯誤提示,將相應錯誤修改完成即可。

前後遇到的問題有:

  1. gcc版本問題。因為jdk8需要用到gcc,但是macOS中的gcc已經連結到clang上了。需要重新裝gcc,並連結。但是可以選擇編譯jdk9或jdk10,聽說這兩個是可以用clang編譯。jdk9沒試,jdk10是的。下載了jdk10的原始碼後,執行configure就沒問題了。太震驚了,現在jdk都已經到12了。

  2. 提示xcodebuild相關的錯誤。可能還是與之前升級了系統有關。其詳細的錯誤資訊如下:

configure: error: No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK

於是運行了一下xcodebuild,錯誤資訊如下:

xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools'
is a command line tools instance

解決方案:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
Xcode若有後續版本,可能需要根據實際情況去做些修改。

3.沒有freetype。提示使用brew安裝:brew install freetype。但是安裝後,並沒有再次執行時,仍然出現相同的提示。找了挺多方法,包括看這些指令碼是怎麼寫的,就是想知道是怎麼找的,然後看它為什麼會輸出”Could not find freetype!…..”。不夠收益不大,並沒有找到解決辦法。這時候看了看doc/building.html,內容如下:

If a required library is not detected by configure, you need to provide the path to it. There are two forms of the configure arguments to point to an external library: --with-<LIB>=<path> or --with-<LIB>-include=<path to include> --with-<LIB>-lib=<path to lib>.

  1. configure的時候一定要帶上–disable-warnings-as-errors這個引數,否則編譯過程中的warning也會中斷編譯的程序,實際上這些warning並不影響編譯後的目標JDK的執行

    所以後面我執行的configure如下:
    ./configure --with-freetype-include=/usr/local/Cellar/freetype/2.9.1/include --with-freetype-lib=/usr/local/Cellar/freetype/2.9.1/lib --disable-warnings-as-errors
    至此,自動檢測的錯誤全部解決。

開始編譯:

使用make時,其後面可用的引數如下:

Apart from the default target, here are some common make targets:

hotspot - Build all of hotspot (but only hotspot)
hotspot-<variant> - Build just the specified jvm variant
images or product-images - Build the JRE and JDK images
docs or docs-image - Build the documentation image
test-image - Build the test image
all or all-images - Build all images (product, docs and test)
bootcycle-images - Build images twice, second time with newly built JDK (good for testing)
clean - Remove all files generated by make, but not those generated by configure
dist-clean - Remove all files, including configuratio

這裡使用了images。

驗證

編譯完成後,驗證編譯結果如下:
這裡寫圖片描述