使用Make 程序来建立大型项目的流水线处理

本文介绍了make程序和makefile的使用。make程序可对大型项目进行流水线处理,只重新编译已改变的文件。文中从简单示例入手,讲解了makefile规则,包括目标、依赖和命令。还介绍了增加文件、使用变量和隐式规则等内容,掌握这些可更好控制项目建立过程。
使用Make 程序来建立大型项目的流水线处理
翻译:javaresearch.org-Abel_Cao
2/7/2003
URL: http://www.zdnet.com.cn/developer/code/story/0,3800066897,39143422,00.htm

本文译自Builder.com,未经许可请勿转载如果你现在依赖于批处理文件或者脚本来编译代码,而且项目正随着建立次数的增加而变大,你就可能使用到make程序。make程序可以对建立大型项目进行流水线处理,并且只重新编译已经改变的文件。

另外,如果你依赖于IDE开发工具来生成代码,实际上make程序是隐藏在开发工具之中的。理解它使你能够更好地控制建立过程。

make程序以难于使用著称,其实是针对非常大的项目而言的。不用害怕,其实他没有你想象得那么复杂。

从简单开始

make程序的基本操作很简单:make程序读取通常叫做makefile的文本文件,该文件包含了怎样使用命令生成目标程序的一系列规则。下面是makefile 中一个规则的一般性:

target: dependents
    commands

  • Targets是建立过程所生成的文件---例如,连接器产生的最终可执行二进制代码或者由编译器及汇编语言解释器产生的中间目标文件。
  • Dependents是指建立目标所需要的文件。例如,最终可执行二进制代码所依赖的所有目标文件,目标文件所依赖的单个源文件或头文件。
  • Commands是指声称一个目标所需要的指令或程序。

下面是一个非常简单的例子(使用了 Microsoft C 编译器工具). 这个makefile 意思是从单个援文件中生成可执行文件。注意最终可执行的程序是makefile 中的第一个目标。

main.exe: main.obj
    link /OUT:main.exe main.obj

main.obj: main.c
    cl -c main.c

当make 运行时,它分析所有目标和所依赖文件的关系,检查文件时间戳的不同,并执行为了生成最终可执行程序所需要的最小命令集合。

增加一些文件

增加一些文件

如果你在项目中加入更多的文件,可以采用类似的方法扩展makefile。下面是一个加入了更多源文件的 makefile :

main.exe: main.obj file.obj test.obj
    link /OUT:main.exe main.obj file.obj test.obj

main.obj: main.c file.h test.h
    cl -c main.c

file.obj: file.c file.h
    cl -c file.c

test.obj: test.c test.h
    cl -c test.c

在这个makefile中,头文件也成了依赖文件。所以, main.obj 要从main.c, file.h or test.h 中从新生成。.

对于很多的项目,这已经足够了。但如果你更有雄心或者使一个大型的makefiles容易维护,你就需要更多的技巧了。

使用变量

变量对于存储可重复的文本非常有用(例如固定的路径名,文件列表,工具的名称和命令行标志位),你可以只在一个地方就能轻松的改变他。采用下面的规则可以使用变量:

$(VARIABLE)

使用隐式规则

隐式规则允许你为从不同依赖文件中生成目标文件定义一个通用公式。一个隐式命令只有在没有明确的命令时才被执行。这可以简化你的makefile,避免相同的命令被不断的重复。

下面是一个从c 文件中生成obj文件的隐式规则:

.c.obj:
    cl -c $<

$< 是第一个依赖文件的速记。使用隐式规则来扩展它。还有其他的速记表达式,包括$@, 意味着生成的目标。在隐式和显式命令中都可以使用速记表达式,但这也会经常引起混淆。

makefile 能够有很多的隐式规则。例如,你可以增加隐式规则来描述怎样从汇编代码中生成目标文件。

下面是一个采用了隐式规则和变量的复杂一点的makefile :

# Variables

CC = cl
CFLAGS = -c
OBJ = main.obj file.obj test.obj

# Implicit rules

.c.obj:
    $(CC) $(CFLAGS) $@

# Explicit rules

main.exe: $(OBJ)
    link /OUT:$@ $(OBJ)

main.obj: main.c file.h test.h

file.obj: file.c file.h

test.obj: test.c test.h

对一些make程序,你可能需要在makefile的启示初增加下面一行

.SUFFIXES: .c .obj .h

这些基本的makefile 工具需要你花一点时间来学习,它们对大多数make程序都是有效的。一旦你掌握了这些特性,你就能在创建大型项目的时候游刃有余了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值