准备环境
1操作系统,这里使用ubuntu20.4
2安装依赖环境,
2.1 安装基础环境
apt-get install -y wget unzip vim gcc g++ net-tools telnet curl make openssl libssl-dev zlib1g zlib1g.dev lrzsz --fix-missing
2.2 安装jvm依赖
下载openjdk12源码: https://hg.openjdk.org/jdk/jdk12/archive/tip.tar.gz 在Ubuntu系统上安装GCC的命令为:
apt-get install build-essential
OpenJDK编译依赖库:
工具 | 库名称 | 安装命令 |
---|---|---|
FreeType | The FreeType Project | apt-get install libfreetype6-dev |
CUPS | Common UNIX Printing System | sudo apt-get install libcups2-dev |
X11 | X Window System | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev |
ALSA | Advanced Linux Sound Architecture | sudo apt-get install libasound2-dev |
lbffi | Portable Foreign Function Interface Library | sudo apt-get install libffi-dev |
Autoconf | Extensible Package of M4 Macros | sudo apt-get install autoconf |
数据单元格 | 数据单元格 | 数据单元格 |
sudo apt-get install openjdk-11-jdk
需要下载的编译环境和依赖项目都齐备后,我们就可以按照默认配置来开始编译了,但通常我们编译OpenJDK的目的都不仅仅是为了得到在自己机器中诞生的编译成品,而是带着调试、定制化等需求,这样就必须了解OpenJDK提供的编译参数才行,这些参数可以使用“bash configure--help”命令查询到,笔者对它们中最有用的部分简要说明如下:
· --with-debug-level=
· --enable-debug:等效于--with-debug-level=fastdebug。
· --with-native-debug-symbols=
· --with-version-string=
· --with-jvm-variants=
· --with-jvm-features=
· --with-target-bits=
· --with-
· --with-extra-
· --with-conf-name=
bash configure [options]
譬如,编译FastDebug版、仅含Server模式的HotSpot虚拟机,命令应为:
bash configure --enable-debug --with-jvm-variants=server
configure命令承担了依赖项检查、参数配置和构建输出目录结构等多项职责,如果编译过程中需要的工具链或者依赖项有缺失,命令执行后将会得到明确的提示,并且给出该依赖的安装命令,这比编译旧版OpenJDK时的“make sanity”检查要友好得多,譬如以下例子所示:
configure: error: Could not find fontconfig! You might be able to fix this by running 'sudo apt-get install libfontconfig1-dev'.
configure exiting with result code 1
解决办法:
# sudo apt-get install libfontconfig1-dev -y
如果一切顺利的话,就会收到配置成功的提示,并且输出调试级别,Java虚拟机的模式、特性, 使用的编译器版本等配置摘要信息,如下所示:
====================================================
A new configuration has been successfully created in
/opt/javaVm/jdk12-06222165c35f/build/linux-x86_64-server-fastdebug
using configure arguments '--enable-debug --with-jvm-variants=server'.
Configuration summary:
* Debug level: fastdebug
* HS debug level: fastdebug
* JVM variants: server
* JVM features: server: 'aot cds cmsgc compiler1 compiler2 epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs zgc'
* OpenJDK target: OS: linux, CPU architecture: x86, address length: 64
* Version string: 12-internal+0-adhoc.root.jdk12-06222165c35f (12-internal)
Tools summary:
* Boot JDK: openjdk version "11.0.21" 2023-10-17 OpenJDK Runtime Environment (build 11.0.21+9-post-Ubuntu-0ubuntu120.04) OpenJDK 64-Bit Server VM (build 11.0.21+9-post-Ubuntu-0ubuntu120.04, mixed mode, sharing) (at /usr/lib/jvm/java-11-openjdk-amd64)
* Toolchain: gcc (GNU Compiler Collection)
* C Compiler: Version 9.4.0 (at /usr/bin/gcc)
* C++ Compiler: Version 9.4.0 (at /usr/bin/g++)
Build performance summary:
* Cores to use: 1
* Memory limit: 1959 MB
在configure命令以及后面的make命令的执行过程中,会在“build/配置名称”目录下产生如下目录结构。不常使用C/C++的读者要特别注意,如果多次编译,或者目录结构成功产生后又再次修改了配 置,必须先使用“make clean”和“make dist-clean”命令清理目录,
make clean && make dist-clean
才能确保新的配置生效。编译产生的目录结构以及用途如下所示:
buildtools/:用于生成、存放编译过程中用到的工具hotspot/:HotSpot虚拟机编译的中间文件images/:使用make *-image产生的镜像存放在这里jdk/:编译后产生的JDK就放在这里
support/:存放编译时产生的中间文件
test-results/:存放编译后的自动化测试结果
configure-support/:这三个目录是存放执行configure、make和test的临时文件make-support/
test-support/
编译成功后执行make命令
make images
注意:本文归作者所有,未经作者允许,不得转载