分类: LINUX
2010-06-17 11:07:48
GNU make是一种代码维护工具,其主要任务是根据Makefile文件定义的规则和步骤,完成整个软件项目的代码生成和维护工作。GNU make将整个软件项目的代码分开放在几个小的源文件中,在改动其中一个文件的时候,可以只对该文件进行重新编译,然后重新链接所有的目标文件。
默认情况下,gnu make 工具在当前的工作目录中按如下的顺序搜索makefile:
l GNUmakefile
l makefile
l Makefile
Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。
1、显式规则。
显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。
2、隐晦规则。
由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。
3、变量的定义。
在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。
4、文件指示。
其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。
5、注释。
Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“\#”。
最后,还值得一提的是,在Makefile中的命令,必须要以[Tab]键开始。
GNU的make工作时的执行步骤入下:(想来其它的make也是类似)
1、读入所有的Makefile。
2、读入被include的其它Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。
l 需要有make工具创建的项目,通常是目标文件和可执行文件,通常用“目标(target)”来表示创建的项目
l 要创建的项目依赖于那些文件
l 创建每个项目需要运行的命令
目标:依赖文件列表
例:test.o:test.c test.h
gcc -c test.c -o test.o -Wall -g -O2
Clean:
rm -rfv *.o exec
ü 自定义变量(相同于宏)
Makefile中的变量(大小写敏感的)
设定变量: 变量名=变量值
引用变量: $(变量名)
例:CC=gcc
Flag=-Wall
test.o:test.c test.h
$(CC) -c test.c -o test .o $(Flag)
ü 预定义变量
l $* 不包含扩展名的目标文件名称。
u $+ 所有的依赖文件以空格分开并以出现的先后为序可能包含重复的依赖文件。
u $< 第一个依赖文件的名称。
l $? 所有的依赖文件以空格分开,这些依赖文件的修改日期比目标的创建日期晚。
l $@ 目标的完整名称。
l $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。
l AR 库文件维护程序的名称,默认值为ar。
l ARFLAGS 库文件维护程序的选项。
l AS 汇编程序的名称,默认值为as。
l ASFLAGS 汇编程序的选项。
l CC C编译器的名称,默认值为cc。
l CFLAGS C编译器的选项。
l CPP C预编译器的名称,默认值为 $(CC) -E。
l CPPFLAGS C预编译的选项。
l CXX C++编译器的名称,默认值为g++。
l CXXFLAGS C++编译器的选项。
l FC FORTRAN 编译器的名称,默认值为f77。
l FFLAGS FORTRAN 编译器的选项
例:
CC=gcc
object=main.o printf1.o
main:$(object)
$(object):%o:%c
$(CC) -c $< -o $@
.PHONY:clean
clean:
rm -fvr $(object) main
Gnu make包含一些内置的或隐含的规则,这些规则定义如何从不同的依赖文件建立特定的类型目标,gnu make支持两种类型的隐含规则:
ü 后缀规则(suffix rules):
定义将一个具有某个后缀的文件转换为另一种后缀的文件的方法,如
.c.o:
$(cc) $(cflag) $(cppflag) -c -o $@ $<
ü 模式规则:(pattern rules) :通用,类似正则规则,在目标名称前多了“%”,
如 %.c:%.o
$(cc) $(cflag) $(cppflag) -c -o $@ $<
ü 省略头文件(。H)和依赖文件(。C)前提是目标文件名和依赖文件名相同
调用函数来完成一些操作,调用函数的格式与引用变量类似,function是函数名,arguments是函数的参数,如有多个参数,它们用逗号隔开。
在text中使用to替换每一处from。
$(subst ee,EE,feet on the street)
结果为:fEET on the strEEt
可以导致根据变量的值执行或忽略Makefile文件中的一部分脚本如:测试相同条件的语法:(不同ifneq)
ifeq(arg1,arg2)
text-if-true
else
text-if-false
Endif
chinaunix网友2010-06-20 10:19:28
你好!博客狠棒cheapMBT Shoes on sale! MBT Shoes are the combination of quality and fashion. MBT Shoes are perfect for lovers of the outdoors, hikers, mountain climbers, campers, and nature enthusiasts. MBT Lami Shoe are perfect for the rugged and the casual. In fact, they are perfect for just about anyone an