来源参考

准备工作

OpenJDK的编译工作不算复杂(相比Mozilla Firefox或者Chromium来说相当简单), 不过需要安装Cygwin

另外编译器环境在Windows SDK中也有提供,如果不打算安装VS2015或更新的话,可以考虑不安装VS2010, 因为4.0以上的.NET和VS2010SP1会造成一个问题,下文会详细提到。

值得一提的是,笔者测试使用的是64位的Windows7环境,多个VS版本共存(VS2010 Exp,VS2013 Community,VS2015 Community) 如若读者使用32位环境,应作出相应变更。

编译环境

  • Cygwin

官方网站下载安装吧。注意需要安装64位版本。笔者是安装在

D:\Cygwin

顺便,Cygwin在安装过程中需要安装这些包

binutils
cpio
diffutils
file
gawk
gcc-core
m4
unzip
zip
mercurial
  • Windows SDK For Window 7 and .NET Framework 4.0

严格来说这个SDK的版本是7.1,应该与Windows SDK For Window 7 and .NET Framework 3.5也就是SDK 7区别开来。

微软的官方网站下载;请注意下载64位版的;这里给的链接是ISO版的,这样不需要安装时再从网络下载,节省时间。 需要留意的是,至少需要安装VC++编译器头文件这两个组件, 路径随意(笔者使用默认安装路径)。此时会在安装路径下,例如默认的

C:\Program Files (x86)\Microsoft Visual  Studio 11.0

此目录下应该能找到VC\Bin\amd64\cl.exe,即编译器入口。

  • Visual Studio 2010 Express Visual C++

对于OpenJDK自己这个不需要安装,但是有一个依赖的库Freetype,需要其进行编译;毕竟Freetype源代码里也只提供到VS2010的 项目解决方案文件,并未支持更新的2013和2015。笔者也未尝试使用新版本的VS编译测试。 (Freetype自身是可以编译通过的,但笔者未测试是否能用于OpenJDK)

如果找不到下载,可以尝试看看这个方法

  • vcvars64.bat

VS2010 Express版本不会带64位编译器(VS2013 Community也是如此),Pro以上版本无此问题。所以会缺少这个文件。 这个批处理脚本为自动根据安装情况设置环境变量,以便于其他项目构建脚本相应的获取编译器、头文件、库文件 路径等信息。它应该位于下面这个路径里(假设使用默认安装路径)

C:\Program Files (x86)\Microsoft Visual  Studio 11.0\VC\Bin\amd64

如果没有,可以手工创建,并填入以下内容(假设默认安装路径)。其中/Release用来设置以发布方式进行编译配置 ,相对于/Debug来说。

CALL "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /Release /x64
  • VS2010SP1

微软官方网站进行下载,可以考虑下载ISO版本的,以便节省配置时间。 对于编译OpenJDK依赖,这个更新是必要的,因为编译器的某个纰漏导致OpenJDK编译过程中会遇到以下错误。 (这里是OpenJDK邮件列表的讨论)。

"LINK: fatal error LNK1123: failure during conversion to COFF: file invalid"

重点来了,虽然安装VS2010SP1后能解决前一个问题,然而因为某个纰漏导致64位的编译器会被删除。 为此,专门发布了一个修复更新(下载链接在前面微软博客的链接里有),请务必安装。

微软啊微软,笔者已经不知道应该用什么表情来面对...

  • 建立工作路径

笔者使用的是

D:\OpenJDK

是否带有空格似乎不重要,但是绝对路径引用时需要注意转义或者带上引号

Make

OpenJDK并不能直接使用Cygwin带的make,笔者按照说明使用了3.82版本的make。

自行从官方网站下载后,编译,不需要安装使用时绝对路径引用即可

解压、配置编译

$ cd /cygdrive/d/OpenJDK/make-3.82
$ ./configure
$ make

Freetype

源代码可以从GNU的下载服务器获取,笔者这里使用的版本是2.4.7。解压至

D:\OpenJDK\freetype-2.4.7

使用VS2010,打开其中的项目文件(如果机器上有多版本VS的话,例如笔者,可以先打开VS2010,再把项目文件拖曳进去)

builds\win32\vc2010\freetype.sln

原版说明在这里,若使用默认的配置都是32位的无需作出改动。 设置项目属性,在Configuration Manager中新增Active platform solution为x64,并将Active platform configuration设置为Release Multithreaded, 回到上一级设置窗口,在选中左侧Configuration Properties / General项目后,编辑右边的配置。 将输出目录设置为

.\..\..\..\objs\win64\vc2010\

将中间过程文件目录设置为

.\..\..\..\objs\release_mt_64\

目标名称设置为freetype,平台工具集设置为Windows7.1SDK。紧接着就可以开始进行项目编译。先后两次,目标文件的扩展名分别是.lib.dll

然后将编译完成的文件复制到以下目录

D:\OpenJDK\freetype\lib

另外,将freetype源代码下的include文件夹复制下面目录中

D:\OpenJDK\freetype

至此准备工作完成!

获取源代码

使用Cygwin shell,进入工作路径后获取OpenJDK源代码

$ cd /cygdrive/d/OpenJDK
$ mkdir jdk
$ cd jdk
$ hg clone http://hg.openjdk.java.net/jdk8u/jdk8u

这里笔者使用了OpenJDK带更新补丁的Master分支,其他分支可以去源代码目录查看。

获取完毕后,可以相应地使用不同的tag来编译想要的版本,例如

# 列出所有版本标签
$ hg tags

# 签出指定代码
$ hg update -C 

配置与编译

如果环境配置没有问题,配置和编译过程就相对比较简单的。

$ cd /cygdrive/d/OpenJDK/jdk/jdk8u
$ ./configure \
  with_freetype="/cygdrive/d/OpenJDK/freetype" \
  with_milestone="120" \
  with_toolsdir="/cygdrive/c/Program Files (x86)/Microsoft Visual Studio 10.0/vc/bin" \
  MAKE="/cygdrive/d/OpenJDK/make-3.82/make"

其中with_tooldir用于指定VS目录,适用于同一台主机上多个VS版本共存时使用; with_milestone用于指定java -version显示的版本,默认为internal,用于作出一些个性定制标记。 如果嫌每次都敲这么一长串命令麻烦,可以将其写入一个bash脚本然后调用(笔者正是这么做的)。

请确保检测到的编译器版本为16.00主版本;倘若不是,则可能使用了非VS2010的编译器。

最终会显示配置的结果,并在build目录生成一个类似windows-x86_64-normal-server-release的工作目录

编译

$ /cygdrive/d/OpenJDK/make-3.82/make.exe clean images

Windows的OpenJDK编译时间比Linux版的要快上不少,应该是不少功能都默认关闭的关系。

测试成果与打包

编译成功后可以进行测试

$ cd /cygdrive/d/OpenJDK/jdk/jdk8u/build/windows-x86_64-normal-server-release/images
$ j2sdk-image/bin/java -version
$ j2re-image/bin/java -version

j2sdk-iamge打个包,也就是JDK的包了,由于其lib中已经带有vc100.dll文件,往其他主机上解开, PATH与JAVA_HOME环境变量设置完即可使用。

小结

Windows下编译开源软件并非不可能,只不过有些麻烦或绕弯;同时也可以一定程度上的了解开源软件的构建。

以后笔者还将继续介绍Mozilla Firefox和Chromium在Windows下的编译。

__END__