【openJDK系列1】macos编译openJDK 8

简介: 【openJDK系列1】macos编译openJDK 8

背景


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


基础环境


macos High Sierra 10.13.1

openJDK 8


编译

# 安装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

注意如果是用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++

其中,

image.png

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

make编译

执行如下命令:

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

其中,

image.png

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

  • 修改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中

相关文章
|
Ubuntu Java iOS开发
MacOS环境-手写操作系统-19-编译自动化
MacOS环境-手写操作系统-19-编译自动化
125 0
|
计算机视觉 iOS开发 C++
【OpenCV】在MacOS上源码编译OpenCV
【7月更文挑战第9天】在MacOS上源码编译OpenCV需分步进行: 1. 准备工作: 安装Xcode, Command Line Tools及依赖如CMake, Homebrew. 2. 获取OpenCV源码: 从官网下载并解压所需版本. 3. 编译OpenCV. 4. 安装OpenCV: 编译后使用`sudo make install`进行安装. 5. 验证安装: 编写简单C++程序测试OpenCV功能, 如读取并显示图片.
757 1
|
IDE 开发工具 Android开发
在Windows和macOS平台,自主编译Qt Creator和Qt Designer源码
在Windows和macOS平台,自主编译Qt Creator和Qt Designer源码
938 0
|
Java iOS开发 MacOS
优雅地在Mac OS Catalina下 编译 Open JDK 13(下)
优雅地在Mac OS Catalina下 编译 Open JDK 13(下)
191 0
优雅地在Mac OS Catalina下 编译 Open JDK 13(下)
|
Oracle Java 关系型数据库
优雅地在Mac OS Catalina下 编译 Open JDK 13(上)
优雅地在Mac OS Catalina下 编译 Open JDK 13(上)
324 0
优雅地在Mac OS Catalina下 编译 Open JDK 13(上)
|
Java Unix 程序员
macOS环境使用clang/makefile编译opencv-4.2.0和opencv_contrib-4.2.0源码
macOS环境使用clang/makefile编译opencv-4.2.0和opencv_contrib-4.2.0源码
731 0
macOS环境使用clang/makefile编译opencv-4.2.0和opencv_contrib-4.2.0源码
|
并行计算 开发工具 C语言
微软开源分布式高性能GB框架LightGBM MacOS下编译安装过程
LightGBM(Light Gradient Boosting Machine)是一个基于决策树算法的快速的、分布式的、高性能 gradient boosting(GBDT、GBRT、GBM 或 MART)框架,可被用于排行、分类以及其他许多机器学习任务中。
1424 0
|
Web App开发 分布式计算 关系型数据库
mac OS X Yosemite 上编译hadoop 2.6.0/2.7.0及TEZ 0.5.2/0.7.0 注意事项
1、jdk 1.7问题 hadoop 2.7.0必须要求jdk 1.7.0,而oracle官网已经声明,jdk 1.7 以后不准备再提供更新了,所以趁现在还能下载,赶紧去down一个mac版吧 http://www.
1430 0