Mac OSX 10.9 上build openjdk8和openjdk7

        先分享下自己build出来的fastdebug版本的openjdk: openjdk7(24.80-b04), openjdk8(25.0-b70)

=====================================================================================

        由于想看下cms gc的debug日志,验证个问题,但是发现jvm的cpp代码里头,要Verbose值为true才能看到debug信息,而这个vm参数只能在debug模式下才能设置,于是就自己动手build出了下jdk。

        我的系统是Mac OSX 10.9.2,XCode是Version 5.1 (5B130a),GCC是:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

         由于XCode5.0开始不再支持llvm-gcc,并且LLVM5.1废弃了一些编译option,如-fcheck-new等,也把不认识的option当成了错误。而jdk源码包里边的make脚本并不完全支持新版的clang,参数需要调整,所以我build的时候就出了一堆问题。

        先是按照obuildfactory的这个指南跑了跑,但是发现不行,他那个针对macosx版本比较低,在我机器上是跑不过的,不知道怎么解决,就放弃了。然后自己下载自己跑,仍然遇到了很多问题,就到<HLLVM群组>里找R大求助,根据R大的帮助,才顺利build出来,艰辛啊,5年前build过一次,没成功,尽是挫折,这次有了R大帮忙才成功build出来。这里主要列下JDK8的build过程,JDK7的跟8差不多,有一点点不一样的地方,最后给出。详细的过程是:

1、通过xcode-select选中xcode,由于我习惯性更新系统软件,所以我的xcode是5.1:

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

2、安装必须的软件,如git 和 mercurial (hg)

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、另外我还装了Xcode的Command line tools、freetype,还link了cups,但是我不知道如果不做这些是否会影响build,所以可以先跳过这部,出错了再回来。

6、下载jdk源码

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

         jdk8u的地址是http://hg.openjdk.java.net/jdk8u/jdk8u

7、configure,可以参考下YourOpenJDK目录下的README,我直接build fastdebug版本的

./configure --enable-debug --with-target-bits=64

         如果是正式版本,./configure后边不需要加参数。configure过程会检查一些配置,然后在YourOpenJDK/build目录下会有macosx-x86_64-normal-server-fastdebug目录,如果不是fastdebug版本,会有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

 8、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/fanhua/develop/openjdk-home/sources/openjdk8/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/fanhua/develop/openjdk-home/sources/openjdk8/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");  
         ~~~~~~~~~~~~~ ^  

        搞到这里已经搞不定了,于是求助了R大,按照他的回复,先在YourOpenJDK/hotspot/make/bsd/makefiles/gcc.make(line 334)里边加入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

         第一个ifeq那里,这个make file其实已经有了,所以注释掉。然后R大回复,修改下这个文件源码:

YourOpenJDK/hotspot/src/share/vm/code/relocInfo.hpp

         最后,用R大给出的make命令,用本机安装的JDK7的目录替换命令行中$JAVA_HOME,期待激动人心的时刻吧:

make CC=clang COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' USE_CLANG=true LP64=1 LANG=C ALT_BOOTDIR=$JAVA_HOME ARCH_DATA_MODEL=64 HOTSPOT_BUILD_JOBS=8 all

9、构建成功后,你可以在这个目录下找到相应的jdk包:

YourOpenJDK/build/macosx-x86_64-normal-server-fastdebug/images/

10、如果你要build jdk7,则没有configure过程,直接make

make sanity

         先运行上边命令检查环境,根据提示可能要改些环境变量,如$JAVA_HOME要干掉,然后build。其他的对jdk文件修改上跟8一样。

        另外还需要改YourOpenJDK7/hotspot/make/bsd/makefiles/gcc.make(line 216),把注释掉一些,加上下边那段,那是我从jdk8的相应文件里边拷出来的:

 # Flags for generating make dependency flags.
 # ifneq ("${CC_VER_MAJOR}", "2")
 # DEPFLAGS = -fpch-deps -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
 # endif
 ####################replace by me
 # Flags for generating make dependency flags.
 DEPFLAGS = -MMD -MP -MF $(DEP_DIR)/$(@:%=%.d)
 ifeq ($(USE_CLANG),)
   ifneq ($(CC_VER_MAJOR), 2)
     DEPFLAGS += -fpch-deps
   endif
 endif

        make命令上跟8也不一样,注意ALT_BOOTDIR是JDK6的Home目录,fastdebug_build说明你要build fastdebug版本:

make CC=clang COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' USE_CLANG=true LP64=1 LANG=C ALT_BOOTDIR=/Library/Java/Home ARCH_DATA_MODEL=64 HOTSPOT_BUILD_JOBS=8 fastdebug_build

         更多make选项可以make help看。 

       build成功后,相关的jdk包在这个目录下:

YourOpenJDK7/build/macosx-x86_64-fastdebug/

         enjoy it!

你可能感兴趣的:(java,jvm)