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
着手解决
- 找到提示信息所在行数(搜索关键字: The tested number of bits in the target),比对错误信息。
结论:"OPENJDK_TARGET_CPU_BITS" 这个参数为 32, - 猜测,该脚本会根据机器信息,为该参数赋不同的值。根据关键字(OPENJDK_TARGET_CPU_BITS)检索,寻找跟该参数赋值逻辑有关的内容(OPENJDK_TARGET_CPU_BITS -> VAR_CPU_ARCH -> host_cpu),并打印在终端。
- 发现代码中,对于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