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即可。
C、Xcode的licence签收
新安装的Xcode需要签收同意它的licence。其方式比较独特,即在命令行中输入(需要root权限):sudo xcodebuild -license。然后会弹出很多文本内容,即licence内容。不用看直接不停按tab键滑到文件最后,然后输入一个agree,敲回车即可。如果这里不同意licence后续使用xcode的时候会报错。
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。这一步才是真正下载源码的地方,这个过程可能有点久,具体由自己的网速决定。
2、配置过程
A、修改配置文件
代码下载完毕之后,需要对一个配置文件中common/autoconf/generated-configure.sh进行修改。否则在编译的过程中会出现很多问题。
解决只能由Xcode4编译的问题(问题汇总中问题1):找到如下代码并注释掉(关键字:Xcode 4 is required to build JDK 8)。
解决invalid argument '-std=gnu++98' not allowed with 'C'的问题:找到如下代码并注释掉(关键字:CXXSTD_CXXFLAG="-std=gnu++98")。
解决error: A gcc compiler is required的问题:找到所有类似如下代码逻辑(共有10处),并注释掉(关键字:does not seem to be the required)
解决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
然后执行如下命令设置环境变量:
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,并注释掉如下部分:
解决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) ,如下图:
解决在slowdebug模式下编译之后崩溃的问题:在slowdebug模式下编译完成之后,执行java -version后会有JVM奔溃的错误。
找到文件hotspot/src/share/vm/runtime/perfMemory.cpp文件。注释掉如下内容:
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
如果你各类工具版本和所有操作都按照本文档配置修改,并走到了这一步,那么不出意外则不会有任何错误了。配置成功之后的日志如下:
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即可(如下)。
这个过程需要花费的时间比较长,如果不出意外最终会打印如下日志,即表示编译成功。
在编译后有可能在最后有大量的No such file or directory的警告。这大家不用担心,只要向前看日志,能够看到上述的编译成功日志即表示编译成功了。
最后我们通过命令验证一下咱们自己编译出来的JDK是否可用,咱们通过命令看下java的版本号,即执行命令:java -version,如下,如果能够正常打印出版本号,即表示编译完全OK了。
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
六、惯例