Windows平台开发
自动构建二:CruiseControl.NET配置基础
0在软件工程领域,CruiseControl是一个基于Java的持续集成框架。它包含了大量与持续集成有关的功能,如:邮件通知,Ant自动构建,以及支持多种源码管理工具。可以利用Web页面观察当前和以往的构建流程。它允许我们对软件开发中的很多流程进行持续的自动化控制。
CruiseControl是一个自由,开源软件,使用BSD类型的license。最早的时候,该软件是由ThoughtWorks公司的员工开发出来用于该公司自身内部项目的,随后则变成了一个独立的应用软件。
CruiseControl.NET是CruiseControl的.NET版本。还有一个Ruby版本的CruiseControl,被称为CruiseControl.rb。
对于使用Windows平台,以及Visual Studio集成开发环境的团队来说,使用CruiseControl.NET的好处在于他整合了MSBuild,NAnt,VSS等微软平台下常用的软件开发中的工具,并且非常易于在.NET平台下对他的功能进行扩展。
自动构建一:MSBuild基础
0MSBuild是微软自Visual Studio 2005开始提供的构建平台,既可以用于VC#项目,也可用于VC++项目。
通常情况下,我们采用IDE本身进行项目的构建,有时,也会采用命令行方式调用IDE程序Build我们的项目。(对于VC++项目来说,就是通过命令行调用devenv进行构建)
然而,当我们希望在持续集成工具当中实现项目的自动构建时,尤其是当依赖情况或者部署情况较为复杂时,我们希望有一个简单、易维护的工具实现构建——MSBuild就是我们所需要的工具。
从C++到C#——穿行于Native与.Net 托管代码之间
0微软在.Net平台中提供了大量丰富的语言,库,并为之提供了非常强大的开发工具。借用.Net平台,我们可以非常容易的开发基于Windows的应用,与采用C++相比,使用C#语言开发相同功能的软件可以极大的提升开发效率,缩短开发周期,减少Bug。
然而,往往现存有大量的积累代码是基于原生语言开发的,当我们决定采用C#时,必须考虑到与现存的软件组件交互的能力,具体而言——如何在一个以C++语言为主的项目中引入.NET组件?如何在.NET组件中使用C++代码库提供的功能?
在游戏项目中,比较理想的情况是底层的3D引擎采用C++编写,而上层编辑器则采用C#编写,这样可以兼顾引擎的运行效率和编辑器的开发效率。一个值得一提的案例是UDK(Unreal引擎的开发包),其中就采用了C++语言与.NET组件相结合的模式,其界面上相当一部分新功能是采用.NET开发的。
windows的消息队列与消息循环#1
9在Windows操作系统中,窗口是一种User Object,隶属于创建它的线程。如果创建窗口的线程结束,则操作系统会自动删除窗口。建立窗口的线程,必须是为窗口处理所有消息的线程,如果你创建了一个后台线程,希望更新界面,那么只能通过消息的形式去通知窗口,并由拥有窗口的线程在窗口的消息处理函数中做出处理。
1、Windows的消息队列与消息循环
所有创建了窗口的Windows程序,都需要运行一个消息循环,我们在无数的Windows编程书籍中都可以看到这样的经典代码:
1: while (GetMessage(&msg, hWnd, 0, 0) > 0)
2: {
3: TranslateMessage(&msg);
4: DispatchMessage(&msg);
5: }
这里的hWnd就是创建的窗口句柄,上述循环会不断的把该窗口(hWnd)相关的消息取出来,并分发到消息处理函数当中。
GetMessage函数是用来获取当前线程消息队列当中的消息的,其中的第二个参数如果传递一个窗口句柄,那么就会获取该窗口相关的消息,如果传NULL,那么会将线程消息队列中所有的消息都取出来。如果创建了多个窗口,而只对其中一个窗口句柄调用GetMessage形成消息循环,那么别的窗口都会毫无响应。
这里需要补充说明一个概念:消息队列是操作系统为每个需要处理消息的线程创建的,任何线程只要调用过与消息有关的函数(如,GetMessage,PeekMessage),操作系统就会为该线程创建消息队列。可能有人会问,那没有窗口的线程,操作系统也有必要为其创建消息队列么?这是有可能的,因为我们可以通过诸如PostThreadMessage的Api向别的线程或者本线程发送消息,如果目标线程没有消息队列,会导致这个函数返回失败。 (more…)
Win32平台下编译SVN源码全过程
5
前段时间曾经总结过一些在win32平台下基于SVN开发的一些注意事项,主要是在利用svn官方发布的二进制库进行开发过程中使用的方法和一些值得注意的问题。
由于svn官方发布的win32平台下的二进制文件是基于vc6编译的,在使用vc2005进行开发时,会遇到因CRT冲突而引起的link错误。因此,如果是使用vc2005(我推测使用VC2003也会遇到同样的问题,尚未验证)附带的CRT库与svn官方发布的binary进行link,那么无论如何都会出现crash的问题。最为彻底的解决方案,还是自行编译svn源码。
在win32下编译svn源码说明:
首先需要从官方下载一份SVN源码,版本可以根据需要选取,比如最新的Release 1.6.3(目前已经更新到1.6.6)可以在这个地址下载到:
http://subversion.tigris.org/downloads/subversion-1.6.3.zip
以及svn所需的依赖包:
http://subversion.tigris.org/downloads/subversion-deps-1.6.3.zip
如果需要支持ssl的话,还需要下载openssl(根据实际需要选择相应版本):
http://www.openssl.org/source/
如果需要BerkeleyDB的话,需要下载WindowsBDB(BDB是可选的,如果不使用BDB,则默认使用FSFS):
此外还有Windows libintl:
解压svn源码包,可以在subversion-1.6.3目录中找到这么一个官方发布的说明文件INSTALL。该文件详述了安装通过源码编译SVN所需依赖的工具及第三方库,并且给出了详细的步骤。
网上同样有一个INSTALL的说明,可以在这里访问到:
http://svn.collab.net/repos/svn/trunk/INSTALL
编译开源项目的话,其附带的INSTALL说明都是最重要也是最全面的参考。网上搜索的其他资料,也会有相应的参考价值,但无论如何,其信息的来源也是INSTALL。因此编译开源项目时,认真阅读INSTALL是最重要且效率最高的。
从Google上进行一下简单的搜索的话,可以找到一篇介绍svn源码编译的文章,在这里:http://rocksun.cn/?p=103
为了后续的步骤方便,我们需要先准备编译所必须的一些东西:
包括Perl:http://www.activestate.com/activeperl/
Python:http://www.python.org/download/
安装Python以及Perl,比如分别安装到D:\Python26以及D:\Perl。安装好之后,将python以及perl的bin目录设为系统目录并重新启动使之生效。
编译svn源码第一步,将下载的svn源码包解压到X:\SVN\svn—trunk下。X可以是任意一个盘符。在我的机器上,我使用了F盘,下文中皆以F盘举例。
在F:\SVN\svn-trunk中解压了刚才下载的svn源码包以及依赖之后,可以在目录
F:\SVN\src-trunk\subversion-1.6.3中看到以下文件及目录:

以及文件:

Svn的编译需要依赖libapr以及libapr-util,SQLite,zlib,libintl可选,libneon/libserf二则择一,openssl可选,BerkeleyDB可选,libsasl可选,对Python,Perl,Java,Ruby支持的模块可选,以及KDELibs,GNOME Keyring可选。
我们依次先编译依赖项:首先进入到subversion-1.6.3\apr目录中。可以看到存在apr.dsw以及apr.dsp文件,这是VC6的工程文件。我们如果想在2005下编译的话,需要将其转换成sln及vcproj文件,简单的用vc2005打开该文件并保存即可。该目录下还有Makefile.win文件,是win下的makefile,我们打开makefile.win文件查看一下说明:可以得知如果需要编译.sln文件的话,需要置USESLN=1。
在VC2005的命令行中输入nmake -f makefile.win buildall checkall USESLN=1便可以开始编译apr了。Checkall表示编译完成后会去运行所有的测试用例。
编译完成后,当前目录下会多出2个文件夹,分别是LibR – StaticRelease,Release – DllRelease。如果选择Debug编译,则会生成LibD – StaticDebug, Debug – DllDebug。
类似的,我们将apr-util以及apr-iconv也编译好。
编译zlib:
进入zlib目录后,使用以下命令编译zlib库
nmake -f win32/Makefile.msc
编译openssl:
将此前下载的openssl解压到F:\SVN\openssl
阅读其INSTALL文档(INSTALL.W32)
使用VC编译openssl首先需要运行configure:
perl Configure VC-WIN32
接着运行
ms\do_masm
这里的do_masm是一个bat脚本,该脚本会生成nt.mak以及ntdll.mak分别是Release版本的静态和动态的库的make文件。如果想生成debug版本的make文件,可以通过修改do_masm.bat中的调用mk1mf.pl脚本处的参数实现,具体参数可以参考mk1mf.pl文件自身的说明。
接下来,创建动态链接库版本的ssl库用nmake -f ms\ntdll.mak,以及静态版本使用:nmake -f ms\nt.mak
生成的结果文件位于out32dll文件夹,以及out32文件夹中。
编译neon
进入F:\SVN\src-trunk\subversion-1.6.3\neon目录
nmake –f neon.mak
默认生成的是release版的libneon.lib (debug版为libneonD.lib)
可以用nmake –f neon.mak DEBUG_BUILD=1生成debug版的lib。
回到F:\SVN\src-trunk\subversion-1.6.3
运行python gen-make.py –help可以了解如何使用gen-make.py生成我们所需的svn编译文件。
由于在此,我打算选用neon, libintl, openssl(本例中并不打算使用BDB,如果需要BDB则需要增加—with-berkeley-db=DIR参数)进行编译,目前需要关注的几个重要参数如下:
–with-apr=DIR
–with-apr-util=DIR
–with-apr-iconv=DIR
–with-neon=DIR
–with-libintl=DIR
–with-openssl=DIR
–with-zlib=DIR
–vsnet-version=VER
运行
F:\SVN\src-trunk\subversion-1.6.3>python gen-make.py -t vcproj
–with-apr=apr –with-apr-iconv=apr-iconv –with-apr-util=apr-util –with-libintl=svn-win32-libintl –with-openssl=..\..\openssl –with-zlib=zlib –vsnet-version=2005
(其中的libintl需要解压到当前文件夹中)
即可生成vc2005的sln(subversion_vcnet.sln)文件了。
打开vc2005,选择Debug编译选项,对项目ALL进行编译。如果一切顺利,则会生成一个F:\SVN\src-trunk\subversion-1.6.3\Debug目录。内容包括svn的所有的lib及可执行文件。

将svn\svn.exe以及所有目录下的.dll文件拷贝到一个新建的bin目录下。将openssl的dll,apr, apr-util, apr-iconv的dll拷贝到同样的bin目录下,如下图:

运行svn –version看看结果吧~
最后,当我们有了自行编译的svn可以做什么?你可以做任何你想做的事——比如自己基于svn的接口进行开发(可以参考开源项目rapidsvn以及TortoiseSVN的源码)