`
阅读更多

        先分享下自己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!

分享到:
评论
8 楼 lanhz 2015-10-28  
谢楼主,构建成功了
7 楼 pulsar_lxl 2014-09-08  
yueyemaitian 写道
pulsar_lxl 写道
yueyemaitian 写道
pulsar_lxl 写道
我也没成功,是因为源码改了么?这不应该是一个稳定版了么?

Building OpenJDK for target 'all' in configuration 'macosx-x86_64-normal-server-fastdebug'

## Starting langtools
Compiling 2 files for BUILD_TOOLS
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:305: 错误: 找不到符号
        return tk.accepts(S.token(lookahead + 1).kind);
                                                ^
  符号:   变量 kind

介个,我这个文章发了后,mac os升级了,编译期版本也升级了,估计又有啥不兼容了,这需要问问R大



好的,那能把你编译成功的fastdebug版给我发一个吗? pulsar.lxl@gmail.com 谢谢!


百度云盘,jdk7:http://pan.baidu.com/s/1sjqaJ1b
jdk8:http://pan.baidu.com/s/1mgsSLZE


谢谢
6 楼 yueyemaitian 2014-09-05  
pulsar_lxl 写道
yueyemaitian 写道
pulsar_lxl 写道
我也没成功,是因为源码改了么?这不应该是一个稳定版了么?

Building OpenJDK for target 'all' in configuration 'macosx-x86_64-normal-server-fastdebug'

## Starting langtools
Compiling 2 files for BUILD_TOOLS
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:305: 错误: 找不到符号
        return tk.accepts(S.token(lookahead + 1).kind);
                                                ^
  符号:   变量 kind

介个,我这个文章发了后,mac os升级了,编译期版本也升级了,估计又有啥不兼容了,这需要问问R大



好的,那能把你编译成功的fastdebug版给我发一个吗? pulsar.lxl@gmail.com 谢谢!


百度云盘,jdk7:http://pan.baidu.com/s/1sjqaJ1b
jdk8:http://pan.baidu.com/s/1mgsSLZE
5 楼 pulsar_lxl 2014-09-05  
yueyemaitian 写道
pulsar_lxl 写道
我也没成功,是因为源码改了么?这不应该是一个稳定版了么?

Building OpenJDK for target 'all' in configuration 'macosx-x86_64-normal-server-fastdebug'

## Starting langtools
Compiling 2 files for BUILD_TOOLS
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:305: 错误: 找不到符号
        return tk.accepts(S.token(lookahead + 1).kind);
                                                ^
  符号:   变量 kind

介个,我这个文章发了后,mac os升级了,编译期版本也升级了,估计又有啥不兼容了,这需要问问R大



好的,那能把你编译成功的fastdebug版给我发一个吗? pulsar.lxl@gmail.com 谢谢!
4 楼 yueyemaitian 2014-09-05  
pulsar_lxl 写道
我也没成功,是因为源码改了么?这不应该是一个稳定版了么?

Building OpenJDK for target 'all' in configuration 'macosx-x86_64-normal-server-fastdebug'

## Starting langtools
Compiling 2 files for BUILD_TOOLS
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:305: 错误: 找不到符号
        return tk.accepts(S.token(lookahead + 1).kind);
                                                ^
  符号:   变量 kind

介个,我这个文章发了后,mac os升级了,编译期版本也升级了,估计又有啥不兼容了,这需要问问R大
3 楼 pulsar_lxl 2014-09-05  
我也没成功,是因为源码改了么?这不应该是一个稳定版了么?

Building OpenJDK for target 'all' in configuration 'macosx-x86_64-normal-server-fastdebug'

## Starting langtools
Compiling 2 files for BUILD_TOOLS
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:305: 错误: 找不到符号
        return tk.accepts(S.token(lookahead + 1).kind);
                                                ^
  符号:   变量 kind
  位置: 类 Token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:313: 错误: 找不到符号
        return tk1.accepts(S.token(lookahead + 1).kind) &&
                                                 ^
  符号:   变量 kind
  位置: 类 Token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:314: 错误: 找不到符号
                tk2.accepts(S.token(lookahead + 2).kind);
                                                  ^
  符号:   变量 kind
  位置: 类 Token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:322: 错误: 找不到符号
        return tk1.accepts(S.token(lookahead + 1).kind) &&
                                                 ^
  符号:   变量 kind
  位置: 类 Token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:323: 错误: 找不到符号
                tk2.accepts(S.token(lookahead + 2).kind) &&
                                                  ^
  符号:   变量 kind
  位置: 类 Token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:324: 错误: 找不到符号
                tk3.accepts(S.token(lookahead + 3).kind);
                                                  ^
  符号:   变量 kind
  位置: 类 Token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:335: 错误: 找不到符号
            if (!kinds[lookahead].accepts(S.token(lookahead + 1).kind)) {
                                                                ^
  符号:   变量 kind
  位置: 类 Token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:350: 错误: 找不到符号
             switch (token.kind) {
                          ^
  符号:   变量 kind
  位置: 类型为Token的变量 token
/work/projects/opensource/openjdk8/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java:351: 错误: 需要常量字符串表达式
                case SEMI:
                     ^
2 楼 yueyemaitian 2014-08-01  
fh63045 写道
没成功!!!

jvm源码又改了不少吧,LLVM群组中,求教R大看看?
1 楼 fh63045 2014-08-01  
没成功!!!

相关推荐

Global site tag (gtag.js) - Google Analytics