轉自:https://www.cnblogs.com/Vicent-Chen/p/7708932.html
1.準備環境:
1)編譯openjdk對應的版本jdk6
我們可以直接去到http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html
,選擇合適的包下載。下載前還需要註冊一個Oracle帳號。下載好jdk-6u45-linux-x64.bin
後複製到想要的目錄並運行,相同目錄下就會創建一個包含有jdk的文件夾。
2)下載openjdk7
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
cd jdk7u-dev
chmod 755 get_source.sh
./get_source.sh
3)準備environment.sh
#!/bin/sh
# environment.sh
# 語言選項,若不設置則會在編譯好後出現一個HashTable的NPE錯
export LANG=C
# Bootstrap JDK的安裝路徑
export ALT_BOOTDIR=#JDK安裝路徑(上文提到的Oracel JDK安裝路徑)
# 允許自動下載依賴
export ALLOW_DOWNLOADS=true
# 並行編譯線程數,設置爲和CPU內核數一樣即可
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4
# 比較本次build出來的映像與先前版本的差異。這對我們來說沒有意義
# 必須設置爲false,否則sanity檢查會報缺少先前版本JDK的映像的錯誤提示
# 如果已經設置 dev 或者 DEV_ONLY = true,這個不顯式設置也行
export SKIP_COMPARE_IMAGES=true
# 使用預編譯頭文件,不加這個編譯會慢些
export USE_PRECOMPILED_HEADER=true
# 要編譯的內容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPORT=true
export BUILD_JDK=true
# 要編譯的版本
# export SKIP_DEBUG_BUILD=false
# export SKIP_FASTDEBUG_BUILD=true
# export DEBUG_NAME=debug
# 把它設置爲false可以避開javaws和瀏覽器Java插件之類的部分的build
BUILD_DEPLOY=false
# 把它設置爲false就不會build出安裝包,因爲安裝包裏有奇怪的依賴項
# 但即便不build出它也已經能得到完整的JDK映像,所以還是不build
BUILD_INSTALL=false
# 編譯結果存放路徑
export ALT_OUTPUTDIR= #openjdk7 路徑/build
# 這兩個環境變量必須去掉,否則會有奇怪的事情發生
unset JAVA_HOME
unset CLASSPATH
# 這個環境變量是make sanity建議消除的
unset LD_LIBRARY_PATH
輸入source environment.sh
,然後make sanity
檢查
如果輸出是Sanity check passed
,則證明檢查通過,可以進行make了
2.編譯openjdk7
- 輸入
make 2>&1 | tee $ALT_OUTPUTDIR/build.log
進行編譯 - 若出現以下信息,則證明編譯成功
#-- Build times ----------
Target all_product_build
Start 2017-10-19 23:38:57
End 2017-10-19 23:53:03
00:00:11 corba
00:01:06 hotspot
00:00:02 jaxp
00:00:04 jaxws
00:12:41 jdk
00:00:02 langtools
00:14:06 TOTAL
-------------------------
關於Hotspot
- 進入
OpenJDK目錄/hotspot/make
,複製environment.sh
,依次運行source environment.sh
,make
- Hotspot的編譯與JDK的編譯大體相似,但還是有所不同,主要修改的還是
environment.sh
- 如果是64位系統,在最後加上
export ARCH_DATA_MODEL=64
,否則會在編譯過程中提示部分頭文件找不到 - 編譯的輸出路徑建議進行修改,不然jdk與hotspot的編譯輸出都會放在
build
下面,比較難分辨 - 編譯完成後可以去
linux_amd64_compiler2/fastdebuf
下修改env.sh
,添加
LD_LIBRART_PATH=.:{JAVA_HOME}/jre/lib/amd64/native_threads:%{JAVA_HOME}/jre/lib/amd64:
export LD_LIBRARY_PATH
然後依次運行source env.sh
,./gamma -version
,如果編譯成功,就能看到結果。
Netbeans
- 去到Netbeans官網下載最新版本並安裝
- Netbeans 源碼調試教程
-
該教程中有些地方與本文的介紹不太合適,這裏是更正:
- Pre-Build Action: 此處輸入的命令應爲
./environment.sh
- Build-Action: 此處
Build Command
應該是${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=environment.sh中的ALT_BOOTDIR ARCH_DATA_MODEL=64 LANG=C
- Pre-Build Action: 此處輸入的命令應爲
-
Netbeans下編譯好的文件將會存放在
OpenJDK目錄/hotspot/build/linux/linux_amd64_compiler2/jvmg
下。 -
錯誤
This OS is not supported
,可以使用這個方法:
修改hotspot/make/linux/Makefile,找到SUPPORTED_OS_VERSION變量定義的地方,在後面追加4%
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4%