OpenJdk8编译

环境准备

操作系统: windows的wsl系统,使用 ubuntu20

jdk版本: jdk8

官方文档: Building the JDK

注: 不同的linux版本下可能部分依赖存在不同,具体参考官方文档

编译步骤

1、拉取代码

git clone GitHub - openjdk/jdk: JDK main-line development https://openjdk.org/projects/jdk

这里我是选了tag之后下载的

2、依赖库准备

2.1  安装编译和配置环境

sudo apt-get install gcc autoconf make

2.2 安装各种依赖环境

sudo apt-get install build-essential libfreetype6-dev libfontconfig-dev libcups2-dev   libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev libasound2-dev libffi-dev

其中 libfreetype6-dev (freetype) 相关库需要注意:

存放freetype.h头文件的文件夹freetype 和 libfreetype.so位置分别位于  /usr/include/freetype2    /usr/lib/x86_64-linux-gnu

如果位于其他地方,需要找到相关文件的位置

2.3、boot-jdk

官方推荐是boot-jdk要比编译的jdk版本低一个版本,比如编译8,那么需要先安装一个jdk7

boot-jdk也称为引导jdk (具体在编译哪个阶段需要暂时没去研究)

不过由于ubuntu自带了一个jdk8,本着先试一试的情况,最后发现也可以

3、configure

去往jdk目录下

bash configure --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu --openjdk-target=x86_64-unknown-linux-gnu --with-debug-level=slowdebug

--with-freetype-include 和 --with-freetype-lib的默认值和我的文件位置不匹配,因此需要指定对应的文件位置 

--openjdk-target 是因为我用的是wsl的环境,如果不指定的话会默认使用windows,因此需要特地指定,非wsl不需要

--with-debug-level 是指定最后编译完成后的二进制文件的调试信息的详细度,最后可以用例如gbd工具调试

还有部分相对重要的参数列举一下,具体参考官网

--with-jvm-variants=xx                                   指定jvm变体

--with-boot-jdk=xxx                                       指定bootjdk位置

最后执行完成可以看到信息如下

4、 make 

编译jdk

make jdk

各种错误

首先会看到这样一个错误

这个错误的原因是由于 prerequisites中存在" : ",如下

target: a1  a2
   cc -c a.c

正常


target: a1  a2:a
   cc -c a.c

这个会出现"多个目标匹配"的错误

通过错误的位置判断出在 BuildLangtools.gmk 第 195行 

 

SetupZipArchive 的定义在 JavaCompilation.gmk文件中

最后通过调试将问题定位在了 302行,主要是 $$($1_ALL_SRCS)参数,从传参来看,最后参数是${ZIP_FULL_JAVAC_SOURCE_ALL_SRCS}

由于不知道什么原因 ,@echo 始终无法输出 ${ZIP_FULL_JAVAC_SOURCE_ALL_SRCS}变量值

通过执行命令将所有参数导出

make --print-data-base all> param.txt

打开文件搜索变量的值 

最后发现存在:Zone.Identifier结尾的文件,这个也是wsl系统专属,会为你创建这种文件,排查了很久才发现

执行以下命令将这种文件全部删除

find ./ -type f -name '*Zone.Identifier' -delete

继续执行,遇到第二个错误

这个错误和变量的定义在一个文件中,因此很快就找到问题了,这个是因为os版本的配置,我的是5版本的,因此加个5%

继续执行,遇到第三个错误,执行的时候将日志等级调整为trace ,否则在代码中会将等级置为warning

make jdk LOG_LEVEL="trace"

看到一个 -j7 参数后面少了几个字母  I/home/c/j  变成了 -dk8.1/make/common  ,按理说应该是  - I/home/c/jdk8.1/make/common 

最后定位到了adjust-mflags.sh中, 然后尝试百度了下,没想到百度到了,主要是make的版本问题,解决方案就是adjust-mflags.sh文件中 如下位置加个大写的 “I ”

然后继续执行,继续报错,这个错误比较明显,waning级别的告警把编译程序打断了,应该是gcc版本没那么匹配,这个编译其他程序也会经常遇到,因此就是需要想办法跳过就行了

粗暴点的就是在gcc.make中把这一行直接给注释掉

最后编译成功

额外再提一个问题,gcc版本不匹配的话也可能出错,我这里用的是gcc 4.9的版本 ,g++也一样,可以使用如下命令对gcc和g++进行多版本管理

sudo vi /etc/apt/sources.list

添加依赖库:

#install gcc 4.9
deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe

sudo apt install gcc-4.9
sudo apt install g++-4.9


sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20


sudo update-alternatives --config gcc
sudo update-alternatives --config g++

选择 4.9版本

最终jdk编译成功,结果在build目录下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值