Mac OSX 10.10 Yosemite编译OpenJDK 8

阅读更多

编译时间: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的编译器,所以后一篇文章仅仅用作参考。

 

你可能感兴趣的:(openjdk8,mac,编译,jdk)