UPDATED 20140118:WebKit已经支持使用VS2013来编译啦!因此,如果使用VS2010来编译最新的WebKit代码会出现问题。还没有安装VS2013,但是,感觉只需将安装VS2010的步骤更改为安装2013就可以完成编译WebKit了。另外,这里用VS2010编译WebKit所遇到的问题应该还是有帮助的。
一直有想编译WebKit的想法,可以一直都没有具体实施。最近,终于将WebKit给编译通过了!虽然,只是编译通过,只是学习WebKit开始的一小步,但是,感觉还是很爽的!
印象中,感觉在Windows下编译WebKit是很繁琐复杂的。但是,在这次成功编译WebKit的过程中发现,只要相关工具安装在“默认”的路径上,成功编译WebKit还是相对简单容易的。只需要按照WebKit官方网站的文档,就可以轻松编译WebKit了(当然,还是会碰到一些小问题)。
接下来,想根据这次编译WebKit过程中所遇到问题的解决和总结,说明一下编译WebKit的步骤。
分为以下几方面来讲述:
我使用的是Windows 8操作系统。当然,如果使用Windows 7/Vista肯定也是没有问题的。
下载并安装June 2010 DirectX SDK。
为什么要将DirectX SDK的安装放在第一步呢?因为,DirectX SDK的安装与Visual Studio 2010 sp1有一个冲突:C++ Runtime版本冲突。为了避开这个问题,就将安装DirectX SDK放在安装Visual Studio之前。如果大家是先安装Visual Studio 2010 sp1的,在碰到DirectX SDK不能成功安装时,可以查看这篇文章:"S1023" error when you install the DirectX SDK (June 2010)(http://support.microsoft.com/kb/2728613),以解决问题。
另外,想说明一下,在Windows 8 SDK中,已经包括了DirectX SDK。但是,因为,WebKit使用了一些最新的DirectX SDK没有包括的部分,所以,还是需要安装June 2010版本的DirectX SDK的。
1)安装Visual Studio 2010或Visual Studio 2010 express。
2)安装Visual Studio 2010 sp1。
需要特别说明的是,建议将VS安装在默认路径的C盘,否则,在编译WebKit时会遇到问题。当时,我就是没有将VS安装在C盘,所以,扑腾了一下。当然,这不是必须的。如果VS不是安装在C盘,可以查看“Visual Studio没有安装在默认的C盘引发的问题”部分,以解决问题。
1)下载Cygwin压缩包。WebKit官方帮我们整理了一个包括WebKit所需工具的Cygwin压缩包。使用这个压缩包,就只会下载安装WebKit所需要的工具集。
2)解压并运行cygwin-downloader.exe,以下载Cygwin所需文件。
3)下载完后,运行setup.exe,安装Cygwin。
有几点说明一下:
a) “Choose A Download Source”,选择“Install from Local Directory”。
b) “Select Root Install Directory”,强烈建议按照默认的“C:\Cygwin”,否则,在编译WebKit时会遇到许多问题。当时,我就是没有将Cygwin安装在默认路 径上,在编译时遇到许多的问题。当然,这不是必须的。如果Cygwin不是安装在默认路径上,可以查看“Cygwin没有安装在默认路径(C:\Cygwin)而引发的问题”部分,以解决问题。
1)下载并安装QuickTime。
2)下载并安装QuickTime SDK。留意右边的“Downloads and Tools”部分,点击该处以查找资源下载。
需要特别说明的是,建议将QuikTime SDK安装在默认的C盘路径上,否则,在编译时会遇到问题。当然,这不是必须的。如果QuickTime SDK不是安装在默认路径上,可以查看“QuickTime SDK没有安装在默认的C盘而引发的问题”部分,以解决问题。
为了安装Debugging Tools for Windows,我直接安装了Windows 8 SDK。这个步骤不是必须的。可以等到经后需要用到Debugging Tools for Windows时,才安装。
至此,编译WebKit所需的开发工具,已安装完成了!
1)下载WebKit源代码。运行cygwin终端,输入以下命令,使用svn客户端程序将WebKit源代码下载到本地(下载到用户HOME目录下的WebKit目录)。
svn checkout https://svn.webkit.org/repository/webkit/trunk WebKit
2)下载WebKit所需的库文件压缩包。下载完后,不需要解压,直接将其放到WebKit目录下即可。
3)更新WebKit源代码。运行Cygwin终端,进入WebKit目录,输入以下命令,以更新WebKit源代码。注意,在编译前,必须执行这一步骤。因为,第一次运行该命令时,会下载一些编译WebKit所需要的额外的库文件。
./Tools/Scripts/update-webkit
至此,开发工具和源代码都已经就绪了,可以开始编译WebKit了!
可以通过两种方式编译。
打开Cygwin终端,进入WebKit目录,输入以下命令,开始编译WebKit(默认是release版本)。
./Tools/Scripts/build-webkit
或
./Tools/Scripts/build-webkit --debug
使用Visual Studio 2010打开解决方案WebKit/Source/WebKit/WebKit.vcxproj/WebKit.sln。直接编译解决方案即可。
这两种方式应该是类似的,如果配置正确,在某种方式下编译成功,在另一种方式下也会编译成功的。
在使用Cygwin命令行开始编译后,发现编译马上就中断了。然后,有以下的错误提示:
根据上面的提示,似乎是由于找不到VS程序而引发的出错。我当时是将VS安装在D盘的,没有安装在默认的C盘。另外,我安装的是Visual Studio,没有安装Visual Studio Express,怎么去找VCExpress.exe呢?因此,根据错误提示,打开webkitdirs.pm文件,查看第1657行到底发生了什么。
发现,由于programFilesPath函数的返回值,从而,错误的进入了else分支。那么,再看看programFilesPath函数。
发现,其返回值是根据环境变量“PROGRAMFILES(X86)”等决定的。在我本机上输出环境变量“PROGRAMFILES(X86)”,发现其值为“C:\Program Files (x86)”。结合上面的setupCygwinEnv函数,可以确定就是因为programFilesPath值不对,导致了找不对VS程序,所以,最终走到了else分支!!
为了解决问题,我直接修改了上面的programFilesPath函数,将赋值的那一行直接改为:
做了以上修改后,问题解决!
需要注意的是,如果VS安装在默认的C盘,是不会有这个问题的。另外,如果是直接使用VS进行编译,而不是使用Cygwin命令行编译,应该也是不会有这个问题的。
如果Cygwin没有安装在C盘,而是安装在D盘(D:\Cygwin)导致碰到许多编译链接问题!绝大多数的编译问题都是这个问题引起的!问题提示类似于这样:
在我本机上输出环境变量“SystemDrive”,发现其值为“C:”,而我的Cygwin是安装在D盘的。这样,相应命令当然是找不到的呀!
为了解决这个问题,可以通过以下方式处理。
1)使用Visual Studio 2010打开WebKit解决方案。
2)通过VS的Property Manager窗口,快速的批量的修改配置(通过Property Manager,可以做到只更改一处,多处起效。例如,修改某处的配置,使得debug和release配置都起作用!我一开始,没有使用Property Manager修改配置,因此,会出现debug编译通过,但是,release编译不通过的问题)。
a) 通过菜单View->Other Windows->Property Manager打开Property Manager窗口。打开后,Property Manager面板显示如下:
b) 定位到WTFGenerated项目,然后,依次展开,定位到common项。
c) 双击common项,打开对话框。左边定位到NMake项,在右边即可看到与错误信息相关的内容了。
d) 依次对“Build Command Line”、“Rebuild All Commond Line”和“Clean Command Line”的内容进行编辑,将两处的Cygwin的安装目录路径修正。以“Build Command Line”为例,修正前的内容为:
修正后的内容为:
3)通过VS,对WebKit解决方案进行对“%SystemDrive%\cygwin”的查找,并对相应之处进行替换。通过查找,发现共有19个cmd文件(都是一些项目编译前处理和编译后处理命令行文件)满足条件,因此,需要对这19个.cmd文件的Cygwin目录进行替换修正。
如果QuickTime SDK没有安装在默认路径,会导致QTMovieWin项目编译不过。可通过下述方法解决问题。
1) 打开Property Manager窗口,并定位到QTMovieWin项目。
2) 在QTMovieWin项目里,定位到QTMovieWinCommon项。
3) 双击QTMoveWinCommon项,打开对话框。修改编译配置的“Additional Include Directories”。将“$(ProgramFiles)/QuickTime SDK/includes”这一路径修正为对应QuickTime SDK安装目录下的头文件目录。
4) 修改链接配置的“Additional Library Directories”。将“$(ProgramFiles)/QuickTime SDK\LIbraries”这一路径修正为对应QuickTime SDK安装目录下的库文件目录。
编译错误如下:
对应的出错源文件为WebCore项目下platform目录下的LocalizedStrings.cpp文件:
通过google发现,是因为上述标出来的全角双引号导致问题的。将这些全角双引号直接替换为半角双引号即可解决问题。
另外,具体为什么会有问题呢?我猜可能与WEB_UI_STRING等宏的实现相关,这就需要进一步查看代码来定位问题了。
至此,无论通过Cygwin还是VS,都应该可以顺利编译通过了!
运行Visual Studio 2010,打开WebKit解决方案,并将WinLauncher项目设置为启动项目。按下F5,即可运行&调试WebKit!
至此,我们不但可以编译WebKit,还可以运行、调试WebKit了!
1、WebKit官方的安装开发工具文档里,提到的Cygwin DLL的relocate操作,我并没有去执行。也不太清楚什么情况下,才必须执行这个操作。我想可以以后遇到问题时,再看看是否要去执行这个操作。
2、WebKit官方的安装开发工具文档里,提到的php的安装(这个步骤原来的文档里是没有的,不知道什么情况文档更新了这一块内容,2013年8月?2013年9月?)。我还没有安装,等以后需要时再安装吧。
3、因为我使用的操作系统是Windows 8,所以,没有去安装WebKit官方的安装开发工具文档里提到的一些补丁。我想对于Windows 8来说是不是已经不需要的呢。
4、WebKit官方支持的Visual Studio版本会不断的升级。以前只支持Visual Studio 2005,现在支持Visual Studio 2010。但是,肯定不会去追最新的Visual Studio版本的。如果想使用最新的Visual Studio版本(例如,Visual Studio 2012)编译最新的WebKit代码,肯定是可行的,网上也有许多类似的文章(是不是关键在于WebKit的编译脚本,可能需要进行一些修改?)。
http://www.microsoft.com/en-us/download/details.aspx?id=6812
http://svn.webkit.org/repository/webkit/trunk/Tools/CygwinDownloader/cygwin-downloader.zip
http://www.apple.com/cn/quicktime/download/
https://developer.apple.com/quicktime/
http://msdn.microsoft.com/en-US/windows/hardware/hh852363
https://developer.apple.com/opensource/internet/webkit_sptlib_agree.html
http://www.webkit.org/building/tools.html
http://www.webkit.org/building/checkout.html
http://www.webkit.org/building/build.html
http://www.webkit.org/building/run.html
http://www.webkit.org/building/debug.html
http://msdn.microsoft.com/en-us/library/ms173410(v=vs.90).aspx