对于每一个项目,都必须有一个工程引导文件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文件是完整的,只要把文件目录适当调整一下,就可以可以使用了。
下面对这个文件的各个部分依次做一些解释说明:
l 以分号开始的行,是注释。这些注释主要是给开发人员看的,生成器会忽略它们。
l &EN,表示安装程序使用的语言。EN表示使用美国英语,具体的代码的意义可以在SDK中查到,这里不详细列出。sis文件支持多语言安装,可以在这里进行设置,比如,&EN,FR,IT,表示是多语言的。对于多语言的安装程序,有一些语法和规则与其对应,具体的使用方法请查阅SDK。如果你只是希望可以做出一个安装程序,那么使用&EN就可以,不过需要保证后面出现的字符串部分使用英文字母。
l #{"HelloWorld"},(0x0D0A2843),1,0,0。这是标准Symbian SIS文件的头部。所有的pkg都必须包含这行,而且必须在语言设置的后面。其中HelloWorld是程序的名字,在安装过程中,可能会使用。0x0D0A2843,是所开发程序的UID,具体点说就是mmp文件中UID项的后面那个数字。接下来的数字,依次是主版本号,副版本号,和创建号,这些号码用于安装程序的版本控制。
l (0x101F7960), 0, 0, 0, {"Series60ProductID"}。这一句说明了这个程序在安装之前需要准备的组件,实际上就是要求必须是Series60的平台。如果还需要其它的组件,也需要在这里说明。0x101F7960,是组件的UID,它其实表示的是S60 2.0的平台,对于S60 2.1的平台,应该是0x101F9115。0,0,0分别是主副版本号和创建号,Series60ProductID则是当需要显示的时候用于向用户显示的说明文字。
l 最后就是实际操作的语句了。第一个双引号中的是文件的源位置,它只的是编译后的文件在PC中的位置。你可以使用绝对位置,也可以像例子那样使用相对位置。第二个双引号中的是文件在目标机器中的位置。“!:”表示由用户来选择安装在哪个驱动器下面,如果不想由用户指定,可以使用“C:”,表示安装在电话的C驱动下面。这两行语句表示的意思就是将指定位置的文件复制到电话的指定位置中。还有很丰富的语法,请查看S60的SDK。