由于公司最近的項目都統(tǒng)一使用Jdk8,因此打算在自己的機器上搭建open jdk的調試環(huán)境;
jdk8的編譯方式發(fā)生了比較大的變化,不再依賴ant,而是采用configure&make的方式;
下面是具體的編譯步驟:
- 安裝mercurial(openjdk源碼由hg管理),我選擇的是3.8.2版本:
sudo brew install mercurial
- 下載源碼:
hg clone http://hg.openjdk.java.net/jdk8/jdk8 java-source
cd java-source
chmod +x get_source.sh
./get_source.sh
jdk源碼下載中,發(fā)現(xiàn)網絡極其不穩(wěn)定硼被,我重試了很多次才將源碼全部下載到本地惶岭;
- 安裝依賴
brew install freetype #2.6.3版本
- 編譯前準備
- 修改relocInfo.hpp的367行(hotspot/src/share/vm/code/relocInfo.hpp):
修改前為:
- 修改relocInfo.hpp的367行(hotspot/src/share/vm/code/relocInfo.hpp):
inline friend relocInfo prefix_relocInfo(int datalen=0);
修改后 為:
inline friend relocInfo prefix_relocInfo(int datalen);
- 修改generated-configure.sh的20061和21640行(common/autoconf/generated-configure.sh)寿弱,解決
configure: error: GCC compiler is required
錯誤:
修改前為:
as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
修改后為:
#as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
我本機的xcode為7.3.1,編譯器為clang按灶,版本為Apple LLVM version 7.3.0 (clang-703.0.31)症革;而jdk編譯默認需要gcc編譯器,由于clang703已經支持大部分的gcc語法鸯旁,因此此處我是直接注釋掉編譯器檢查噪矛,當然也可以安裝gcc編譯器進行編譯;
注意:編譯器的版本很重要铺罢,否則會報一大堆語法錯誤艇挨;如果采用gcc,要求>=3.81
- 編譯
./configure --with-debug-level=slowdebug --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home --with-target-bits=64 --with-jvm-variants=server --with-jdk-variant=normal --with-milestone=internal --with-num-cores=2 --with-jobs=4 CC=clang CXX=clang++
make COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' CC=clang USE_CLANG=true LP64=1
一般而言,編譯jdk8要求boot-jdk的版本為jdk1.7,此處我設置的with-boot-jdk
為jdk1.7.0.79韭赘;
- 編譯完成之后缩滨,可以通gdb進行調試:
export JAVA_ROOT_PATH=~/java-source/jdk8/build/macosx-x86_64-normal-server-slowdebug
export ALT_JAVA_HOME=${JAVA_ROOT_PATH}/jdk
${ALT_JAVA_HOME}/bin/javac -g Hello.java
${JAVA_ROOT_PATH}/hotspot/bsd_amd64_compiler2/debug/hotspot -gdb HelloWorld
備注:編譯jdk8還依賴其他,比如cups, pulse, alsa等泉瞻,都可以通過brew進行安裝