编译OpenJDK主要为了学习HotSpot,编译过程在很多相关书籍中都有所涉及,但由于机型、机子具体环境的不同,很难有资料能够一步到位。还是得碰到具体问题通过上网查来一个个解决。

下载OpenJDK

由于网络环境还不错,所以这里采用通过版本管理来下代码。

安装mercurial版本管理

brew install mercurial

接下来clone源码

hg clone http://hg.openjdk.java.net/jdk8/jdk8
cd jdk8 && sh get_source.sh

安装一些依赖

安装FreeType,否则会出现configure: error: Could not find freetype!

brew install freetype

如果遇到

configure: error: GCC compiler is required. Try setting --with-tools-dir.

安装gcc48

$ brew install gcc48

$ sudo mkdir /usr/bin/backup && sudo mv /usr/bin/gcc /usr/bin/g++ /usr/bin/backup
$ sudo ln -s /usr/local/bin/gcc-4.8 /usr/bin/gcc
$ sudo ln -s /usr/local/bin/g++-4.8 /usr/bin/g++

安装ccache加速编译

$ brew install ccache

安装x11,地址https://www.xquartz.org/

$ ln -s /opt/X11/include/X11 /usr/local/include/X11

修改一些配置

hotspot/make/bsd/makefiles/gcc.make

我们需要干掉下面的代码,否则warnings会无法编译下去

# Compiler warnings are treated as errors
ifneq ($(COMPILER_WARNINGS_FATAL),false)
WARNINGS_ARE_ERRORS = -Werror
endif

这一段也要干掉,否则在后续编译中可能会出现clang: error: unknown argument: '-fpch-deps'

ifeq ($(USE_CLANG),)
ifneq ($(CC_VER_MAJOR), 2)
DEPFLAGS += -fpch-deps
endif
endif

加上下面这句话,否则在编译adlc时可能会出错

LFLAGS += -stdlib=libstdc++

common/autoconf/generate-config.sh

找到as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5出现的位置干掉,否则在config的时候可能会出现configure: error: GCC compiler is required

编译

配置configure

sudo sh ./configure --enable-debug

可以看到出现类似如下的内容

A new configuration has been successfully created in
/Users/robin/Code/cpp/jdk/jdk8/build/macosx-x86_64-normal-server-fastdebug
using configure arguments '--enable-debug'. Configuration summary:
* Debug level: fastdebug
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64 Tools summary:
* Boot JDK: java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8.0_112-b16) Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode) (at /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home)
* C Compiler: version (at /usr/bin/gcc)
* C++ Compiler: version (at /usr/bin/g++) Build performance summary:
* Cores to use: 4
* Memory limit: 16384 MB
* ccache status: installed, but disabled (version older than 3.1.4)

开始编译

$ make

在成功之后可以看到如下提示

Finished building OpenJDK for target 'default'

调试

在编译好我们的OpenJDK后,我们可以开始调试了,这里我用的是Jetbrains的CLion作为IDE,Clion对makefile支持不是太好,不过就阅读和调试C++程序而言已经相当强大了。



加上一个调试hotspot的配置,在这里的Executable选择我们编译出来的jdk的java程序,路径如OpenJDK路径/build/macosx-x86_64-normal-server-fastdebug/jdk/bin/java

接下来我们便可以从java命令开始调试hotspot学习了

后记

由于编译过程因为OpenJDK版本、个人机型、软件环境等众多因素影响,以上流程、配置仅供参考。在遇到问题时多查查StackOverflow等网站,大多情况下都有人碰到过。

参考

《HotSpot实战》

Mac上编译OpenJDK过程记录的更多相关文章

  1. MAC 上编译安装nginx-rtmp-module 流媒体服务器

    MAC 上编译安装nginx-rtmp-module 流媒体服务器 记录踩坑过程 下载nginx和nginx-rtmp-module wget http://nginx.org/download/ng ...

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

    下载.配置环境.build和运行参考的都是Android Source提供的文档,包括:Initializing a Build Environment,Downloading the Source和 ...

  3. 尝试在Mac上编译DNX

    自从XRE改名为DNX至今,从来没有在Mac OS X上成功编译过DNX.一直很纳闷,难道DNX的开发人员不用Mac?今天突然明白了,DNX的开发人员真的不用Mac.而且DNX用的2个持续集成服务Ap ...

  4. cgo在mac上编译

    用了cgo mac上编译不过的可以试试下面的方法 ../../pkg/mod/github.com/mattn/go-sqlite3@v1.:: fatal error: 'stdlib.h' fil ...

  5. 剖析并利用Visual Studio Code在Mac上编译、调试c#程序

    0x00 前言 一周多以前的微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——Visual Studio Code.很多使用Windows的朋友都很高兴,认为又多了一个很 ...

  6. 剖析并利用Visual Studio Code在Mac上编译、调试c#程序【转】

    0x00 前言 一周多以前的微软的Build大会上,微软发布了一个让很多人眼前一亮的工具,也是本文的主角——Visual Studio Code.很多使用Windows的朋友都很高兴,认为又多了一个很 ...

  7. 为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)

    在mac电脑上管理这些gnu的库一般都使用Homebrew,但总有一些你个性化的需要是官方的Homebrew配方无法满足的.比如在屏幕的输出中使用中文字符. 在OPENCV中输出UTF8字符集早已经有 ...

  8. 2016-1-1最新版本的linphone-android在mac上编译通过,同时建立了IDEA工程

    虽然参考了这个文章<MAC OS编译Android版Linphone SDK和APP>,https://www.lidaren.com/archives/1592 ,但是在实际的编译过程中 ...

  9. 关于编译openjdk过程的一个编码错误

    -Xlint:deprecation 重新编译 或者 错误: 编码ascii的不可映射字符 出现这种错误的时候 可以进行设置jdk编译编码即可解决 因为是编译openjdk  所以在环境变量中设置: ...

随机推荐

  1. java中变量使用的总结

    java中整数默认为int,小数默认为double. float n5=1.3; 这个句子就会报错,应该修改成这样float n5=1.3f; 八大基本类型 变量类型 位数 范围 备注 Byte 8位 ...

  2. .16-浅析webpack源码之编译后流程梳理

    这节把编译打包后的流程梳理一下,然后集中处理compile. 之前忽略了一个点,如下: new NodeEnvironmentPlugin().apply(compiler); // 引入插件加载 i ...

  3. Jquery操作属性

    1.attr(name,value):修改单个属性! name :属性名称 value:属性的值 <script> $(function(){ //给div添加一个alt=hello的属性 ...

  4. FineUI 布局宽度自适应,后台回调js方法

    FineUI页面布局,宽度自适应 @(F.Panel().CssClass().ShowBorder().BoxConfigChildMargin("0 5 0 0").ShowH ...

  5. JSON & Ajax

    Ajax是异步JavaScript和XML是用来在客户端作为一组相互关联的Web开发技术,以创建异步Web应用程序. Ajax模型,Web应用程序可以发送数据和检索数据从一个服务器,而不干扰现有的页面 ...

  6. Java基础——Servlet(二)

    好久没有写博客了,最近有在学习.可能是遇到瓶颈了,学到Servlet这里觉得有些吃力.前几天已经学完一遍了,但是学完之后觉得还是很迷茫.去知乎和百度上搜索,遇到的都是一些概念之类的讲解.核心的介绍说, ...

  7. spring装配注解(IOC容器加载控制)ComponentScan及ComponentScans使用

    ComponentScan,只写入value,可扫描路径下装配的@Contrller.@Service.@Repository @ComponentScan(value = "com.tes ...

  8. Android - 内存泄漏 + 垃圾回收(GC)概念

    Android内存泄露——全解析和处理办法 内存泄露 说到内存泄露,就不得不提到内存溢出,这两个比较容易混淆的概念,我们来分析一下. 内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未 ...

  9. C#连接Oracle方式

    1.在web.config或者app.config文件中,不会像连接SqlServer的格式那样,直接把账号密码写入就可以了 C#是微软的,oracle是Oracle公司做出来的,两家是对立的,都懂得 ...

  10. POJ2186(强连通分量分解)

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 35035   Accepted: 14278 De ...