一、所要解決的問(wèn)題
由于軟件項(xiàng)目越來(lái)越大,也增加了軟件項(xiàng)目管理的難度。在開(kāi)發(fā)組中,每個(gè)成員都要保留一個(gè)副本,在開(kāi)發(fā)中非常容易引起沖突。CVS 是為了解決這個(gè)問(wèn)題的。
a、修改同步,防止一名開(kāi)發(fā)人員的修改覆蓋其他人的成果。(check out、read only)
b、維護(hù)不同的版本。(按 version 查找)
c、可查找歷史記錄。防止 bug 的再引入。(diff)
CVS 為了解決這個(gè)問(wèn)題,采用的方式是:
當(dāng)開(kāi)發(fā)人員對(duì)源代碼進(jìn)行修改時(shí),修改的內(nèi)容被登記(check in)到了 CVS 倉(cāng)庫(kù)(repository)中。倉(cāng)庫(kù)中保存了代碼的主控副本,以及歷次修改的歷史信息。它不保存文件的每個(gè)版本,而只是簡(jiǎn)單的記錄發(fā)生在每個(gè)版本間的不同,節(jié)省磁盤(pán)空間。它能做到:
a、使開(kāi)發(fā)人員的目錄和倉(cāng)庫(kù)保持一致?梢园炎约旱男薷奶峤唬╟ommit)給倉(cāng)庫(kù),讓倉(cāng)庫(kù)更新自己。
b、允許代碼派生?梢赃M(jìn)行測(cè)試,如果失敗,可以消除所做的修改,維持原結(jié)果。
c、檢索任何一個(gè)版本。
二、使用 CVS:
a、建立倉(cāng)庫(kù):設(shè)置并 export CVSROOT 變量,并設(shè)置倉(cāng)庫(kù)目錄。比如創(chuàng)建 /home/cvsroot 目錄,并合理設(shè)置權(quán)限,在 .bash_profile 中加入:export CVSROOT=$HOME/cvsroot;運(yùn)行 cvs init;設(shè)置讓用戶輸入日志信息的默認(rèn)的編輯器:export EDITOR=vim。如果使用的是網(wǎng)絡(luò),則 CVSROOT 變量的形式是: export CVSROOT=:exit:user@server:/path,比如:export CVSROOT=:exit:david@power/home/projects/repository
b、導(dǎo)入文件或目錄:cvs import filename_or_directory vender_tag release_tag;這三個(gè)參數(shù)的含義是:在倉(cāng)庫(kù)中這些導(dǎo)入的文件所在的目錄、供應(yīng)商標(biāo)記、發(fā)行標(biāo)記。比如 cvs import step1 david start。導(dǎo)入時(shí)的 N 表示所導(dǎo)入的文件都是新文件。
c、使用時(shí)導(dǎo)出文件,用:cvs checkout directory_name;參數(shù)含義是倉(cāng)庫(kù)中所在的目錄。建立新的目錄,而不是獲取他人的改動(dòng)
d、對(duì)文件修改后,保存修改到倉(cāng)庫(kù):cvs commit。
e、如果要獲得他人的修改,使用 cvs update,U 表示本地的一個(gè)文件已經(jīng)被更新。如果已經(jīng)對(duì)文件進(jìn)行了修改,而此是他人已經(jīng)修改了該文件并提交,cvs 將告訴用戶發(fā)生沖突和沖突的位置。
f、添加一個(gè)文件:cvs add filename; cvs commit。
g、刪除一個(gè)文件:先在本地刪除,然后使用 cvs remove file_name; cvs commit。
三、使用標(biāo)記
可以使用標(biāo)記記錄某個(gè)時(shí)刻文件的內(nèi)容,這在制作發(fā)行版本的過(guò)程中非常有用:
cvs tag release1.0
改動(dòng)后發(fā)現(xiàn)不正常,重新獲得這個(gè)版本,則使用:cvs checkout -r release1.0
四、測(cè)試性代碼:
當(dāng)其中一個(gè)開(kāi)發(fā)者對(duì)代碼進(jìn)行改進(jìn),但未來(lái)結(jié)果不能確定時(shí),可以使用 cvs 產(chǎn)生出一個(gè)代碼的分之,這并不改變主控代碼:cvs tag -b for_test。導(dǎo)出該代碼的命令是:cvs checkout -r for_test example。由于在已有的目錄樹(shù)中不會(huì)使用該分之,因此必須重新建立目錄樹(shù)。如果測(cè)試成功,則要求將主控代碼和測(cè)試代碼合并,則先導(dǎo)出主控代碼,然后合并:
cvs checkout;cvs update -jfor_test;cvs commit。
automake
通常情況下,在寫(xiě)完自己代碼后,使用 make 命令進(jìn)行編譯。make 命令其實(shí)什么也不做,知識(shí)讀取一個(gè)叫 Makefile 的文件,從中獲得 dependence and rule,然后調(diào)用 gcc 進(jìn)行編譯。但是 Makefile 比較復(fù)雜,變化技巧也比較多。對(duì)于一個(gè)大的工程項(xiàng)目來(lái)說(shuō),如果沒(méi)有一個(gè)統(tǒng)一的風(fēng)格,在工程延續(xù)的時(shí)候改動(dòng) Makefile 會(huì)很麻煩,也容易出錯(cuò)誤。所以這時(shí)有了使用 automake 的需求。使用 automake,只需要掌握一點(diǎn)點(diǎn)規(guī)則,定義一些變量,能自動(dòng)生成 Makefile。而這些 Makefile 有著統(tǒng)一的格式和結(jié)構(gòu),便于修改。下面如何使用 automake 舉出一個(gè)實(shí)際的例子。
2.1 使用 automake 的前提條件
在使用 automake 前,請(qǐng)先確認(rèn)在系統(tǒng)中安裝了如下軟件:
GNU Automake
GNU Autoconf
GNU m4
perl
GNU Libtool(如果需要產(chǎn)生 shared library)如果沒(méi)有的話,請(qǐng)?jiān)诎l(fā)行版中找相應(yīng)的 rpm 包。
2.2 制作 configure 腳本
autoconf 是用來(lái)生成自動(dòng)配置軟件源代碼腳本(configure)的工具。configure 腳本獨(dú)立于 autoconf 運(yùn)行,而且在運(yùn)行的過(guò)程中,不需要用戶的干預(yù),通常不需要附帶參數(shù)。它是用來(lái)檢驗(yàn)軟件必須的參數(shù)的。autoconf 從一個(gè)列舉編譯軟件時(shí)所需要各種參數(shù)的模板文件中創(chuàng)建 configure。autoconf 需要 GNU m4 來(lái)生成該腳本。
由 autoconf 生成的腳本一般起名為 configure。當(dāng)運(yùn)行時(shí),configure 創(chuàng)建了多個(gè)文件,并對(duì)這些文件中的配置參數(shù)賦予適當(dāng)?shù)闹。?configure 創(chuàng)建生成的文件有:
1。一個(gè)或多個(gè) Makefile,在軟件源代碼的每個(gè)目錄中都生成一個(gè) Makefile。
2。還可選的生成 C 頭文件——configurable,包含了各種 #define 聲明。
3。一個(gè)名為 config.status 的腳本,當(dāng)運(yùn)行時(shí),重新生成上面的文件。
4。一個(gè)名為 config.cache 的腳本,保存運(yùn)行檢測(cè)的結(jié)果。
5。一個(gè)名為 config.log 的文件,保存有編譯器生成的信息,用于調(diào)試 configure。