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.
相关文章
相关标签/搜索