如何用Mac完美编译OpenJDK 7

前段时间为了研究JVM,于是去下了OpenJDK6编译一把,就因为少声卡驱动,又没查到如何解决,结果总是编译不成功,遂放弃。但是近来调试jdk源码的时候,发现很多调试信息都没有,看得我那个辛苦啊。正好一朋友成功编译了OpenJDK7,我就又去下了一个试编,虽然在CentOS下成功了,但是我Mac下又用不了,所以我就花了点时间再次在Mac下弄一次。整体来说还算顺利,现在已经很开心的用上了。

1.选择OS X版本很重要。

目前我的Mac版本是10.10,一开始没想那么多,配置好必要信息以后就开始编,结果错误满屏。简单看过之后发现是编译C文件的时候参数有误,于是查了一下,才知道是LLVM版本太新,不兼容低版本的一些编译参数,具体的可以看看这篇文章http://yueyemaitian.iteye.com/blog/2038304 的第8点。我也照着上面改了点代码,但是依旧编译不过。这时我想到一个很简单的办法,既然高版本不行,我就装个低版本的呗。由于最新的OS
X不能装低版本的Xcode(装了Xcode才能装LLVM),所以去下了一个10.8的OS X装在虚拟机里,然后再装个Xcode4.4,地址后面附上。

装好Xcode以后,要手动下载LLVM安装。打开Xcode,随便建立一个空项目,然后打开Preferences,找到如下所示的地方开始安装(因为我已经安装过了,所以是Installed)

第一步咱就这么搞定了。

2.安装X11

X11这玩意是unix类os使用的图形系统,10.8以前的OS X是自带的,但是从此以后就不自带了。对应于Mac,你需要装XQuartz,这个没有版本限制,去网上下最新版即可。装这个的原因是当时在编译PolicyTools的时候出现了如下错误:

ld: library not found for -lX11

后面查到了这个https://github.com/hgomez/obuildfactory/wiki/Building-and-Packaging-OpenJDK7-for-OSX才去想着试装一下XQuartz才解决问题的。

安装以后要为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 /usr/X11/include/freetype2/freetype/ /usr/X11/include/freetype

4. 配置环境变量

和在Linux下编译相比,OS X的环境变量配置相对来说简单很多。只需要配置编译需要的jdk和llvm的目录就可以了。

因为很多源代码都是用本机现有的jdk来编译,所以预装一个低版本的jdk是必须的,这里我们需要安装jdk6。安装好以后,找到其安装目录,并添加如下环境变量:

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放在了别的目录,那就找到对应的目录即可。

export ALT_COMPILER_PATH=/Applications/Xcode.app/Contents/Developer/usr/bin

5.获取编译源码

按照这上面的第三点获取源代码 https://blogs.oracle.com/arungupta/entry/build_open_jdk_7_on 如果没有装hg的需要自行安装

到现在为止,编译前的准备工作已经完成。我们可以先执行make sanity执行下编译前的检查。如果检查通过,先来看看具体的编译命令:

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

找到下面这段内容:

<!-- Download bundles from a url. -->
<target name="-jaxp_src-url-bundle"
    depends="init, -jaxp_src-ready, -jaxp_src-url-should-be-used"
        if="jaxp_src.url.should.be.used"
        unless="jaxp_src.ready">
    <echo message="Downloading from ${jaxp_src.master.bundle.url}"/>
    <dirname property="jaxp_src.bundle.dirname" file="${jaxp_src.bundle.copy}"/>
    <mkdir dir="${jaxp_src.bundle.dirname}"/>
    <delete file="${jaxp_src.bundle.copy}.temp"/>
    <delete file="${jaxp_src.bundle.copy}"/>
    <get src="${jaxp_src.master.bundle.url}" dest="${jaxp_src.bundle.copy}.temp"/>
    <move file="${jaxp_src.bundle.copy}.temp" tofile="${jaxp_src.bundle.copy}"/>
    <property name="jaxp_src.master.bundle.found" value="true"/>
</target>

很明显能看到倒数第四行的get命令就表明从某个url下载这个包,并且建立一个.temp文件,下载完了再把.temp去掉。所以我们把这段内容改成下面这样:

<!-- Download bundles from a url. -->
<target name="-jaxp_src-url-bundle"
    depends="init, -jaxp_src-ready, -jaxp_src-url-should-be-used"
        if="jaxp_src.url.should.be.used"
        unless="jaxp_src.ready">
    <echo message="Downloading from ${jaxp_src.master.bundle.url}"/>
    <dirname property="jaxp_src.bundle.dirname" file="${jaxp_src.bundle.copy}"/>
    <mkdir dir="${jaxp_src.bundle.dirname}"/>
    <!-- <delete file="${jaxp_src.bundle.copy}.temp"/> -->
    <!-- <delete file="${jaxp_src.bundle.copy}"/> -->
    <!-- <get src="${jaxp_src.master.bundle.url}" dest="${jaxp_src.bundle.copy}.temp"/> -->
    <!-- <move file="${jaxp_src.bundle.copy}.temp" tofile="${jaxp_src.bundle.copy}"/> -->
    <property name="jaxp_src.master.bundle.found" value="true"/>
</target>

注释掉两行delete的原因是避免编译的时候把我们放进去的包删掉。

脚本修改以后,下载好对应的包,并放到对应目录下。针对jaxp145_01.zip的地址为:

openjdk根目录/build/macosx-universal/jaxp/drop/bundles

最后重新编译一次,这一段就能顺利通过了。另外两个包也是同样的做法,各位可以参照这个例子进行修改并重新编译。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考资料:

OS X10.8和Xcode4.4 http://mac.pcbeta.com/thread-91877-1-1.html

LLVM高版本引起的编译失败 http://yueyemaitian.iteye.com/blog/2038304

在Linux和OS X环境下编译个版本openjdk https://github.com/hgomez/obuildfactory/wiki

ftheader.h找不到(即freetype路径问题)http://luchanghong.com/python/2012/07/24/compile-captchaimage-error-cause-freetype-could-not-found.html

时间: 2024-10-13 21:33:05

如何用Mac完美编译OpenJDK 7的相关文章

Mac OSX 10.10 Yosemite编译OpenJDK 9

在Mac OSX 10.10系统上编译了下OpenJDK9,以下仅是个人安装记录,供参考. 编译时间:2015-06-13 系统版本:Mac OS X Yosemite 10.10.4 编译OpenJDK版本:JDK 9 相关软件版本: XCode版本:XCode6-Beat4    Version 6.0 (6A267n) JDK版本:1.8.0_45 软件管理工具:brew Xquartz(X11):2.7.7 参考资料: OpenJDK Home Page OpenJDK官方编译步骤(下载

FFmpeg在iOS上完美编译

最近刚接触ffmpeg,找了很多相关的编译资料,都没有编译成功,前几天在 github上找到一个脚本(https://github.com/kewlbear/FFmpeg-iOS-build-script),就可完美编译 具体步骤如下: 1.下载脚本:https://github.com/kewlbear/FFmpeg-iOS-build-script,要运行这个脚本, 准备条件: 先下载文件:https://github.com/libav/gas-preprocessor, 复制gas-pr

JVM之编译OpenJDK

学习JVM时看到书里讲到自己编译OpenJDK.记录一下过程 Mac系统版本:High Sierra 10.13.6 源码版本:jdk8u-dev 一.准备源码 我是从官网下载网站的,openJDK源码是用mercurial进行管理的,所以首先使用homebrew安装mercurial brew install mercurial 安装完成之后,再运行命令克隆jdk源码,之后通过运行脚本get_source.sh获取所有的源代码 hg clone http://hg.openjdk.java.n

尝试在Mac上编译DNX

自从XRE改名为DNX至今,从来没有在Mac OS X上成功编译过DNX.一直很纳闷,难道DNX的开发人员不用Mac?今天突然明白了,DNX的开发人员真的不用Mac.而且DNX用的2个持续集成服务AppVeyor与Travis,一个是Windows环境,一个是Linux环境,就是没有Mac OS X环境. 看来不能指望DNX的开发人员短期内解决这个问题了,只能自己动手. 编译的错误信息如下(编译命令./build.sh): Restore complete, 725ms elapsed info

Mac上编译并运行Android5.0源码

下载.配置环境.build和运行参考的都是Android Source提供的文档,包括:Initializing a Build Environment,Downloading the Source和Building the System. 我是在OSX 10.10.3上编译的AOSP,记录一下中途碰到的各种问题. 下载 AOSP需要FQ,而且经常会断,还好是断点续传,坚持个两三天怎么也能下下来. case sensitive system 我在Mac上对file system只会用Disk U

Mac sublime 编译Python UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 6-8: ordinal not in range(128)

刚学Python,想打印个"hello 张林峰",代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- print('hello 张林峰') 用sublime运行一下,竟然报错??? Traceback (most recent call last): File "/Users/zhanglinfeng/Documents/Python/\u7ec3\u4e60/\u5b57\u7b26\u4e32\u7f16\u7801\

如何用bat批处理编译swf项目

平时用FB等IDE编译多模块的游戏项目时,除了添加移除模块的操作很繁琐外,编译速度也非常之慢.而用bat来编译swf项目,速度非常快,稳定. 在此分享自己工作用的bat,每次运行会重新编译主模块GameLoader.swf,main.swf,并编译相应的子模块. 1 @echo off 2 for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k 3 ::记录编译开始时间

Mac下编译libpomelo静态库,并在cocos2dx项目中引用

最近在学习cocos2dx的过程中需要和服务器进行交互,所以这几天在学习libpomelo静态库的编译和使用.之前在windows系统下编译libpomelo,并在VS中引入比较顺利:但是,目前对Mac系统和XCode不是很熟悉,所以多花了些时间.不过,最终还是成功了,在这里就将我编译引入libpomelo静态库的过程记录下来,也分享给和我一样遇到问题的朋友们. 准备工作 libpomelo下载地址:https://github.com/NetEase/libpomelo或者http://pan

JVM学习——编译OpenJDK

最近在学习<深入理解java虚拟机 第二版>这本书.书中第一部分建议大家自己编译OpenJDK.抱着学习态度也来编译个玩一玩.下面进入正题. 1.编译环境介绍 操作系统 CentOS Linux release 7.1.1503 (Core) Linux内核版本 3.10.0-229.el7.x86_64 gcc版本 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) openJdk版本 openjdk-7u40 2.准备工作 2.1下载OpenJDK 打开网站ht