Win10下編譯OpenJDK8
編譯環境
- Windows10專業版64位;
編譯前準備
Tip: 以下軟體的安裝和解壓目錄儘量不要包含中文或空格,不然可能會出現問題
- 安裝 Visual Studio 2010 Professional
在windows下編譯JDK需要使用Visual Studio 2010 Professional,推薦下載地址:https://msdn.itellyou.cn/
最好下載英文版的IDE,不然可能會出現問題,下載完成後只用勾選安裝C++部分就行
- 準備OpenJDK8
首先下載OpenJDK8,推薦下載地址:https://download.java.net/openjdk/jdk8 , 下載完成後解壓
- 編譯JDK環境安裝(如果已經安裝,跳過此部)
編譯OpenJDK需要本機先安裝上JDK作為編譯JDK,而且該編譯JDK的版本必須要使用前一個版本的JDK,編譯OpenJDK8需要安裝JDK7 Update 7 以後的版本。
首先下載Oracle JDK7 並解壓,推薦下載地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
下載完成後配置JDK環境變數(JAVA_HOME、Path、classpath)
- 安裝Cygwin
編譯JDK需要使用到Unix和Linux上的一些工具軟體,Cygwin可以在Windows上執行這些系統上的軟體。
推薦下載地址:http://www.cygwin.com/
下載最新版的Cygwin後安裝,由於預設的安裝只會安裝一些必要的軟體,所以安裝過程中需要選擇安裝一些額外的包,需要的包如下圖:
如果已經安裝完了Cygwin軟體後,想要繼續安裝其他的軟體包,可以再次執行Cygwin的安裝程式,在過程中確保其選中了本地的Cygwin安裝目錄,一直點選下一步後會出現選擇安裝包的介面。
- 準備FreeType-2.7
編譯JDK需要用到FreeType,它是一個字型渲染庫,官方文件中沒有提及,但它是必須的。
最好使用2.7版本的,我先前使用較新版本的會出現問題。
推薦下載地址:https://www.freetype.org/ ,下載完成後解壓: https://www.freetype.org/download.html
執行Visual Studio 2010,依次點選 File -> Open -> Project/Solution
選擇開啟 freetype-2.7\builds\windows\vc2010\freetype.sln 檔案
選中專案後右擊選擇Properties,彈出視窗後操作如下圖:
點選應用後再點選確定關閉視窗,右擊專案,點選 Build 按鈕後成功編譯出lib檔案。
再次右擊專案,點選 Properties按鈕,彈出視窗。
點選應用後再點選確定關閉視窗;右擊專案,點選 Build 按鈕後成功編譯出dll檔案。
在 freetype-2.7/ 目錄下新建 lib 目錄
將 freetype-2.7\objs\vc2010\x64\ 目錄下的 freetype.lib 和 freetype.dll 兩個檔案拷貝到lib目錄下
開始編譯
- 生成編譯配置指令碼
執行Cygwin,cd 進入OpenJDK8的根目錄
Tip :Cygwin中的目錄可以直接用Windows的目錄標記方式,比如:‘D:\DirName\file.txt’,單必須使用單引號包圍,也可以使用類似linux的形式:如: /cygdrive/d/DirName/file.txt,推薦使用後一種方式相容性較好。
輸入如下命令:
./configure --with-freetype=你本機路徑/freetype-2.7/ --with-target-bits=64 --enable-debug
注意以上的freetype路徑替換成你本機上的路徑,執行成功後顯示如下:
- 編譯JDK
Cygwin切換到Open JDK根目錄下,執行如下命令
make all
命令執行後會開始編譯,編譯過程可能比較久,具體看機器效能,編譯成功後顯示如下:
- 驗證編譯結果
在這裡僅簡單驗證一下,官方說需要用jtreg來進行迴歸測試,但該測試比較麻煩和耗時所以就先忽略執行 cmd.exe ,進入目錄 openjdk8\build\windows-x86_64-normal-server-fastdebug\jdk\bin,依次輸入命令:
javac -version
java -version
失敗問題處理
- 提示cygwin太老,但使用的cygwin確實是1.7版本以後的版本,提示如下如圖:
這是由於OpenJDK8自帶的生成配置的指令碼的問題。
文字編輯器開啟OpenJDK目錄下的 openjdk8\common\autoconf\generated-configure.sh 這個檔案搜尋上面的提示文字“Your cygwin is too old在這裡插入圖片描述,將if條件語句註釋掉
- 編譯images庫時失敗
執行編譯到images相關庫的時候會出錯
在這裡插入圖片描述錯誤資訊中顯示了一個CreateJars.gmk出錯,查閱相關資料後發現是檔案中需要加上兩個回車符號,也就是 '\r’表示為CR這個符號。
- 用 Notepad++ 軟體開啟OpenJDK目錄裡的 CreateJars.gmk 這個檔案
- 依次點選選單欄中的:檢視 -> 顯示符號 -> 顯示所有符號
- 然後就可以看到所有的符號,包括換行符和回車符
找到檔案中如下的地方:
在兩個 ‘class$$’ 中間加入回車符號(按下Ctrl + M),如下圖:
修改完成後儲存,執行 make clean 命令清理後再次執行 make all 編譯
參考文章
文字在編寫和實施過程中參考瞭如下的博文或文章:
https://blog.csdn.net/wqlinloveruby/article/details/80409031
https://www.jianshu.com/p/e85f93cc74cb
OpenJDK原始碼目錄下的README-builds.html官方文件
https://blog.csdn.net/qq0012520/article/details/86014579