版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
精選優(yōu)質(zhì)文檔傾情為你奉上精選優(yōu)質(zhì)文檔傾情為你奉上專心專注專業(yè)專心專注專業(yè)精選優(yōu)質(zhì)文檔傾情為你奉上專心專注專業(yè)PC-lint研究總結(jié)TOC1. PC-lint總體介紹 圖在ProjectManager中的源文件上點(diǎn)擊鼠標(biāo)右鍵,選擇Lint就開(kāi)始檢查選中的文件了,輸出信息在Build窗口。圖3.2.2.5集成到SI中SourceInsight的集成方法參見(jiàn)C:\Lint8\lnt\env-si.lnt中的注釋。從Options菜單中選擇“Custom
Commands”命令項(xiàng)。點(diǎn)擊Add…。在Name欄中輸入“PC-lint
unitcheck”,原則上這個(gè)名稱可以隨便起,只要你能搞清楚它的含義就可以了。在Run欄中輸入“C:\Lint8\lint-nt
-u
-iC:\Lint8\
std
env-si
%f”其中C:\Lint8是你PC-LINT的安裝目錄。在Output欄中選擇“Iconic
Window”、“Capture
Output”。在Control欄中選擇“Save
Files
First”。在Source
Links
in
Output欄中選擇“Parse
Links
in
Output”、“File,then
Line”。在Pattern欄中輸入“^\([^
]*\)
\([0-9]+\)”。點(diǎn)Close鍵加入該命令。如下圖:圖3.2.3.1使用時(shí),在Source
Insight下打開(kāi)要LINT的文件,打開(kāi)Options菜單中的“Custom
Commands”命令項(xiàng),在“Command”欄中選擇“PC-lint
unit
check”命令運(yùn)行即可。請(qǐng)注意,不論你怎樣配置參數(shù)一定不要忘記了將env-si.lnt包含在你的配置文件里,否則就無(wú)法進(jìn)行錯(cuò)誤信息和程序的自動(dòng)對(duì)應(yīng)了。用Menu命令把PC_Lint添加到菜單中。圖3.2.3.2至此,你可以運(yùn)行sourceinsight下集成的PC-Lint功能完成對(duì)代碼的走查,并且很方便的找到錯(cuò)誤信息的位置。圖3.2.3.3在錯(cuò)誤信息處點(diǎn)擊旁邊的紅色圖標(biāo),就會(huì)自己跳轉(zhuǎn)至錯(cuò)誤出現(xiàn)處。上圖就是一個(gè)不安全變量轉(zhuǎn)換的警告信息。以上是對(duì)在sourceinsight3.5中使用集成PC-lint的一個(gè)總結(jié)。我們可以看到該方式使用PC-lint簡(jiǎn)單易用,容易查找到錯(cuò)誤,但考慮只能做當(dāng)前文件的單元檢查,需要自己指定Include目錄和需要自己定義相關(guān)的宏等,設(shè)置過(guò)程比較麻煩,并且不夠通用。此方式適合個(gè)人維護(hù)自己的代碼用,對(duì)于整個(gè)部門的代碼的走查,還是采取makefile的方式比較好。集成到UE中圖3.2.4.1(1)從UltraEdit的<高級(jí)>菜單中進(jìn)入<工具配置>(2)<菜單項(xiàng)目名>欄輸入“PC-lintunitcheck”(3)<命令行>欄輸入以下命令:C:\PCLint8\LINT-NT–u-iC:\PCLint8\si\stdenv-si%f其中,C:\PCLint8是PC-Lint的安裝目錄(4)<工作目錄>欄輸入以下路徑:x:\code(5)選中<先保存所有文件>的復(fù)選框(6)在<命令輸出>欄中,選中<輸出到列表>和<捕捉輸出>(7)點(diǎn)<插入>將命令行插入U(xiǎn)ltraEdit的菜單,此時(shí)在UltraEdit的<高級(jí)>菜單中會(huì)增加一個(gè)<PC-lintunitcheck>欄目,點(diǎn)擊該欄目即可對(duì)當(dāng)前文件執(zhí)行PC-lint。檢查的執(zhí)行結(jié)果如下圖所示:圖3.2.4.2makefile方式這里makefile指的是一類文件,用在C/C++的Make工具中,Make工具通過(guò)makefile文件來(lái)描述源程序之間的相互關(guān)系,并自動(dòng)維護(hù)編譯工作。Makefile文件按照特定的語(yǔ)法進(jìn)行編寫,文件中需要說(shuō)明如何編譯各個(gè)源文件,并連接生成可執(zhí)行文件。Makefile文件作為一種描述文檔一般需要包含以下內(nèi)容:
◆宏定義
◆源文件之間的相互依賴關(guān)系
◆可執(zhí)行的命令
Makefile中允許使用簡(jiǎn)單的宏指代源文件及其相關(guān)編譯信息,也稱宏為變量。在引用宏時(shí)只需在變量前加$符號(hào),但值得注意的是,如果變量名的長(zhǎng)度超過(guò)一個(gè)字符,在引用時(shí)就必須加圓括號(hào)()。平臺(tái)目前使用的Make工具是Tornado集成環(huán)境中的自帶的make.exe(一般位于Tornado安裝目錄\host\x86-win32\bin),它實(shí)際上是GNUMakeversion3.74(vpath+),以上的版本信息具體情況可能會(huì)略有不同,可以通過(guò)make–v來(lái)查看。那么,在說(shuō)明平臺(tái)的makefile結(jié)構(gòu)和如何將PC-lint結(jié)合到makefile中使用之前,先來(lái)介紹GNUMake及makefile。GNUMake和makefile介紹GNUMake在大型的開(kāi)發(fā)項(xiàng)目中,通常有幾十到上百個(gè)的源文件,如果每次均手工鍵入gcc命令進(jìn)行編譯的話,則會(huì)非常不方便。因此,人們通常利用make工具來(lái)自動(dòng)完成編譯工作。這些工作包括:如果僅修改了某幾個(gè)源文件,則只重新編譯這幾個(gè)源文件;如果某個(gè)頭文件被修改了,則重新編譯所有包含該頭文件的源文件。利用這種自動(dòng)編譯可大大簡(jiǎn)化開(kāi)發(fā)工作,避免不必要的重新編譯。實(shí)際上,make工具通過(guò)一個(gè)稱為makefile的文件來(lái)完成并自動(dòng)維護(hù)編譯工作。makefile需要按照某種語(yǔ)法進(jìn)行編寫,其中說(shuō)明了如何編譯各個(gè)源文件并連接生成可執(zhí)行文件,并定義了源文件之間的依賴關(guān)系。當(dāng)修改了其中某個(gè)源文件時(shí),如果其他源文件依賴于該文件,則也要重新編譯所有依賴該文件的源文件。makefile文件是許多編譯器,包括WindowsNT下的編譯器維護(hù)編譯信息的常用方法,只是在集成開(kāi)發(fā)環(huán)境中,用戶通過(guò)友好的界面修改makefile文件而已。默認(rèn)情況下,GNUmake工具在當(dāng)前工作目錄中按如下順序搜索makefile:*GNUmakefile*makefile*Makefile在UNIX系統(tǒng)中,習(xí)慣使用Makefile作為makfile文件。如果要使用其他文件作為makefile,則可利用類似下面的make命令選項(xiàng)指定makefile文件:$make-fMakefile.debugmakefile基本結(jié)構(gòu)makefile中一般包含如下內(nèi)容:*需要由make工具創(chuàng)建的項(xiàng)目,通常是目標(biāo)文件和可執(zhí)行文件。通常使用“目標(biāo)(target)”一詞來(lái)表示要?jiǎng)?chuàng)建的項(xiàng)目。*要?jiǎng)?chuàng)建的項(xiàng)目依賴于哪些文件。*創(chuàng)建每個(gè)項(xiàng)目時(shí)需要運(yùn)行的命令。例如,假設(shè)你現(xiàn)在有一個(gè)C/C++源文件test.C,該源文件包含有自定義的頭文件test.h,則目標(biāo)文件test.o明確依賴于兩個(gè)源文件:test.C和test.h。另外,你可能只希望利用g++命令來(lái)生成test.o目標(biāo)文件。這時(shí),就可以利用如下的makefile來(lái)定義test.o的創(chuàng)建規(guī)則:#Thismakefilejustisaexample.#Thefollowinglinesindicatehowtest.odepends#test.Candtest.h,andhowtocreatetest.otest.o:test.Ctest.hg++-c-gtest.C從上面的例子注意到,第一個(gè)字符為#的行為注釋行。第一個(gè)非注釋行指定test.o為目標(biāo),并且依賴于test.C和test.h文件。隨后的行指定了如何從目標(biāo)所依賴的文件建立目標(biāo)。當(dāng)test.C或test.h文件在編譯之后又被修改,則make工具可自動(dòng)重新編譯test.o,如果在前后兩次編譯之間,test.C和test.h均沒(méi)有被修改,而且test.o還存在的話,就沒(méi)有必要重新編譯。這種依賴關(guān)系在多源文件的程序編譯中尤其重要。通過(guò)這種依賴關(guān)系的定義,make工具可避免許多不必要的編譯工作。當(dāng)然,利用Shell腳本也可以達(dá)到自動(dòng)編譯的效果,但是,Shell腳本將全部編譯任何源文件,包括哪些不必要重新編譯的源文件,而make工具則可根據(jù)目標(biāo)上一次編譯的時(shí)間和目標(biāo)所依賴的源文件的更新時(shí)間而自動(dòng)判斷應(yīng)當(dāng)編譯哪個(gè)源文件。一個(gè)makefile文件中可定義多個(gè)目標(biāo),利用maketarget命令可指定要編譯的目標(biāo),如果不指定目標(biāo),則使用第一個(gè)目標(biāo)。通常,makefile中定義有clean目標(biāo),可用來(lái)清除編譯過(guò)程中的中間文件,例如:clean:rm-f*.o運(yùn)行makeclean時(shí),將執(zhí)行rm-f*.o命令,最終刪除所有編譯過(guò)程中產(chǎn)生的所有中間文件。makefile變量GNU的make工具除提供有建立目標(biāo)的基本功能之外,還有許多便于表達(dá)依賴性關(guān)系以及建立目標(biāo)的命令的特色。其中之一就是變量或宏的定義能力。如果你要以相同的編譯選項(xiàng)同時(shí)編譯十幾個(gè)C源文件,而為每個(gè)目標(biāo)的編譯指定冗長(zhǎng)的編譯選項(xiàng)的話,將是非常乏味的。但利用簡(jiǎn)單的變量定義,可避免這種乏味的工作:#DefinemacrosfornameofcompilerCC=gcc#DefineamacrofortheCCflagsCCFLAGS=-D_DEBUG-g-m486#Aruleforbuildingaobjectfiletest.o:test.ctest.h$(CC)-c$(CCFLAGS)test.c在上面的例子中,CC和CCFLAGS就是make的變量。GNUmake通常稱之為變量,而其他UNIX的make工具稱之為宏,實(shí)際是同一個(gè)東西。在makefile中引用變量的值時(shí),只需變量名之前添加$符號(hào),如上面的$(CC)和$(CCFLAGS)。GNUmake的主要預(yù)定義變量GNUmake有許多預(yù)定義的變量,這些變量具有特殊的含義,可在規(guī)則中使用。表1-5給出了一些主要的預(yù)定義變量,除這些變量外,GNUmake還將所有的環(huán)境變量作為自己的預(yù)定義變量。表1-5GNUmake的主要預(yù)定義變量預(yù)定義變量含義$*不包含擴(kuò)展名的目標(biāo)文件名稱。$+所有的依賴文件,以空格分開(kāi),并以出現(xiàn)的先后為序,可能包含重復(fù)的依賴文件。$<第一個(gè)依賴文件的名稱。$?所有的依賴文件,以空格分開(kāi),這些依賴文件的修改日期比目標(biāo)的創(chuàng)建日期晚。$@目標(biāo)的完整名稱。$^所有的依賴文件,以空格分開(kāi),不包含重復(fù)的依賴文件。$%如果目標(biāo)是歸檔成員,則該變量表示目標(biāo)的歸檔成員名稱。例如,如果目標(biāo)名稱為mytarget.so(image.o),則$@為mytarget.so,而$%為image.o。AR歸檔維護(hù)程序的名稱,默認(rèn)值為ar。ARFLAGS歸檔維護(hù)程序的選項(xiàng)。AS匯編程序的名稱,默認(rèn)值為as。ASFLAGS匯編程序的選項(xiàng)。CCC編譯器的名稱,默認(rèn)值為cc。CFLAGSC編譯器的選項(xiàng)。CPPC預(yù)編譯器的名稱,默認(rèn)值為$(CC)-E。CPPFLAGSC預(yù)編譯的選項(xiàng)。CXXC++編譯器的名稱,默認(rèn)值為g++。CXXFLAGSC++編譯器的選項(xiàng)。FCFORTRAN編譯器的名稱,默認(rèn)值為f77。FFLAGSFORTRAN編譯器的選項(xiàng)。隱含規(guī)則GNUmake包含有一些內(nèi)置的或隱含的規(guī)則,這些規(guī)則定義了如何從不同的依賴文件建立特定類型的目標(biāo)。GNUmake支持兩種類型的隱含規(guī)則:*后綴規(guī)則(SuffixRule)。后綴規(guī)則是定義隱含規(guī)則的老風(fēng)格方法。后綴規(guī)則定義了將一個(gè)具有某個(gè)后綴的文件(例如,.c文件)轉(zhuǎn)換為具有另外一種后綴的文件(例如,.o文件)的方法。每個(gè)后綴規(guī)則以兩個(gè)成對(duì)出現(xiàn)的后綴名定義,例如,將.c文件轉(zhuǎn)換為.o文件的后綴規(guī)則可定義為:.c.o:$(CC)$(CFLAGS)$(CPPFLAGS)-c-o$@$<*模式規(guī)則(patternrules)。這種規(guī)則更加通用,因?yàn)榭梢岳媚J揭?guī)則定義更加復(fù)雜的依賴性規(guī)則。模式規(guī)則看起來(lái)非常類似于正則規(guī)則,但在目標(biāo)名稱的前面多了一個(gè)%號(hào),同時(shí)可用來(lái)定義目標(biāo)和依賴文件之間的關(guān)系,例如下面的模式規(guī)則定義了如何將任意一個(gè)X.c文件轉(zhuǎn)換為X.o文件:%.c:%.o$(CC)$(CFLAGS)$(CPPFLAGS)-c-o$@$<平臺(tái)的makefile結(jié)構(gòu)平臺(tái)的makefile文件也稱為工程文件,主要由名為makefile和*.mak的兩類文件構(gòu)成。平臺(tái)的makefile文件可以分為兩個(gè)等級(jí):平臺(tái)級(jí)和子系統(tǒng)級(jí)。平臺(tái)級(jí)的makefile是生成最終的執(zhí)行代碼的工程文件,它還需要調(diào)用源程序體系中的子系統(tǒng)級(jí)的工程文件(或更深級(jí)別的工程文件)來(lái)最終完成自己的工作,它一般位于一級(jí)目錄中的PROJECT目錄。子系統(tǒng)級(jí)的makefile,主要是根據(jù)不同的編譯選項(xiàng)來(lái)生成各種類型的目標(biāo)文件(例如、各種邏輯單板的DEBUG、RELEASE版),它一般分布在一級(jí)目錄CODE的各子系統(tǒng)、模塊的目錄中。它所需的各種選項(xiàng)由平臺(tái)級(jí)的工程文件傳遞下來(lái)。PROJECT目錄的組織規(guī)則是按照網(wǎng)元、物理單板和邏輯單板三層組織結(jié)構(gòu)進(jìn)行組織的。對(duì)于網(wǎng)元級(jí)目錄,目前包括:BSC、PCF、AGW、HA、RNC、WCN,分別用來(lái)存放BSC、PCF、AGW、HA、RNC、WCDMACN的版本。對(duì)于物理單板級(jí),沒(méi)有工程文件,在其下按照該物理單板支持的邏輯單板創(chuàng)建相應(yīng)的邏輯單板的目錄,對(duì)于一種物理單板,可能有多種邏輯單板,或者多種邏輯單板的合一版本。在本目錄中,存放所有的邏輯單板以及一些典型的合一單板的目錄。對(duì)于邏輯單板級(jí),存放的是相應(yīng)邏輯單板的工程文件。平臺(tái)級(jí)在Project目錄下,有下列文件。CalculateCompilePara.mak:計(jì)算各種CPU的編譯參數(shù),包括字節(jié)序和編譯器的路徑等。CheckParam.mak:輸入?yún)?shù)的合法性檢查。CpuCompileOptionConfig.mak:配置各種CPU的編譯選項(xiàng)。DivisionPlatCompileControl.mak:用于配置編譯平臺(tái)或者事業(yè)部的選項(xiàng)。LinkMultiCPUBoard.bat:用于有多個(gè)CPU時(shí)對(duì)每個(gè)CPU連接可執(zhí)行文件。LinkOneCPUVersion.mak:用于連接特定序號(hào)的CPU的可執(zhí)行文件。Makefile:頂級(jí)makefile,被makenet.bat調(diào)用,用于編譯所有的網(wǎng)元的所有單板。MakeNet.bat:編譯網(wǎng)元的批處理文件。MakeOneCpuType.mak:用于支持多種CPU子卡的編譯MakeOneNet.mak:被makefile調(diào)用,用于編譯一個(gè)指定網(wǎng)元的所有單板。MakeSubsystem.mak:用于編譯指定的子系統(tǒng)NetCommon.mak:調(diào)用RunMake.bat完成對(duì)一塊單板的編譯,并提供對(duì)單個(gè)子系統(tǒng)進(jìn)行編譯時(shí)的入口。PlatCfg.mak:平臺(tái)的配置文件,其中配置了平臺(tái)支持的物理板、邏輯板、CPU等。PlatLink.mak:鏈接文件。Pub.mak:調(diào)用相關(guān)子系統(tǒng)的makefile,以便進(jìn)行編譯。RunMake.bat:完成對(duì)Tornado路徑的自動(dòng)切換,并且調(diào)用Pub.mak開(kāi)始編譯。VersionInfoConfig.mak:用于配置版本的信息,包括版本的路徑以及版本號(hào)等。子系統(tǒng)級(jí)(以支撐為例)在./code/oss目錄下,有下列文件。OssCfg.mak——支撐子系統(tǒng)的配置文件。Oss.mak——支撐子系統(tǒng)的頂級(jí)makefile。對(duì)于支撐的各個(gè)子模塊,各有一個(gè)以后綴名為.mak的文件,負(fù)責(zé)自身文件的編譯過(guò)程。一共包含下面幾個(gè)文件:./code/pub/pub.mak——平臺(tái)級(jí)公用部分。./code/oss/Common/Common.mak——子撐子系統(tǒng)對(duì)內(nèi)的公用部分。./code/oss/File/File.mak——文件子模塊./code/oss/Device/Device.mak——設(shè)備子模塊。./code/oss/Excep/Excep.mak——異常子模塊。./code/oss/Comm/Comm.mak——通信子模塊。./code/oss/Mem/Mem.mak——內(nèi)存子模塊./code/oss/Pub/Pub.mak——支撐子系統(tǒng)對(duì)外的公用部分。./code/oss/Sche/Sche.mak——調(diào)度子模塊。./code/oss/SDL/SDL.mak——SDL子模塊。./code/oss/Timer/Timer.mak——定時(shí)器子模塊。./code/oss/VOS/VOS.mak——Vos子模塊。平臺(tái)makefile的調(diào)用方式這里以UPCF單板、OSS子系統(tǒng)、COMMON子模塊為例進(jìn)行說(shuō)明。假設(shè)我們要編譯UPCF單板的OSS子系統(tǒng),最終生成名為Oss_SubsysEx.o的目標(biāo)文件。程序目錄已被映射為X:盤。TornadoforArm已安裝在D:\Tornado\Arm目錄下。進(jìn)入X:\Project目錄,調(diào)用tenv.bat參數(shù)為arm設(shè)置相應(yīng)的環(huán)境變量;進(jìn)入X:\project\PCF\mnic\upcf目錄,調(diào)用make.exe參數(shù)為Oss開(kāi)始編譯;make自動(dòng)搜索到當(dāng)前目錄下的makefile文件,開(kāi)始執(zhí)行編譯;makefile除設(shè)置版本、CPU、單板等變量外,包含進(jìn)../../PlatNetelementCfg.mak等文件;PlatNetelementCfg.mak除設(shè)置網(wǎng)元變量外,包含進(jìn)
$(_PROJECT_PATH)/netcommon.mak文件;netcommon.mak計(jì)算CPU的數(shù)量,并通過(guò)命令的方式執(zhí)行
$(_PROJECT_PATH)/MakeOneCpuIndex.mak;MakeOneCpuIndex.mak根據(jù)CPU的類型調(diào)用RunMake.bat并把所需的參數(shù)傳遞給該批處理;RunMake.bat執(zhí)行
callmake-C%make_project_path%-fPub.mak%make_subsystem%調(diào)入Pub.mak并把子系統(tǒng)參數(shù)Oss傳遞給它;Pub.mak根據(jù)參數(shù)Oss執(zhí)行相應(yīng)的部分
@$(MAKE)-C$(_SOURCE_PATH)/oss-foss.mak調(diào)用程序級(jí)的oss.mak;oss.mak包含進(jìn)OSS系統(tǒng)各子模塊的makefile,其中包括COMMON子模塊的common.mak;common.mak生成本模塊的目標(biāo)文件;oss.mak把各模塊的目標(biāo)文件連接成子系統(tǒng)的目標(biāo)文件,完成編譯;上面的過(guò)程中,只列出了關(guān)鍵步驟的主線makefile,并沒(méi)有寫出只作了變量設(shè)置的makefile,是為了便于描述,不致顯得零亂。平臺(tái)makefile同PC-lint的集成通過(guò)上節(jié)的執(zhí)行過(guò)程可以看出,從第9步開(kāi)始makefile由平臺(tái)級(jí)轉(zhuǎn)到了子系統(tǒng)級(jí),真正的編譯工作也是從第9步開(kāi)始的,Pub.mak根據(jù)傳入的參數(shù)Oss去執(zhí)行相應(yīng)部分,完成具體的功能。那么,首先我們來(lái)看一下Pub.mak具體結(jié)構(gòu):Default:BaseFunc…BaseFunc:MakeForce …CleanLinkFile:MakeForce …MakeForce:##BSP子系統(tǒng)Bsp:BaseFuncBspTargetBspTarget: …BspClean: …BspCleanAll: …##OSS子系統(tǒng)Oss:BaseFunc@echo開(kāi)始支撐子系統(tǒng)的編譯 $(_MAK_CONTINUE_WHEN_ERROR)@$(MAKE)-C$(_SOURCE_PATH)/oss-foss.makOssOnlyOssTarget: …OssClean: …OssCleanAll: …##SCS子系統(tǒng)…##DBS子系統(tǒng)…##SIG子系統(tǒng)…##BRS子系統(tǒng)…##MCS子系統(tǒng)…##OAM子系統(tǒng)…##PP子系統(tǒng)…##TEST子系統(tǒng)…##DivisionAppTarget…實(shí)際上,在我們上面的例子中,當(dāng)執(zhí)行makeOss之后,在Pub.mak里只是執(zhí)行的Oss:那一段的帶有下劃線的代碼,完成OSS子系統(tǒng)的編譯。Pub.mak為每一個(gè)子系統(tǒng)都定義了若干個(gè)目標(biāo),還是以O(shè)SS子系統(tǒng)為例,就有:Oss、OssTarget、OssClean、OssCleanAll這幾個(gè)目標(biāo),分別完成子系統(tǒng)的編譯和生成文件的清理,其他的各個(gè)子系統(tǒng)都定義了同樣類似的目標(biāo)。前面我們講了這么多,有makefile的原理,有平臺(tái)目前makefile的結(jié)構(gòu),其實(shí)最終的目的都是為了看如何把PC-lint同makefile結(jié)合起來(lái),完成系統(tǒng)代碼批量檢查的功能。那么,Pub.mak就是關(guān)鍵所在,我們可以在Pub.mak里為每個(gè)子系統(tǒng)增加一個(gè)目標(biāo)定義來(lái)完成調(diào)用PC-lint進(jìn)行靜態(tài)代碼分析。比如:可以為OSS子系統(tǒng)增加一個(gè)目標(biāo)OssLint。下面將列出為增加OssLint對(duì)平臺(tái)的makefile所作的修改:Pub.makOssLint: @echo開(kāi)始支撐子系統(tǒng)的Lint $(_MAK_CONTINUE_WHEN_ERROR)@$(MAKE)-C$(_SOURCE_PATH)/oss-foss.makOssLintoss.mak#定義PCLint所需的變量(這部分設(shè)置暫時(shí)放在這)_PCLINT_PATH=E:/PCLink/x/PC.Lint.v8.00NLINT=$(_PCLINT_PATH)/lint-ntLINTOPTION=-zero-os($(subst.lob,.txt,$@))-i$(_PCLINT_PATH)/std.lntLINTOPTIONoss=$(LINTOPTION)$(_OSS_INCLUDE_PATH)#PCLint的執(zhí)行入口 OssLint:$(_OSS_LINT_PATH)/Oss_SubSys_Obj.lob @echo只完成支撐子系統(tǒng)各模塊的Lint。$(_OSS_LINT_PATH)/Oss_SubSys_Obj.lob:$(_Oss_All_Lint_Objects) @ifnotexist$(_OSS_LINT_PATH)$(MKDIR)$(subst/,\,$(_OSS_LINT_PATH)) $(LINT)$(LINTOPTION)$(_Oss_All_Lint_Objects)-oo($@) @echo輸出內(nèi)容為$@Common.mak#PCLint_Oss_Common_Lint_Depend+=$(addprefix$(_OSS_COMMON_LINT_PATH)/,$(subst.c,.lob,$(notdir$(_Oss_Common_All_C))))_Oss_All_Lint_Objects+=$(_Oss_Common_Lint_Depend)$(_OSS_COMMON_LINT_PATH)/%.lob:$(_OSS_COMMON_SORUCE_PATH)/source/%.c @echo開(kāi)始Lint$< @ifnotexist$(_OSS_COMMON_LINT_PATH)$(MKDIR)$(subst/,\,$(_OSS_COMMON_LINT_PATH)) $(ECHO)Linting$@ $(LINT)$(OSS_LINT_CFLAGS)-u+fdi$(LINTOPTIONoss)$<-oo($@) @echoDone!OssCfg.mak#用于PCLint存放lob文件(子系統(tǒng))ifeq(TRUE,$(_MAK_EXIST_MULTI_CPU))_OSS_LINT_PATH=$(_TEMP_PATH)/Oss/Lint/$(_OSS_NET_ELEMENT)/\$(subst_OSS_,,$(_OSS_VERSION_TYPE))/$(_OSS_PHYSICAL_BOARD_NAME)/\$(_OSS_LOGIC_BOARD_NAME)/CPU$(_CURRENT_CPU_INDEX)/\$(_OSS_CPU_NAME)else_OSS_LINT_PATH=$(_TEMP_PATH)/Oss/Lint/$(_OSS_NET_ELEMENT)/\$(subst_OSS_,,$(_OSS_VERSION_TYPE))/$(_OSS_PHYSICAL_BOARD_NAME)/\$(_OSS_LOGIC_BOARD_NAME)/$(_OSS_CPU_NAME)endif#用于PCLint存放lob文件(子模塊)_OSS_PUB_LINT_PATH =$(_OSS_LINT_PATH)/Pub/OssPub_OSS_COMMON_LINT_PATH=$(_OSS_LINT_PATH)/Common_OSS_SCHE_LINT_PATH =$(_OSS_LINT_PATH)/Sche_OSS_COMM_LINT_PATH =$(_OSS_LINT_PATH)/Comm_OSS_TIMER_LINT_PATH =$(_OSS_LINT_PATH)/Timer_OSS_MEM_LINT_PATH =$(_OSS_LINT_PATH)/Mem_OSS_DEV_LINT_PATH=$(_OSS_LINT_PATH)/Device_OSS_FILE_LINT_PATH =$(_OSS_LINT_PATH)/File_OSS_EXCEP_LINT_PATH =$(_OSS_LINT_PATH)/Excep_OSS_VOS_LINT_PATH =$(_OSS_LINT_PATH)/Vos_OSS_SDL_LINT_PATH =$(_OSS_LINT_PATH)/Sdl#配置DEBUG或者是RELEASE版本的編譯標(biāo)志ifeq(_OSS_DEBUG,$(_OSS_VERSION_TYPE))_OSS_VERSION_LINT_FLAG=-D_OSS_DEBUGelse_OSS_VERSION_LINT_FLAG=-D_OSS_RELEASEendif#定義Lint的參數(shù)OSS_LINT_CFLAGS=$(LINT_CFLAGS)$(_OSS_VERSION_LINT_FLAG)#定義最上層的PCLint參數(shù)TOPLINT_COMMON_CFLAGS=$(COMMON_DEVICE_DEFINE)\-D_REENTRANT-DRW_MULTI_THREAD\$(_MAK_TORNADO_INCLUDE_PATH)#為ARM配置編譯、鏈接選項(xiàng)ifeq($(_CPU_TYPE),_CPU_ARM)LINT_CFLAGS=$(TOPLINT_COMMON_CFLAGS)\-DCPU=ARMSA110endif#為每種類型的CPU都要設(shè)置,這里略過(guò)…經(jīng)過(guò)上面的修改就可以通過(guò)makefile調(diào)用PC-lint進(jìn)行代碼的檢查了(這里只是針對(duì)OSS子系統(tǒng)COMMON模塊,其他部分類似)。它將對(duì)每一個(gè).C文件做單元檢查并生成一個(gè)目標(biāo)模塊.lob,這個(gè)過(guò)程中產(chǎn)生的所有錯(cuò)誤、警告信息都將存入一個(gè)同名的.txt文件,并最后把相應(yīng)的目標(biāo)模塊連接成子系統(tǒng)的目標(biāo)模塊Oss_SubSys_Obj.lob,這個(gè)過(guò)程將檢查多個(gè)模塊連接在一起后是否會(huì)存在問(wèn)題,些處也會(huì)把產(chǎn)生的告警存入名為Oss_SubSys_Obj.txt的文件。需要注意的是PC-lint的所有輸出文件(*.lob、*.txt)的名字都是makefile中定義的。注:lob文件(LintObjectModule)是一個(gè)C或C++模塊內(nèi)的外部信息的總結(jié)(二進(jìn)制形式)。PC-lint能使用這些信息來(lái)和其它模塊比較一致性。保存檢查結(jié)果的目錄如下所示:tar├─temp├─Oss├─Lint├─PCF├─DEBUG├─MNIC├─UPCF├─ARM├─Oss_SubSys_Obj.txtOss_SubSys_Obj.lobCommon├─OSS_Config.txtOSS_Config.lobOSS_Device_Cfg.txtOSS_Device_Cfg.lobOss_LogicBoardCfg.txtOss_LogicBoardCfg.lobOss_ProcessType.txtOss_ProcessType.lobOss_SubsysEx.txtOss_SubsysEx.lob平臺(tái)推廣方案(建議)推廣使用的前提1、通過(guò)對(duì)PC-lint在一定范圍的試用,形成一個(gè)全平臺(tái)統(tǒng)一的PC-lint檢查選項(xiàng)模板,此模板應(yīng)按照PC-lint不同的告警級(jí)別進(jìn)行分類,按照從低到高逐漸提高告警級(jí)別的方式,一步一步改善程序質(zhì)量。2、根據(jù)不同的模板和
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年外研銜接版九年級(jí)歷史上冊(cè)階段測(cè)試試卷含答案
- 2025年華東師大版選修3物理下冊(cè)階段測(cè)試試卷含答案
- 2025年北師大新版九年級(jí)物理下冊(cè)階段測(cè)試試卷含答案
- 2025年牛津譯林版九年級(jí)歷史下冊(cè)階段測(cè)試試卷含答案
- 二零二五版苗木種植基地土壤檢測(cè)與分析合同4篇
- 承包給農(nóng)民工砍筏蘭竹合同(2篇)
- 二零二五年度農(nóng)藥農(nóng)膜環(huán)保處理技術(shù)合同范本4篇
- 二零二五年度泥水工施工技能競(jìng)賽組織與培訓(xùn)合同2篇
- 美容院與醫(yī)療機(jī)構(gòu)合作開(kāi)展抗衰老服務(wù)合同范本4篇
- 2025版電子商務(wù)平臺(tái)賣家免責(zé)條款合同范本4篇
- 中醫(yī)診療方案腎病科
- 人教版(2025新版)七年級(jí)下冊(cè)數(shù)學(xué)第七章 相交線與平行線 單元測(cè)試卷(含答案)
- 完整2024年開(kāi)工第一課課件
- 從跨文化交際的角度解析中西方酒文化(合集5篇)xiexiebang.com
- 中藥飲片培訓(xùn)課件
- 醫(yī)院護(hù)理培訓(xùn)課件:《早產(chǎn)兒姿勢(shì)管理與擺位》
- 《論文的寫作技巧》課件
- 空氣自動(dòng)站儀器運(yùn)營(yíng)維護(hù)項(xiàng)目操作說(shuō)明以及簡(jiǎn)單故障處理
- 2022年12月Python-一級(jí)等級(jí)考試真題(附答案-解析)
- T-CHSA 020-2023 上頜骨缺損手術(shù)功能修復(fù)重建的專家共識(shí)
- Hypermesh lsdyna轉(zhuǎn)動(dòng)副連接課件完整版
評(píng)論
0/150
提交評(píng)論