如何用Mac完美编译OpenJDK 7

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用Mac完美编译OpenJDK 7相关的知识,希望对你有一定的参考价值。

1.选择OS X版本很重要。
目前这里Mac版本是10.10,配置好必要信息以后就开始编,结果错误满屏。简单看过之后发现是编译C文件的时候参数有误,于是查了一下,才知道是LLVM版本太新,不兼容低版本的一些编译参数。照着上面改了点代码,但是依旧编译不过。既然高版本不行,就装个低版本的呗。由于最新的OS X不能装低版本的Xcode(装了Xcode才能装LLVM),所以去下了一个10.8的OS X装在虚拟机里,然后再装个Xcode4.4。
装好Xcode以后,要手动下载LLVM安装。打开Xcode,随便建立一个空项目,然后打开Preferences,找到如下所示的地方开始安装
第一步咱就这么搞定了。
2.安装X11
X11这玩意是unix类os使用的图形系统,10.8以前的OS X是自带的,但是从此以后就不自带了。对应于Mac,你需要装XQuartz,这个没有版本限制,去网上下最新版即可。装这个的原因是当时在编译PolicyTools的时候出现了如下错误:
ld: library not found for -lX11
安装以后要为X11建立软连接
sudo ln -s /usr/X11/include/X11 /usr/include/X11
3.安装freetype
在linux下编译openjdk的朋友可能遇到过需要安装freetype的要求,然后安装下并将安装目录加到环境变量里就好了。但是OS X不一样,freetype单独安装实际是没用的。虽然单独安装能让编译前的检查通过,但是到后面还是会出错,至于原因我没找到。那怎么办呢?实际上如果安装好X11,freetype就一起安装好了,大家可以去X11的目录里看看是否有freetype。
虽然说安装了X11就自带freetype,但是编译过程中可能会出现如下错误:
error: freetype/config/ftheader.h: No such file or directory
实际上就是目录问题,执行下面这句命令就好了:
sudo ln -s /sr/X11/include/freetype2/freetype/ /usr/X11/include/freetype
4. 配置环境变量
和在Linux下编译相比,OS X的环境变量配置相对来说简单很多。只需要配置编译需要的jdk和llvm的目录就可以了。
因为很多源代码都是用本机现有的jdk来编译,所以预装一个低版本的jdk是必须的,这里我们需要安装jdk6。安装好以后,找到其安装目录,并添加如下环境变量:
[plain] view plaincopy
export ALT_BOOTDIR=/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
通常来说安装目录都应该在/System/Library/Java/JavaVirtualMachines目录下。如果不在的话,有个技巧可以找到。因为安装好jdk以后,系统会自动在/usr/bin下建立指向java命令的软连接,所以执行“ls -l /usr/bin/java”就能看到这个命令指向哪,然后这么顺着找下去就能找到。
llvm是编译C类文件所必须的,所以要把它的所在目录添加到环境变量里。通常OS X下安装app都会把app移到Applications目录下,所以我最初安装Xcode的时候也把他移进去了,如果你把Xcode放在了别的目录,那就找到对应的目录即可。
[plain] view plaincopy
export ALT_COMPILER_PATH=/Applications/Xcode.app/Contents/Developer/usr/bin
5.获取编译源码
按照这上面的第三点获取源代码 如果没有装hg的需要自行安装
到现在为止,编译前的准备工作已经完成。我们可以先执行make sanity执行下编译前的检查。如果检查通过,先来看看具体的编译命令:

[plain] view plaincopy
make ALLOW_DOWNLOADS=true SA_APPLE_BOOT_JAVA=true SKIP_DEBUG_BUILD=false SKIP_FASTDEBUG_BUILD=false ALWAYS_PASS_TEST_GAMMA=true HOTSPOT_BUILD_JOBS=`sysctl -n hw.ncpu`
这里有两个问题:

a. ALLOW_DOWNLOADS=true表示编译过程中允许下载。因为有些编译模块,比如jaxp,编译脚本中指定了需要下载特定的包。虽然我没试过设置成false会不会影响编译,但是还是推荐设置成true。但是这就带来另一个问题,下载这类包很费时间,有时候就会在那卡很长时间,所以我根据编译日志找到编译脚本中控制下载的具体命令,修改修改并且把用迅雷下的对应包放到正确目录中,然后重新编译一遍,就能顺利通过了。这一点后面我会详说。
b. SKIP_DEBUG_BUILD=false SKIP_FASTDEBUG_BUILD=false这两个表示编译出来的jdk或者hotspot是否可以debug。FASTDEBUG表示的应该是提供简单的debug功能,如果想要完整的debug,则SKIP_DEBUG_BUILD必须设置为false。不过这里提醒一点,如果想在debug jdk的时候能看到debug信息,比如变量名等,只需要SKIP_FASTDEBUG_BUILD设置为false就可以了
如果这两个问题都不是问题,那么就可以按回车了。如果debug和fastdebug都是false,再加上用虚拟机编译,所以需要的时间会比较长,你也许需要找一部长一点的电影来消磨一下了。最后编译出来的结果是这样的:
j2sdk-image就是自己编译出来的jdk,可以直接用了。至于其他目录下的内容,各位自己琢磨吧。
现在来说下ALLOW_DOWNLOADS=true引起的问题。
但是遇到下载很久的包总共有三个:
jaxp145_01.zip、jdk7-jaf-2010_08_19.zip、jdk7-jaxws2_2_4-b03-2011_05_27.zip
之前说过可以修改编译脚本跳过下载并且用我们已经下载好的,但是实际编译过程中,这三个包对应的的编译脚本是动态生成的,所以只能等到他卡在那了,才能停下来并找到脚本修改之。因此因为这三个包,总共需要停3次。,比起一直卡在那好太多了。
假设编译的是普通版本,即非DEBUG和非FASTDEBUG。下面以jaxp145_01.zip为例子讲一下怎么修改对应脚本:
脚本所在位置:openjdk根目录/build/macosx-universal/jaxp/build/xml_generated/build-drop-jaxp_src.xml
参考技术A JDK 6编译的class文件不能在之前版本运行。<br

/>在基类中声明的方法,在继承类中实现的话可以用@Override进行标注。1.5和1.6均正常。但@Override注释在jdk1.5环境下只能用于对继承的类的方法的重写,而不能用于对实现的接口中的方法的实现。<br
/>public interface StudentVS<br /><br /> public void
saveStudent(Student s);<br /><br /><br />public class
StudentVSImpl implements StudentVS<br /><br />
@Override<br /> public void saveStudent(Student s)<br />
<br /> ..........<br /> <br /><br
/>上述代码在1.5中会报错,而在1.6中不会。所以建议不要加,因为同一项目用不同版本的jdk编译,加上@Override会使用1.5编译的人出错。本回答被提问者采纳

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

六、惯例


以上是关于如何用Mac完美编译OpenJDK 7的主要内容,如果未能解决你的问题,请参考以下文章

MAC编译OpenJDK8(含202-242)的Xcode版本问题

MAC编译OpenJDK8(含202-242)的Xcode版本问题

mac编译openJDK8

Mac 10.14.4 编译openjdk1.9源码 及集成clion动态调试

在MAC系统上,重新编译了一次OpenJDK8

在MAC系统上,重新编译了一次OpenJDK8