Mac编译OpenJdk源码
本文最后更新于:2023-05-12 22:53 星期五
MacOs编译OpenJDK
- 未强调目录,即本地仓库根目录
- 编译Git Tag:jdk-21+21 # 本想编译jdk17,奈何17版本报错太多,无法解决,怀疑是xcode或系统版本问题,索性目前最新。
点击下面按钮跳转相关文档
获取OpenJDK
源码仓库地址1 |
|
编译环境
软件环境 (参考官网文档,自行安装。MacOs 推荐使用brew)
macos Ventura 13.3.1 (a)
xcodebuild -version
: Xcode 14.3xcode-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/binclang++ --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/binautoconf --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 |
|
1 |
|
–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 |
|
configure 结果
1 |
|
build
目录生成如下目录。
1 |
|
make
make [Targets]
[Targets文档]
1 |
|
1 |
|
导入Clion
compile-commands.json
生成 compile-commands.json ,Compile Commands参考Clion[彩蛋]文档[jetbrains]
1 |
|
导入
使用Clion打开目录
./build/macosx-x86_64-server-slowdebug/compile_commands.json
文件。使用项目打开,等待Clion完成项目索引扫描
更改项目根目录为OpenJDK根目录,等待重新扫描索引。如下图
配置
配置外部工具
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)
Run/Debug configuration
编译jdk,修改jdk源码后编译源码使用。
运行Debug
Debug入口
src/java.base/share/native/libjli/java.c
第391行Debug出现 SIGSEGV (signal SIGSEGV)
IDEA 引用 Native OpenJDK
IDEA 新建工程,并修改JDK为编译好的jdk(
build/macosx-x86_64-server-slowdebug/images/
),将源码修改为OpenJdk根目录下的src目录。修改jdk代码
执行 make images 编译jdk
源码更目录执行
make images
或在CLion执行预先配置好的make images即可。运行测试代码看修改效果
异常问题
error: unmappable character (0xE6) for encoding ascii
make/common/JavaCompilation.gmk
文件,274行将 ascii
修改为utf-8
Library not loaded: /usr/local/lib/libgvc.6.dylib 错误信息
Library not loaded: /usr/local/lib/libgvc.6.dylib 错误信息
1 |
|
解决方式 : 将 graphviz[graphviz官网]的 lib目录下 .dylib
文件映射到 /usr/local/lib/
目录下
解决方式:执行以下命令即可。
1 |
|
寻找到的变相解决方式,反正是意外的解决了make all
报错的问题。
感觉不是最终解决方式,但有没有更好的方式,如看到此贴的人知道,麻烦请告知一下更好的解决方案。📮邮箱 : wangdekunemail@gmail.com
ln -s /usr/local/Cellar/graphviz/8.0.5/lib/libcdt.5.dylib /usr/local/lib/libcdt.5.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libcgraph.6.dylib /usr/local/lib/libcgraph.6.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libgvc.6.dylib /usr/local/lib/libgvc.6.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libgvpr.2.dylib /usr/local/lib/libgvpr.2.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/liblab_gamut.1.dylib /usr/local/lib/liblab_gamut.1.dylibln -s /usr/local/Cellar/grahviz/8.0.5/lib/libpathplan.4.dylib /usr/local/lib/libpathplan.4.dylibln -s /usr/local/Cellar/graphviz/8.0.5/lib/libxdot.4.dylib /usr/local/lib/libxdot.4.dylib
lldb报错:
SIGSEGV (signal SIGSEGV) (涉及到C/C++相关内容,不明所以,完全是照猫画虎)
解决办法是,在用户家目录创建
.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目录下面只有一个配置信息,则可以省略。
参考
- Targets文档:https://hg.openjdk.org/jdk/jdk11/raw-file/tip/doc/building.html#common-make-targets ↩
- jetbrains:https://www.jetbrains.com/help/fleet/generating-a-json-compilation-database.html ↩
- 彩蛋:来源网络的激活工具 https://ffff.ga/ ↩
- graphviz官网:https://graphviz.org/download/#mac ↩
- lldbinit1:https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/ ↩
- lldbinit2:https://www.jianshu.com/p/e7891d25ba6a ↩
- lldbinit3:https://jiawanggjia.github.io/post/openjdk-bian-yi-zhi-nan/ ↩