Mac编译OpenJdk源码

本文最后更新于:2023-05-12 22:53 星期五

MacOs编译OpenJDK

  • 未强调目录,即本地仓库根目录
  • 编译Git Tag:jdk-21+21 # 本想编译jdk17,奈何17版本报错太多,无法解决,怀疑是xcode或系统版本问题,索性目前最新。

点击下面按钮跳转相关文档

OpenJDK官网地址 构建JDK文档 构建JDK文档 Clion博客关于OpenJDK开发的内容

获取OpenJDK

源码仓库地址
1
git clone https://github.com/openjdk/jdk.git

编译环境

  • 软件环境 (参考官网文档,自行安装。MacOs 推荐使用brew)

    • macos Ventura 13.3.1 (a)

    • xcodebuild -version : Xcode 14.3

    • xcode-select -v : xcode-select version 2397.

    • /Library/Java/JavaVirtualMachines/jdk-20.jdk/Contents/Home

    • clang --version

      Apple clang version 14.0.3 (clang-1403.0.22.14.1)
      Target: x86_64-apple-darwin22.4.0
      Thread model: posix
      InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

    • clang++ --version

      Apple clang version 14.0.3 (clang-1403.0.22.14.1)
      Target: x86_64-apple-darwin22.4.0
      Thread model: posix
      InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

    • autoconf --version : autoconf (GNU Autoconf) 2.71 # brew install autoconf

    • freetype-config --ftversion : 2.13.0 # brew install freetype

    • make --version : GNU Make 3.81 # brew install make

    • ccache -V : ccache version 4.8 # brew install ccache

  • 硬件 :MacBook Pro ; 2.6 GHz 六核Intel Core i7 ; 内存 16 GB 2400 MHz DDR4


编译

configure

1
2
# 获取配置参数帮助
$ bash configure --help
1
2
3
4
5
bash configure \
--with-debug-level=slowdebug \
--with-jvm-variants=server \
--with-target-bits=64 \
--with-boot-jdk=$JAVA_20_HOME
  • –with-debug-level=slowdebug #可选:release、fastdebug、slowdebug,越靠后debug信息越多,优化越少。

  • –with-jvm-variants=server #jvm模式:server、client、minimal、core、zero、custom

  • –with-target-bits=64 #指定编译32位还是64位的JVM

  • –with-boot-jdk=$JAVA_20_HOME # 系统export 配置的环境变量,我使用的是jdk20

补充

  • –with-conf-name=jdk-21+22-slowdebug 自定义名字,执行make指令,增加CONF=jdk-21+22-slowdebug 参数。例如make CONF=jdk-21+22-slowdebug images
1
2
3
4
$ java --version
java 20.0.1 2023-04-18
Java(TM) SE Runtime Environment (build 20.0.1+9-29)
Java HotSpot(TM) 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing)

configure 结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
====================================================
A new configuration has been successfully created in
/Users/*/openjdk/build/macosx-x86_64-server-slowdebug
using configure arguments '--with-debug-level=slowdebug --with-jvm-variants=server --with-target-bits=64 --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk-20.jdk/Contents/Home'.

Configuration summary:
* Name: macosx-x86_64-server-slowdebug
* Debug level: slowdebug
* HS debug level: debug
* JVM variants: server
* JVM features: server: 'cds compiler1 compiler2 dtrace epsilongc g1gc jfr jni-check jvmci jvmti management parallelgc serialgc services shenandoahgc vm-structs zgc'
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 21-internal-adhoc.wdk.openjdk (21-internal)
* Source date: 1683614002 (2023-05-09T06:33:22Z)

Tools summary:
* Boot JDK: java version "20.0.1" 2023-04-18 Java(TM) SE Runtime Environment (build 20.0.1+9-29) Java HotSpot(TM) 64-Bit Server VM (build 20.0.1+9-29, mixed mode, sharing) (at /Library/Java/JavaVirtualMachines/jdk-20.jdk/Contents/Home)
* Toolchain: clang (clang/LLVM from Xcode 14.3)
* Sysroot: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk
* C Compiler: Version 14.0.3 (at /usr/bin/clang)
* C++ Compiler: Version 14.0.3 (at /usr/bin/clang++)

Build performance summary:
* Build jobs: 12
* Memory limit: 16384 MB

The following warnings were produced. Repeated here for convenience:
WARNING: pandoc is version 2.18, not the recommended version 2.19.2

build目录生成如下目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ tree -NL 1 build .
build
└── macosx-x86_64-server-slowdebug # configure 之后生成的目录,之后编译结果存放在此
.
├── ADDITIONAL_LICENSE_INFO
├── ASSEMBLY_EXCEPTION
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── bin
├── build
├── compile_commands.json
├── configure
├── doc
├── make
├── src
└── test

make

make [Targets][Targets文档]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 全量编译
$ make all
Building target 'all' in configuration 'macosx-x86_64-server-slowdebug'
Compiling up to 1 files for BUILD_TOOLS_HOTSPOT
..........
# 需要一段时间 ,这里省略N行信息
..........
Compiling up to 2 files for CLASSLIST_JAR
Creating support/classlist.jar
Creating jdk.jlink.jmod
Creating java.base.jmod
Creating jdk image
Creating CDS archive for jdk image for server
Creating CDS-NOCOOPS archive for jdk image for server
Stopping javac server
Finished building target 'all' in configuration 'macosx-x86_64-server-slowdebug'
1
2
3
4
$ ./build/macosx-x86_64-server-slowdebug/jdk/bin/java  --version
openjdk 21-internal 2023-09-19
OpenJDK Runtime Environment (slowdebug build 21-internal-adhoc.wdk.openjdk)
OpenJDK 64-Bit Server VM (slowdebug build 21-internal-adhoc.wdk.openjdk, mixed mode)

导入Clion

compile-commands.json

生成 compile-commands.json ,Compile Commands参考Clion[彩蛋]文档[jetbrains]

1
2
3
4
5
6
7
$ make compile-commands
Building target 'compile-commands' in configuration 'macosx-x86_64-server-slowdebug'
Cleaning compile-commands make support artifacts ... done
Updating compile_commands.json
Finished building target 'compile-commands' in configuration 'macosx-x86_64-server-slowdebug'

# make compile-commands 再 make all 生成的compile_commands.json 也可以

导入

  1. 使用Clion打开目录 ./build/macosx-x86_64-server-slowdebug/compile_commands.json 文件。

  2. 使用项目打开,等待Clion完成项目索引扫描

  3. 更改项目根目录为OpenJDK根目录,等待重新扫描索引。如下图

根据compile_commands.json导入项目
项目打开方式
更改根目录

配置

配置外部工具

ExtendedTools

  • make all

    #Program 和 Arguments 共同构成了所要执行的命令 “make all”

    Name: make
    Program: make
    Arguments: all
    Working directory: {项目的根目录/本地openjdk位置}

  • make clean 配置同 make all

  • make images 配置 同 make all

  • make 配置同 make all

运行/调试配置 (Run/Debug configuration)

RunDebugConfiguration

  • Run/Debug configuration

    Configuration

  • 编译jdk,修改jdk源码后编译源码使用。

    make-images

运行Debug

IDEA 引用 Native OpenJDK

  1. IDEA 新建工程,并修改JDK为编译好的jdk(build/macosx-x86_64-server-slowdebug/images/),将源码修改为OpenJdk根目录下的src目录。

    SDK1
    SDK2
  2. 修改jdk代码

    MAIN

  3. 执行 make images 编译jdk

    源码更目录执行make images 或在CLion执行预先配置好的make images即可。

    run-make-images1
    run-make-images1
  4. 运行测试代码看修改效果

    result

异常问题

error: unmappable character (0xE6) for encoding ascii

make/common/JavaCompilation.gmk文件,274行将 ascii 修改为utf-8

ascii_to_utf8

Library not loaded: /usr/local/lib/libgvc.6.dylib 错误信息

Library not loaded: /usr/local/lib/libgvc.6.dylib 错误信息

1
2
3
4
dyld[77415]: Library not loaded: /usr/local/lib/libgvc.6.dylib
Referenced from: <1F936113-F892-345E-A9E8-0F93B969392C> /usr/local/bin/dot
Reason: tried: '/usr/local/lib/libgvc.6.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/lib/libgvc.6.dylib' (no such file), '/usr/local/lib/libgvc.6.dylib' (no such file), '/usr/lib/libgvc.6.dylib' (no such file, not in dyld cache)

解决方式 : 将 graphviz[graphviz官网]的 lib目录下 .dylib 文件映射到 /usr/local/lib/ 目录下

解决方式:执行以下命令即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
brew install graphviz
brew link graphviz
#
brew link --overwrite graphviz


#-------------------------------------------------------
#-------------------------------------------------------
#-------------------------------------------------------


#如有以下错误
brew link --overwrite graphviz
Linking /usr/local/Cellar/graphviz/8.0.5...
Error: Could not symlink lib/graphviz/config6
/usr/local/lib/graphviz is not writable.
# 执行 chown 根据实际情况更改
sudo chown -R '用户名:admin' /usr/local/lib/graphviz

寻找到的变相解决方式,反正是意外的解决了make all 报错的问题。

感觉不是最终解决方式,但有没有更好的方式,如看到此贴的人知道,麻烦请告知一下更好的解决方案。

📮邮箱 : wangdekunemail@gmail.com

ln -s /usr/local/Cellar/graphviz/8.0.5/lib/libcdt.5.dylib /usr/local/lib/libcdt.5.dylib
ln -s /usr/local/Cellar/graphviz/8.0.5/lib/libcgraph.6.dylib /usr/local/lib/libcgraph.6.dylib
ln -s /usr/local/Cellar/graphviz/8.0.5/lib/libgvc.6.dylib /usr/local/lib/libgvc.6.dylib
ln -s /usr/local/Cellar/graphviz/8.0.5/lib/libgvpr.2.dylib /usr/local/lib/libgvpr.2.dylib
ln -s /usr/local/Cellar/graphviz/8.0.5/lib/liblab_gamut.1.dylib /usr/local/lib/liblab_gamut.1.dylib
ln -s /usr/local/Cellar/grahviz/8.0.5/lib/libpathplan.4.dylib /usr/local/lib/libpathplan.4.dylib
ln -s /usr/local/Cellar/graphviz/8.0.5/lib/libxdot.4.dylib /usr/local/lib/libxdot.4.dylib

lldb报错:SIGSEGV (signal SIGSEGV) (涉及到C/C++相关内容,不明所以,完全是照猫画虎)

iShot_2023-05-10_01.10.55

解决办法是,在用户家目录创建.lldbinit,内容如下:

  • 第一种方法[lldbinit1]

    1
    2
    # 在compile_commands.json 同级目录添加经过测试无效,需要在系统 	`~/.lldbinit`目录下新建,原因未知。
    br set -n main -o true -G true -C "pro hand -p true -s false SIGSEGV SIGBUS"
  • 第二种方法[lldbinit2]

    1
    2
    #main.c是本地绝对路径
    breakpoint set --file /Users/../openjdk/src/java.base/share/native/launcher/main.c --line 98 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true
  • 第三种方法[lldbinit3]

    1
    break set -n main -C "process handle --pass true --stop false SIGSEGV" -C "process handle --pass true --stop false SIGBUS"

其他

关于在网上看到如下命令

1
2
3
bash configure --with-debug-level=slowdebug --with-jvm-variants=server
make CONF=macosx-x86_64-server-slowdebug compile-commands
make CONF=macosx-x86_64-server-slowdebug

关于CONF参数的作用,如果build目录下面只有一个配置信息,则可以省略。

补充说明 CONF=<config pattern>

点击查看CONF官方文档

出自文件:./make/InitSupport.gmk 第245行

CONF=

参考


Mac编译OpenJdk源码
https://blog.dekun.wang/blog/19ecb602.html
作者
Wang Dekun
发布于
2023-05-09 13:54 星期二
更新于
2023-06-01 22:41 星期四
许可协议