第一篇: openJDK源碼編譯安裝--mac版本

1.爲何要編譯JDK

  想要一探JDK內部的實現機制,最便捷的路徑之一就是本身編譯一套JDK,經過閱讀和跟蹤調試JDK源碼去了解Java技術體系的原理,雖然門檻高一點,但確定比閱讀各類書籍,文章,博客更在貼切一點,另外,JDK的不少方法都是本地化(Native)的,須要跟蹤這些方法的運做或對JDK進行Hack的時候,都須要本身編譯一套JDK。
 

2.選擇JDK

  如今網上有很多開源的JDK實現能夠供咱們選擇,如Apache Harmony,OpenJDK等,考慮到Sun系列的JDK是如今使用得最普遍的JDK版本,因此咱們選擇openJDK進行編譯。
關於openJDK?
  openJDK是sun在2006年底把java開源而造成的項目。開源是一般意義上的源碼形式上開放,等同於源碼可被複用。商業版的oracle jdk和open jdk 除了版權註釋以外,其他代碼基本上都是相同的,都是創建在二者共有的組件基礎上。oracle jdk還會存在一些open jdk沒有的,商用閉源的功能。oracle的項目發佈經理Joe Darcy 在OSCON2011 上對二者的關係上也證明了oracle jdk和open jdk程序上市很是接近。
 

3.環境準備

1.openJDK下載,獲取openJDk源碼有兩種方式.
  (1)其中一種是經過一款代碼版本管理Mercurial上獲取
    hg clone http://hg.openjdk.java.net/jdk8/jdk8 jdk8
    cd jkd8
    bash ./get_source.sh
  這種是最直接的方式,可是因爲文件不少,國內的網絡對Mercurial不如對git svn上不夠快,常常可能失敗,能夠把鏡像換成國內的,這個能夠本身找找。
  (2)從 https://download.java.net/openjdk/jdk8直接下載打包好的源碼文件,這裏openjdk在下載源碼有個bug,如圖:
  
把這裏的下載地址前面的域名弄錯了,應該是http://download.java.net,把前面的http://www.java.net/download/換掉,後面的不變,就能下載打包好的源碼文件。參考1.7地址: http://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip
最終的地址: http://download.java.net/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip
 
2.安裝依賴軟件,若是沒有brew命令,能夠先看看brew怎麼安裝再繼續執行以上安裝命令。
(1)Xcode-select:安裝命令:xcode-select –install  進行x11連接
  sudo ln -s /usr/X11/include/X11 /usr/include/X11 or sudo ln -s /usr/local/X11/include/X11 /usr/include/X11  (若是軟鏈接失敗,重啓mac時按住command+R 進入恢復模式,而後打開terminal  執行 csrutil disable,再重啓,這是mac對安全的一種校驗)
這裏重點說一句: 重啓mac時按住command+R 進入恢復模式. 在彈出的面板上是沒有終端的,終端要去上面的菜單欄選擇. 
這一步很重要, 包括軟鏈,若是不操做, 後面編譯會報異常
(2)安裝XQuartz 下載地址: https://www.xquartz.org/
(3)安裝freetype,安裝命令:brew install freetype
(4)安裝GC 安裝命令: brew install gcc49 聽說安裝往上的版本會報錯。
(5) 安裝ccache提高編譯速度 brew install ccache
(6) 安裝ant 通常mac都會有這個環境,若是沒有執行:brew install ant
 
 
3.修改源碼

(1). 修改generated-configure.sh(路徑:common/autoconf/generated-configure.sh)
  註釋20061行
  // as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
  註釋21640行
  // as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5java

 

(2). 修改relocInfo.hpp(路徑:hotspot/src/share/vm/code/relocInfo.hpp)
  修改367行
  inline friend relocInfo prefix_relocInfo(int datalen);
  修改472行
  inline relocInfo prefix_relocInfo(int datalen = 0) {
    assert(relocInfo::fits_into_immediate(datalen), "datalen in limits");
    return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen);
  }ios


(3). 修改openjdk/hotspot/src/share/vm/opto/loopPredicate.cpp
  修改775行爲
  assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int()->_lo >= 0, "must be");c++


 (4).修改openjdk/hotspot/src/share/vm/runtime/virtualspace.cpp
  修改331行爲
  if (base() != 0) {git

4.設置環境變量

  cd ~
  open .bash_profile (這個在安裝jdk都會設置的,若是沒有這個文件去看看jdk安裝的教程)
添加變量:


# 設定語言選項,必須設置
export LANG=C
# Mac平臺,C編譯器再也不是GCC,是clang
export CC=clang
# 跳過clang的一些嚴格的語法檢查,否則會將N多的警告做爲Error
export COMPILER_WARNINGS_FATAL=false
# 連接時使用的參數
export LFLAGS='-Xlinker -lstdc++'
# 是否使用clang
export USE_CLANG=true
# 使用64位數據模型
export LP64=1
# 告訴編譯平臺是64位,否則會按32位來編譯
export ARCH_DATA_MODEL=64
# 容許自動下載依賴
export ALLOW_DOWNLOADS=true
# 並行編譯的線程數,編譯時間長,爲了避免影響其餘工做,我選擇爲2
export HOTSPOT_BUILD_JOBS=2
export ALT_PARALLEL_COMPILE_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=falsemacos

最後幹掉這兩個變量,否則會有詭異的事發生
unset JAVA_HOME
unset CLASSPATHvim

 將變量添加到base_profile之後, 把中午註釋去掉, 不然會亂碼,編譯報錯

5.編譯, ( 遇到問題能夠先看看下面的問題描述)

(1)cd 到下載好的openSDK目錄下,先授予權限給openJDK目錄 如: chmod -R 777 openjdk
 
(2)./configure 若是找不freetype 能夠執行./configure --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/
 

sh configure --with-debug-level=slowdebug --with-boot-jdk=`/usr/libexec/java_home -v 1.7` --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/ --with-target-bits=64 --with-jvm-variants=server --with-jdk-variant=normal --with-milestone=internal --with-update-version=b25 --with-build-number=b25 --with-zlib=system --with-num-cores=2 --with-jobs=4 CC=clang CXX=clang++xcode

使用這種方式編譯, 在build文件夾生成兩個文件. 若是使用第一種, 只會生成一個瀏覽器

參考文章: https://blog.csdn.net/lizhengjava/article/details/60138890安全

 
  (3) 開始執行make命令: 在執行make命令須要指定編譯環境,環境路徑在:./openjdk/build/下面 通常有兩個 macosx-x86_64-normal-server-release 和 macosx-x86_64-normal-server-slowdebug
  若是通常編譯失敗會有失敗的文件,爲了保險起見先執行:
    make CONF=macosx-x86_64-normal-server-release clean 或者
    make CONF=macosx-x86_64-normal-server-slowdebug clean
  再執行:
    make CONF=macosx-x86_64-normal-server-release install 或者
    make CONF=macosx-x86_64-normal-server-slowdebug install
 
我使用的是第一個: make CONF=macosx-x86_64-normal-server-release clean由於個人文件夾下沒有第二個
編譯成功如圖:
  

6.我執行./configure和編譯遇到的問題:

問題1和問題2是原做者遇到的,我並無遇到. 後面的問題是我遇到的bash

(1)./configure問題: configure: error: GCC compiler is required
  解決方法:
   jdk8/common/autoconf/generated-configure.sh文件中 註釋兩處代碼:第20061,21640行 #as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
 
  (2)make問題:
  Running nasgen
  Exception in thread "main" java.lang.VerifyError:
  class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final method setPrototype.(Ljava/lang/Object;)V
  解決方法:
  修改:vim ./openJDk/nashorn/make/BuildNashorn.gmk
  80行原來 -cp 修改成:-Xbootclasspath/p:  如圖: 
  
 (3) 在執行sudo ln -s /usr/X11/include/X11 /usr/include/X11 的時候提示:  sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
 
  這個問題的緣由是提示sudo沒有權限, 最終結覺辦法是, 使用root用戶登陸. 而後將/usr/bin/sudo 授與4755權限
  若是不知道怎麼使用root用戶登陸, 能夠看這篇文章: https://www.jianshu.com/p/be9f1d57c710.   我是重置了root的密碼, 由於不知道原密碼是什麼, 而後退出當前用戶, 使用root從新登陸. 
  執行: chmod 4755 /usr/bin/sudo 就可使用了
 
  (4) 在root用戶受權sudo之後, 回到luo***用戶登陸的時候, 終端顯示異常. 內容以下:

  Could not determine audit condition  [Process completed]

  [進程已完成]

   處理辦法參考:  https://www.jianshu.com/p/d764d2840071. 不少說是由於./bash_profile文件配置錯誤致使的, 但我這個不是. 將/usr/bin 下的login文件更名login1, 再打開終端, 而後執行

  sudo chown root:wheel /usr/bin/login

  sudo chmod u+s /usr/bin/login

  在將login1的名字改回login. 已經恢復了.

 (4) 報異常<iostream> not found. 這個問題應該是和Xcode沒有進行軟鏈有關係. 我第一次操做的時候沒有進行軟鏈
 
 
(5) 
7.測試是否編譯成功
  cd ./openjdk/build/macosx-x86_64-normal-server-release/jdk/bin
  執行java -version
  如圖則編譯成功:
   
相關文章
相關標籤/搜索