2023 编译Windows JDK8(亲测有效)

安装JDK8,Cygwin,VS2010,freetype
下载jdk源码
配置
编译
一.安装Boostrap JDK
先有母鸡,才有蛋
要想编译jdk8,首先得有jdk8。很明显,这是一只母鸡,我们需要它来下蛋。
建议使用镜像下载站安装jdk8
https://mirrors.huaweicloud.com/java/jdk/此处使用华为云的jdk镜像
选择jdk8啥版本都可以,下载后安装,配置环境变量
二.安装Cygwin
https://www.cygwin.com
下载安装,一路下一步,安装路径不要含有空格和中文

选择清华镜像(https://mirrors.tuna.tsinghua.edu.cn),下一步

选择完整,搜索并安装如下包
binutils,cpio,mercurial,zip,unzip,make,m4,procps-ng
安装完下一步
三.安装Visual Studio 2010英文版,(PowerISO)
由于VS2010过于久远,所以目前VS2010直接安装包并不可用(微软下载服务器域名更换)
所以使用iso镜像的方法来安装。
首先下载VS2010的ISO镜像,什么版本的都可以
https://my.visualstudio.com/Downloads?q=visual studio 2010
使用微软官方下载(需要登录微软账号)

此处选择Visual Studio Professional 2010(2.189GB),点击下载
得到一个iso镜像,并用PowerISO挂载到一个盘,双击盘符
自动打开安装界面(如果没有,请手动点击盘里面的setup.exe)
图中为Visual Studio Uitimate 2010(来源与互联网)




安装目录不要含有空格和中文
最后仅勾选C++就可以了
四.获取freetype
https://github.com/ubawurinna/freetype-windows-binaries/releases
此处是已编译好的freetype
选择最新releases下载,解压后将文件夹下对应电脑架构的文件夹名称改为lib
例如:freetype/release dll/win64改为lib,建议把lib文件夹复制出release dll文件夹放在freetype目录下。
五.获取JDK源码
打开Cygwin,在终端 输入
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u/
下载最新OpenJDK jdk8u源码到jdk8u目录

cd jdk8u/
进入jdk目录
ls
检查一下文件是否完整

sh ./get_source.sh
获取完整源码
这一步不能省略,过程可中断,下一次执行自动下一步

执行完这里可能会出现这个情况,这个应该不是网络的问题,我试了很多次都这样,这导致jdk根目录下jdk文件夹的丢失。如果你直接忽略该步骤,将在编译过程中出现该错误

理智方法:借助wsl在linux执行get_source.sh后复制jdk8u文件夹到Windows(√)

(打开浏览器https://hg.openjdk.org/jdk8u/jdk8u/jdk/archive/tip.zip下载(建议魔法)
并解压到jdk根目录就可以解决了)
六. 配置文件
chmod +x ./configure
赋予文件执行权限
./configure --with-freetype=/cygdrive/e/freetype --with-target-bits=64 --enable-debug
参数:
--with-freetype=freetype位置,替换成你自己的
--with-target-bits=目标架构(64,86)
--enable-debug 开启调试模式

七.编译器前的准备
接下来是一个不断试错和改错的过程。
在jdk根目录,终端输入make all(全量编译),然后直接报错。
以下是各种报错的解决方法(按顺序来的)
1. 中文乱码,可以用记事本或notepad--等打开jdk8u/build/windows-x86_64-normal-server-fastdebug/build.log查看
2. ‘xxxx’ 不是内部或外部命令,也不是可运行的程序


若终端输出如上内容,则说明是vc环境变量有问题,说实话,这就是个坑
由于Microsoft SDKs这个文件夹中间有个空格的原因,导致无法正常获取sdks
解决方法,就是更改该文件夹的名称。
编辑jdk8u/build/windows-x86_64-normal-server-fastdebug/vs-env/set-vs-env.sh

检查一下有没有路径中含有空格的(除了Program Files之类)
结果一眼就看到了Microsoft SDKs,把整个文件中的Microsoft SDKs替换成MicrosoftSDKs(随便)
并实际去修改这个文件夹的名称(这可能会导致部分程序无法正常使用,你可以复制Microsoft SDKs后再改名)
另外还需要应用一下这个配置,所以
编辑jdk8u\common\autoconf\generated-configure.sh
查找”Trying to extract Visual Studio environment variables”
在下面几行找到”cmd /c extract-vs-env.bat | $CAT”一行.在前面加上#注释掉

最后执行第六个步骤

看到这个就说明配置成功
其他也是类似的情况,把路径中有空格的文件夹名空格去掉就好了
3.error C2220: warning treated as error - no object file generated
详见:https://learn.microsoft.com/zh-cn/cpp/error-messages/compiler-errors-1/compiler-error-c2220
由于编译cpp过程中,使用/WX的选项,编译器将所有的警告视为了错误(坑啊),关掉,关掉,必须关掉。
编辑jdk8u\hotspot\make\windows\makefiles\compile.make
查找/WX,找到

这一行,并去掉 /WX.如果要忽略所有警告,把/W3改为/W0
八.全量编译
make all

用时13分钟,编译成功
jdk8u\build\windows-x86_64-normal-server-fastdebug\images

j2re-image这个就是jre,j2sdk-image就是jdk,可以直接使用

java版本信息部分可以在jdk8u\hotspot\make\hotspot_version更改
九. 增量编译
jdk8u\jdk\src\share目录下,就是各个Java包的源码,可以随意查看和更改。
更改完在终端输入make images进行增量编译(两分钟左右)

十.小芝士
PROGRA~1:Program Files
PROGRA~2:Program Files (x86)
MICROS~1: Microsoft
It's possible to build both Windows and Linux binaries from WSL. To build Windows binaries, you must use a Windows boot JDK (located in a Windows-accessible directory).
Note that while it's possible to build on WSL, testing is still not fully supported.
----------Building the JDK Doc