1. 程式人生 > >bld.inf、.mmp和.pkg檔案淺析

bld.inf、.mmp和.pkg檔案淺析

對於每一個專案,都必須有一個工程引導檔案bld.inf和一個專案定義檔案.mmp。bld.inf檔案可能引用一個或多個.mmp檔案,每個.mmp檔案對應一個將要生成的元件。

一、工程引導檔案bld.inf

其實是一個指令碼,它告訴build環境在做build之前需要準備或知道一些什麼東西,最普通的寫法是:
PRJ_MMPFILES
HelloWorld.mmp
這是告訴build環境,你馬上要處理的工程檔名字叫HelloWorld.mmp。
如果做比較複雜的程式可能需要同時build所有的庫,那麼就在這裡把你所有需要build的工程都列出來:
PRJ_MMPFILES
Project.mmp
Project_lib1.mmp
Project_lib2.mmp
另外一個常用的標記是PRJ_PLATFORMS。它告訴編譯環境,以下的這些平臺(Targets)是需要編譯的。
PRJ_PLATFORMS
WINS ARMI WINSCW
或者直接使用:
PRJ_PLATFORMS
DEFAULT
注意:如果在bld.inf中不做PRJ_PLATFORMS標記,其效果相當於PRJ_PLATFORMS DEFAULT,也就是說這個標記不是必須的。
第三個常用標記是PRJ_EXPORTS。它告訴編譯器在編譯之前需要把哪些檔案先拷貝到指定位置。舉個例子,如果你的工程裡面需要include一個第三方的*.inl檔案,那麼如果編譯之前這個檔案不存在就會編譯不過,那麼可以這樣寫:
PRJ_EXPORTS
./nk_set.inl /epoc32/include
那麼,編譯時,一個perl指令碼會首先把你工程目錄下的nk_set.inl檔案拷貝到/epoc32/include目錄下,然後再編譯。
大多數的bld.inf文家需要這三個標記就夠了,還有一點小技巧,就是可以在其中使用#if   #else等東西,比如:
#if defined(WINS)
…….//注意沒有{ }
else
…….
#endif

二、專案定義檔案.mmp

這個檔案的內容要比bld.inf檔案複雜的多。
先看一下HelloWorldbasic.mmp檔案的內容:
TARGET            HelloWorldBasic.app
TARGETTYPE        app
UID               0x100039CE 0x10005B91
TARGETPATH        /system/apps/helloworldbasic
SOURCEPATH        ../src
SOURCE            HelloWorldBasic.cpp
SOURCE            HelloWorldBasicApplication.cpp
SOURCE            HelloWorldBasicAppView.cpp
SOURCE            HelloWorldBasicAppUi.cpp
SOURCE            HelloWorldBasicDocument.cpp
SOURCEPATH        ../group
RESOURCE          HelloWorldBasic.rss
USERINCLUDE       ../inc
SYSTEMINCLUDE     /epoc32/include
LIBRARY           euser.lib
LIBRARY           apparc.lib
LIBRARY           cone.lib
LIBRARY           eikcore.lib 
LIBRARY           avkon.lib 
.mmp檔案以平臺無關和編譯器無關的方法指定專案元件的屬性。
(1)TARGET:應用程式的名稱,該名稱必須具有正確的副檔名:.exe、.app、.dll等
(2)TARGETTYPE:定義為app(該選項確定UID1的值),意味著這是一個GUI應用程式,還存在許多其他型別,包括dll、exe、tsy、csy和ldd。
(3)UID:指定GUI應用程式的唯一系統標誌符。
(4)TARGETPATH:最終生成的應用程式及其元件所在的位置,總是位於/system/apps/下面,該目錄相對於裝置驅動器、模擬驅動盤(例如C:)或模擬ROM(Z:)驅動盤的根目錄。
(5)SOURCEPATH:專案原始檔的位置路徑。
(6)LANG:若應用程式支援不同語言,則使用該語句。每種支援的語句具有兩位數字的程式碼。
(7)SOURCE:指定專案原始檔的名稱。可以多次使用該語句,並且在每條語句上可以有多個檔名。
(8)RESOURCE:指定資原始檔。
(9)USERINCLUDE和SYSTEMINCLUDE:指定應用程式特有的標頭檔案的位置。
(10)LIBRARY:列出需要連結的應用程式框架和圖形庫――這些是對應於共享庫DLL的.lib檔案,將在執行時呼叫這些DLL函式。
(11)AIF:指定應用程式資訊檔案(.aif),該檔案包含應用程式資原始檔中定義的圖示和其他應用程式屬性。
針對於專案定義檔案,我們看一下其中部分關鍵詞的詳細解釋:
(1) UID:全球唯一性標誌符,由32位二進位制數字構成。在symbian os中,通過UID型別標誌物件,UID型別具有3個元件UID:UID1、UID2、UID3。
UID1:確定檔案是文件還是可執行碼,應將它看作一個系統級的標誌符,用於區分可執行檔案、DLL等檔案。.mmp檔案中的TARGETTYPE語句確定UID1。
UID2:對於文件檔案,UID2確定文件型別(應用程式資料檔案或.aif檔案)。對於可執行程式碼檔案,UID2確定可執行檔案的型別(.app、.dll、.tsy)。對於可執行檔案,在.mmp檔案中的UID行上指定UID2和UID3。
UID3:是一個應用程式級的標誌符,應用程式的UID3必須不同於其他所有應用程式。只有symbian才可以釋出這些值。通過電子郵件到symbian獲取,開發實驗時,可以使用0x01000000~0x0FFFFFFF,但釋出時不能再使用。
Symbian os使用UID將文件(資料檔案)和.aif檔案與它們各自的應用程式關聯起來;UID3包含在每個資料檔案、可執行檔案或.aif檔案的頭部。然而,可執行檔案和它們的元件仍然需要具有正確的副檔名,否則它們將無法正確執行。
當應用程式建立文件檔案時,應用程式框架將所有的3個UID和32位的檢查總數自動合併到標頭檔案的前16個位元組。

(2)AIF檔案

在執行時使用.aif檔案,並且儲存關於應用程式的資料。包括:
a、兩種大小的圖示
b、各種功能,例如文件嵌入、新檔案的建立、是否隱藏應用程式以及MIME型別支援的優先順序。
c、可選地使用支援語言的應用程式標題(名稱)。
如果沒有.aif檔案,應用程式將使用預設的圖示、以應用程式名稱(省略副檔名)作為標題。
圖示:
網格和列表檢視使用42×29象素的圖示,然而狀態面板的上下文面板(當應用程式具有焦點時顯示在螢幕的頂部)使用44×44的圖示。
提供不同的圖示大小有助於確保系統可以使用最合適的大小。如果只提供一種大小,那麼顯示時就會縮放,損壞圖示質量。
這種點陣圖檔案格式稱為多重點陣圖檔案格式(.mbm),有相應的工具Aifbuilder來設計這種點陣圖。
AIF檔案本地化:
如果應用程式根據不同的語言而提供不同的圖示,通過使用副檔名.axx儲存產生的每個本地化.aif檔案,其中xx是與適當地區關聯的兩位數字語言碼。

標題:

Series60 UI和應用程式框架Avkon提供了將標題和應用程式關聯的可選功能――相比於一般通過.aif檔案提供標題的功能,應該優先使用這種功能。預設情況下,系統將使用.aif檔案中的標題。然而,很可能應用程式建立一個單獨的標題檔案,同事包含普通長度標題和簡短標題――簡短標題用於網格檢視,普通標題用於列表檢視。使用建立普通GUI資原始檔的方法得到標題檔案。對於HelloWorld專案,標題原始檔是HelloWorld_caption.rss,在執行時使用二進位制輸出檔案為HelloWorld_caption.rsc。如果需要,可以為每種語言產生單獨的標題檔案。
通過將額外的行新增到應用程式的.mmp檔案:
RESOURCE:HelloWorld_caption.rss

三、.pkg檔案

pkg檔案也就是安裝包配置檔案,是製作Symbian OS安裝程式的核心部分。它包含了製作安裝檔案所需要的全部資訊。為了生成.sis檔案,必須首先編寫.pkg檔案。因此製作Symbian程式安裝檔案的過程,實際上主要就是編寫pkg檔案的過程。pkg檔案像Symbian的資原始檔一樣,有自己完整的語法體系,掌握了pkg檔案的語法,就基本上掌握了製作安裝程式的大部分知識,所以熟悉pkg檔案的結構,對於製作安裝程式來說,是非常重要的。
舉例(HelloWorld.pkg):
;
; Installation file for HelloWorld application
;
;Languages
&EN
;
; UID is the app''s UID
;
#{"HelloWorld"},(0x0D0A2843),1,0,0
;
;Supports Series 60 v 2.0
;This line indicates that this installation is for the Series 60 platform v2.0
;This line must appear _exactly_ as shown below in the sis file
;If this line is missing or incorrect, the sis file will not be able
;to be installed on Series 60 v2.0 platforms
(0x101F7960), 0, 0, 0, {"Series60ProductID"}
;
; Four files to install
; Symbols set up for the source location are Carbide.c++ specific symbols
"$(EPOCROOT)epoc32/release/$(PLATFORM)/$(TARGET)/HelloWorld.app"         -"!:/system/apps/HelloWorld/HelloWorld.app"
"$(EPOCROOT)epoc32/data/z/system/apps/HelloWorld/HelloWorld.rsc"         -"!:/system/apps/HelloWorld/HelloWorld.rsc"
"$(EPOCROOT)epoc32/data/z/system/apps/HelloWorld/HelloWorld_caption.rsc" -"!:/system/apps/HelloWorld/HelloWorld_caption.rsc"
"$(EPOCROOT)epoc32/data/z/system/apps/HelloWorld/HelloWorld.aif"         -"!:/system/apps/HelloWorld/HelloWorld.aif"
這個pkg檔案是完整的,只要把檔案目錄適當調整一下,就可以可以使用了。
下面對這個檔案的各個部分依次做一些解釋說明:

·以分號開始的行,是註釋。這些註釋主要是給開發人員看的,生成器會忽略它們。

·&EN,表示安裝程式使用的語言。EN表示使用美國英語,具體的程式碼的意義可以在SDK中查到,這裡不詳細列出。sis檔案支援多語言安裝,可以在這裡進行設定,比如,&EN,FR,IT,表示是多語言的。對於多語言的安裝程式,有一些語法和規則與其對應,具體的使用方法請查閱SDK。如果你只是希望可以做出一個安裝程式,那麼使用&EN就可以,不過需要保證後面出現的字串部分使用英文字母。

·#{"HelloWorld"},(0x0D0A2843),1,0,0。這是標準Symbian SIS檔案的頭部。所有的pkg都必須包含這行,而且必須在語言設定的後面。其中HelloWorld是程式的名字,在安裝過程中,可能會使用。0x0D0A2843,是所開發程式的UID,具體點說就是mmp檔案中UID項的後面那個數字。接下來的數字,依次是主版本號,副版本號,和建立號,這些號碼用於安裝程式的版本控制。

·(0x101F7960), 0, 0, 0, {"Series60ProductID"}。這一句說明了這個程式在安裝之前需要準備的元件,實際上就是要求必須是Series60的平臺。如果還需要其它的元件,也需要在這裡說明。0x101F7960,是元件的UID,它其實表示的是S60 2.0的平臺,對於S60 2.1的平臺,應該是0x101F9115。0,0,0分別是主副版本號和建立號,Series60ProductID則是當需要顯示的時候用於向用戶顯示的說明文字。

·最後就是實際操作的語句了。第一個雙引號中的是檔案的源位置,它只的是編譯後的檔案在PC中的位置。你可以使用絕對位置,也可以像例子那樣使用相對位置。第二個雙引號中的是檔案在目標機器中的位置。“!:”表示由使用者來選擇安裝在哪個驅動器下面,如果不想由使用者指定,可以使用“C:”,表示安裝在電話的C驅動下面。這兩行語句表示的意思就是將指定位置的檔案複製到電話的指定位置中。還有很豐富的語法,請檢視S60的SDK。