Mac OSX 10.10 Yosemite编译OpenJDK 8

时间:2023-02-07 02:38:29

编译时间: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下

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. sudo ln -s /usr/X11/include/X11 /usr/include/X11   
 

 

 4. link llvm-gcc和llvm-g++,由于xcode目录下已经没有llvm-gcc和llvm-g++程序,而build jdk的时候会用到,所以需要link过去

 

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. sudo ln -s /usr/bin/llvm-g++ /Applications/Xcode.app/Contents/Developer/usr/bin/llvm-g++   
  2. sudo ln -s /usr/bin/llvm-gcc /Applications/Xcode.app/Contents/Developer/usr/bin/llvm-gcc   
 

 

5. 下载jdk源码

 

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. hg clone http://hg.openjdk.java.net/jdk8/jdk8 YourOpenJDK    
  2. cd YourOpenJDK    
  3. bash ./get_source.sh   
 

 

         hg的方式下载太慢,而且网络容易出错,我是直接下载的zip文件,地址:http://download.java.net/openjdk/jdk8

 

6.  configure,可以参考下YourOpenJDK目录下的README,我直接build release版本的

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. sh configure --with-target-bits=64  
 

 

    configure过程会检查一些配置,然后在YourOpenJDK/build目录下会有macosx-x86_64-normal-server-release目录。这个过程中遇到一个问题:

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. configure: error: GCC compiler is required   
 

 

         对于这个问题,我查到是YourOpenJDK/common/autoconf/generated-configure.sh里边校验抛出,我直接找到下边文本出现的两个地方给注释掉了......

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5   

 

 

7. make,直接./make all的时候遇到了很多问题

        遇到了这个,看是clang的参数问题:

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. clang: error: unknown argument: '-fcheck-new' [-Wunused-command-line-argument-hard-error-in-future]   
 

 

     于是直接打开YourOpenJDK/hotspot/make/bsd/makefiles/gcc.make,把这行(line 193)给注释掉:

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. #CFLAGS += -fcheck-new   

         但是继续build还是遇到了很多问题,诸如:

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. <span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; font-size: 12px; line-height: 18px;">/Users/jme/workspace/jdk8</span>/hotspot/src/share/vm/utilities/globalDefinitions.hpp:754:11: error: enumeration values 'number_of_states' and 'ilgl' not handled in switch [-Werror,-Wswitch]     
  2.   switch (state) {     
  3.           ^     
  4. <span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; font-size: 12px; line-height: 18px;">/Users/jme/workspace/jdk8</span>/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]     
  5.     if (!is_power_of_2(s)) basic_fatal("s must be a power of 2");     
  6.          ~~~~~~~~~~~~~ ^     

 

     首先需要hotspot/make/bsd/makefiles/gcc.make里加入Clang5.1的逻辑:

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. ifeq ($(USE_CLANG), true)   
  2.   # Clang 4.2   
  3.   ifeq ($(shell expr $(CC_VER_MAJOR) = 4 \& $(CC_VER_MINOR) = 2), 1)   
  4.     OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)   
  5.     OPT_CFLAGS/unsafe.o += -O1   
  6.   endif   
  7.   # Clang 5.0   
  8.   ifeq ($(shell expr $(CC_VER_MAJOR) = 5 \& \( $(CC_VER_MINOR) = 0 \| $(CC_VER_MINOR) = 1 \) ), 1)    
  9.     OPT_CFLAGS/loopTransform.o += $(OPT_CFLAGS/NOOPT)   
  10.     OPT_CFLAGS/unsafe.o += -O1   
  11.     OPT_CFLAGS/graalCompilerToVM.o += -O1   
  12.   endif   

 

需要将make的执行增加如下参数:

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. 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

 

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. YourOpenJDK/hotspot/src/share/vm/code/relocInfo.hpp  
 

 

8. 执行最后的构建,可以看到构建成功后的日志:

 

Java代码   Mac OSX 10.10 Yosemite编译OpenJDK 8
  1. ----- Build times -------  
  2. Start 2016-04-03 14:26:01  
  3. End   2016-04-03 14:35:05  
  4. 00:00:39 corba  
  5. 00:02:57 hotspot  
  6. 00:00:21 jaxp  
  7. 00:00:35 jaxws  
  8. 00:04:30 jdk  
  9. 00:00:00 langtools  
  10. 00:09:04 TOTAL  
  11. -------------------------  
  12. Finished building OpenJDK for target 'default'  
  13.    
  14. WARNING: You have the following ALT_ variables set:  
  15. ALT_PARALLEL_COMPILE_JOBS=6 ALT_BOOTDIR=/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/ ALT_OUTPUTDIR=/Users/jme/workspace/jdk8/build  
  16. 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的编译器,所以后一篇文章仅仅用作参考。