[讨论] Mac OS X 10.9.2 build JDK8有谁build成功过么

yueyemaitian 2014-03-28
        近来遇到个问题,想看看jvm cmsgc的时候的debug信息,就build了下jdk,先是根据obuildfactory的这篇文章试了下jdk7,不行。
        于是就根据jdk源码里头readme自己build,但是遇到很多问题,查了一堆资料是说clang新版本很多参数都废掉了。我也试图改了openjdk8/hotspot/make/bsd/makefiles/gcc.make一些gcc配置项,解决了诸如这种问题:
/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");
         ~~~~~~~~~~~~~ ^

但是还是有更多的问题,搞不定。现在遇到的问题是类似这种:
In file included from /Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/utilities/debug.hpp:29:
/Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/utilities/globalDefinitions.hpp:737:11: error: 6 enumeration values not handled in switch: 'T_ADDRESS', 'T_NARROWOOP', 'T_METADATA'... [-Werror,-Wswitch]
  switch (type) {
          ^
/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) {
          ^
In file included from /Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/precompiled/precompiled.hpp:29:
In file included from /Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/asm/assembler.hpp:28:
In file included from /Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/asm/codeBuffer.hpp:29:
/Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/code/relocInfo.hpp:367:27: error: friend declaration specifying a default argument must be a definition
  inline friend relocInfo prefix_relocInfo(int datalen = 0);
                          ^
/Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/code/relocInfo.hpp:462:18: error: friend declaration specifying a default argument must be the only declaration
inline relocInfo prefix_relocInfo(int datalen) {
                 ^
/Users/fanhua/develop/openjdk-home/sources/openjdk8/hotspot/src/share/vm/code/relocInfo.hpp:367:27: note: previous declaration is here
  inline friend relocInfo prefix_relocInfo(int datalen = 0);
                          ^

        求各位帮忙看看!
yueyemaitian 2014-03-29
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
RednaxelaFX 2014-03-29
我在Mac OS X上build过OpenJDK 8 build 132的HotSpot VM,能正常build出来。

首先你用的不是GCC(g++)而是Clang。

其次你需要这些参数:
make -C 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_fastdebug

其中跟Clang相关的参数是 CC=clang COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' USE_CLANG=true。试试在你的build上加上这些参数来避开Clang的严格检查…

然后看看你的hotspot/make/bsd/makefiles/gcc.make里有没有下面这段,没有的话加上它(你的Clang是5.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 ($(USE_CLANG),)
   CFLAGS += -pthread
   CFLAGS += -fcheck-new

可能需要把这个CFLAGS += -fcheck-new这行注释掉。

最后你需要修改一处源码,请参考:http://cr.openjdk.java.net/~henryjen/jdk9/8033057/webrev/hotspot.changeset
yueyemaitian 2014-03-29

RednaxelaFX 写道

make -C 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_fastdebug

其中跟Clang相关的参数是 CC=clang COMPILER_WARNINGS_FATAL=false LFLAGS='-Xlinker -lstdc++' USE_CLANG=true。试试在你的build上加上这些参数来避开Clang的严格检查…

这个地方开头多打了make -C吧?
build成功了,多谢R大指点!
写了篇博客记录了下过程
RednaxelaFX 2014-03-30
yueyemaitian 写道
这个地方开头多打了make -C吧?

没有多打。我是在hotspot目录执行的make而不是在hotspot/make目录里执行的。make -C就是指定Makefile在哪里的。
yueyemaitian 2014-03-30
RednaxelaFX 写道
yueyemaitian 写道
这个地方开头多打了make -C吧?

没有多打。我是在hotspot目录执行的make而不是在hotspot/make目录里执行的。make -C就是指定Makefile在哪里的。

哈,好吧,是我对make不了解
pulsar_lxl 2014-09-05
我按照你得blog,到make那一步又出错了

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:
                     ^

请问有什么解决办法吗?
Global site tag (gtag.js) - Google Analytics