zoukankan      html  css  js  c++  java
  • mac编译openJDK8

    买了《深入理解Java虚拟机》 周志明著这本书一直没有看,我们的程序都用JVM在跑,所以学习java必须掌握JVM,才能理解我们对象到底干嘛了。
     

    1.为什么要编译JDK

      想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛高一点,但肯定比阅读各种书籍,文章,博客更在贴切一点,另外,JDK的很多方法都是本地化(Native)的,需要跟踪这些方法的运作或对JDK进行Hack的时候,都需要自己编译一套JDK。
     

    2.选择JDK

      现在网上有不少开源的JDK实现可以供我们选择,如Apache Harmony,OpenJDK等,考虑到Sun系列的JDK是现在使用得最广泛的JDK版本,所以我们选择openJDK进行编译。
    关于openJDK?
      openJDK是sun在2006年末把java开源而形成的项目。开源是通常意义上的源码形式上开放,等同于源码可被复用。商业版的oracle jdk和open jdk 除了版权注释之外,其余代码基本上都是相同的,都是建立在两者共有的组件基础上。oracle jdk还会存在一些open jdk没有的,商用闭源的功能。oracle的项目发布经理Joe Darcy 在OSCON2011 上对两者的关系上也证实了oracle jdk和open jdk程序上市非常接近。
     

    3.环境准备

    1.openJDK下载,获取openJDk源码有两种方式.
      (1)其中一种是通过一款代码版本管理Mercurial上获取
        hg clone http://hg.openjdk.java.net/jdk8/jdk8 jdk8
        cd jkd8
        bash ./get_source.sh
      这种是最直接的方式,但是由于文件很多,国内的网络对Mercurial不如对git svn上不够快,经常可能失败,可以把镜像换成国内的,这个可以自己找找。
      (2)从https://download.java.net/openjdk/jdk8直接下载打包好的源码文件,这里openjdk在下载源码有个bug,如图:
      
    把这里的下载地址前面的域名弄错了,应该是http://download.java.net,把前面的域名换掉,后面的不变,就能下载打包好的源码文件。参考1.7地址: http://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip
     
    2.安装依赖软件,如果没有brew命令,可以先看看brew怎么安装再继续执行以上安装命令。
    (1)Xcode-select:安装命令:xcode-select –install  进行x11链接
      sudo ln -s /usr/X11/include/X11 /usr/include/X11 or sudo ln -s /usr/local/X11/include/X11 /usr/include/X11  (如果软连接失败,重启mac时按住command+R 进入恢复模式,然后打开terminal  执行 csrutil disable,再重启,这是mac对安全的一种校验)
    (2)安装XQuartz 下载地址: https://www.xquartz.org/
    (3)安装freetype,安装命令:brew freetype
    (4)安装GC 安装命令: brew install gcc49 据说安装往上的版本会报错。
    (5) 安装ccache提升编译速度 brew install freetype
    (6) 安装ant 一般mac都会有这个环境,如果没有执行:brew install ant
     
     
    3.修改源码

    (1). 修改generated-configure.sh(路径:common/autoconf/generated-configure.sh)
      注释20061行
      // as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
      注释21640行
      // as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5

    (2). 修改relocInfo.hpp(路径:hotspot/src/share/vm/code/relocInfo.hpp)
      修改367行
      inline friend relocInfo prefix_relocInfo(int datalen);
      修改472行
      inline relocInfo prefix_relocInfo(int datalen = 0) {
        assert(relocInfo::fits_into_immediate(datalen), "datalen in limits");
        return relocInfo(relocInfo::data_prefix_tag, relocInfo::RAW_BITS, relocInfo::datalen_tag | datalen);
      }


    (3). 修改openjdk/hotspot/src/share/vm/opto/loopPredicate.cpp
      修改775行为
      assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int()->_lo >= 0, "must be");


     (4).修改openjdk/hotspot/src/share/vm/runtime/virtualspace.cpp
      修改331行为
      if (base() != 0) {

    4.设置环境变量

      cd ~
      open .bash_profile (这个在安装jdk都会设置的,如果没有这个文件去看看jdk安装的教程)
    添加变量:

    export LANG=C
    # 设定语言选项,必须设置
    export LANG=C
    # Mac平台,C编译器不再是GCC,是clang
    export CC=clang
    # 跳过clang的一些严格的语法检查,不然会将N多的警告作为Error
    export COMPILER_WARNINGS_FATAL=false
    # 链接时使用的参数
    export LFLAGS='-Xlinker -lstdc++'
    # 是否使用clang
    export USE_CLANG=true
    # 使用64位数据模型
    export LP64=1
    # 告诉编译平台是64位,不然会按32位来编译
    export ARCH_DATA_MODEL=64
    # 允许自动下载依赖
    export ALLOW_DOWNLOADS=true
    # 并行编译的线程数,编译时间长,为了不影响其他工作,我选择为2
    export HOTSPOT_BUILD_JOBS=2
    export ALT_PARALLEL_COMPILE_JOBS=2
    # 是否跳过与先前版本的比较
    export SKIP_COMPARE_IMAGES=true
    # 是否使用预编译头文件,加快编译速度
    export USE_PRECOMPILED_HEADER=true
    # 是否使用增量编译
    export INCREMENTAL_BUILD=true
    # 编译内容
    export BUILD_LANGTOOLS=true
    export BUILD_JAXP=true
    export BUILD_JAXWS=true
    export BUILD_CORBA=true
    export BUILD_HOTSPOT=true
    export BUILD_JDK=true
    # 编译版本
    export SKIP_DEBUG_BUILD=true
    export SKIP_FASTDEBUG_BUILD=false
    export DEBUG_NAME=debug
    # 避开javaws和浏览器Java插件之类的部分的build
    export BUILD_DEPLOY=false
    export BUILD_INSTALL=false

    最后干掉这两个变量,不然会有诡异的事发生
    unset JAVA_HOME
    unset CLASSPATH

     

    5.编译, ( 遇到问题可以先看看下面的问题描述)

    (1)cd 到下载好的openSDK目录下,先授予权限给openJDK目录 如: chmod -R 777 openjdk
     
    (2)./configure 如果找不freetype 可以执行./configure --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/
     
      (3) 开始执行make命令: 在执行make命令需要指定编译环境,环境路径在:./openjdk/build/下面 一般有两个 macosx-x86_64-normal-server-release 和 macosx-x86_64-normal-server-slowdebug
      如果一般编译失败会有失败的文件,为了保险起见先执行:
        make CONF=macosx-x86_64-normal-server-release clean 或者
        make CONF=macosx-x86_64-normal-server-slowdebug clean
      再执行:
        make CONF=macosx-x86_64-normal-server-release install 或者
        make CONF=macosx-x86_64-normal-server-slowdebug install
    编译成功如图:
      

    6.我执行./configure和编译遇到的问题:

    (1)./configure问题: configure: error: GCC compiler is required
      解决方法:
       jdk8/common/autoconf/generated-configure.sh文件中 注释两处代码:第20061,21640行 #as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
     
      (2)make问题:
      Running nasgen
      Exception in thread "main" java.lang.VerifyError:
      class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final method setPrototype.(Ljava/lang/Object;)V
      解决方法:
      修改:vim ./openJDk/nashorn/make/BuildNashorn.gmk
      80行原来 -cp 修改为:-Xbootclasspath/p:  如图: 
      
     
     
    7.测试是否编译成功
      cd ./openjdk/build/macosx-x86_64-normal-server-release/jdk/bin
      执行java -version
      如图则编译成功:
       
     
     
     
     
     

  • 相关阅读:
    bash 教程 shell 基础语法
    使用 Flutter 开发 Windows 桌面应用 [MD]
    小tips:使用babelupgrade从babel6升级babel7
    JS的可选链操作符(?.)与双问号(??),你用到了吗?
    JS处理html的编码(encode)与解码(decode)
    pdf A3 到 A4
    grub4dos 制作U盘启动盘
    amixer的用法
    一个tomcat设置多个端口
    PostgreSQL 配置内存参数
  • 原文地址:https://www.cnblogs.com/Seeasunnyday/p/9368302.html
Copyright © 2011-2022 走看看