前言
相信很多读过周志明的《深入理解Java虚拟机》的小伙伴们,一定也看到了实战:自己编译JDK这项必修课了吧
周志明老师也在该书中有说到,在MacOS和Linux上编译JDK上编译JDK构建编译环境相对简单,并且书中也有相应的编译流程。本人参考着该流程也成功地在WSL中Ubuntu 18.04版本上成功编译出可使用的JDK,但非Window平台上日常总归不大方便。因此,前前后后差不多倒腾八九天的样子,终于给我倒腾出来了
下面就本人的思路来复盘一下Win10上编译JDK的过程吧~
系统环境
Win10版本信息
注意:JDK编译与Win10版本并无太大关系!!
下载JDK源码
先到官网https://openjdk.java.net/瞅瞅,看有没有源码包可直接下载~
OpenJDK源码主要由两种管理工具Mercurial和Git进行管理~
实际上是从Mercurial向GitHub平台迁移过程,并于去年9月份已经迁移完。
参考文献:
方式一:直接下载打包好的源码包(推荐)
下载地址:https://jdk.java.net/
上方下载地址选择相应版本后,即可在下方箭头指示处下载相应的源码包~
本方法下载的源码包,编译过程的坑更少~
方式二:GitHub 下载Release包 (本文主要使用此处下载的OpenJDK包)
GitHub Releases板块翻阅JDK8源码包即可(Tag太多了,耐心翻吧~)
git clone https://github.com/openjdk/jdk.git 也可行但不推荐,了解git 的小伙伴应该清楚,git中记录了过多的版本信息,导致文件异常巨大~
方式三:通过Mercurial工具下载
Mercurial官方网站:https://www.mercurial-scm.org/
类似于git的版本管理软件,安装好后就可以使用 hg clone获取源码了
例如下载JDK 8:
hg clone http://hg.openjdk.java.net/jdk8
同理下载JDK11:
hg clone http://hg.openjdk.java.net/jdk11
README-builds.html导读
相信很多人没有读官方文档的习惯,同样本人也木有,但习惯总得花时间养成!!
本导读部分仅截取Windows平台编译JDK部分的内容!(后文与导读部分无关,小伙伴们不感兴趣可跳过~)
简介
此README文件包含OpenJDK的构建说明 。为OpenJDK构建源代码需要一定程度的技术能力。
Mercurial的使用
OpenJDK源代码由版本控制系统Mercurial维护 。如果您不熟悉Mercurial,请参阅《 入门指南》 或参阅《 Mercurial Book》。本书的前几章对Mercurial进行了很好的概述,它是什么以及它如何工作。
有关将Mercurial与OpenJDK一起使用的信息,请参阅《 开发人员指南:安装和配置Mercurial》 部分。
获取来源
要获取完整的OpenJDK Mercurial存储库集,请使用get_source.sh位于根存储库中的脚本:
hg clone http://hg.openjdk.java.net/jdk8/jdk8 YourOpenJDK cd YourOpenJDK bash ./get_source.sh
拥有所有存储库后,请记住,每个存储库都是其自己的独立存储库。您还可以./get_source.sh随时重新运行以获取所有存储库中的所有最新变更集。这套嵌套存储库已被赋予术语“forest”,并且有多种方法可以将相同的 hg命令应用于每个存储库。例如,该脚本make/scripts/hgforest.sh 可用于hg 在每个存储库上重复相同的命令,例如
cd YourOpenJDK bash ./make/scripts/hgforest.sh status
仓库
仓库以及仓库中包含着的内容:
Repository | Contains |
---|---|
. (root) | common configure and makefile logic |
hotspot | source code and make files for building the OpenJDK Hotspot Virtual Machine |
langtools | source code for the OpenJDK javac and language tools |
jdk | source code and make files for building the OpenJDK runtime libraries and misc files |
jaxp | source code for the OpenJDK JAXP functionality |
jaxws | source code for the OpenJDK JAX-WS functionality |
corba | source code for the OpenJDK Corba functionality |
nashorn | source code for the OpenJDK JavaScript implementation |
仓库源准则
有一些非常基本的准则:
- 限制在源文件(.java,.c,.h,.cpp和.hpp文件)中使用空格。没有TAB,行中没有尾随空格,并且文件不应以一个以上的空行结尾。
- 具有执行权限的文件不应添加到源存储库。
- 所有生成的文件都需要与源代码管理系统维护或管理的文件保持隔离。生成文件的标准区域是顶层 build/目录。
- 缺省的构建过程应该是以一种形式构建产品,而没有其他任何形式,例如,产品(优化),调试(未优化,-g加断言逻辑)或快速调试(优化,-g加断言逻辑)。
- 每个存储库中 的.hgignore文件必须存在,并且应包括^ build /,^ dist /以及可选的任何 nbproject / private目录。它绝不应在src /或test / 或存储库的任何托管目录区域中包含任何内容 。
- 目录名和文件名不得包含空格或非打印字符。
- 绝不应将生成的源文件或二进制文件添加到存储库(包括javah输出)。该规则有一些例外,特别是某些生成的配置脚本。
- 典型构建或测试存储库不需要的文件不应添加到存储库。
构建
构建OpenJDK的第一步是确保系统本身具有完成OpenJDK构建所需的一切。设置系统后,通常无需再次执行。
现在,通过运行configure证您是否拥有所需的一切,然后运行 make,例如
bash ./configure make all
该configure脚本将在可能的情况下尝试将各个组件定位在默认位置或通过组件特定的变量设置。当正常的默认设置失败或找不到组件时,configure可能需要其他选项来帮助configure 找到用于构建的必要工具,或者由于缺少软件包而可能需要重新访问系统的设置。
**注:**该configure脚本文件没有执行权限,并需要与明确运行 bash,请参阅源的指导方针。
系统设置
在尝试使用系统构建OpenJDK之前,还需要一些非常基本的系统设置。对于所有系统:
- 确保GNU make实用程序为3.81版或更高版本,例如,运行“ make -version”
- 安装 Bootstrap JDK。所有OpenJDK构建都需要访问以前发布的称为引导JDK或引导JDK的JDK。 一般规则是,引导JDK必须是JDK先前主要版本的实例。另外,可能需要使用特定更新级别或更高版本的发行版。
- *构建JDK 8要求使用Update 7或更高版本的JDK 7版本。JDK 8开发人员不应将JDK 8用作启动JDK,以确保不会将JDK 8依赖项引入使用JDK 7构建的系统部分中。*
- 可以从Oracle的JDK 7下载站点下载JDK 7二进制文件 。出于构建性能的考虑,使此引导JDK在进行构建的计算机的本地磁盘上可用非常重要。您应该将其bin目录添加到PATH环境变量。如果configure在查找此JDK时遇到任何问题,则可能需要使用configureoption --with-boot-jdk。
- 确保GNU make,Bootstrap JDK和编译器都在PATH环境变量中。
对于特定系统:
Windows |
---|
安装 CYGWIN或 MinGW / MSYS之一 |
安装 Visual Studio 2010 |
Windows
Windows Unix Toolkit
在Windows上构建需要类似Unix的环境,尤其是类似Unix的shell。Cygwin和 MinGW / MSYS有几种这样的环境可用 目前支持OpenJDK构建。这些系统与标准Windows工具的区别之一是它们处理Windows路径名的方式,特别是包含空格,作为路径分隔符的反斜杠以及可能包含驱动器号的路径名。根据使用情况和每个环境的具体情况,可以通过以下方法解决这些路径问题:引用整个路径,将反斜杠转换为正斜杠,将反斜杠转义为带有附加反斜杠的转义,然后将路径名转换为其路径名。
CYGWIN
CYGWIN是一个类似Linux的开源环境,它试图在Windows上模拟完整的POSIX层。它在路径名上尽量保持精明,并且在内部正确地将驱动器号映射<drive>: 到虚拟目录,但是如果正确引用或转义了路径,通常可以处理所有类型的路径/cygdrive/<drive>。
您始终可以使用该cygpath实用程序将带有空格的路径名或反斜杠字符映射为路径名的C:/样式(称为“混合”),例如。cygpath -s -m "*path*"
请注意,使用CYGWIN会在设置方面产生一个独特的问题PATH。通常,在Windows上,PATH变量包含用“;”分隔的目录。字符(Solaris和Linux使用“:”)。在CYGWIN中,它使用“:”,但这意味着不能在CYGWIN版本中放置“ C:/ path”之类的路径PATH,而是CYGWIN使用/cygdrive/c/path CYGWIN可以理解的东西,但只有CYGWIN可以理解。
OpenJDK构建需要CYGWIN 1.7.16版或更高版本。可以从CYGWIN网站www.cygwin.com获得有关CYGWIN的信息 。
默认情况下,CYGWIN不会安装构建OpenJDK所需的所有工具。除了默认安装外,您还需要安装以下工具。
Binary Name | Category | Package | Description |
---|---|---|---|
ar.exe | Devel | binutils | GNU汇编器,链接器和二进制实用程序 |
make.exe | Devel | make | 专为CYGWIN构建的make实用程序 |
m4.exe | Interpreters | m4 | 传统Unix宏处理器的GNU实现 |
cpio.exe | Utils | cpio | 一个用于管理文件存档的程序 |
gawk.exe | Utils | awk | 模式导向的扫描和处理语言 |
file.exe | Utils | file | magic数字确定文件类型 |
zip.exe | Archive | zip | 打包和压缩(存档)文件 |
unzip.exe | Archive | unzip | 提取ZIP压缩文件中的压缩文件 |
free.exe | System | procps | 显示系统中的可用和已用内存量 |
请注意,CYGWIN软件可能与Windows系统上的其他非CYGWIN软件冲突。CYGWIN提供了有关已知问题的 FAQ,特别有趣的是有关 BLODA(干扰CYGWIN的应用程序)的部分。
MinGW / MSYS
MinGW(“用于Windows的Minimallist GNU”)是一组免费的Windows专用头文件和导入库,结合了GNU工具集,这些工具集允许人们生成不依赖任何第三方C运行时DLL的本机Windows程序。MSYS是MinGW的补充,它允许构建依赖于传统UNIX工具的应用程序和程序。其中包括诸如bash 和的工具make。有关 更多信息,请参见MinGW / MSYS。
与Cygwin一样,MinGW / MSYS可以处理不同类型的路径格式。它们在内部转换为带有正斜杠和驱动器号的路径,并 <drive>:替换为虚拟目录/<drive>。此外,MSYS自动检测为MSYS环境编译的二进制文件,并使用内部Unix样式的路径名来提供它们。如果从MSYS程序中调用本机Windows应用程序,则其路径参数将自动转换回以驱动器号和反斜杠作为路径分隔符的Windows样式路径名。对于使用正斜杠作为参数分隔符(例如cl /nologo /I)的Windows应用程序,这可能会导致问题,因为MSYS可能会错误地 将这些参数替换为驱动器号。
除了默认安装的工具外,您还必须手动安装 msys-zip和 msys-unzip软件包。这可以通过MinGW命令行安装程序轻松完成:
mingw-get.exe install msys-zip mingw-get.exe install msys-unzip
Visual Studio 2010编译器
32位和64位OpenJDK Windows构建需要Microsoft Visual Studio C ++ 2010(VS2010)Professional Edition或Express编译器。预期编译器和其他工具位于VS100COMNTOOLSMicrosoft Visual Studio安装程序设置的变量所定义的位置 。
仅需要VS2010的C ++部分。尝试让安装进入默认的安装目录。在安装VS2010之后,请始终重新引导系统。应该在您的环境中设置系统环境变量VS100COMNTOOLS。
确保在环境中也设置了TMP和TEMP,并引用存在的Windows路径,例如C:tempnot /tmp,not/cygdrive/c/temp和not C:/temp。C:temp仅作为示例,假定该区域是用户专用的,因此默认情况下,安装后,您应该在这些变量中看到唯一的用户路径。
Configure
configure脚本 的基本调用如下所示
bash ./configure [options]
这将创建一个包含“配置”的输出目录,并为构建结果设置一个区域。该目录通常如下所示:
build/linux-x64-normal-server-release
configure将尝试找出您正在运行的系统以及所有必要的构建组件在哪里。如果您具有安装构建的所有先决条件,它应该会找到所有内容。如果无法自动检测到任何组件,它将退出并通知您有关问题。发生这种情况时,请在下面的configure选项中阅读更多内容 。
一些例子:
描述 | 配置命令行 |
---|---|
指定了freetype的Windows 32位版本 | bash ./configure --with-freetype=/cygdrive/c/freetype-i586 --with-target-bits=32 |
调试64位版本 | bash ./configure --enable-debug --with-target-bits=64 |
Configure Options
有关所有OpenJDKconfigure选项的完整详细信息,请参见:
bash ./configure --help=short
使用-help以查看所有configure可用的选项。您可以生成任意数量的不同配置,例如,调试,发行版,32、64等。一些更常用的configure选项是:
OpenJDK配置选项 | 描述 |
---|---|
--enable-debug | 将调试级别设置为fastdebug(这是的简写 --with-debug-level=fastdebug) |
--with-alsa=path | 选择 要在Linux上构建OpenJDK的 高级Linux声音体系结构(ALSA) 0.9.1版或更高版本的ALSA文件的位置。这些Linux文件通常可以从“ libasound”开发软件包的“ alsa”中获得,强烈建议您尝试使用所使用的特定Linux版本提供的软件包。 |
--with-boot-jdk=Path | 选择Bootstrap JDK |
--with-boot-jdk-jvmargs=“ args ” | 提供用于运行Bootstrap JDK的JVM选项 |
--with-cacerts=Path | 选择cacerts文件的路径。请参阅 http://en.wikipedia.org/wiki/Certificate_Authority 以便更好地了解证书颁发机构(CA)。名为“ cacerts”的证书文件代表具有CA证书的系统范围的密钥库。在JDK和JRE二进制捆绑包中,“ cacerts”文件包含来自多个公共CA(例如VeriSign,Thawte和Baltimore)的根CA证书。源包含不带CA根证书的cacerts文件。正式的JDK构建者将需要获得每个公共CA的许可,并将证书包括在其自己的自定义cacerts文件中。如果无法提供已填充的cacerts文件,则会在运行时导致证书链的验证错误。默认情况下,提供了一个空的cacerts文件,这对于大多数JDK开发人员来说应该没问题。如果无法提供已填充的cacerts文件,则会在运行时导致证书链的验证错误。默认情况下,提供了一个空的cacerts文件,这对于大多数JDK开发人员来说应该没问题。如果无法提供已填充的cacerts文件,则会在运行时导致证书链的验证错误。默认情况下,提供了一个空的cacerts文件,这对于大多数JDK开发人员来说应该没问题。 |
--with-cups=Path | 选择CUPS安装位置 。在Solaris和Linux上构建OpenJDK时,需要使用 通用UNIX打印系统(CUPS)标头。可通过从Solaris Software Companion CD / DVD安装软件包SFWcups来获取Solaris头文件,这些文件通常将安装在该目录中/opt/sfw/cups。CUPS头文件始终可以从www.cups.org下载 。 |
--with-cups-include=Path | 配置CUPS包含目录位置 |
--with-debug-level=level | 配置发布,快速调试或慢速调试的调试信息级别 |
--with-dev-kit=Path | 配置编译器安装位置或开发人员安装位置 |
--with-freetype=Path | 配置要使用的freetype文件。期望 自由类型库位于下 lib/,标头位于之下include/。需要2.3版或更高版本的FreeType。在Unix系统上,所需的文件可以作为分发的一部分使用(尽管您可能仍需要升级它们)。请注意,您需要包含FreeType库和头文件的软件包的开发版本。您始终可以从FreeType网站上下载最新的FreeType版本 。也可以从头开始构建freetype 2库,但是在Windows上,请参考 Windows FreeType DLL构建说明。请注意,由于许可限制,默认情况下,FreeType内置禁用字节码提示支持的功能。在这种情况下,文本外观和度量标准应与Sun的官方JDK构建不同。看 有关更多信息 ,请参见SourceForge FreeType2主页 。 |
--with-import-hotspot=Path | 选择位置以查找先前构建的热点二进制文件,以避免构建热点 |
--with-target-bits=arg | 选择32或64位版本 |
--with-jvm-variants=variants | 选择要从中构建的JVM变体,以逗号分隔的列表可以包括:服务器,客户端,内核,零和zeroshark |
--with-memory-size=Size | 配置GNU认为该系统具有的RAM大小 |
--with-msvcr-dll=Path | 选择msvcr100.dll 要包含在Windows构建中的文件(Visual Studio的C / C ++运行时库)。通常,这是从Visual Studio 2010的redist目录中自动提取的。 |
--with-num-cores=cores | 选择要使用的内核数(处理器数或CPU数) |
--with-x=Path | 选择X11和xrender文件的位置。该 XRENDER扩展报头 都需要建立在OpenJDK在Solaris和Linux。通常可以从“ Xrender”开发包中获得Linux头文件,建议您尝试使用所使用的特定Linux发行版提供的包。Solaris XRender头文件与其他 足够新版本的Solaris软件包SFWxwinc中的其他X11头文件一起提供,并将安装在 /usr/X11/include/X11/extensions/Xrender.h或 /usr/openwin/share/include/X11/extensions/Xrender.h |
Make
该make实用程序的基本调用如下所示:
make all
这将开始构建到包含configure 脚本创建的“配置”的输出目录。运行make help以获取有关可用目标的更多信息。
有一些普遍感兴趣的make目标:
Make Target | Description |
---|---|
empty | 构建一切,除了images |
all | 构建一切,包括images |
all-conf | 构建所有配置 |
images | 构建完整的J2SDK和J2re镜像 |
install | 在本地安装生成的映像,通常在 /usr/local |
clean | 删除make生成的所有文件,但不删除由configure生成的文件 |
dist-clean | 删除由和生成的所有文件configure(基本上是终止配置) |
help | 提供一些使用上的帮助make,包括一些有趣的make目标 |
Test
构建完成后,您应该j2sdk-image 在输出目录的目录中看到生成的二进制文件和关联的文件。特别是,该 目录应包含该配置的OpenJDK工具和实用程序的可执行文件。该测试工具将是必需的,可以 在以下网址找到:jtreg网站。存储库中提供的回归测试可以使用以下命令运行:
build/*/images/j2sdk-image/binjtreg
cd test && make PRODUCT_HOME=`pwd`/../build/*/images/j2sdk-image all
README-Builds文件读完,那么简要梳理一下编译流程:
配置编译环境------>configure------>make
编译环境
下载安装VS2010
官网: https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/
安装过程中注意一下几点即可:
- 勾选C++模块
- 安装路径确保无空格,例如 D:UsersWSharkCoderMicrosoftVisualStudio10.0
环境变量配置:
修改文件vctres.exe
MicrosoftVisualStudio10.0VCbin和 MicrosoftVisualStudio10.0VCbinamd64 中cvtres.exe程序和编译过程中需要用到的MicroSoft.Net中的cvtres.exe 同名,确保编译过程中使用正确的cvtres.exe程序分别修改为:
MicrosoftVisualStudio10.0VCbincvtres.exe.bak MicrosoftVisualStudio10.0VCbinamd64cvtres.exe.bak
下载安装CygWin
官网:https://www.cygwin.com/ 下载setup-x86_64.exe
安装:
安装编译JDK所需工具包:
检索后选择版本即可在后一步中安装想对应的版本,即使漏安装某一工具包,利用setup-x86_64.exe重新安装也可以~
编译JDK需要的源码包:
Binary Name | Category | Package | Description |
---|---|---|---|
ar.exe | Devel | binutils | The GNU assembler, linker and binary utilities |
make.exe | Devel | make | The GNU version of the ‘make’ utility built for CYGWIN |
m4.exe | Interpreters | m4 | GNU implementation of the traditional Unix macro processor |
cpio.exe | Utils | cpio | A program to manage archives of files |
gawk.exe | Utils | awk | Pattern-directed scanning and processing language |
file.exe | Utils | file | Determines file type using ‘magic’ numbers |
zip.exe | Archive | zip | Package and compress (archive) files |
unzip.exe | Archive | unzip | Extract compressed files in a ZIP archive |
free.exe | System | procps | Display amount of free and used memory in the system |
安装完后桌面会有如下图标:
检查CygWin环境变量
安装BootJDK
README-BUILD中叙述道 :构建JDK 8要求使用Update 7或更高版本的JDK 7版本。JDK 8开发人员不应将JDK 8用作启动JDK,以确保不会将JDK 8依赖项引入使用JDK 7构建的系统部分中
但本人使用jdk1.7.0_80作为BootJDK时遇到了坑,因此再此给大家排排雷,本人换用jdk1.8.0_281作为BootJDK进行编译成功~
注意: BootJDK安装路径请确保没有空格,含空格的路径通常导致诡异的错误!!
本人BootJDK 安装路径:D:UsersWSharkCoderJavajdk1.8.0_281
下载并安装freetype
OpenJDk中Swing和Console需要使用feetype的字体渲染功能,因此需要先对其进行编译。
官网https://www.freetype.org/ 已经有编译好的lib和dll可直接使用,那么没必要弄巧成拙给大家献丑了~
下载完后解压至无空格路径下,由于修改win64目录为lib目录:
自动配置(configure)
脚本中的cygwin版本与安装的cygwin版本不同需要修改脚本
jdk-jdk8-b120commonautoconfgenerated-configure.sh 中注释掉如下部分:
VS Code中直接检索文本并注释起来即可~
if test "x$CYGWIN_VERSION_OK" = x; then { $as_echo "$as_me:$: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5 $as_echo "$as_me: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&6;} as_fn_error $? "Cannot continue" "$LINENO" 5 fi if test "x$CYGPATH" = x; then as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5 fi { $as_echo "$as_me:$: checking cygwin root directory as unix-style path" >&5 $as_echo_n "checking cygwin root directory as unix-style path... " >&6; }
Linux中换行符 n而Win上换行符rn二者不同导致脚本执行异常
jdk-jdk8-b120jdkmakeCreateJars.gmk修改过程:
CygWin64 Terminal 中跳转至改目录:
CygWin中将Win10中c,d盘映射至cygdrive目录下!
vi编辑CreateJars.gmk
移动光标至指定位置后,按’i’进入编辑模式,然后按ctrl+v和ctrl+M键入下图字符:
:wq进入命令模式保存并退出即可
注意: 请无贪图方便直接使用VS Code等编辑软件直接编辑CreateJars.gmk, 此处的^M本质上是对应换行符而非字符^M,且VS Code编辑文本也容易应发其他换行符错误!!
jdk-jdk8-b120nashornmakeBuildNashorn.gmk中也应发后续make中错误:
VS Code中直接检索文本并注释起来即可~
文本80行:
-cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes"
修改为:
-Xbootclasspath/p:"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes"
开始配置:
configure 简要说明
configure 脚本负责在你使用的系统上准备好软件的构建环境。确保接下来的构建和安装过程所需要的依赖准备好,并且搞清楚使用这些依赖需要的东西。
Unix 程序一般是用 C 语言写的,所以我们通常需要一个 C 编译器去构建它们。在这个例子中 configure 要做的就是确保系统中有 C 编译器,并确定它的名字和路径。
配置命令行:
bash ./configure --enable-debug --with-target-bits=64 --with-boot-jdk=/cygdrive/d/Users/WSharkCoder/Java/jdk1.8.0_281 --with-freetype=/cygdrive/d/Users/WSharkCoder/freetype
以上参数简要说明:
--enable-debug:编译时DeBug级别,默认fastdebug (可调式JDK)
--with-target-bits=64: 64位JDK
--with-boot-jdk:BootJDK路径
--with-freetype:Freetype渲染库路径
可使用一下配置调整内存和CPU配置:
--with-num-cores:配置使用的内核数(处理器数目或CPU数目)
--with-memory-size:配置GNU认为该系统具有的RAM大小
成功配置:
构建过程基本把核心和内存吃满了~(电脑此时基本异常卡顿!)
编译(make)
万里长征终于踏入最后一步了~
make构建简要说明:
当 configure 配置完毕后,可以使用 make 命令执行构建。这个过程会执行在 Makefile 文件中定义的一系列任务将软件源代码编译成可执行文件。
你下载的源码包一般没有一个最终的 Makefile 文件,一般是一个模版文件 Makefile.in 文件,然后 configure 根据系统的参数生成一个定制化的 Makefile 文件.
make images
make命令除去images参数还有其他参数,上文README-BUILD导读过程中以及列举了,就不再重复~
成功编译:
验证
jdk-jdk8-b120buildwindows-x86_64-normal-server-fastdebugjdkbin 执行java -version
自动配置和编译过程中的异常
Your cygwin is too old问题
报错信息
configure: Your cygwin is too old. You are running 3.2.0(0.340/5/3), but at least cygwin 1.7 is required. Please upgrade. configure: error: Cannot continue configure exiting with result code 1
修复方法
修改jdk-jdk8-b120commonautoconfgenerated-configure.sh 注释掉如下部分
if test "x$CYGWIN_VERSION_OK" = x; then { $as_echo "$as_me:$: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5 $as_echo "$as_me: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&6;} as_fn_error $? "Cannot continue" "$LINENO" 5 fi if test "x$CYGPATH" = x; then as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5 fi { $as_echo "$as_me:$: checking cygwin root directory as unix-style path" >&5 $as_echo_n "checking cygwin root directory as unix-style path... " >&6; }
空格问题
报错信息
VS2010安装路径包含空格会导致configure过程中,报找不到VS或VS SDK 的报错信息!
同样,BootJDK路径包含空格也会报相应错误信息:
## Starting hotspo make[2]: warning: -jN forced in submake: disabling jobserver mode. INFO: ENABLE_FULL_DEBUG_SYMBOLS=1 NMAKE : fatal error U1073: don't know how to make 'filesjavajdk1.7.0_80' Stop. make[3]: *** [Makefile:217: generic_build2] Error 2 make[2]: *** [Makefile:167: fastdebug] Error 2 make[1]: *** [HotspotWrapper.gmk:45: /cygdrive/d/Users/WSharkCoder/Desktop/jdk-jdk8-b120/build/windows-x86_64-normal-server-fastdebug/hotspot/_hotspot.timestamp] Error 2 make: *** [/cygdrive/d/Users/WSharkCoder/Desktop/jdk-jdk8-b120//make/Main.gmk:109: hotspot-only] Error 2
修复方式
重新将BootJDK安装在无空格路径中 ~
_the.rt.jar.contents问题
报错信息
Updating images/src.zip make[2]: *** [CreateJars.gmk:268:/cygdrive/e/hub/openjdk/jdk8u/build/windows-x86_64-normal-server-release/images/lib/_the.rt.jar.contents] Error 1 make[2]: *** Waiting Unfinished Task.... make[1]: *** [BuildJdk.gmk:101:images] error2 make: *** [/cygdrive/e/hub/openjdk/jdk8u//make/Main.gmk:136:images-only] error 2
修复方式
CygWin64 Terminal 中跳转至改目录:
CygWin中将Win10中c,d盘映射至cygdrive目录下!
vi编辑CreateJars.gmk
移动光标至指定位置后,按’i’进入编辑模式,然后按ctrl+v和ctrl+M键入下图字符:
:wq进入命令模式保存并退出即可
_the.CORBA.binaries.imported问题
报错信息
## Starting jdk Importing CORBA classes.jar Importing CORBA src.zip Importing CORBA bin.zip java.io.IOException: lib: ▒▒▒▒▒▒Ŀ¼ at sun.tools.jar.Main.extractFile(Main.java:1007) at sun.tools.jar.Main.extract(Main.java:924) at sun.tools.jar.Main.run(Main.java:264) at sun.tools.jar.Main.main(Main.java:1231) make[2]: *** [Import.gmk:100: /cygdrive/d/Users/FangJunXiong/Desktop/jdk-jdk8-b120/build/windows-x86_64-normal-server-release/jdk/_the.CORBA.binaries.imported] Error 1 make[2]: *** Waiting for unfinished jobs.... make[1]: *** [BuildJdk.gmk:51: import-only] Error 2 make: *** [/cygdrive/d/Users/FangJunXiong/Desktop/jdk-jdk8-b120//make/Main.gmk:116: jdk-only] Error 2
修复方式
更换更新版本的BootJDK
参考连接: https://github.com/adoptium/temurin-build/issues/1733
BuildNashorn.gmk:79问题
报错信息
## Starting nashorn Compiling 435 files for BUILD_NASHORN Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Compiling 111 files for BUILD_NASGEN Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. Running nasgen Exception in thread "main" java.lang.VerifyError: class jdk.nashorn.internal.objects.ScriptFunctionImpl overrides final method setPrototype.(Ljava/lang/Object;)V at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at jdk.nashorn.internal.tools.nasgen.StringConstants.<clinit>(StringConstants.java:85) at jdk.nashorn.internal.tools.nasgen.ScriptClassInstrumentor$2.visitMethodInsn(ScriptClassInstrumentor.java:157) at jdk.internal.org.objectweb.asm.MethodVisitor.visitMethodInsn(MethodVisitor.java:509) at jdk.internal.org.objectweb.asm.ClassReader.readCode(ClassReader.java:1445) at jdk.internal.org.objectweb.asm.ClassReader.readMethod(ClassReader.java:1046) at jdk.internal.org.objectweb.asm.ClassReader.accept(ClassReader.java:722) at jdk.internal.org.objectweb.asm.ClassReader.accept(ClassReader.java:535) at jdk.nashorn.internal.tools.nasgen.Main.process(Main.java:121) at jdk.nashorn.internal.tools.nasgen.Main.processAll(Main.java:88) at jdk.nashorn.internal.tools.nasgen.Main.main(Main.java:62) gmake[1]: *** [/root/test/openjdk8/build/linux-x86_64-normal-server-release/nashorn/classes/_the.nasgen.run] Error 1 make: *** [nashorn-only] Error 2
解决方式
修改jdk-jdk8-b120nashornmakeBuildNashorn.gmk 文件80行
# Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN) $(ECHO) Running nasgen $(MKDIR) -p $(@D) $(RM) -rf $(@D)/jdk $(@D)/netscape $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/ $(FIXPATH) $(JAVA) -cp "$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) $(TOUCH) $@
修改为:
# Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package $(NASHORN_OUTPUTDIR)/classes/_the.nasgen.run: $(BUILD_NASGEN) $(ECHO) Running nasgen $(MKDIR) -p $(@D) $(RM) -rf $(@D)/jdk $(@D)/netscape $(CP) -R -p $(NASHORN_OUTPUTDIR)/nashorn_classes/* $(@D)/ $(FIXPATH) $(JAVA) -Xbootclasspath/p:"$(NASHORN_OUTPUTDIR)/nasgen_classes$(PATH_SEP)$(NASHORN_OUTPUTDIR)/nashorn_classes" jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D) $(TOUCH) $@
参考资料
https://my.oschina.net/langxSpirit/blog/1624428
https://segmentfault.com/a/1190000023251649
https://github.com/adoptium/temurin-build/issues/1733
文章评论