研究一下openjdk在Windows下的编译过程,建议采用Linux环境下编译。
openjdk中代码由java,c++,c语言共同完成,因此需要jdk以及c++编译环境支持。
环境准备
1. Windows10 64操作系统 安装jdk1.7版本以上。
2. cygwin 3.0.6. http://www.cygwin.com/
3. freeType 2.7 https://download.savannah.gnu.org/releases/freetype/
4. vs2010
5. openjdk1.8 http://jdk.java.net/java-se-ri/8
以上软件可以从该处获取:https://blog.csdn.net/wqlinloveruby/article/details/80409031
链接:https://pan.baidu.com/s/10iD2e7LhtQTPolGVUdOGgg 密码:yjqh
环境安装
1.cygwin安装
cygwin模拟Linux环境的软件,相当于一个虚拟机,主要编译工作在这里进行。cygwin软件很多,这里只选择需要的软件安装即可
启动安装程序
选择合适站点,具体站点选择可根据自己网络情况来选择,可参考 https://cygwin.com/mirrors.html
具体cygwin软件安装过程,结合category以及search来搜索需要的包,点击New来选择版本安装
基本软件安装完成,配置环境变量Path,将cygwin bin目录配置到path环境目录下
2.安装VS2010
下载地址:链接:https://pan.baidu.com/s/10iD2e7LhtQTPolGVUdOGgg 密码:yjqh
解压iso文件,setup.exe进行安装
安装VS2010完成。
3.安装freeType
下载地址:https://download.savannah.gnu.org/releases/freetype/
解压,利用vs2010来编译freeType产生静态以及动态链接库
利用VS2010打开freetype-2.7\builds\windows\vc2010
静态链接库编译
右击项目属性,配置参数如下:
配置Configuration Manager
右击Build,开始编译
动态链接库开始编译
右击Build开始编译,编译结果:freetype-2.7\objs\vc2010\x64
将编译文件放置到freeType安装目录下新建lib目录,放入其中
配置环境变量FREETYPE_CFLAGS=freetype-2.7\include;FREETYPE_LIBS=freetype-2.7\lib,以及path路径
4.下载openjdk1.8
下载地址:http://jdk.java.net/java-se-ri/8
解压,在正式编译以前,阅读参考文档openjdk-8u40-src-b25-10_feb_2015/openjdk/README-builds.html
编译环境检查
打开cygwin,切换到openjdk1.8解压目录下
cd /cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk
执行编译环境检查命令:
bash ./configure -with-freetype=/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/freetype-2.7 -enable-debug -with-target-bits=64
具体的配置参数可以参考文档README-builds.html
这里首先执行编译环境检查,由于不同版本可能会遇到不同问题,这里可以结合文件
openjdk-8u40-src-b25-10_feb_2015\openjdk\common\autoconf\generated-configure.sh来解决
编译检查通过显示如下:
编译检查过程中可能遇见的问题
1.
Could not find cpio\Could not find unzip! \Could not find zip!
由于cygwin安装软件不完整而导致,重新安装cygwin,确保以下软件安装完成
2.
checking cygwin release... 3.0.6(0.338/5/3)
configure: Your cygwin is too old. You are running 3.0.6(0.338/5/3), but at least cygwin 1.7 is required. Please upgrade.
configure: error: Cannot continue
configure exiting with result code 1
由于检查脚本bug导致:修改文件generated-configure.sh,注释cygwin版本检查部分
3.
configure: error: Target CPU mismatch. We are building for x86_64 but CL is for ""; expected "x64".
修改文件generated-configure.sh,注释以下部分,有两部分需要注释
还可能遇到的问题
4.
checking if the first found link.exe is actually the Cygwin link tool... yes
configure: Cannot locate a valid Visual Studio installation, checking current environment
checking for Visual Studio variables... not found
configure: Cannot locate a valid Visual Studio or Windows SDK installation on disk,
configure: nor is this script run from a Visual Studio command prompt.
configure: Try setting --with-tools-dir to the VC/bin directory within the VS installation
configure: or run "bash.exe -l" from a VS command prompt and then run configure from there.
configure: error: Cannot continue
configure exiting with result code 1
执行编译检查时,配置参数-with-target-bits,路径要与本地VS2010路径相对应。
bash ./configure -with-freetype=/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/freetype-2.7 -enable-debug -with-target-bits=64 with_toolsdir="/cygdrive/C/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin" --disable-ccache
开始编译
/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk目录下,执行make all
编译结果输出目录openjdk-8u40-src-b25-10_feb_2015\openjdk\build\windows-x86_64-normal-server-fastdebug
编译最终结果
测试一下编译之后的jdk版本信息
下面是之前安装的jdk1.8
编译过程可能遇到各种各样的问题以及编译错误,可以查阅资料来解决,重新编译
make clean && make all
编译过程中可能遇见的问题
libcpmt.lib(newaop.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1900' in main.obj
libcpmt.lib(xlock.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1900' in main.obj
libcpmt.lib(uncaught.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1900' in main.obj
libcpmt.lib(xthrow.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1900' in main.obj
libcpmt.lib(locale0.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1900' in main.obj
libcpmt.lib(iosptrs.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1900' in main.obj
MSVCRT.lib(ti_inst.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1900' in main.obj
## Starting hotspot
make[2]: 警告: 子 make 中强制 -jN: 关闭 jobserver 模式。
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
D:\openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot/make/windows/get_msc_ver.sh: 第 65 行:[: ▒▒▒▒ x64 ▒▒ Microsoft (R) C/C++ ▒Ż▒▒▒▒▒▒▒ 19: 需要整数表达式
/usr/bin/expr: 语法错误
NMAKE : fatal error U1077: ▒▒sh▒▒: ▒▒▒ش▒▒롰0x2▒▒
Stop.
make[3]: *** [Makefile:231:generic_build2] 错误 2
make[2]: *** [Makefile:177:fastdebug] 错误 2
make[1]: *** [HotspotWrapper.gmk:45:/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/windows-x86_64-normal-server-fastdebug/hotspot/_hotspot.timestamp] 错误 2
make: *** [/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk//make/Main.gmk:109:hotspot-only] 错误 2
查看cl.exe版本 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cl.exe
执行该目录下cl.exe报错:VS2010目录下cl.exe,dumpbin.exe找不到mspdb100.dll的问题
参考地址:https://blog.csdn.net/sptoor/article/details/8892315?utm_source=blogxgwz3
执行代码:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"
再次执行cl.exe,查看版本16.00.30319.01
修改配置文件\openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot\make\windows get_msc_ver.sh
WARNING: Path does not exist as file or directory: jdk\jfr
make[2]: *** [CreateJars.gmk:268:/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/windows-x86_64-normal-server-fastdebug/images/lib/_the.rt.jar.contents] 错误 1
make[2]: *** 正在等待未完成的任务....
make[1]: *** [BuildJdk.gmk:101:images] 错误 2
make: *** [/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk//make/Main.gmk:136:images-only] 错误 2
参考链接https://my.oschina.net/langxSpirit/blog/1624428
进入cygwin,用vi打开C:\openjdk\jdk\make\CreateJars.gmk,268行附近。在VI下,可输入268gg。仅两处要改,原因是Linux和Winodws换行符不同,造成了之后再编译images target时失败,因为在gmk中会通过grep命令将class文件导出,而如果不做改动则会因换行符问题导致文件大小为零,也就无法进行下一步。在这里卡了好久,最后还是看到OpenJDK的mailing list中,也有人遇到相同的问题。在我的机器上是遇到了此问题,阁下的环境我不得而知,如果不用改动就能编译过,那最好不过啦。修改如下:
在VI输入状态下,按Ctrl + V, Ctrl + M,即可打出^M。保存退出。
[Error] encoded value was less than 0: encode(-8.326673E-17, 5.0, 11.0, 16.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] encoded value was greater than 3: encode(15.029411, 1.0, 14.0, 15.0)
[Error] encoded value was less than 0: encode(-0.05882353, 1.0, 24.0, 25.0)
[Error] Encountered Infinity: encode(-0.00877193, 0.0, 7.0, 7.0)
https://bugs.openjdk.java.net/browse/JDK-8016451好像是个bug,先不处理。
使用的操作命令
cd /cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk
bash ./configure -with-freetype=/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/freetype-2.7 -enable-debug -with-target-bits=64
./configure -with-freetype=/cygdrive/d/MyWorkSpace/freetype-2.9.1/ -enable-debug -with-target-bits=64 with_toolsdir="/cygdrive/c/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Auxiliary/Build" --disable-ccache
bash ./configure --with-freetype=/cygdrive/d/dev/freetype -with-target-bits=64 --with-tools-dir="/cygdrive/d/vs2015/VC/bin" --with-toolchain-version=2015
参考链接:
https://blog.csdn.net/wqlinloveruby/article/details/80409031
https://blog.csdn.net/a510835147/article/details/73011498
https://blog.csdn.net/ciqingloveless/article/details/81950308
https://blog.csdn.net/LPWSTR/article/details/78849587
https://www.jianshu.com/p/e85f93cc74cb
https://blog.csdn.net/wd2014610/article/details/81703203
https://www.cnblogs.com/dennyzhangdd/tag/jdk%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/