MicroStation开发语言(MDL)应用教程(第三章)

第三章&nbspbMake工具&nbsp
bMake工具允许用户使用工程文件编译整个MDL应用。工程文件定义了组成一个MDL应用的各种宏并指定了各从属文件的编译关联。bMake工具通过判断文件创建的时间可以识别工程文件中是否有文件被改变、删除等。&nbsp
 &nbsp
一、工程文件的文件格式&nbsp
 &nbsp
·&nbsp工程文件中包含一系列描述应用将如何编译的语句,这些语句有以下几种类型:&nbsp
宏(Marco)&nbsp
条件(Conditionals)&nbsp
Build命令&nbsp
从属(Dependencies)&nbsp
规则&nbsp
 &nbsp
·&nbsp工程文件的几个通用规则:&nbsp
规则和从属语句之后必须有一空行;&nbsp
如果一条语句分几行写,用“\”表示后续;&nbsp
在任何操作系统中,目录的分隔符一律采用“/”(不用“\”);&nbsp
注释用“#”符号打头。&nbsp
 &nbsp
二、宏(Macros)&nbsp
 &nbsp
宏是一种定义,它给字符串定义一个宏名,在使用时,这个宏名就代表该字符串。您可以引用已有的宏,当然也可以建立自己的宏。下面是一些预定义的宏:&nbsp
表3-1、预定义的宏&nbsp
宏&nbsp
定义&nbsp
$@&nbsp
当前目标文件&nbsp
$?&nbsp
所有从属文件新于目标文件&nbsp
$=&nbsp
最新从属文件&nbsp
$<&nbsp
当前从属文件&nbsp
$*&nbsp
目标文件的基名(忽略后缀)&nbsp
$%&nbsp
第一个从属文件所在目录&nbsp
msdos.IP32.unix.macintosh.vax.etc.&nbsp
指定操作系统的各种宏&nbsp
 &nbsp
 &nbsp
·&nbsp宏定义的几种方式:&nbsp
在工程文件内定义;&nbsp
工程文件以外的可被作为宏引用的环境变量;&nbsp
在命令行中使用-D开关。&nbsp
 &nbsp
·&nbsp宏定义的语法:&nbsp
macroname&nbsp=&nbspstring&nbsp
例如:&nbsp
BaseDir&nbsp=&nbsp$(MS)/mdl/example/basic&nbsp
 &nbsp
三、条件(Conditionals)&nbsp
 &nbsp
条件是工程文件中的流控制语句,条件语句必须以“%”打头。&nbsp
 &nbsp
表3-2、条件语句的关键字&nbsp
条件&nbsp
描述&nbsp
%include文件名&nbsp
包含工程头文件&nbsp
%ifdef&nbsp宏&nbspOR&nbsp%if宏&nbsp
如果宏已经定义,执行后面的语句&nbsp
%ifndef&nbsp宏&nbsp
如果宏未定义,执行后面的语句&nbsp
%else&nbsp
与%ifdef&nbsp,%if,%ifndef配合使用,表示其条件为假&nbsp
%elif&nbsp
在if条件为假时再判断另一条件&nbsp
%endif&nbsp
结束if条件&nbsp
 &nbsp
 &nbsp
四、Build命令&nbsp
 &nbsp
Build命令是被从属和规则用来建立目标文件的一系列语句行。如果未定义Build命令,预定义的规则将使用mdl.mki文件中的内容。&nbsp
表3-3、各种Build命令标志&nbsp
标志&nbsp
描述&nbsp
@&nbsp
命令不回显&nbsp
$&nbsp
强制回显,即使使用了silent模式&nbsp
~&nbsp
使用内嵌的bmake命令,例如:&nbsp
~CURRENT设置目标文件的日期为当前日期&nbsp
~TIME设置目标文件的时间为当前时间&nbsp
>&nbsp文件&nbsp
把所有的命令行写入指定的文件中,直到出现“<”标志&nbsp
<&nbsp
关闭“>”标志指定的文件&nbsp
 &nbsp
 &nbsp
五、从属(Dependencies)&nbsp
 &nbsp
从属语句指定了用那些源文件生成目标文件。当任一个源文件被改变时会执行从属语句。&nbsp
从属语句的语法:&nbsp
 &nbsp
目标文件:&nbsp从属1&nbsp从属2&nbsp…&nbsp从属n&nbsp[build命令]&nbsp
例如:&nbsp
$(o)basic.mo&nbsp:$(BaseDir)basic.mc&nbsp$(BaseDir)basic.h&nbsp
六、规则(Rules)&nbsp
 &nbsp
“规则”用于定义如何使用给定扩展名的从属文件来建立指定扩展名的目标文件。许多规则都已经在mdl.mki中定义过了。如果一个目标文件有多个从属文件,其中第一个文件的扩展名将用来寻找规则。如果对一个目标文件使用了多个规则,只有最后一个有效。&nbsp
规则的语法:&nbsp
.从属文件扩展名.目标文件扩展名&nbsp:build命令&nbsp
以下的mdl.mki文件显示了规则的范例&nbsp
七、运行bMake&nbsp
 &nbsp
bMake命令把MDL源码文件编译成应用。在Windows&nbspNT中使用bMakeWin命令&nbsp
·&nbspbMake的语法&nbsp
bMake&nbsp[options]&nbsp工程文件(*.mke)&nbsp
bMakeWin&nbsp[options]&nbsp工程文件(*.mke)&nbsp#&nbsp–&nbspWindows&nbspNT平台&nbsp
·&nbspbMake&nbsp/&nbspbMakeWin的参数&nbsp
-a&nbsp重编译所有文件&nbsp
-dmacro=value&nbsp定义宏&nbsp
-n&nbsp仅仅显示build命令&nbsp
-Idir&nbsp设置&nbsp.mki文件路径&nbsp
有两个常用的宏值得一提,它们是&nbsp-ddebug和-dproduction。设置宏-ddebug将打开编译器和链接器的调试信息生成开关,使得编译后的MDL应用中包含调试信息。相反,设置宏-dproduction将此开关关闭,运行时将不能进入MDL的调试器。&nbsp
·&nbsp环境变量&nbsp
BMAKE_OPT可用于指定编译命令行参数。以下是DOS&nbsp&&nbspWindows&nbspNT操作系统autoexec.bat文件中的环境变量设置示范。&nbsp
SET&nbspBMAKE_OPT=-I\WIN32APP\INGR\USTATION\MDL\INCLUDE&nbsp
 &nbsp
八、bMake涉及到的文件类型&nbsp
 &nbsp
在使用bMake进行编译时,除了源程序文件外,还涉及到两种类型的文件:工程文件和工程包含文件(或工程头文件)。工程文件以“.MKE”为扩展名;工程包含文件以“.MKI”为扩展名。一般而言,规则在工程文件中定义;从属在工程包含文件中定义。&nbsp
在&nbsp$(MS)/mdl/inclde/目录中有一个标准的工程头文件:mdl.mki,其中包含了一些可以用于编译 MDL应用的默认设置。以下是MicroStation提供的示例程序Basic的工程文件和工程包含文件。&nbsp
basic.mke文件&nbsp
#———————————————————————-&nbsp
#&nbsp
#&nbspMDL&nbspMake&nbspFile&nbsp
#&nbsp
#&nbsp$Workfile:&nbspbasic.mke&nbsp$&nbsp
#&nbsp$Revision:&nbsp5.3&nbsp$&nbsp
#&nbsp$Date:&nbsp01&nbspApr&nbsp1993&nbsp07:39:06&nbsp$&nbsp
#&nbsp
#&nbspCopyright&nbsp(1993)&nbspBentley&nbspSystems,&nbspInc.&nbsp
#&nbsp
#&nbspLimited&nbsppermission&nbspis&nbsphereby&nbspgranted&nbspto&nbspreproduce&nbspand&nbspmodify&nbspthis&nbsp
#&nbspcopyrighted&nbspmaterial&nbspprovided&nbspthat&nbspthe&nbspresulting&nbspcode&nbspis&nbspused&nbsponly&nbspin&nbsp
#&nbspconjunction&nbspwith&nbspBentley&nbspSystems&nbspproducts&nbspunder&nbspthe&nbspterms&nbspof&nbspthe&nbsp
#&nbsplicense&nbspagreement&nbspprovided&nbsptherein,&nbspand&nbspthat&nbspthis&nbspnotice&nbspis&nbspretained&nbsp
#&nbspin&nbspits&nbspentirety&nbspin&nbspany&nbspsuch&nbspreproduction&nbspor&nbspmodification.&nbsp
#&nbsp
#———————————————————————-&nbsp
#———————————————&nbsp
#&nbspDefine&nbspmacros&nbspspecific&nbspto&nbspthis&nbspexample&nbsp
#———————————————&nbsp
BaseDir&nbsp=&nbsp$(MS)/mdl/examples/basic/&nbsp
privateInc&nbsp=&nbsp$(BaseDir)&nbsp
 &nbsp
#———————————————&nbsp
#&nbspmdl.mki&nbspcontains&nbspthe&nbspdefault&nbsprules&nbspfor&nbspcreating&nbsp.rsc,&nbsp.mo,&nbspetc&nbspfiles&nbsp
#&nbspmdlexmpl.mki&nbspcontains&nbspthe&nbspoutput&nbspdirectory&nbspoverrides&nbspused&nbspby&nbspexamples&nbsp
#———————————————&nbsp
%include&nbspmdl.mki&nbsp
%include&nbspmdlexmpl.mki&nbsp
 &nbsp
#———————————————————————-&nbsp
#&nbspDefine&nbspmacros&nbspfor&nbspfiles&nbspincluded&nbspin&nbspour&nbsplink&nbspand&nbspresource&nbspmerge&nbsp
#———————————————————————-&nbsp
basicObjs&nbsp=&nbsp\&nbsp
$(o)basic.mo&nbsp\&nbsp
$(mdlLibs)ditemlib.ml&nbsp
 &nbsp
basicRscs&nbsp=&nbsp\&nbsp
$(o)basic.mp&nbsp\&nbsp
$(o)basiccmd.rsc&nbsp\&nbsp
$(o)basictyp.rsc&nbsp
 &nbsp
#———————————————&nbsp
#&nbspGenerate&nbspcommand&nbsptable&nbspinclude&nbsp&&nbspresource&nbspfile&nbspusing&nbsprcomp&nbsp
#———————————————&nbsp
$(genSrc)basiccmd.h&nbsp:&nbsp$(BaseDir)basiccmd.r&nbsp
 &nbsp
$(o)basiccmd.rsc&nbsp:&nbsp$(BaseDir)basiccmd.r&nbsp
 &nbsp
#———————————————&nbsp
#&nbspCreate&nbsp&&nbspcompile&nbspthe&nbspapplication's&nbsptype&nbspresource&nbspfile&nbspusing&nbsprsctype&nbsp
#&nbspand&nbsprcomp&nbsp
#———————————————&nbsp
$(o)basictyp.r&nbsp:&nbsp$(BaseDir)basictyp.mt&nbsp$(BaseDir)basic.h&nbsp
 &nbsp
$(o)basictyp.rsc&nbsp:&nbsp$(o)basictyp.r&nbsp$(BaseDir)basic.h&nbsp
 &nbsp
#———————————————&nbsp
#&nbspCompile&nbspthe&nbspMDL&nbspsource&nbspfile&nbspusing&nbspmcomp&nbsp
#———————————————&nbsp
$(o)basic.mo&nbsp:&nbsp$(BaseDir)basic.mc&nbsp$(BaseDir)basic.h&nbsp
 &nbsp
#———————————————&nbsp
#&nbspLink&nbspMDL&nbspprogram&nbspfile&nbspfrom&nbspbasic.mo&nbsp&&nbspditemlib.ml&nbspusing&nbsprlink&nbsp
#———————————————&nbsp
$(o)basic.mp&nbsp:&nbsp$(basicObjs)&nbsp
$(msg)&nbsp
>&nbsp$(o)make.opt&nbsp
$(linkOpts)&nbsp
-a$@&nbsp
$(basicObjs)&nbsp
<&nbsp
$(linkCmd)&nbsp@$(o)make.opt&nbsp
~time&nbsp
 &nbsp
#———————————————&nbsp
#&nbspMerge&nbspthe&nbspdialog&nbspresources&nbsp&&nbspMDL&nbspprogram&nbspfile&nbspusing&nbsprlib&nbsp
#———————————————&nbsp
$(reqdObjs)basic.mi&nbsp:&nbsp$(basicRscs)&nbsp
$(msg)&nbsp
>&nbsp$(o)make.opt&nbsp
-o$@&nbsp
$(basicRscs)&nbsp
<&nbsp
$(rscLibCmd)&nbsp@$(o)make.opt&nbsp
~time&nbsp
 &nbsp
#&nbspcomplete&nbspconstruction&nbspof&nbspthe&nbsp.ma&nbspby&nbspgetting&nbspthe&nbsplast&nbspresource.&nbsp
 &nbsp
%include&nbsp$(BaseDir)basicrsc.mki&nbsp
 &nbsp
 &nbsp
basicrsc.mki文件&nbsp
#———————————————————————-&nbsp
#&nbsp
#&nbspMDL&nbspMake&nbspFile&nbsp
#&nbsp
#&nbsp$Workfile:&nbspbasicrsc.mki&nbsp$&nbsp
#&nbsp$Revision:&nbsp5.0&nbsp$&nbsp
#&nbsp$Date:&nbsp01&nbspApr&nbsp1993&nbsp07:33:12&nbsp$&nbsp
#&nbsp
#&nbspCopyright&nbsp(1993)&nbspBentley&nbspSystems,&nbspInc.,&nbspAll&nbsprights&nbspreserved&nbsp
#&nbsp
#&nbspLimited&nbsppermission&nbspis&nbsphereby&nbspgranted&nbspto&nbspreproduce&nbspand&nbspmodify&nbspthis&nbsp
#&nbspcopyrighted&nbspmaterial&nbspprovided&nbspthat&nbspthe&nbspresulting&nbspcode&nbspis&nbspused&nbsponly&nbspin&nbsp
#&nbspconjunction&nbspwith&nbspBentley&nbspSystems&nbspproducts&nbspunder&nbspthe&nbspterms&nbspof&nbspthe&nbsp
#&nbsplicense&nbspagreement&nbspprovided&nbsptherein,&nbspand&nbspthat&nbspthis&nbspnotice&nbspis&nbspretained&nbsp
#&nbspin&nbspits&nbspentirety&nbspin&nbspany&nbspsuch&nbspreproduction&nbspor&nbspmodification.&nbsp
#&nbsp
#———————————————————————-&nbsp
basicRscs&nbsp=&nbsp\&nbsp
$(reqdObjs)basic.mi&nbsp\&nbsp
$(rscObjects)basic.rsc&nbsp\&nbsp
$(rscObjects)basicmsg.rsc&nbsp
 &nbsp
$(rscObjects)basic.rsc&nbsp:&nbsp$(BaseDir)basic.r&nbsp$(langSpec)basictxt.h&nbsp\&nbsp
$(privateInc)basic.h&nbsp
 &nbsp
$(rscObjects)basicmsg.rsc&nbsp:&nbsp$(langSpec)basicmsg.r&nbsp$(privateInc)basic.h&nbsp
 &nbsp
$(mdlapps)basic.ma&nbsp:&nbsp$(basicRscs)&nbsp
$(msg)&nbsp
>&nbsp$(rscObjects)make.opt&nbsp
-o$@&nbsp
$(basicRscs)&nbsp
<&nbsp
$(rscLibCmd)&nbsp@$(rscObjects)make.opt&nbsp
~time&nbsp
 &nbsp
 &nbsp
九、工程文件涉及到的MDL文件类型&nbsp
图3-1工程文件涉及到的MDL文件类型&nbsp
 &nbsp
 &nbsp
十、工程文件涉及到的MDL文件类型细节&nbsp
图3-2工程文件涉及到的MDL文件类型细节&nbsp

发表评论

您的邮箱不会被公开。* 为必填项