基于【nmake】的win32asm【makefile】书写规则说明

 

基于 nmake 的win32asm makefile 书写规则说明

注释和换行
① makefile 文件注释以“#”开头,一直到行尾的字符
当一行的内容过长的时候,可以用换行符“/”来继续。在使用换行符的时候在“/” 后面不要再加上其他任何字符,包括注释和空格。因为只有“/”出现在一行的最后的 时候,nmake才把它当成换行符来解释。
宏定义(也可称之为变量定义)
宏定义的语法如下:
        变量名=变量内容
宏的引用
在引用宏时只需在变量前加“$”,被引用的变量名要加圆括号,如下:
        #定义
        EXE = Test.exe
        #引用
        $(EXE)
用宏定义的好处不言而喻,但最大的好处是是可以直接在命令行中用新的宏定义覆盖:
比如在原makefile中有如下宏定义:
        #编译选项
        ML_FLAG =  /c  /coff
        #在命令行中输入:
        nmake ML_FLAG=" /c  /coff  /F1"
这里有必要解释一下,此处“覆盖”的意思并不是执行本条命令后makefile文件中宏ML_FLAG的值被物理的改变成“ /c  /coff  /F1”,执行本命令后查看makefile文件,发现宏ML_FLAG的值仍为“/c  /coff ”。此处“覆盖”的真正含义是:仅在执行本条命令遇到makefile文件中宏ML_FLAG时,以“ /c  /coff  /F1”来替换执行。
不过关于上述的使用中有两点需要注意:
        ■宏名称要区分大小写,ML_FLAG与ml_flag是不一样的,一般习惯用大写
        ■定义值中有空格的时候要用双引号引起来(没有空格时可以不用双引号。(makfile中的宏定义不用遵守这种规则))
        这使临时使用不同的参数编译文件时可以不必修改makefile
显示规则
 makefile中包含有一些规则,这些规则定义了文件之间的依赖关系和产生命令,一个规则的格式是这样的:

        目标文件:依赖文件;命令 (方法一)
        或
        目标文件:依赖文件  (方法二)
       (Tab)命令
  说明:
        ■规则可以用这两种方法,用方法二的时候,命令可以从第二行开始,第一行的“;”省略,但是这时命令前面必须有一个“Tab”字符,否则nmake无法区分这究竟是命  令还是别的定义。
        ■在同一个规则中目标文件可以有多个,依赖文件也可以有多个,同时命令也可以由多个命令行组成,当然这时候就必须用第二种方法定义了,否则无法在同一行中写入多   条命令。
        ■nmake默认将整个描述文件的第一条规则中的目标文件认为是最终文件,所以我们必须把最终需要生成的文件放在第一条规则定义
  当用户要求nmake去建造一个目标时,make会去找到这个目标的依赖规则,这时规则中定义的命令并不会立刻被执行,而是首先要做一些事情:▲nmake首先去检查依赖文件是否是另一条规则的目标文件,如果是,则先处理这一条规则,依次类推;▲如果不是,nmake再检查各个依赖文件的时间,看这些文件有没有比目标文件更新的,如果没有,nmake会决定不再建造目标文件,并给出提示:‘xxx文件’is up-to-date,如果依赖文件有比目标文件更新的,才执行命令生成目标文件。一旦放在第一条的目标文件生成,如果还有其它尚未生成的目标文件没有生成的话,nmake并不去理会,这就说明了为什么我们要把我们想要生成的最终目标文件放在第一条的原因。
        ■目标也可以没有依赖文件,而且目标也可以不是一个真正的文件,比如
……
              Clean:
              (Tab)del *.obj
              del *.res
  Clean是一个目标,但我们并不是要生成一个clean文件,而是希望在文件调试完毕后用nmake来清除临时文件,当我们键入nmake clean的时候,工作目录下并没有clean   文件,那么nmake就会去执行clean定义中的命令,因为nmake把每一个不存在的目   标当做是一个过时(out-of-date)的目标(需要重新生成),如此一来,就会执行clean   定义中的命令,如此一来,就会删除中间过程中的文件*.obj和*.res
               ■指出了目标文件全名的规则称为显示规则,便有些类别的文件的编译方法可以是雷同的,如从asm文件产生obj文件的命令总是用ml,从rc文件产生res文件的命令总   是用rc ,对于每个文件都写一条规则有些多余,这时候就要用到隐含规则。

隐含规则
 隐含规则可以为某一类的文件指出建立的命令,它具体定义了如何将带一个特定扩展名的文件转换成具有另一种扩展名的文件,定义的格式是:
             .源扩展名.目标扩展名:;命令(方法一)
             或
             .源扩展名.目标扩展名: (方法二)
            (Tab)命令
② 隐含规则不能有依赖文件,所以“:”下面没有内容。
             .asm.obj:
             Ml $(ML_FLAG) $<
             .rc.res:
             rc $<

隐含规则中无法指定确定的输入文件名,因为输入文件名是泛指的有相同扩展名的一整类文件,这时候就要用到几个特殊的内定宏来指定文件名:
            ▲ $@-----全路径的目标文件。
            ▲ $*-----除去扩展名的全路径的目标文件。
            ▲ $?-----所有源文件名。
            ▲ $<-----源文件名(只能用在隐含规则中)
所以上述的rc $<用于x.rc时就是 rc x.rc ,而用于 y.rc 时就是 rc y.rc 了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值