Win32平臺下編譯SVN源碼全過程

前段時間曾經總結過一些在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):

http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=688&expandFolder=688&folderID=2627

此外還有Windows libintl:

http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=2627&expandFolder=2627&folderID=8100

 

 

解壓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的源碼)

發佈了70 篇原創文章 · 獲贊 5 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章