macOS sonoma 14.4.1编译JDK 12

macOS sonoma 14.4.1编译JDK 12

记录一次靠自己看代码解决问题的经历(总之就是非常开心)。

首先,先diss一下bing,我差一点就放弃了。

环境

  • macOS sonoma 14.4.1
  • Boot JDK 11
  • Xcode 15.3

参考文档

openJdk 源码中building文件(路径如下: /doc/building)

开始

简述问题

不整虚的,先放上我自己碰到的问题。

bash 复制代码
configure: The tested number of bits in the target (64) differs from the number of bits expected to be found in the target (32)

简单来说,就是期望构建64版本的JDK,但是我的机器是32位,未通过校验。

心路历程

给我整不自信了,被某东坑了?我靠,这会可是已经过了质保时间了啊(哭)。赶紧自查,还好是64位(虚惊一场)。

bash 复制代码
# 自查指令,我的机器上返回 "arm64"
uname -m

于是开始上网冲浪,先是问的Bing,什么手把手教学啊的文章映入眼帘,但是扫了几眼,人家没碰到我的问题,而且很顺利。没辙,问问chatGpt,给了我一个配置参数(我去指令都让我自己背下来了) : --with-target-bits=64。试了之后仍然没什么用,再问也没了结果。只好再去问Bing,并且提供了更详细的描述,结果告诉我Open JDK不能在ARM上运行。扭头去问gpt,结果如下(还是gpt牛):

询问到此为止(我已经不知道该怎么组织提示词了)。

看看终端执行编译指令给出的错误信息,发现有这么个东东(这好像是个脚本啊)。

/jdk12-06222165c35f/build/.configure-support/generated-configure.sh: line 84: 5: Bad file descriptor

着手解决

  1. 找到提示信息所在行数(搜索关键字: The tested number of bits in the target),比对错误信息。
    结论:"OPENJDK_TARGET_CPU_BITS" 这个参数为 32,
  2. 猜测,该脚本会根据机器信息,为该参数赋不同的值。根据关键字(OPENJDK_TARGET_CPU_BITS)检索,寻找跟该参数赋值逻辑有关的内容(OPENJDK_TARGET_CPU_BITS -> VAR_CPU_ARCH -> host_cpu),并打印在终端。
  3. 发现代码中,对于mac系统的赋值只存在于一处,因为自己比较懒且对sh的语法不熟,便做了最简单的修改(见最后)。

步骤二扩展:

bash 复制代码
# 1、找出OPENJDK_TARGET_CPU_BITS赋值的位置(共2处)
# 1.1 不符合
if test "x$with_target_bits" = x32 && test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
      # A reduced build is requested
      COMPILE_TYPE="reduced"
      OPENJDK_TARGET_CPU_BITS=32
      if test "x$OPENJDK_TARGET_CPU_ARCH" = "xx86"; then
        OPENJDK_TARGET_CPU=x86
      elif test "x$OPENJDK_TARGET_CPU_ARCH" = "xsparc"; then
        OPENJDK_TARGET_CPU=sparc
      else
        as_fn_error $? "Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" "$LINENO" 5
      fi
    
# 1.2 看不懂不确定,但是也只剩这一处了
# ... and setup our own variables. (Do this explicitly to facilitate searching)
  OPENJDK_TARGET_OS="$VAR_OS"
  if test "x$VAR_OS_TYPE" != x; then
    OPENJDK_TARGET_OS_TYPE="$VAR_OS_TYPE"
  else
    OPENJDK_TARGET_OS_TYPE="$VAR_OS"
  fi
  if test "x$VAR_OS_ENV" != x; then
    OPENJDK_TARGET_OS_ENV="$VAR_OS_ENV"
  else
    OPENJDK_TARGET_OS_ENV="$VAR_OS"
  fi
  OPENJDK_TARGET_CPU="$VAR_CPU"
  OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH"
  OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS"
 
 # 2、找出VAR_CPU_BITS赋值的位置(就是这里了,所以但凡是arm架构的,都被当成了32位机器(淦..)。)
 case "$host_cpu" in
    ....
    arm*)
      VAR_CPU=arm
      VAR_CPU_ARCH=arm
      VAR_CPU_BITS=32
      VAR_CPU_ENDIAN=little
      ;;
      ....
  esac

最终解决(前面有点啰嗦了,可以直接看这里)

将VAR_CPU_BITS改成64即可。

bash 复制代码
case "$host_cpu" in
    ....
    arm*)
      VAR_CPU=arm
      VAR_CPU_ARCH=arm
      VAR_CPU_BITS=32
      VAR_CPU_ENDIAN=little
      ;;
      ....
  esac
相关推荐
蛋蛋的就会顺顺的6 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8267 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡7 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
伯恩bourne9 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_9 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs10 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲10 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog10 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616810 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail10 小时前
05 管理活动与选品
java