vlambda博客
学习文章列表

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

系列文章:

1、Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

2、最新Mac版本OpenJDK8编译调试源码下载(直接使用无需修改,简单方便)

3、Mac10.14下使用Clion调试OpenJDK8最新教程(附源码)

 

源码移步>>>最新Mac版本OpenJDK8编译调试源码下载(直接使用无需修改,简单方便)

一、前言

最近在深入研究Java锁升级的过程中遇到很多问题。这些问题从网上各类文章中都没有找到合适的答案(网上大部分都说的比较概念化,深入细节的关键点也没能说清楚,后续我会专门整理一篇从源码层面分析Java锁升级的文章,敬请期待),于是迫不得已只能自己下载JDK源码进行研究。

因为要研究源码就不得不对源码进行编译、调试等操作。由于自己对C/C++不熟悉,所以在整个过程中遇到了很多问题、查阅了很多文章,也费力很多精力。本篇文章就对本次OpenJdk8的编译、调试过程进行一次整理记录。希望对有需要的同学有所帮助。

二、环境准备

1、环境说明

我当前的编译环境信息如下:

操作系统:Mac OS 10.14.6

Xcode版本:10.3

Command_Line_Tools版本:macOS 10.14 for Xcode 10.3

其他需要软件(版本貌似没有要求,最新就OK吧):mercurial(openjdk的版本管理工具)、ccache(用于加速编译)、freetype(编译所需)

PS:

1、一定要注意Mac OS 、 Xcode和Command_Line_Tools的版本,不同的版本遇到的问题会有所不同。所以如果想完全跟着本文编译调试,建议和楼主使用相同的版本号。

2、Xcode的版本和Command_Line_Tools的版本要对应。

2、软件安装

A、安装Xcode

由于我的Mac OS版本不是最小的10.15,所以无法从App Store上直接下载Xcode版本进行安装(下载会提示安装不了)。如果大家的mac可以下载,则直接安装从App Store安装即可。下面我们将讲解下不从App Store如何安装Xcode。

首先我们访问苹果官网(需要苹果账号登录):https://developer.apple.com/download/more/,这里会有各类软件的历史版本。我们直接搜索Xcode,然后找到10.3的版本下载即可。下载完成之后直接安装dmg,安装过程比较简单,就不赘述了。

B、安装Command_Line_Tools

据说新版的Xcode安装后不会自动安装Command_Line_Tools。所以我们需要自己安装。方法和Xcode的安装方式一样,直接到上述官网下载安装即可。

如果自己已经存在Command_Line_Tools,但为了确保版本号和Xcode一致,我们可以将本地的Command_Line_Tools删除即可。删除方法比较简单,直接执行sudo rm -rf  /Library/Developer/CommandLineTools即可。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

C、Xcode的licence签收

新安装的Xcode需要签收同意它的licence。其方式比较独特,即在命令行中输入(需要root权限):sudo xcodebuild -license。然后会弹出很多文本内容,即licence内容。不用看直接不停按tab键滑到文件最后,然后输入一个agree,敲回车即可。如果这里不同意licence后续使用xcode的时候会报错。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

D、安装mercurial、ccache、freetype

这个安装也比较简单,直接在命令行执行如下指令即可。

brew install mercurial
brew install ccache
brew install freetype

三、编译过程

1、下载源码

自己新建一个目录,然后执行:hg clone http://hg.openjdk.java.net/jdk8u/jdk8u。执行完克隆之后,并不表示源码已经下载OK了。此时需要进入该目录 jdk8u,在其中执行脚本 sh get_source.sh。这一步才是真正下载源码的地方,这个过程可能有点久,具体由自己的网速决定。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

2、配置过程

A、修改配置文件

代码下载完毕之后,需要对一个配置文件中common/autoconf/generated-configure.sh进行修改。否则在编译的过程中会出现很多问题。

解决只能由Xcode4编译的问题(问题汇总中问题1):找到如下代码并注释掉(关键字:Xcode 4 is required to build JDK 8)。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

解决invalid argument '-std=gnu++98' not allowed with 'C'的问题:找到如下代码并注释掉(关键字:CXXSTD_CXXFLAG="-std=gnu++98")。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

解决error: A gcc compiler is required的问题:找到所有类似如下代码逻辑(共有10处),并注释掉关键字does not seem to be the required

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

解决fatal error: 'iostream' file not found的问题:按照如下方式设置环境变量(直接在命令行中执行如下命令即可)

NEW_INCLUDE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
export CFLAGS=-I$NEW_INCLUDE
export CXXFLAGS=-I$NEW_INCLUDE

 

解决library not found for -lstdc++的问题:按照如下从操作即可。

克隆一个工具:git clone https://github.com/quantum6/xcode-missing-libstdcpp(注意:该文件的内容会软连接到Xcode中,所以该目录不能删除)

然后进入该工具执行sh install.sh

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

然后执行如下命令设置环境变量:

NEW_LIB=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib
export LDFLAGS="-L${NEW_LIB}"
export LIBRARY_PATH=$NEW_LIB:$LIBRARY_PATH

解决clang: error: unknown argument: ‘-fpch-deps‘问题:找到如下文件hotspot/make/bsd/makefiles/gcc.make,并注释掉如下部分:

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

解决ld: symbol(s) not found for architecture x86_64问题

错误日志如下:

Undefined symbols for architecture x86_64:
  "_attachCurrentThread", referenced from:
      +[ThreadUtilities getJNIEnv] in ThreadUtilities.o
      +[ThreadUtilities getJNIEnvUncached] in ThreadUtilities.o
ld: symbol(s) not found for architecture x86_64

解决办法:找到文件jdk/src/macosx/native/sun/osxapp/ThreadUtilities.m,然后修改然后把inline void attachCurrentThread(void** env) 改为static inline void attachCurrentThread(void** env) ,如下图:

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

解决在slowdebug模式下编译之后崩溃的问题:在slowdebug模式下编译完成之后,执行java -version后会有JVM奔溃的错误。

找到文件hotspot/src/share/vm/runtime/perfMemory.cpp文件。注释掉如下内容:

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

B、配置工程

按照上述方式修改配置文件之后,就可以执行配置操作了。具体方式很简单,在jdk8u目录执行如如下命令即可。

sh configure --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/ --disable-zip-debug-info --disable-debug-symbols --with-debug-level=slowdebug --with-target-bits=64 --with-jvm-variants=server

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

如果你各类工具版本和所有操作都按照本文档配置修改,并走到了这一步,那么不出意外则不会有任何错误了。配置成功之后的日志如下:

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

3、安装compiledb

这一步在很多网上指导都没有。其实这一步的操作的原因是为了解决编译导入Clion之后,很多头文件找不到的问题。即在编译器中,头文件夹都报红。安装compiledb貌似也可以通过修改头文件的方式解决,但是我尝试了操作下。貌似不行。最后还是不得不安装compiledb,这样简单省事。

安装要求:需要python3+。如果python是2+的,可以通过命令brew install python3来安装python3。

然后需要安装pip,安装指令为:curl https://bootstrap.pypa.io/get-pip.py | python3

最后通过pip安装compiledb即可,指令为:pip install compiledb

四、编译源码

1、环境变量设置

在开始编译之前,还需要设置一些公共环境变量:

export LANG=C
export CC=clang #mac平台,c编译器不再是GCC,而是clang
export COMPILER_WARNINGS_FATAL=false #跳过clang一些严格的语法检查
 
#允许自动下载依赖
export ALLOW_DOWNLOADS=true
export LFLAGS='-Xlinker -lc++ -lstdc++'
 
#并行编译的线程数,设置为和cpu内核数量一致即可
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4
export SKIP_COMPARE_IMAGES=true
export USE_PRECOMPILED_HEADER=true
#要编译的内容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true
BUILD_DEPLOY=false
BUILD_INSTALL=false
unset JAVA_HOME
unset CLASSPATH

2、编译过程

配置完成之后,接下来就是编译OpenJdk了。操作也比较简单,直接在jdk8u目录执行make all即可(如下)。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

这个过程需要花费的时间比较长,如果不出意外最终会打印如下日志,即表示编译成功。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

在编译后有可能在最后有大量的No such file or directory的警告。这大家不用担心,只要向前看日志,能够看到上述的编译成功日志即表示编译成功了。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

最后我们通过命令验证一下咱们自己编译出来的JDK是否可用,咱们通过命令看下java的版本号,即执行命令:java -version,如下,如果能够正常打印出版本号,即表示编译完全OK了。

Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)

3、其他问题汇总

在整个安装过程中,遇到很多问题。正常来说,如果大家安装上述安装把步骤则不会出现这些问题了。但是为了方便大家查询,这里我们还是对其他一些没有直接提到的错误进行一个汇总。

/objs/java_objs/java.diz': No such file or directory 或者 /objs/java_objs/java.dSYM': No such file or directory 问题:

如果遇到这个问题,是因为在使用sh configure命令的时候使用了日志--with-native-debug-symbols=external,这貌似是一个bug,在xcode10下执行configure的时候使用了日志,就会报错。具体可以看下面的一个bug。https://github.com/AdoptOpenJDK/openjdk-build/issues/2331。

通过说,可以知道解决办法就是关闭debug信息。即在configure后面添加参数:--disable-zip-debug-info --disable-debug-symbols。

configure: error: Could not find freetype!问题:

这个问题就是在configure的时候找不到我们安装的freetype。解决方法比较简单,直接在configure上面添加参数来指定freetype的路径即可,参数为:--with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/

PS:现在大家应该能够理解为什么我们上面的configure的指令待了一些参数了。

sh configure  --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/ --disable-zip-debug-info --disable-debug-symbols

 

OpenJDK8的源码编译就介绍的到这里,下一篇文章我们将介绍如何在mac下使用clion对已经编译的好的源码进行debug调试。

五、引用

https://www.jianshu.com/p/d9a1e1072f37

https://blog.csdn.net/davi_qiang/article/details/82817852

https://www.jianshu.com/p/d9a1e1072f37

https://www.cnblogs.com/yuhangwang/p/11298540.html

https://www.jianshu.com/p/ee7e9176632c

https://blog.csdn.net/y3over/article/details/103127782

https://blog.csdn.net/quantum7/article/details/108466760

https://www.jianshu.com/p/0fc877be4c3d

六、惯例