由于想看下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版本比较低,在我机器上是跑不过的,不知道怎么解决,就放弃了。然后自己下载自己跑,仍然遇到了很多问题,就到群组里找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
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命令,期待激动人心的时刻吧:
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!