OpenJDK 編譯調試指南(Ubuntu 16.04 + MacOS 10.15)

本篇文章主要介紹在MacOS系統和Ubuntu系統上如何編譯OpenJDK項目代碼,並使用IDE工具JetBrains CLion(下文簡稱CLion)來運行/調試OpenJDK。文中僅包含兩種操做系統的特定版本(MacOS 10.15Ubuntu 16.04)下的方法,不一樣版本下可能會略有差別。但願對讀者有必定的參考價值。html

整體來講,編譯OpenJDK11在兩種系統上都沒有太大的阻礙,難度低於OpenJDK8。編譯OpenJDK8Ubuntu上比較簡單,在MacOS上比較繁瑣複雜。java

編譯調試OpenJDK的基本步驟

完成編譯並實現調試OpenJDK流程能夠分爲如下幾個步驟:python

  1. 獲取OpenJDK項目源代碼
  2. 下載一個合適版本的JDK做爲BootJDK
  3. 下載所需工具鏈,包括編譯器、調試器、構建工具等
  4. 下載所需依賴庫
  5. Running Configure(配置)
  6. Running Make(構建)
  7. 導入CLion並進行Run/Debug配置

其中3-6步對於不一樣操做系統和不一樣OpenJDK版本差別較大,其他步驟差別較小,因此本文的行文順序是先將1-二、7三部分以及一些前置知識作詳細介紹。在以後的具體場景(不一樣操做系統 + 不一樣OpenJDK版本)中針對對這些部分只作差別點的特殊說明。linux

開始以前

如何獲取 OpenJDK 源代碼?

編譯調試的第一步固然是獲取到OpenJDK的源代碼,獲取方式主要有如下三種:c++

1. 經過OpenJDK官方的Mercurial倉庫下載

OpenJDK官方使用Mercurial來進行版本控制。Mercurial倉庫地址:hg.openjdk.java.net/,主要項目地址:git

項目 地址
jdk hg.openjdk.java.net/jdk/jdk
jdk8u hg.openjdk.java.net/jdk8u/jdk8u…
jdk11u hg.openjdk.java.net/jdk-updates…

經過這種方式下載源代碼,須要先安裝Mercurial工具,並使用hg clone <url>下載源代碼。好比下載 jdk8u使用以下命令:github

hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/
複製代碼

這種方式下載比較慢,並且會有中斷的狀況,不推薦使用shell

2. 經過鏡像Git倉庫下載

OpenJDK官方在GitHub上有JDK項目的倉庫鏡像,主頁地址:github.com/openjdk,主要項目地址:macos

項目 地址
jdk github.com/openjdk/jdk
jdk11u github.com/openjdk/jdk…
jdk12u github.com/openjdk/jdk…

但在官方git倉庫中沒有看到 jdk11 如下的版本。json

除此以外還有一些非官方的鏡像Git倉庫。好比AdoptOpenJDK項目,主頁地址:github.com/AdoptOpenJD…,主要項目地址:

項目 地址
jdk github.com/AdoptOpenJD…
jdk8u github.com/AdoptOpenJD…
jdk11u github.com/AdoptOpenJD…

使用這種方式須要安裝git工具,並使用git clone <url>下載源代碼。好比下載jdk8u使用以下命令:

git clone https://github.com/AdoptOpenJDK/openjdk-jdk8u
複製代碼

git工具使用方便,而且比從官方Mercurial倉庫下載要快不少,推薦使用

3. 下載Mercurial倉庫或者Git倉庫 打包文件

除此以外,OpenJDK官方的Mercurial倉庫還提供了直接下載壓縮包的入口,入口在各個項目頁面左側bz2,zip,gz三個連接,點擊便可下載。以下圖所示:

一樣在GitHub上的每一個項目均可如下載ZIP格式的打包文件。以下圖所示:

顯然這種方式的缺點是缺乏版本控制的能力,若是對項目代碼進行了改動想要恢復是作不到的,也不可以方便地獲取最新代碼改動,可是相比前兩種方式更下載更快,也不要任何額外工具。

如何下載JDK?

讓人以爲矛盾的是,編譯JDK以前咱們須要一個已經編譯好的JDK做爲Boot JDK。通常須要的JDK版本是編譯版本前一版本的JDK,好比編譯JDK8須要JDK7,編譯JDK11須要JDK10。 有幾種途徑能夠下載JDK

  1. Oracle官網下載 Oracle JDK。下載須要登陸帳號
  2. 下載OpenJDK
    • jdk.java.net/能夠找到Oracle提供的基於OpenJDK的參考實現。但大部分只有Linux版本
    • 也可使用其餘組織預編譯好的OpenJDK。好比AdoptOpenJDK,可是沒有jdk8如下版本
  3. Linux系統下,還能夠經過軟件包管理器(好比Ubuntu下的aptCentos下的yum)下載安裝JDK

JSON Compilation Database

CLionCMake構建的項目支持很友好,但OpenJDK項目是基於Make構建的,對於使用Make構建的項目,CLion仍然能夠經過Compilation Database來導入項目,而不用將其修改成CMake項目。同時也能經過Compilation Database實現代碼的分析、跳轉等功能,這對於咱們進行代碼調試頗有幫助。

有關於Compilation Database的介紹能夠參考這幾篇文章:

對於基於Make構建的OpenJDK項目來講,有一些工具能夠生成Compilation Database,好比下面幾個:

一般默認生成的Compilation Database是一個compile_commands.json文件。

除此以外,在OpenJDK 11u及以後版本中,OpenJDK官方提供了對於IDE的支持,可使用make compile-commands命令生成Compilation Database,不須要使用額外的工具,具體命令能夠查看看源代碼目錄下的\doc\ide.md

如何將OpenJDK項目導入CLion中並運行/調試

讀者能夠選擇先跳過本小節,而後在完成前面幾個步驟以後再來根據本小節進行導入調試。

對於如何在CLion中管理基於Make構建的項目,CLion的官方幫助文檔中有詳細的介紹: Managing Makefile Projects

參考上述文檔,本小節簡要介紹瞭如何在CLion中導入OpenJDK項目並運行/調試的方法。請注意小節中所展現的圖示是基於Ubuntu 16.04系統 + CLion 2020.1.1 環境下的,操做步驟基本也適用於MacOS 系統下同版本的CLion

  1. 下載安裝CLion,並安裝Makefile Support插件。建議使用最新版本,比較老的版本是不支持Make構建的項目的。

  2. 導入項目。打開CLion,選擇Open Or Import,選擇項目目錄中的compile_commands.json文件,彈出框選擇Open as Project,等待文件索引完成。

    compile_commands.json的生成方法及生成位置根據不一樣的OpenJDK版本略有不一樣,具體位置請看下文具體場景的介紹。

  3. 建立自定義Build Target。點擊File菜單欄,Settings | Build, Execution, Deployment | Custom Build Targets,點擊+新建一個 Target

    • NameTarget的名字,以後在建立Run/Debug配置的時候會看到這個名字
    • 點擊Build或者Clean右邊的三點,彈出框中點擊+新建兩個External Tool配置以下:
      # 第一個配置以下,用來指定構建指令
      # Program 和 Arguments 共同構成了所要執行的命令 "make all"
      Name: make
      Program: make
      Arguments: all
      Working directory: {項目的根目錄}
      
      # 第二個配置以下,用來清理構建輸出
      # Program 和 Arguments 共同構成了所要執行的命令 "make clean"
      Name: make clean
      Program: make
      Arguments: clean
      Working directory: {項目的根目錄}
      複製代碼
    • ToolChain選擇DefaultBuild選擇make(上面建立的第一個External Tool);Clean選擇make clean(上面建立的第二個External Tool

    其中兩個External Tool配置中make的參數能夠根據須要改變。通常狀況用於Build的配置與執行構建時maketarget保持一致便可。

  4. 建立自定義的Run/Debug configuration。點擊Run菜單欄,Edit Configurations, 點擊+,選擇Custom Build Application,配置以下:

    # Executable 和 Program arguments 能夠根據須要調試的信息自行選擇
    # NameL:Configure 的名稱
    Name: linux-x86_64-normal-server-slowdebug
    # Target:選擇上一步建立的 「Custom Build Target」
    Target: linux-x86_64-normal-server-slowdebug
    # Executable:程序執行入口,也就是須要調試的程序
    Executable: 這裏咱們調試`java`,選擇`{source_root}/build/{build_name}/jdk/bin/java`。
    # Program arguments: 與 「Executable」 配合使用,指定其參數
    Program arguments: 這裏咱們選擇`-version`,簡單打印一下`java`版本。
    複製代碼

    若是不想每次運行/調試前都執行Build操做(在這裏就是Make構建過程,比較耗時),能夠在編輯頁下方Before launch框中刪除Build條目。

  5. 點擊Run/Debug開始運行/調試。

    • 若是使用的調試器是gdbUbuntu下默認),調試的時候可能會發現gdb報錯:Signal: SIGSEGV (Segmentation fault)。解決辦法是,建立用戶家目錄建立.gdbinit,內容以下:
      handle SIGSEGV pass noprint nostop
      handle SIGBUS pass noprint nostop
      複製代碼
    • 若是使用的調試器是lldbMacOS下默認),調試的時候可能會發現lldb報錯:SIGSEGV (signal SIGSEGV)。解決辦法是,在用戶家目錄建立.lldbinit,內容以下:
      break set -n main -C "process handle --pass true --stop false SIGSEGV" -C "process handle --pass true --stop false SIGBUS"
      複製代碼
  6. 配合File Watchers插件自動更新Compilation Database(可選)

    若是修改了項目代碼,須要從新生成Compilation Database,通常狀況須要從新構建才能夠。

    若是不想每次都從新手動構建,可使用Files Watcher插件來實現監聽變動自動從新生成。詳見:www.jetbrains.com/help/clion/…

Ubuntu 16.04 環境

OpenJDK 8

1. 下載OpenJDK8源代碼

咱們這裏選擇從AdoptOpenJDKGitHub倉庫下載源代碼。

# 首先須要安裝git工具(若是沒有的話)
sudo apt-get install git
# 克隆項目代碼,可能耗時較長
git clone git@github.com:AdoptOpenJDK/openjdk-jdk8u.git
複製代碼

2. 安裝工具鏈及依賴

# 首先須要下載安裝 JDK7 做爲 BootJDK
方法見上文
# 安裝編譯器及構建工具
sudo apt-get install gcc g++ gdb make
# 下載安裝依賴包
sudo apt-get install libasound2-dev libfreetype6-dev libcups2-dev libfontconfig1-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
複製代碼

3. 配置及構建

# 首先進入 OpenJDK8 源碼目錄
# 配置
sh ./configure --with-debug-level=slowdebug --disable-zip-debug-info --with-target-bits=64 --with-boot-jdk=/home/jiajiawang/software/jdk/jdk1.7.0_80 --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu/
複製代碼

configure參數說明:

參數 含義
--with-debug-level 調試信息的級別,可選值有release,fastdebug,slowdebug
--disable-zip-debug-info 禁止壓縮調試信息,設置爲true有助於調試
--with-target-bits 選擇32位或者64位,根據操做系統選擇
--with-boot-jdk BootJDK的位置
--with-freetype-include
--with-freetype-lib
指定freetype依賴位置,若是提示找不到freetype,須要配置這兩個參數

參數的更多說明及更多參數請參考:OpenJDK 8 Build README - Configure

咱們可使用兩種工具來生成Compilation Database

使用Bear工具

# 下載Bear工具
sudo apt-get install bear
# 構建,並使用bear工具生成Compilation Database
bear make all
複製代碼

使用compiledb工具

# 須要保證有python環境
# 安裝pip
sudo apt-get install python-pip
# pip安裝 compiledb
pip install compiledb
# 構建,並使用compiledb工具生成Compilation Database
compiledb make all
複製代碼

更多maketarget請參考OpenJDK 8 Build README - Make

若是沒有報錯,完成以後應該能夠在./build/linux-x86_64-normal-server-slowdebug/jdk目錄下找到編譯以後的JDK,驗證一下是否成功

~: cd build/linux-x86_64-normal-server-slowdebug/jdk/bin/
~: ./java -version
openjdk version "1.8.0-internal-debug"
......
複製代碼

同時項目根目錄下應該同時有一個compile_commands.json文件,而且不爲空。

4. 導入CLion並調試

步驟參見上文

OpenJDK 11

1. 下載OpenJDK11源代碼

# 首先須要安裝git工具(若是沒有的話)
sudo apt-get install git
# 克隆項目代碼,可能耗時較長
git clone git@github.com:AdoptOpenJDK/openjdk-jdk11u.git
複製代碼

2. 安裝工具鏈及依賴

# 須要下載安裝 JDK10 做爲 BootJDK
方法見上文
# 安裝編譯器及構建工具
sudo apt-get install gcc g++ gdb make autoconf
# 下載安裝依賴包
sudo apt-get install libfreetype6-dev libcups2-dev
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
sudo apt-get install libasound2-dev libffi-dev
sudo apt-get install libfontconfig1-dev
複製代碼

3. 配置及構建

# 配置
sh ./configure --with-debug-level=slowdebug --with-native-debug-symbols=internal --with-target-bits=64 --with-boot-jdk=/home/jiajiawang/software/jdk/jdk-10.0.2
複製代碼

若是不成功,通常多是缺乏部分依賴,根據腳本給出的提示安裝相應依賴便可。

configure參數說明:

參數 含義
--with-debug-level 調試信息的級別,可選值有release,fastdebug,slowdebug
--with-native-debug-symbols 指定如何構建debug symbol,可選值有none,internal, external, zipped,設置爲internal能夠更好地調試
--with-target-bits 選擇32位或者64位,根據操做系統選擇
--with-boot-jdk bootjdk位置
--with-freetype-include
--with-freetype-lib
指定freetype依賴位置。若是提示找不到freetype,須要配置這兩個參數

參數的更多說明及更多參數請參考:OpenJDK 11 Build README - Configure

# 生成Compilation Database
make compile-commands
# 構建
make all
複製代碼

更多maketarget請參考OpenJDK 11 Build README - Make

完成以後應該能夠在./build/linux-x86_64-normal-server-slowdebug/jdk目錄下找到編譯以後的jdk,驗證一下是否成功

~: cd build/linux-x86_64-normal-server-slowdebug/jdk/bin/
~: ./java -version
openjdk version "11.0.8-internal" 2020-07-14
......
複製代碼

同時在/build/linux-x86_64-normal-server-slowdebug/目錄下會有compile_commands.json文件,而且不爲空。

4. 導入CLion並調試

大體步驟與前文介紹相同。 須要注意的是在選擇/build/linux-x86_64-normal-server-slowdebug/目錄下的compile_commands.json文件導入項目以後須要更改項目的根目錄爲源碼的根目錄(這裏也就是openjdk-11u目錄)。點擊菜單Tools | Compilation Database | Change Project Root,選擇源碼根目錄openjdk-11u),等待從新索引完成。

MacOS 10.15 環境

OpenJDK 8

MacOS 10.15.5環境下構建OpenJDKLinux下步驟類似,可是因爲OpenJDK 8版本較老,其中一些依賴在MacOS 10.15.5版本中已經沒法找到,致使在配置構建過程當中會出現各類問題,本文給出了一種比較簡單方便的辦法。

1. 下載OpenJDK8源代碼

咱們選擇從AdoptOpenJDKgithub倉庫下載源代碼

git clone git@github.com:AdoptOpenJDK/openjdk-jdk8u.git
複製代碼

2. 安裝工具鏈及依賴

  1. 首先須要下載安裝jdk7做爲bootjdk,方法見文章開頭。
  2. 安裝HomeBrewHomebrew是一款MacOS系統上的軟件包管理系統。
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
    複製代碼
  3. 安裝Xcode。能夠直接在App Store搜索安裝,也能夠在developer.apple.com/download/mo…下載離線安裝包安裝。可使用xcodebuild命令驗證是否安裝成功,正確輸出版本號則代表正確安裝。
    xcodebuild -version
    複製代碼
    若是是離線安裝的話,可能會報xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance錯誤,這是由於xcodebuild找不到新安裝的Xcode,只須要執行下面這個命令便可。
    sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
    複製代碼
  4. 安裝編譯工具
    # 安裝構建工具
    brew install make
    複製代碼
  5. 安裝所需依賴
    # 安裝freetype
    brew install freetype
    複製代碼

3. 配置及構建

3.1 修改代碼

若是不對代碼進行修改,在執行configure的時候,會報各類錯誤。網上也有不少針對每種錯誤來修改源文件來解決報錯的方法, 這裏給出一種更爲方便的方法。
GitHub上的stooke/jdk8u-xcode10這個項目,提供了對openjdk8的代碼進行修改的patch文件,對代碼修改以後,就能夠正常地configure

git clone git@github.com:stooke/jdk8u-xcode10.git
複製代碼

這個項目自己提供了腳原本完成下載源碼、下載依賴、代碼修改、配置、編譯、測試等工做,但咱們這裏只使用其中的修改代碼這部分。原項目中的README可能已通過時了,經過查看其源代碼中的build8.sh文件,可以大概瞭解其中的執行邏輯,據此我將其中的修改OpenJDK8代碼的部分抽取出來,簡化以下:

新建一個shell腳本patch.sh,內容以下:

#!/bin/bash
# JDK8 源碼所在目錄
JDK_DIR=`pwd`
# 下載的jdk8u-xcode10項目所在目錄
PATCH_DIR="$(dirname $JDK_DIR)/jdk8u-xcode10"
PATCH_DIR="$PATCH_DIR/jdk8u-patch"

applypatch() {
	cd "$JDK_DIR/$1"
	echo "applying $1 $2"
	patch -p1 <$2
}

patchjdkbuild() {
	echo "patch jdk"
	# JDK-8019470: Changes needed to compile JDK 8 on MacOS with clang compiler
	applypatch . "$PATCH_DIR/jdk8u-8019470.patch"

	# JDK-8152545: Use preprocessor instead of compiling a program to generate native nio constants
	# (fixes genSocketOptionRegistry build error on 10.8)
	applypatch jdk "$PATCH_DIR/jdk8u-jdk-8152545.patch"

	# fix WARNINGS_ARE_ERRORS handling
	applypatch hotspot "$PATCH_DIR/jdk8u-hotspot-8241285.patch"

	# fix some help messages and Xcode version checks
	applypatch . "$PATCH_DIR/jdk8u-buildfix1.patch"
	# use correct C++ standard library
	#applypatch . "$PATCH_DIR/jdk8u-libcxxfix.patch"
	# misc clang-specific cleanup
	applypatch . "$PATCH_DIR/jdk8u-buildfix2.patch"

	# misc clang-specific cleanup; doesn't apply cleanly on top of 8019470 
	# (use -g1 for fastdebug builds)
	#applypatch . "$PATCH_DIR/jdk8u-buildfix2a.patch"

	# fix for clang crash if base has non-virtual destructor
	applypatch hotspot "$PATCH_DIR/jdk8u-hotspot-8244878.patch"
	
	applypatch hotspot "$PATCH_DIR/jdk8u-hotspot-mac.patch"

	# libosxapp.dylib fails to build on Mac OS 10.9 with clang
	applypatch jdk     "$PATCH_DIR/jdk8u-jdk-8043646.patch"

	applypatch jdk     "$PATCH_DIR/jdk8u-jdk-minversion.patch"
}
patchjdkbuild
複製代碼

而後執行這個腳本:

bash patsh.sh
複製代碼

3.2 配置

sh ./configure MAKE=/usr/bin/make --with-toolchain-type=clang --with-debug-level=slowdebug --disable-zip-debug-info --with-target-bits=64 --with-boot-jdk=/Users/jiajiawang/Software/jdk/jdk1.7.0_80.jdk/Contents/Home/ --with-freetype-include=/usr/local/Cellar/freetype/2.10.2/include/freetype2 --with-freetype-lib=/usr/local/Cellar/freetype/2.10.2/lib/
複製代碼

MAKE=/usr/bin/make是可選的,若是下文使用Bear來生成Compilation Database,能夠不加這個參數。

configure部分參數說明以下:

參數 含義
--with-toolchain-type 使用的工具鏈類型,取值有gccclang等,可使用--help來查看全部可選值
--with-debug-level 調試信息的級別,可選值有release,fastdebug,slowdebug
--disable-zip-debug-info 禁止壓縮調試信息,設置爲true能夠更好地調試
--with-target-bits 選擇32位或者64位,根據操做系統選擇
--with-boot-jdk bootjdk位置
--with-freetype-include
--with-freetype-lib
指定freetype依賴位置,在執行configure時若是找不到freetype,須要指定這兩個參數

參數的更多說明及更多參數請參考:OpenJDK 8 Build README - Configure

3.3 構建

一樣咱們仍然可使用bear或者compiledb來生成Compilation Database,可是使用bear過程當中遇到一些問題比較繁瑣,推薦使用compiledb

使用compiledb
# 1. 請先確保安裝了Python及pip
方法請自行搜索
# 2. 安裝compiledb工具
pip install compiledb
# 3. 構建,並使用compiledb工具生成Compilation Database
compiledb make all COMPILER_WARNINGS_FATAL=false
# 可使用 LOG=debug 選項來輸出更爲詳細的信息
# compiledb make all LOG=debug COMPILER_WARNINGS_FATAL=false
複製代碼

使用compiledb可能會存在的問題是生成的compile_commands.json文件中全部項的directory項都是項目的根目錄,致使一個頭文件沒法找到,導入CLion時報錯,代碼定義及跳轉無效。緣由是在MacOS平臺,編譯構建使用的多是gmake,而compiledbgmake切換路徑的操做沒法捕捉到,致使路徑所有都是根目錄。解決辦法就是顯示指定使用make而不是gmake,指定方法就是上一小節中在Configure時指定的MAKE=/usr/bin/make參數。

使用bear

上面咱們使用compiledb工具來生成Compilation Database,一樣也可使用bear工具來生成:

# 1. 首先須要關閉SIP,不然生成的 Compilation Database 可能會是空的
關閉SIP的方法請自行搜索
# 2. 安裝bear
brew install bear
# 3. 構建,並使用bear工具生成Compilation Database
bear make all COMPILER_WARNINGS_FATAL=false
# 可使用 LOG=debug 選項來輸出更爲詳細的信息
# compiledb make all LOG=debug COMPILER_WARNINGS_FATAL=false
複製代碼

若是遇到執行命令遇到報錯/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/stdio.h:107:15: fatal error: 'stdio.h' file not found 能夠嘗試執行以下命令:

sudo mount -uw /
sudo cp -R /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include /usr
複製代碼

更多maketarget請參考OpenJDK 8 Build README - Make

若是沒有報錯,完成以後應該能夠在./build/macosx-x86_64-normal-server-slowdebug/jdk目錄下找到編譯以後的JDK,驗證一下是否成功

~: cd build/macosx-x86_64-normal-server-slowdebug/jdk/bin/
~: ./java -version
openjdk version "1.8.0-internal-debug"
......
複製代碼

同時項目根目錄下應該同時有一個compile_commands.json文件,而且不爲空。

4. 導入CLion並調試

須要注意在建立Custom Build Targets時,新建的用於BuildExternal Toolmake的參數中也要加上COMPILER_WARNINGS_FATAL=false

OpenJDK 11

1. 下載OpenJDK11源代碼

git clone git@github.com:AdoptOpenJDK/openjdk-jdk11u.git
複製代碼

2. 安裝工具鏈及依賴

  1. 首先須要下載安裝jdk10做爲bootjdk,方法見文章開頭。
  2. 安裝HomeBrewHomebrew是一款MacOS系統上的軟件包管理系統。
    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
    複製代碼
  3. 安裝Xcode。能夠直接在App Store搜索Xcode安裝,也能夠在developer.apple.com/download/mo…下載離線安裝包安裝。可使用xcodebuild命令驗證是否安裝成功,正確輸出版本號則代表正確安裝。
    xcodebuild -version
    複製代碼
    若是是離線安裝的話,可能會報xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance錯誤,這是由於xcodebuild找不到新安裝的Xcode,只須要執行下面這個命令便可。
    sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer/
    複製代碼
  4. 安裝編譯工具
    brew install autoconf
    brew install make
    複製代碼
  5. 安裝所需依賴
    # 安裝freetype
    brew install freetype
    複製代碼

3. 配置及編譯

# 配置
sh ./configure --with-debug-level=slowdebug --with-native-debug-symbols=internal --with-target-bits=64 --with-boot-jdk=/Users/jiajiawang/Software/jdk/jdk-10.0.2+13/Contents/Home
複製代碼

configure參數說明:

參數 含義
--with-debug-level 調試信息的級別,可選值有release,fastdebug,slowdebug
--with-native-debug-symbols 指定如何構建debug symbol,可選值有none,internal, external, zipped,設置爲internal能夠更好地調試
--with-target-bits 選擇32位或者64位,根據操做系統選擇
--with-boot-jdk bootjdk位置
--with-freetype-include
--with-freetype-lib
指定freetype依賴位置,在執行configure時若是找不到freetype,須要指定這兩個參數

參數的更多說明及更多參數請參考:OpenJDK 11 Build README - Configure

# 生成Compilation Database
make compile-commands
# 構建
make all
複製代碼

完成以後,應該在/build/linux-x86_64-normal-server-slowdebug/目錄下會有compile_commands.json文件。

更多maketarget請參考OpenJDK 11 Build README - Make

完成以後應該能夠在./build/macosx-x86_64-normal-server-slowdebug/jdk目錄下找到編譯以後的jdk,驗證一下是否成功

~: cd build/macosx-x86_64-normal-server-slowdebug/jdk/bin/
~: ./java -version
openjdk version "11.0.8-internal" 2020-07-14
......
複製代碼

同時在./build/macosx-x86_64-normal-server-slowdebug/目錄下會有compile_commands.json文件,而且不爲空。

4. 導入CLion並調試

大體步驟與前文介紹相同。 須要注意的是在選擇/build/macosx-x86_64-normal-server-slowdebug/目錄下的compile_commands.json文件導入項目以後須要更改項目的根目錄爲源碼的根目錄(這裏也就是openjdk-11u目錄)。點擊菜單Tools | Compilation Database | Change Project Root,將項目的根目錄設置爲源碼根目錄(openjdk-11u),等待從新索引完成。

參考

  1. OpenJDK
  2. OpenJDK 8 Build README
  3. OpenJDK 11 Build README
  4. rizsotto/Bear: Bear is a tool that generates a compilation database for clang tooling
  5. nickdiego/compiledb: Tool for generating Clang's JSON Compilation Database files for make-based build systems.
  6. Managing Makefile Projects
  7. Dealing with Makefile Projects in CLion: Status Update
  8. Tips & Tricks: Develop OpenJDK in CLion with Pleasure
  9. Debugging OpenJDK - DZone DevOps
  10. Compilation database — Sarcasm notebook
  11. More Software Downloads - Apple Developer
  12. stooke/jdk8u-xcode10: How to compile JDK 8u with Xcode 9, 10 or 11 on macOS.
相關文章
相關標籤/搜索