如何用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即可。
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
六、惯例
以上是关于如何用Mac完美编译OpenJDK 7的主要内容,如果未能解决你的问题,请参考以下文章
MAC编译OpenJDK8(含202-242)的Xcode版本问题
MAC编译OpenJDK8(含202-242)的Xcode版本问题