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)

        开始

        简述问题

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

        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位(虚惊一场)。

        # 自查指令,我的机器上返回 "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的语法不熟,便做了最简单的修改(见最后)。

        步骤二扩展:

        # 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即可。

        case "$host_cpu" in
            ....
            arm*)
              VAR_CPU=arm
              VAR_CPU_ARCH=arm
              VAR_CPU_BITS=32
              VAR_CPU_ENDIAN=little
              ;;
              ....
          esac