发信人: galfordli()
整理人: wenbobo(2002-12-06 23:28:13), 站内信件
|
make文件其实就是一种批操作文件,将一系列命令行的编译连接命令
写成一个文本文件,供nmake.exe程序调用,在命令行方式下运行nmake
就可以生成所需的文件,其效果和IDE中的BUILD类似。
先简单介绍一下几个必要的工具(nmake当然是必不可少的了,但它的
使用比较简单,就不提了)。ml.exe/cl.exe作用是将汇编源程序或
c源程序编译连接成可执行文件(ml就是masm和link),其后可以加上
命令行选项(开关)对编译连接的过程进行控制。另一个程序是link.exe,
当然就是对obj文件作连接的啦。它不但可以生成exe文件,还可以生
成DLL和VxD(这也是我采用命令行方式的主要原因)。关于ml.exe和link.exe
的命令行选项很多,这里也不可能一一解释,详细说明可以看帮助(masm6或MSD N上都有)。
如果会用ml和link进行编译连接了,那make文件就很容易写了。
一. 依赖规则:
make文件由依赖规则(Dependent Rulers)组成,基本结构是指定
目标文件(Targets)及其依赖文件(Dependents),然后定义目标文件
如何形成(当然是用ml和link了,也有其他的,我们下边会看到)。
具体格式是:
目标文件:依赖文件
命令行
例如有源文件myasm.asm和myasm.inc,依赖规则就可以写成
myasm.obj:myasm.asm myasm.inc
ml /c myasm.asm
nmake还支持通用依赖规则(Inference Rules),例如我们可以将由
asm文件到obj文件的规则写成一个通用依赖规则(一个asm文件生成一个obj文件 )
.asm.obj:
ml /c $*.asm
这样我们就不用一遍一遍的写ml......了,只要写出目标文件和依赖
文件就行了。这里$*是一个预定义宏,下面就讲一下宏的应用。
二. 宏的定义和引用:
首先是定义宏。很简单,用"="就行了,例如我们可以将ml的命
令行选项串(就是多个选项啦,一时想不出用什么词描述了,可能用词不
当了)定义成一个宏AFLAGS:
AFLAGS= /C /Zi /Sn
使用时用$(宏名)的形式,即nmake执行时会将AFLAGS替换成/C /Zi /Sn,
怎么样,简单吧。
而前面用到的$*表示不带扩展名的目标文件名(这样才通用嘛),
向这样的预定义宏还有很多,如$@,表示目标文件的完整文件名,$<
表示比目标文件时间更新的依赖文件名,等等。
三. 例子:
讲了这么多不知道大家是否已经糊涂了,下面就给出一个完整的
例子,这个例子来自DDK,为了大家看得清楚,我先将源文件贴出,而
下一篇是带注释的。
# *
# THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF AN Y *
# KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE *
# IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULA R *
# PURPOSE. *
# *
# Copyright (C) 1993-95 Microsoft Corporation. All Rights Reserved. *
# *
#********************************************************************* *******
#
# Makefile for serial device
#
###################################################################### ####
!ifdef MASTER_MAKE
BUILD_BITS=32
BUILD_TYPE=comm
!INCLUDE $(DDKROOT)\master.mk
!endif
DEVICE = SERIAL
OBJS = serial.obj serutil.obj serfunc.obj serinit.obj serdbg.obj
########## Definitions ###############################
ASM = ml
AFLAGS = -coff -DBLD_COFF -DIS_32 -nologo -W2 -Zd -c -Cx -DMASM6
ASMENV = ML
LFLAGS = /VXD /NOD
############## VxD device link rule ###################
.asm.obj:
set $(ASMENV)=$(AFLAGS)
$(ASM) -Fo$*.obj $<
$(DEVICE).SYM: $(DEVICE).MAP
mapsym -s -o $(DEVICE).sym $(DEVICE).map
$(DEVICE).VXD $(DEVICE).MAP: $(OBJS)
link @<<$(DEVICE).lnk /DEF:<<$(DEVICE).def
$(LFLAGS)
/OUT:$(DEVICE).VXD
/MAP:$(DEVICE).map
$(OBJS)
<<
VXD $(DEVICE) DYNAMIC
DESCRIPTION '$(DEVICE) Device'
SEGMENTS
_LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
_TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
_DATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
CONST CLASS 'LCODE' PRELOAD NONDISCARDABLE
_BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE
_ITEXT CLASS 'ICODE' DISCARDABLE
_IDATA CLASS 'ICODE' DISCARDABLE
_PTEXT CLASS 'PCODE' NONDISCARDABLE
_PDATA CLASS 'PCODE' NONDISCARDABLE
_STEXT CLASS 'SCODE' RESIDENT
_SDATA CLASS 'SCODE' RESIDENT
_16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
_RCODE CLASS 'RCODE'
EXPORTS
$(DEVICE)_DDB @1
<<
clean:
-@del *.obj
-@del *.lib
-@del *.exp
-@del *.map
-@del *.sym
-@del *.vxd
-- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.77.71]
|
|