当前位置: 首页 > news >正文

MacOS 环境编译 JVM 源码

一、Mac 当前工具环境

系统环境

在这里插入图片描述

需要的工具

在这里插入图片描述

二、资源下载

XCode 下载

苹果官网 xcode 下载

xcode_13.4.1 下载

JDK 下载

JDK 的网址

推荐下载 jdk 11

在这里插入图片描述

三、编译步骤

# 检查当前环境是否满足
sh configure

环境满足
如果出现上面的图表示环境满足

# 全量编译
make all

四、遇见问题和解决方案

错误一

$  make
Building target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release'
Warning: No mercurial configuration present and no .src-rev
Compiling 8 files for BUILD_TOOLS_LANGTOOLS

~/Java/openjdk11/openjdk/src/hotspot/share/runtime/arguments.cpp:1461:35: error: result of comparison against a string literal is unspecified (use an explicit string comparison function instead) [-Werror,-Wstring-compare]
      if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {
                                  ^  ~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make[3]: *** [/Users/lzq/Java/openjdk11/openjdk/build/macosx-x86_64-normal-server-release/hotspot/variant-server/libjvm/objs/arguments.o] Error 1
make[3]: *** Waiting for unfinished jobs....
Compiling 90 properties into resource bundles for java.desktop
Compiling 2961 files for java.base
make[2]: *** [hotspot-server-libs] Error 2
make[2]: *** Waiting for unfinished jobs....

ERROR: Build failed for target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release' (exit code 2) 
Stopping sjavac server

=== Output from failing command(s) repeated here ===
* For target hotspot_variant-server_libjvm_objs_arguments.o:
~/Java/openjdk11/openjdk/src/hotspot/share/runtime/arguments.cpp:1461:35: error: result of comparison against a string literal is unspecified (use an explicit string comparison function instead) [-Werror,-Wstring-compare]
      if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {
                                  ^  ~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

* All command lines available in /Users/lzq/Java/openjdk11/openjdk/build/macosx-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===

No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See doc/building.html#troubleshooting for assistance.

make[1]: *** [main] Error 2
make: *** [default] Error 2

根据提示,需要修改src/hotspot/share/runtime/arguments.cpp文件的源码: 将第1461行的常量从DEFAULT_VENDOR_URL_BUG更改为0 更改前:

1461 if (old_java_vendor_url_bug != DEFAULT_VENDOR_URL_BUG) {
更改后:

1461 if (old_java_vendor_url_bug != 0) {

错误二

更改源码之后,重新make clean,然后make
$ make clean

Building target 'clean' in configuration 'macosx-x86_64-normal-server-release'
... ...
$  make
... ...

=== Output from failing command(s) repeated here ===
* For target hotspot_variant-server_libjvm_objs_sharedRuntime.o:
~/Java/openjdk11/openjdk/src/hotspot/share/runtime/sharedRuntime.cpp:2798:85: error: expression does not compute the number of elements in this array; element type is 'double', not 'relocInfo' [-Werror,-Wsizeof-array-div]
      buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
                                                                          ~~~~~~~~  ^
~/Java/openjdk11/openjdk/src/hotspot/share/runtime/sharedRuntime.cpp:2797:14: note: array 'locs_buf' declared here
      double locs_buf[20];
             ^
~/Java/openjdk11/openjdk/src/hotspot/share/runtime/sharedRuntime.cpp:2798:85: note: place parentheses around the 'sizeof(relocInfo)' expression to silence this warning
      buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
                                                                                    ^
1 error generated.

* All command lines available in /Users/lzq/Java/openjdk11/openjdk/build/macosx-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===

No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See doc/building.html#troubleshooting for assistance.

make[1]: *** [main] Error 2
make: *** [default] Error 2

根据,提示,我们需要修改src/hotspot/share/runtime/sharedRuntime.cpp这个文件的源码。 更改前:

2798       buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, sizeof(locs_buf) / sizeof(relocInfo));
更改后:

2798       buffer.insts()->initialize_shared_locs((relocInfo*)locs_buf, (sizeof(locs_buf)) / (sizeof(relocInfo)));
你没看错。。就是增加了两个括号而已,但是就是这么神奇,不加就报错,加了就不报错

在这里插入图片描述

错误三

重新make clean后,再次make,这时候出现了第三个编译错误。。。

$ make clean
Building target ‘clean’ in configuration ‘macosx-x86_64-normal-server-release’
$ make

=== Output from failing command(s) repeated here ===
* For target support_native_java.desktop_libawt_lwawt_CSystemColors.o:
/Users/lzq/Java/openjdk11/openjdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m:134:9: error: converting the result of '?:' with integer constants to a boolean always evaluates to 'true' [-Werror,-Wtautological-constant-compare]
    if (colorIndex < (useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS) {
        ^
1 error generated.

* All command lines available in /Users/lzq/Java/openjdk11/openjdk/build/macosx-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===

No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See doc/building.html#troubleshooting for assistance.

make[1]: *** [main] Error 2
make: *** [default] Error 2

从错误信息里面可以看出,我们这里需要修改src/java.desktop/macosx/native/libawt_lwawt/awt/CSystemColors.m这个文件,修改方式和第2个错误基本相同,也是加括号=_=

修改前:

134     if (colorIndex < (useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS) {
修改后:

134     if (colorIndex < ((useAppleColor) ? sun_lwawt_macosx_LWCToolkit_NUM_APPLE_COLORS : java_awt_SystemColor_NUM_COLORS)) {
基本没啥差别,就是加了个括号。

错误四

这时再次make,还会出现一个错误

$ make clean
$ make

ERROR: Build failed for target 'default (exploded-image)' in configuration 'macosx-x86_64-normal-server-release' (exit code 2)
Stopping sjavac server

=== Output from failing command(s) repeated here ===
* For target support_native_java.desktop_libjsound_PLATFORM_API_MacOSX_MidiUtils.o:
/Users/lzq/Java/openjdk11/openjdk/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_MidiUtils.c:263:31: error: cast to smaller integer type 'MIDIClientRef' (aka 'unsigned int') from 'void *' [-Werror,-Wvoid-pointer-to-int-cast]
static MIDIClientRef client = (MIDIClientRef) NULL;
                              ^~~~~~~~~~~~~~~~~~~~
/Users/lzq/Java/openjdk11/openjdk/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_MidiUtils.c:264:29: error: cast to smaller integer type 'MIDIPortRef' (aka 'unsigned int') from 'void *' [-Werror,-Wvoid-pointer-to-int-cast]
static MIDIPortRef inPort = (MIDIPortRef) NULL;
                            ^~~~~~~~~~~~~~~~~~
/Users/lzq/Java/openjdk11/openjdk/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_MidiUtils.c:265:30: error: cast to smaller integer type 'MIDIPortRef' (aka 'unsigned int') from 'void *' [-Werror,-Wvoid-pointer-to-int-cast]
static MIDIPortRef outPort = (MIDIPortRef) NULL;
                             ^~~~~~~~~~~~~~~~~~
/Users/lzq/Java/openjdk11/openjdk/src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_MidiUtils.c:471:32: error: cast to smaller integer type 'MIDIEndpointRef' (aka 'unsigned int') from 'void *' [-Werror,-Wvoid-pointer-to-int-cast]
    MIDIEndpointRef endpoint = (MIDIEndpointRef) NULL;
                               ^~~~~~~~~~~~~~~~~~~~~~
   ... (rest of output omitted)

* All command lines available in /Users/coachhe/Tools/jdk-compile/openjdk11/build/macosx-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===

No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See doc/building.html#troubleshooting for assistance.

make[1]: *** [main] Error 2
make: *** [default] Error 2

可以看到,这里需要修改src/java.desktop/macosx/native/libjsound/PLATFORM_API_MacOSX_MidiUtils.c文件的4个地方。但是修改方式是统一的,都是将括号里的内容(MIDIClientRef,MIDIPortRef,MIDIEndpointRef)修改为unsigned long。

修改前:

263 static MIDIClientRef client = (MIDIClientRef) NULL;
264 static MIDIPortRef inPort = (MIDIPortRef) NULL;
265 static MIDIPortRef outPort = (MIDIPortRef) NULL;

471 MIDIEndpointRef endpoint = (MIDIEndpointRef) NULL;

修改后:

263 static MIDIClientRef client = (unsigned long) NULL;
264 static MIDIPortRef inPort = (unsigned long) NULL;
265 static MIDIPortRef outPort = (unsigned long) NULL;

471 MIDIEndpointRef endpoint = (unsigned long) NULL;

错误五

jfrNetworkUtilization.cpp:58:25: error: too many arguments provided to function-like macro invocatio

assert 宏定义有问题

解决方案

把用到的几处先注释掉 assert
在这里插入图片描述

错误六

ld: warning: dylib (/Users/lzq/Java/openjdk11/openjdk/build/macosx-x86_64-normal-server-release/support/modules_libs/java.base/server/libjvm.dylib) was built for newer macOS version (12.0) than being linked (10.9)

ERROR: Build failed for target 'all' in configuration 'macosx-x86_64-normal-server-release' (exit code 2)

=== Output from failing command(s) repeated here ===
* For target support_native_java.base_libjava_ProcessImpl_md.o:
/Users/lzq/Java/openjdk11/openjdk/src/java.base/unix/native/libjava/ProcessImpl_md.c:364:17: error: 'vfork' is deprecated: Use posix_spawn or fork [-Werror,-Wdeprecated-declarations]
    resultPid = vfork();
                ^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/unistd.h:604:1: note: 'vfork' has been explicitly marked deprecated here
__deprecated_msg("Use posix_spawn or fork")
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.3.sdk/usr/include/sys/cdefs.h:208:48: note: expanded from macro '__deprecated_msg'
        #define __deprecated_msg(_msg) __attribute__((__deprecated__(_msg)))
                                                      ^
1 error generated.

* All command lines available in /Users/lzq/Java/openjdk11/openjdk/build/macosx-x86_64-normal-server-release/make-support/failure-logs.
=== End of repeated output ===

No indication of failed target found.
Hint: Try searching the build log for '] Error'.
Hint: See doc/building.html#troubleshooting for assistance.

make[1]: *** [main] Error 2
make: *** [all] Error 2

resultPid = vfork(); 改成 resultPid = fork();

编译成功
在这里插入图片描述

JDK11编译过程(超详细,超多图)

相关文章:

  • Linux内核互斥技术1
  • 【RHCE-第五天作业】
  • MFCC--学习笔记
  • 领航杯2022年-Crypto-rsa
  • 黄北断裂和渤南2号断裂
  • JS逆向之巨量算数signature与data解密
  • 网站收录查询-批量网站收录查询软件
  • Docker - 镜像的分层 - busybox镜像制作
  • 每日三题 9.02
  • RabbitMQ 26问,基本涵盖了面试官必问的面试题
  • 轻取软考45分之软考信息系统项目管理师范围管理​章节学习笔记
  • C#实现二叉树的最大深度
  • 用Python实现广度优先搜索
  • bitset位集学习
  • Modbus协议介绍
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • JS实现简单的MVC模式开发小游戏
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Linux gpio口使用方法
  • mysql 5.6 原生Online DDL解析
  • rc-form之最单纯情况
  • vue-cli3搭建项目
  • 笨办法学C 练习34:动态数组
  • 关于字符编码你应该知道的事情
  • 将回调地狱按在地上摩擦的Promise
  • 蓝海存储开关机注意事项总结
  • 力扣(LeetCode)21
  • 力扣(LeetCode)22
  • 入门级的git使用指北
  • 通过调用文摘列表API获取文摘
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #控制台大学课堂点名问题_课堂随机点名
  • (145)光线追踪距离场柔和阴影
  • (2)STM32单片机上位机
  • (done) 两个矩阵 “相似” 是什么意思?
  • (LeetCode 49)Anagrams
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)菜鸟学数据库(三)——存储过程
  • ***测试-HTTP方法
  • *上位机的定义
  • .FileZilla的使用和主动模式被动模式介绍
  • .net 7 上传文件踩坑
  • .Net 8.0 新的变化
  • .NET Core 中的路径问题
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Framework .NET Core与 .NET 的区别
  • .net mvc 获取url中controller和action
  • .Net 路由处理厉害了
  • .NET 设计模式初探
  • .NET 使用 XPath 来读写 XML 文件
  • .net 验证控件和javaScript的冲突问题