基于Mac OS Bigsur 编译OpenJDK8

  |   2 评论   |   1,442 浏览

简单记录一下编译过程.其它教程所说的各种要特殊处理的,我基本都没有遇到. 整个编译过程可以用丝滑来形容. 只是在折腾xcode的时候反而浪费了太多时间. 也浪费了好多流量.将近下了4-5遍吧. 将近下了近50多个G的安装包.

环境介绍:
操作系统: Mac OS BigSur , Version 11.6.5
xcode: https://download.developer.apple.com/Developer_Tools/Xcode_12.5.1/Xcode_12.5.1.xip
Xcode command line tools: https://download.developer.apple.com/Developer_Tools/Command_Line_Tools_for_Xcode_12.5.1/Command_Line_Tools_for_Xcode_12.5.1.dmg

Xcode 12.5.1
Build version 12E507

BootJDK 版本: jdk-7u80-macosx-x64
OpenJDK版本: openjdk jdk8u 源码 -> jdk8u
Make 版本: GNU Make 3.81

0 源代码选择

# 下载jdk8u分支下的仓库代码
http://hg.openjdk.java.net/jdk8u/jdk8u

不同版本的代码可能有差异.
这里选择jdk8u 这个分支的代码会一直更新.且是稳定的版本 , 会有小的修复.但是功能基本保持不变.
这样可以研究一个稳定的版本.具体可以参考:
https://wiki.openjdk.java.net/display/jdk8u/Main
https://wiki.openjdk.java.net/display/jdk8u/Guidelines+for+working+on+jdk8u

下面是来自知乎的引用:

JDK 8 代表的是一个大版本的更新,你可以理解成定义好了框架和实现
JDK 8u代表的是基于JDK 8的后续小版本的迭代,里面不会有 JDK 8 标准之外的内容,只会包含一些安全性,性能等方面的修改,例如某个Class的实现优化
一般来说,建议选用大版本下面最新的u版本,比如你要选择 JDK 8 ,那么就选择 JDK 8u281,这个是目前8这个大版本的最新版本,原因是里面会修复和优化前序版本的一些问题
作者:最灵活的胖子
链接:https://www.zhihu.com/question/442447628/answer/1711226912
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1 安装hg命令

# hg 实际为 mercurial 版本管理工具的命令.安装方式如下
brew install mercurial

hg是官方使用版本管理工具. 如果是非程序猿折腾了一下编译OPENJDK的乐趣,可以参考其它教程的直接下载压缩源码包进行编译.
甚至可以参考去github下载. 但是由于如果是因为"科学上网"的原因,那任何一种方式获取源码都是慢且不稳定的.
anyway, 程序猿还是推荐使用hb命令直接克隆官方仓库方式获取源码.
如果hg还是比较慢,可以挂代理,找梯子.

2 安装autoconf,gnu make

安装命令:

# 先确认你的系统是否自带.如果有了,可以不用安装.我的系统就已经带了这个软件.
brew install autoconf
brew install make

这两个工具一般在mac系统上都自带了.如果要安装可以自行搜索命令安装.
特别说明:
GNU MAKE版本需要 >= 3.8.1 ,而我的系统自带的刚好是这个版本

GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i386-apple-darwin11.3.0

3 安装freetype

# 安装freetype
brew install freetype

4 安装 compiledb

pip install compiledb

注1: 这个不是必须的,如果你想使用Clion此类的CMake项目类型的工具进行调试. 那需要安装此命令. 否则就使用最原始的Make命令就好了.
注2: 上面的pip是Python命令, 如果没有安装python或者没有pip.请自行搜索处理办法.

5 安装 BootJDKXCode

这里安装过程略. 直接到Oracle官网下载JDK版本进行安装即可. 安装完成找到JDK 的安装目录.
对于xcode的安装:
请选择最高12版本,最低4.65版本. 高于12的版本, 也是可以的,需要修改一些脚本. (经测试, bigsur系统使用13.2.1是可以编译完成的.不过需要小改一下generated-configure.sh脚本)

6 编译处理

6.1 进行配置 ./configure

使用如下命令进行配置:

sh ./configure MAKE=/usr/bin/make \
--with-toolchain-type=clang \
--with-debug-level=slowdebug \
--disable-zip-debug-info \
--with-target-bits=64 \
--with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/ \
--with-freetype-include=/usr/local/Cellar/freetype/2.12.0/include/freetype2 \
--with-freetype-lib=/usr/local/Cellar/freetype/2.12.0/lib/
  • BootJDK

注1: 你在使用上述命令的时候需要确认: 你的jdk版本是否与我的一致. freetype的版本与路径是否与我的一致. 不一致需要修改后再执行.

  • XCode

注2: mac平台的编译从版本xocde 6开始, 使用clang编译器进行编译.之前的xcode使用gcc进行编译.

执行完成我的输出总结如下:

====================================================
A new configuration has been successfully created in
/Users/lijianhong/IdeaProjects/jdk8u/build/macosx-x86_64-normal-server-slowdebug
using configure arguments 'MAKE=/usr/bin/make --with-toolchain-type=clang --with-debug-level=slowdebug --disable-zip-debug-info --with-target-bits=64 --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home/ --with-freetype-include=/usr/local/Cellar/freetype/2.12.0/include/freetype2 --with-freetype-lib=/usr/local/Cellar/freetype/2.12.0/lib/'.

Configuration summary:
* Debug level:    slowdebug
* JDK variant:    normal
* JVM variants:   server
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64

Tools summary:
* Boot JDK:       java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)  (at /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home)
* Toolchain:      clang (clang/LLVM)
* C Compiler:     Version 12.0.5 (at /usr/bin/clang)
* C++ Compiler:   Version 12.0.5 (at /usr/bin/clang++)

Build performance summary:
* Cores to use:   7
* Memory limit:   65536 MB

6.2 编译

compiledb make all COMPILER_WARNINGS_FATAL=false
# 可以使用 LOG=debug 选项来输出更为详细的信息
# compiledb make all LOG=debug COMPILER_WARNINGS_FATAL=false**

注: 如果你不使用Clion此类IDE工具,你也可以直接make all命令进行编译.

16 warnings
## Finished docs (build time 00:01:11)

----- Build times -------
Start 2022-05-11 02:16:26
End   2022-05-11 02:23:42
00:00:16 corba
00:00:19 demos
00:01:11 docs
00:01:29 hotspot
00:00:59 images
00:00:12 jaxp
00:00:17 jaxws
00:01:58 jdk
00:00:23 langtools
00:00:11 nashorn
00:07:16 TOTAL
-------------------------
Finished building OpenJDK for target 'all'

6.3 测试

测试version
~/IdeaProjects/jdk8u/build/macosx-x86_64-normal-server-slowdebug/jdk/bin]$./java -version
openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-lijianhong_2022_05_11_02_13-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00-debug, mixed mode)
测试代码:
import java.util.*;
public class Main {
  public static void main(String[] argv){
    System.out.println("hello world");
  }
}

使用如下命令进行编译:

~/IdeaProjects/jdk8u/build/macosx-x86_64-normal-server-slowdebug/jdk/bin/javac Main.java

使用如下命令运行:

~/IdeaProjects/jdk8u/build/macosx-x86_64-normal-server-slowdebug/jdk/bin/java -cp .:/Users/lijianhong/IdeaProjects/test   Main
hello world

至此, Mac版本的OpenJDK8就编译完成了.

7 总结

jdk8的源代码在分支jdk8u上其实一直在维护. 一直在对新的环境进行适配. 所以基本之前遇到的老问题现在都一一解决 比如要安装X11等.(不知道我的是否已经预安装,或者不需要了.整个过程没有遇到问题.).

一些QA:

Q: OPENJDK8很老了, 是不是要找特别老的系统来进行编译才能编译成功?
A: 以上,OpenJDK一直在维护,所以会一直更新编译基础设施以支持新的编译环境. 比如MacOS都已经支持到了xCode 12了.

Q: 看OpenJDK的官方文档说其采用了GNU MAKEAutoConf此类的技术,为何我们在编译时没有使用autoconf此类的命令,而是使用了./configure这样的命令的呢?
A: OpenJDK官方已经内置了使用autoconf命令生成的目标文件, 换句话说,这个步骤OpenJDK已经帮我们做了. 我们要从零开始也是可以的. 最原始的配置文件: configure.ac and various .m4 files in common/autoconf

Q: .m4是什么文件:
A: .m4是 一种宏文件,参考: GNU M4 is a prerequisite for Autoconf.

Q: 哪里可以了解GNU AutoConf?
A: 这是他们的官网:https://www.gnu.org/software/autoconf/

Q: 如果要编译 OpenJDK8 , 这个对mac 的操作系统的版本要求多么?
A: 这个几乎没有什么要求 .唯一的要求就 是xCode, 而xcode有一些挑系统. 比如 最新的13.3的xcode就不能在 bigsur运行.(WTF) , 所有的问题总结起来就是OpenJDK挑xcode,但是范围特别宽泛. 一般的4,6,9,12都是可以的.

8 参考

  1. http://hg.openjdk.java.net/jdk8u/jdk8u/raw-file/2f40422f564b/README-builds.html
  2. OpenJDK 编译指南(Ubuntu 16.04 + MacOS 10.15)
  3. Guidelines for working on jdk8u
  4. JDK 8,和 JDK 8U 有什么区别???
  5. https://mirrors.huaweicloud.com/java/jdk/7u80-b15/
  6. https://formulae.brew.sh/formula/mercurial
  7. # JDK版本侧重(收集于知乎问题)

评论

  • leesonwa @ellien 回复»

    没有使用过m1版本. 不建议不熟悉环境的直接尝试ARM架构的JDK

  • ellien 回复»

    mac m1芯片 11.2.3 big sur版本

    报错

    It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead

发表评论


取消