编译时间:2016-04-03
系统版本:Mac OS X Yosemite 10.10.2
编译OpenJDK版本:JDK8
相关软件版本:
• XCode版本:Version 5.1.1 (5B1008)
• JDK版本:1.8.0_51
• 软件管理工具:brew
• Xquartz(X11):2.5.3
1. 安装必须的软件,如git 和 mercurial (hg)
2. 安装XCode
3. 安装X11,系统默认好像是没有这个东西,需要下载安装XQuartz,然后link下
sudo ln -s /usr/X11/include/X11 /usr/include/X11
4. link llvm-gcc和llvm-g++,由于xcode目录下已经没有llvm-gcc和llvm-g++程序,而build jdk的时候会用到,所以需要link过去
sudo ln -s /usr/bin/llvm-g++ /Applications/Xcode.app/Contents/Developer/usr/bin/llvm-g++ sudo ln -s /usr/bin/llvm-gcc /Applications/Xcode.app/Contents/Developer/usr/bin/llvm-gcc
5. 下载jdk源码
hg clone http://hg.openjdk.java.net/jdk8/jdk8 YourOpenJDK cd YourOpenJDK bash ./get_source.sh
hg的方式下载太慢,而且网络容易出错,我是直接下载的zip文件,地址:http://download.java.net/openjdk/jdk8
6. configure,可以参考下YourOpenJDK目录下的README,我直接build release版本的
sh configure --with-target-bits=64
configure过程会检查一些配置,然后在YourOpenJDK/build目录下会有macosx-x86_64-normal-server-release目录。这个过程中遇到一个问题:
configure: error: GCC compiler is required
对于这个问题,我查到是YourOpenJDK/common/autoconf/generated-configure.sh里边校验抛出,我直接找到下边文本出现的两个地方给注释掉了......
as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
7. make,直接./make all的时候遇到了很多问题
遇到了这个,看是clang的参数问题:
clang: error: unknown argument: '-fcheck-new' [-Wunused-command-line-argument-hard-error-in-future]
于是直接打开YourOpenJDK/hotspot/make/bsd/makefiles/gcc.make,把这行(line 193)给注释掉:
#CFLAGS += -fcheck-new
但是继续build还是遇到了很多问题,诸如:
/Users/jme/workspace/jdk8/hotspot/src/share/vm/utilities/globalDefinitions.hpp:754:11: error: enumeration values 'number_of_states' and 'ilgl' not handled in switch [-Werror,-Wswitch] switch (state) { ^ /Users/jme/workspace/jdk8/hotspot/src/share/vm/utilities/globalDefinitions.hpp:1108:24: error: implicit conversion changes signedness: 'uintx' (aka 'unsigned long') to 'intptr_t' (aka 'long') [-Werror,-Wsign-conversion] if (!is_power_of_2(s)) basic_fatal("s must be a power of 2"); ~~~~~~~~~~~~~ ^
首先需要hotspot/make/bsd/makefiles/gcc.make里加入Clang5.1的逻辑:
ifeq ($(USE_CLANG), true) # Clang 4.2 ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1) OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT) OPT_CFLAGS/unsafe.o += -O1 endif # Clang 5.0 ifeq ($(shell expr $(CC_VER_MAJOR) = 5 \& \( $(CC_VER_MINOR) = 0 \| $(CC_VER_MINOR) = 1 \) ), 1) OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT) OPT_CFLAGS/unsafe.o += -O1 OPT_CFLAGS/graalCompilerToVM.o += -O1 endif
需要将make的执行增加如下参数:
make CC=clang COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' USE_CLANG=true LP64=1 LANG=C ALT_BOOTDIR=/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/ ARCH_DATA_MODEL=64 HOTSPOT_BUILD_JOBS=8
其中跟Clang相关的参数是 CC=clang COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' USE_CLANG=true。build加上这些参数后可以避开Clang的严格检查。
最后,下面这个文件要进行修改,参考:http://cr.openjdk.java.net/~henryjen/jdk9/8033057/webrev/hotspot.changeset
YourOpenJDK/hotspot/src/share/vm/code/relocInfo.hpp
8. 执行最后的构建,可以看到构建成功后的日志:
----- Build times ------- Start 2016-04-03 14:26:01 End 2016-04-03 14:35:05 00:00:39 corba 00:02:57 hotspot 00:00:21 jaxp 00:00:35 jaxws 00:04:30 jdk 00:00:00 langtools 00:09:04 TOTAL ------------------------- Finished building OpenJDK for target 'default' WARNING: You have the following ALT_ variables set: ALT_PARALLEL_COMPILE_JOBS=6 ALT_BOOTDIR=/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/ ALT_OUTPUTDIR=/Users/jme/workspace/jdk8/build ALT_ variables are deprecated and will be ignored. Please clean your environment.
9. 其他说明
本次构建,主要参考了文章:
Mac OSX 10.9 上build openjdk8和openjdk7
同时也参考了老外的一篇文章:
Building OpenJDK 8 on Mac OS X Mavericks
后一篇文章主要是针对gcc的问题和freetype的问题进行了原因说明,我一开始是按照这个操作,但最终的编译由于gcc等版本冲突,是行不通的,最终只能采用clang的编译器,所以后一篇文章仅仅用作参考。