java源码学习二、编译OpenJDK8。安装CYGWIN。

①下载OpenJDK8。

②下载CYGWIN。并安装CYGWIN。

CYGWIN默认安装的工具并没有包含所有编译所需的工具,所以不能选择默认安装,下图为其额外所需要的工具:

双击以上exe文件。

三种安装模式
Install from Internet,这种模式直接从Internet安装,适合网速较快的情况;
Download Without Installing,这种模式只从网上下载Cygwin的组件包,但不安装;
Install from Local Directory,这种模式与上面第二种模式对应,当你的Cygwin组件包已经下载到本地,则可以使用此模式从本地安装Cygwin。
我们选择第一种Install from Internet

 选择安装路径,如下图:

在下载的同时,Cygwin组件也保存到了本地,以便以后能够再次安装,这一步选择安装过程中从网上下载的Cygwin组件包的保存位置,如下图:

这一步选择连接的方式,选择你的连接方式,然后点击下一步,会出现选择下载站点的对话框,如下图所示


Use System Proxy Settings 使用系统的代理设置
Direct Connection 一般多数用户都是这种直接连接的网络,所以都是直接使用默认设置即可
Use HTTP/FTP Proxy 使用HTTP或FTP类型的代理。如果有需要,自己选择此项后,设置对应的代理地址和端口,即可
我们选择Direct Connection
选择下载站点,如下图:
不同的镜像存放了不同的包,为了获得最快的下载速度,我们可以添加网易开源镜像http://mirrors.163.com/cygwin/ 或者 阿里云镜像http://mirrors.aliyun.com/cygwin/

 

安装完成后出现如下窗口:

选择需要下载安装的组件包
此处,对于安装Cygwin来说,就是安装各种各样的模块而已。最核心的,一定要安装Devel这个部分的模块,其中包含了各种开发所用到的工具或模块。除下图以外,还需要添加gcc、mingw 、gdb等等模块。具体看下面。

展开devel,从中选择binutils、gdb、 gcc-core、gcc-g++ 、mingw64-i686-gcc-core、mingw64-i686-gcc-g++ 、gdb等进行安装,找到以下选项,点击后边的skip,使其变为版本号即可。

  这里找上述的包可能比较难找,主要在Search中搜索上述的Package。如第一个ar.exe,如果搜索ar,是找不到这个工具的,但是搜索binutils,可以找到。但是实际上是没有显示哪个是我们需要的,因为没有名称是ar的,此时就要对比上述的描述Description了,这样就确定了要下载哪个工具了,左击Skip选中,出现版本号即可。通过Category可以快速定位,但是不准确,实践中可行,但有些不对。总结一下就是以Package为主,Description为确定目标,这个毕竟是功能描述,包一致,功能也差不多,那就是那个包了,Category只能用于快速定位,没找到要到其它Category中寻找。

 

进行安装

等待进度条完成,如下图:

下载下来的包在如下路径:

 下次安装,双击

三种安装模式
Install from Internet,这种模式直接从Internet安装,适合网速较快的情况;
Download Without Installing,这种模式只从网上下载Cygwin的组件包,但不安装;
Install from Local Directory,这种模式与上面第二种模式对应,当你的Cygwin组件包已经下载到本地,则可以使用此模式从本地安装Cygwin。
我们选择第一种Install from Local Directory,如下图,不选红框,选第三个选项Install from Local Directory,然后选择以上下载的包的路径。

双击:

在窗口输入:cygcheck -c cygwin

gcc --version

g++ --version

说明安装成功。

③安装freeType。

下载文件如下:

解压以上文件,并更名为freeType。

进入该文件夹里面 打开工程文件

E:\BaiduNetdiskDownload\jdkyuanma\freeType\freetype-2.10.1\builds\windows\vc2010

打开工程文件

双击以上freetype.vcxproj文件。

已经安装好vs。则会在VS2010里面打开。最好装vs2010,否则后面会有坑。

  项目->属性,如图所示,改成v100

LINK fatal error LNK1123转换到 COFF期间失败文件无效或损坏

项目—属性—配置属性—清单工具—输入输出—嵌入清单,改为“否

用新版cvtres.exe替换旧版本的cvtres.exe

查看计算机是否为64bit操作系统,如是,继续如下操作。
查找是否有两个cvtres.exe
D:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe即安装路径下
C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe即c盘系统路径下

右键属性—详细信息, 查看两者版本号

用新版本即C盘(一般是)的替换D盘的。最好先复制一份D盘的。以防恢复原系统。

将以上lib和dll文件复制到新建的lib文件夹内:

将freetype路径更改一下

④更改CreateJars.gmk的内容。

进入cygwin,用vi打开C:\openjdk\jdk\make\CreateJars.gmk,268行附近。在VI下,可输入268gg。仅两处要改,原因是Linux和Winodws换行符不同,造成了之后再编译images target时失败,因为在gmk中会通过grep命令将class文件导出,而如果不做改动则会因换行符问题导致文件大小为零,也就无法进行下一步。

在VI输入状态下,按Ctrl + V, Ctrl + M,即可打出^M。保存退出。

Ctrl + V打出^,而 Ctrl + M打出M。

⑤修改E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\common\autoconf,Line 7217-7225注释掉,不检测cygwin版本

⑥开始编译。

开启CMD,输入set path=%path%;c:\cygwin\bin。

然后把Visual Studio 2010目录下VC\bin\amd64\vcvars64.bat拖入CMD窗口,必须是64位元的VC环境。

通过CYGWIN进入OpenJDK8的解压目录

cd E:/BaiduNetdiskDownload/jdkyuanma/openjdk-8u40-src-b25-10_feb_2015/openjdk
 

 解压下载的FreeType和OpenJDK8到同一个根目录,目录中最好不要有中文,以免带来不好的影响。放在同一个路径下也是为了等下在CYGWIN中好操作。

 bash ./configure --with-freetype=/freetype --with-target-bits=64

上面代码有错误,freetype的路径不对。 

错误提示:

Your cygwin is too old. You are running 2.6.0(0.304/5/3), but at least cygwin 1.7 is required. Please upgrade.

解决方案:

E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\common\autoconf

generated-configure.sh用edit plus打开注释掉以上内容。

再重新编译。

在openjdk下:

export PATH=/usr/bin:$PATH

chmod 0755 ./configure 

./configure --enable-debug --with-freetype=/cygdrive/e/BaiduNetdiskDownload/jdkyuanma/openjdk-8u40-src-b25-10_feb_2015/openjdk/freetype --with-boot-

jdk=/cygdrive/d/programfiles/Java/jdk1.8.0_144 --with-target-bits=64

 注意:盘符E盘和D盘后面没有冒号,而且小写。


--with-freetype=freetype的地址,--with-boot-
jdk=jdk的地址,但前面都有一个地址/cygdrive/

再然后make all

错误; error: Target CPU mismatch. We are building for x86_64 but CL is for ""; expected "x64".

E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\common\autoconf\toolchain.m4

找到相应的字串Target CPU mismatch,有两个办法:

注释这一段if。

或者把AC_MSG_ERROR改成AC_MSG_RESULT

这里我们选择注释掉相关代码。

E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\common\autoconf\generated-configure.sh

也注释掉相关代码。

然后重新执行:

 ./configure --enable-debug --with-freetype=/cygdrive/e/BaiduNetdiskDownload/jdkyuanma/openjdk-8u40-src-b25-10_feb_2015/openjdk/freetype --with-boot-jdk=/cygdrive/d/programfiles/Java/jdk1.8.0_144 --with-target-bits=64

成功的话出现如下画面:

然后make all

make all出现错误:

## Starting hotspot
make[2]: 警告: 子 make 中强制 -jN: 关闭 jobserver 模式。
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1
E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot/make/windows/get_msc_ver.sh: 第 65 行:[: ▒▒▒▒ x64 ▒▒ Microsoft (R) C/C++ ▒Ż▒▒▒▒▒▒▒ 16: 需要整数表达式
/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/e/BaiduNetdiskDownload/jdkyuanma/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/windows-x86_64-normal-server-fastdebug/hotspot/_hotspot.timestamp] 错误 2
make: *** [/cygdrive/e/BaiduNetdiskDownload/jdkyuanma/openjdk-8u40-src-b25-10_feb_2015/openjdk//make/Main.gmk:109:hotspot-only] 错误 2
解决方案如下:

cl.exe在vs2010安装目录下VC\bin\下有三个,在dos中运行一下看是哪个版本的。我的是16.00.30319.01版。然后修改

程序名称.exe -v,可以知道版本号。

 16.00.30319.01 版,然后修改openjdk\hostpot\make\windows\get_msc_ver.sh

 make all出现错误:

LNK1123:failureduringconversiontoCOFF
LINK:fatalerrorLNK1123:failureduringconversiontoCOFF:fileinvalidorcorrupt
 
NMAKE:fatalerrorU1077:"C:\progra~2\micros~2.0\vc\bin\amd64\link.exe":returncode"0x463"
 
Stop.
 
NMAKE:fatalerrorU1077:"cd":returncode"0x2"
 
Stop.
 
NMAKE:fatalerrorU1077:""C:\ProgramFiles(x86)\MicrosoftVisualStudio10.0\VC\BIN\amd64\nmake.EXE"":returncode"0x2"
 
Stop.
 
make[3]:***[Makefile:217:generic_build2]错误2
 
make[2]:***[Makefile:167:debug]错误2
 
make[1]:***[HotspotWrapper.gmk:45:/cygdrive/e/hub/openjdk/jdk8u/build/windows-x86_64-normal-server-release/hotspot/_hotspot.timestamp]错误2
 
make:***[/cygdrive/e/hub/openjdk/jdk8u//make/Main.gmk:109:hotspot-only]错误2

解决办法,将 visuo studio  安装目录中的 vc2010\VC\bin\cvtres.exe 和vc2010\VC\bin\amd64\cvtres.exe 名字换掉,换成cvtres02.exe,默认让编译程序使用系统 .net framework 的 cvtres.exe

将重新编译:如下:

开启CMD,输入set path=%path%;c:\cygwin\bin。

然后把Visual Studio 2010目录下VC\bin\amd64\vcvars64.bat拖入CMD窗口,必须是64位元的VC环境。

make all

花费了四十多分钟时间。

⑦单独创建Visual Studio的hotspot工程,为了单步调试。

1.开启CMD,输入

set path=%path%;c:\cygwin\bin

把Visual Studio 2010目录下VC\bin\amd64\vcvars64.bat拖入CMD窗口,必须是64位元的VC环境。

set java_home=D:\programfiles\Java\jdk1.8.0_144          java_home的值不能有空格 

set path=%path%;D:\programfiles\MicrosoftVisualStudio10.0\VC\bin          将vs的工具路径设置成环境变量

2.进入E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot\make\windows,编辑create.bat

删除如下几行代码,即使配置了vs工具运行路径仍然会报找不到cl.exe, Make sure cl.exe is in your PATH before running this script.
cl 2>NUL >NUL
if %errorlevel% == 0 goto nexttest
echo Make sure cl.exe is in your PATH before running this script.

goto end

:nexttest
grep -V 2>NUL >NUL
if %errorlevel% == 0 goto testit
echo Make sure grep.exe is in your PATH before running this script. Either cygwin or MKS should work.

goto end
 

或者注释掉,后来发现注释掉出错,需要删除。

 

上图出错,注释不行,要删除。

编辑create.bat,line 142:改成阁下自己的cygwin安装目录。如: 

在cmd输入create.bat的目录

cd E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot\make\windows

回车,然后在该目录下:create.bat openjdk的hotspot的解压目录

create.bat E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot

 然后会在该目录下生成build文件夹。

双击打开此文件夹:又出现文件夹vs-amd64。双击此文件夹。

有VS工程目录:

进入工程:

3.进入工程,保存。选择Compiler2 Fastdebug + X64,F7编译。

4.右键打开项目工程属性,找到debugging,在command arguments后面追加 -Djava.class.path=C:\JavaCode Test1,C:\JavaCode是.class文件所在的目录。

5.打开文件:share\vm\runtime\thread.cpp,line 3304,create_vm,打上断点,F5。这里是已经走到JVM部分了。在JVM创建前,肯定会运行java.exe这个程序,那么它在何处?看到右边的调用堆栈了吧?点击之,进入java.c这个编译单元。在此处打断点,重运行之。

会报错,找不到java.exe

把D:\programfiles\Java\jdk1.8.0_144里面的内容复制到E:\BaiduNetdiskDownload\jdkyuanma\openjdk-8u40-src-b25-10_feb_2015\openjdk\hotspot里面。license不复制。

发布了155 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/lbh19630726/article/details/104113473