【openJDK系列1】macos编译openJDK 8

背景

因为之前一直在研究jdk源码,但是基于自己比较懒的缘故,一直没有手动编译过jdk源码,也就只是看看书本上的东西,似懂非懂的看懂了也就草草了事了,这次终于下定决心编译一把openJDK8的源码

基础环境

macos High Sierra 10.13.1
openJDK 8

编译

直接找到 http://hg.openjdk.java.net/ ,执行以下命令

# 安装mercurial
brew install mercurial
# clone openJDK源码
hg clone http://hg.openjdk.java.net/jdk8/jdk8 openjdk8

当然在git JDK也有对应的JDK源码,git clone之后checkout到对应的tag上进行编译也是可以的

git clone https://github.com/openjdk/jdk
git checkout -b openjdk8  jdk8-b80

注意如果是用hg clone的方式我们还得执行sh ./get_source.sh命令来获取额外的文件,对于Mercurial和Git的区别,网上一大堆,网友可以自行查找,操作方式可以参考hg git 操作

我们这里选择hg clone的方式,执行

cd openjdk8 && sh ./get_source.sh

安装依赖

brew install freetype

Running Configure

bash ./configure --with-debug-level=slowdebug  --with-boot-jdk=/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home --with-freetype-include=/usr/local/Cellar/freetype/2.10.4/include/freetype2 --with-freetype-lib=/usr/local/Cellar/freetype/2.10.4/lib --with-target-bits=64 --with-jvm-variants=server --with-jdk-variant=normal --with-milestone=internal  --with-num-cores=2 --with-jobs=4 CC=clang CXX=clang++

其中,

名词说明
–with-debug-level可选release[默认值], fastdebug, slowdebug slowdebug 含有最丰富的调试信息
–with-boot-jdk用于bootstrap build,指向本地已有的jdk
–with-freetype-includefreetype include文件目录
–with-freetype-libfreetype lib目录
–with-target-bits编译成64还是32位jdk
–with-jvm-variantsjvm 的模式如server,client,kernel等,多个用逗号分开
–with-jdk-variantjdk的模式,会在build目录下生成的文件下有体现
–with-milestonebuild的里程碑,也就是阶段,会在build目录下生成的文件下有体现
–with-num-cores用于此次build的核数
–with-jobsbuild的并发任务数
CCC 编译器命令,如:clang,gcc
CXXC++编译器命令,如:clang++,g++

关于clang和gcc的区别,参考clang和gcc的区别

make编译
执行如下命令:

make COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' CC=clang USE_CLANG=true LP64=1 

其中,

名词解释
COMPILER_WARNINGS_FATAL设置为false来跳过严格的编译器的语法检查
LFLAGS链接时使用的参数
CCC编译器命令
LP64使用64位数据模型

编译的过程出现如下问题,以及解决:

  • 修改relocInfo.hpp的367行(hotspot/src/share/vm/code/relocInfo.hpp),没验证为啥需要修改
    修改前:
inline friend relocInfo prefix_relocInfo(int datalen=0);

修改后:

inline friend relocInfo prefix_relocInfo(int datalen)
  • 修改generated-configure.sh的20061和21640行(common/autoconf/generated-configure.sh),解决configure: error: GCC compiler is required 错误
    修改前:
as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 6
as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5

修改后:

# as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 6
# as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
  • 修改hotspot/src/share/vm/opto/loopPredicate.cpp 755行,解决error: ordered comparison between pointer and zero (‘const TypeInt *’ and ‘int’)
    修改前:
assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int() ->_lo >= 0, "must be");

修改后:

// assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int() ->_lo >= 0, "must be");
  • 安装XQuartz,解决’X11/Xlib.h’ file not found
    安装详细信息见关于 Mac 版 X11,意思即使Mac 不再随附 X11,得自己手动安装,安装完后做软连:
     ln -s /opt/X11/include/X11 /usr/local/include/X11
    

如果build成功则会出现:

----- Build times -------
Start 2020-11-24 14:18:38
End   2020-11-24 14:18:50
00:00:01 corba
00:00:06 hotspot
00:00:00 jaxp
00:00:00 jaxws
00:00:02 jdk
00:00:01 langtools
00:00:12 TOTAL
-------------------------
Finished building OpenJDK for target 'default'

验证

build/macosx-x86_64-normal-server-slowdebug/jdk/bin/java -version

居然报错,what??? s s s

   #
   # A fatal error has been detected by the Java Runtime Environment:
   #
   #  SIGILL (0x4) at pc=0x000000010f1ed218, pid=74259, tid=6915
   #
   # JRE version: OpenJDK Runtime Environment (8.0) (build 1.8.0-internal-debug-ljh_2020_11_23_23_19-b00)
   # Java VM: OpenJDK 64-Bit Server VM (25.0-b70-debug mixed mode bsd-amd64 compressed oops)
   # Problematic frame:
   # V  [libjvm.dylib+0x9ed218]  PerfData::~PerfData()+0x8
   #
   # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
   #
   # If you would like to submit a bug report, please visit:
   #   http://bugreport.sun.com/bugreport/crash.jsp
   #

修改hotspot/src/share/vm/runtime/perfData.cpp 285行,此处参考了stackoverflow简书
修改前:

delete p;

修改后:

// delete p;

之后执行make clean再重新编译,

再重新执行

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-ljh_2020_11_24_11_02-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)

至此,openJDK8在macOS上的编译完成,具体编译的步骤在源码REDAME中

### 回答1: macOS M1是苹果公司推出的一款基于ARM架构的操作系统,而JDK8是Java开发环境的一部分。下面给出300字的回答。 macOS M1是苹果公司于2020年推出的基于ARM架构的新一代操作系统。相比以往的Mac电脑使用的Intel芯片,M1芯片采用了自家研发的ARM架构,具有更高的性能和更低的功耗。对于开发者来说,在macOS M1上运行JDK8是完全可行的。 JDK8(Java Development Kit 8)是Java开发环境的一部分,包含了编写、编译和运行Java程序所需的工具集合。JDK8作为Java语言的一项重要技术,广泛应用于开发各类应用程序,包括Web应用、移动应用、桌面应用等。 在macOS M1上使用JDK8进行开发是非常方便的。由于macOS M1自带了ARM架构的处理器,所以并不需要进行额外的设置或安装其他软件。开发者只需要去Oracle官网下载适用于ARM架构的JDK8版本,然后进行安装即可。安装完成后,就可以使用JDK提供的工具,例如Java编译器javac和Java虚拟机java,来编写和运行Java程序。 使用macOS M1和JDK8进行Java开发的优势是明显的。首先,macOS M1采用了ARM架构,在处理器性能和功耗方面都有很大的提升,可以提供更加流畅和高效的开发体验。其次,JDK8作为Java开发环境的核心,提供了丰富的类库和工具,可以满足开发者在不同领域开发的需求。最后,苹果公司一直致力于优化开发工具和环境,所以使用macOS M1和JDK8进行Java开发可以得到更好的支持和体验。 总的来说,macOS M1和JDK8的结合为开发者提供了一种高效、可靠的Java开发环境,可以满足各种开发需求,并且可以充分发挥出macOS M1处理器的优势。无论是新的ARM架构还是成熟的JDK8,都会为开发者带来更好的开发体验。 ### 回答2: macOS M1是苹果公司最新一代的处理器架构,而JDK 8是Java开发工具包的第8个版本。 macOS M1基于ARM架构,与传统的x86架构不同,所以它需要经过适配才能正常运行一些软件。对于使用JDK 8的开发者来说,他们需要安装与macOS M1兼容的JDK 8版本,以便在新的处理器上正常运行Java应用程序。 幸运的是,Oracle已经发布了针对macOS M1的JDK 8版本。开发者可以从Oracle官方网站下载并安装这个版本。安装过程与在其他系统上安装JDK 8相似。 一旦安装完成,开发者就可以使用JDK 8在macOS M1上编写和运行Java应用程序。他们可以使用Java的各种特性和API,进行开发、测试和调试。 需要注意的是,由于macOS M1和传统x86架构的差异,一些JDK 8的特性和库可能会有所不同。开发者需要在使用这些特性和库时进行测试和适配,以确保应用程序在macOS M1上的正常运行。 总而言之,对于想要在macOS M1上使用JDK 8开发Java应用程序的开发者来说,他们可以通过下载并安装与macOS M1兼容的JDK 8版本来实现这一目标。然后,他们可以利用Java的特性和API进行开发,并在macOS M1上正常运行他们的应用程序。 ### 回答3: macOS M1是苹果公司最新推出的基于ARM架构的操作系统,而JDK8是Java开发工具包的第8个版本。目前,针对macOS M1的JDK8版本还没有官方的原生支持,但是可以通过一些方法进行安装和配置。 首先,我们可以通过在macOS M1上安装openJDK来使用JDK8。openJDK是一个开源项目,可以在官网上下载与macOS M1兼容的版本。下载安装后,我们需要配置环境变量,以确保系统可以找到新安装的JDK。 其次,我们还可以使用Rosetta 2模拟器来运行x86架构的JDK8。Rosetta 2是macOS M1上的一个工具,可以将x86应用程序转换为适用于ARM架构的应用程序。通过在终端中执行命令,我们可以启用Rosetta 2并使用x86版本的JDK8。 需要注意的是,虽然以上方法可以在macOS M1上运行JDK8,但由于JDK8不是为ARM架构优化的,可能会有性能上的一些损失。因此,如果有可能,我们推荐使用官方支持的JDK版本,如JDK11或JDK15,这些版本已经进行了ARM架构的优化,可以更好地发挥macOS M1的性能优势。 总结来说,虽然macOS M1目前没有官方支持的JDK8版本,但我们仍然可以通过安装openJDK或使用Rosetta 2模拟器来在M1上运行JDK8,不过建议尽可能使用官方支持的JDK版本以获得更好的性能和兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值