分类:
2007-07-21 14:34:28
GNU make
-B: 认为所有的目标都需要更新(重编译)
-C
--debug[=
a: 即all,输出所有的调试信息
b: 即basic,只输出简单的调试信息。即输出不需要重编译的目标
v: 即verbose,在b选项的级别之上。输出的信息包括哪个makefile被解析,
不需要被重编译的依赖文件(或是依赖目标)等。
i: 即implicit,输出所以的隐含规则。
j: 即jobs,输出执行规则中命令的详细信息,如命令的PID、返回码等。
m: 即makefile,输出make读取makefile,更新makefile,执行makefile的信息。
-d:相当于--debug=a
-e: 指明环境变量的值覆盖makefile中定义的变量的值
-f=
-i: 在执行时忽略所有的错误
-I
-k: 出错也不停止运行
-n: 仅输出执行过程中的命令序列,但并不执行
-p: 输出makefile中的所有数据,包括所有的规则和变量
-q: 仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,
如果是2则说明有错误发生
-r: 禁止make使用任何隐含规则
-R: 禁止make使用任何作用于变量上的隐含规则
-s: 在命令运行时不输出命令的输出
-S: 取消-k选项的作用
-t:把目标的修改日期变成最新的,即阻止生成目标的命令运行
-w: 输出运行makefile之前和之后的信息,
这个参数对于跟踪嵌套式调用make时很有用.
-W: 禁止-w
GNU makefile
make 通过makefile 完成并自动维护编译工作
1. makefile说明了如何编译各个源文件并连接生成可执行文件,并定义了
源文件之间的依赖关系
2. GNU make 工具在当前工作目录中按如下顺序搜索 makefile:
GNUmakefile
makefile
Makefile
3. 使用-f指定其他文件名作为Makefile
make -f makefile.debug
makefile 基本结构
1. 三元组(Target, Dependency, Command)
Target : Dep1 Dep2
[Blank Line]
示例:
test.o: test.cpp test.h
g++ -c -g test.cpp
2. make 根据target上一次编译的时间和目标所依赖的源文件的更新时间
而自动判断应当编译哪个源文件.
3. 如果target文件的时间戳比至少它的一个依靠文件旧的话, make就执行
相应的命令更新target文件。否则命令行不执行.
makefile预定义变量
$* 不包含扩展名的目标文件名称 $+ 所有的依赖文件,以空格分开,并以出现的先后为序, 可能包含重复的依赖文件 $< 第一个依赖文件的名称 $? 所有的依赖文件,以空格分开,这些依赖文件的 修改日期比目标的创建日期晚 $@ 目标的完整名称 $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件 $% 如果目标是归档成员,则该变量表示目标的归档成员名称 AR 归档维护程序的名称,默认值为 ar ARFLAGS 归档维护程序的选项 AS 汇编程序的名称,默认值为 as ASFLAGS 汇编程序的选项 CC C 编译器的名称,默认值为 cc CFLAGS C 编译器的选项 CPP C 预编译器的名称,默认值为 $(CC) -E CPPFLAGS C 预编译的选项 CXX C++ 编译器的名称,默认值为 g++ CXXFLAGS C++ 编译器的选项
Makefile 隐含规则
1. 后缀规则(Suffix Rule): 后缀规则定义了将一个具有某个后缀的文件(例如,.c 文件) 转换为具有另外一种后缀的文件(例如,.o 文件)的方法. 例如:将.c文件转化为.o文件的后缀规则为: .c.o: $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< 2. 模式规则(pattern rules): 利用模式规则定义更加复杂的依赖性规则. 例如下面的模式规则定义了如何将任意一个 X.c 文件转换为 X.o 文件: %.c:%.o $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< Makefile假象目的
1. 象正常目的,只是目的文件不存在. 用.PHONY表明假象目的. .PHONY clean clean: rm -fr *.o *.tmp 2. 假如不声明clean为假象目的而且磁盘上有一文件名为clean, 因为clean不存在依赖,所以不可避免的被认为已经up-to-date, 下面的命令行永远不执行. 声明假象目的后,不去检查磁盘上的文件 从而保证下面的命令永远执行
Makefile静态模式
静态模式可以更加容易地定义多目标的规则: : targets目标集 target-parrtern目标集模式 prereq-parrterns是目标的依赖模式 例如: files = foo.elc bar.o lose.o $(filter %.o,$(files)): %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ $(filter %.elc,$(files)): %.elc: %.el emacs -f batch-byte-compile $<
嵌套执行make
针对一些大的工程, 不同模块或是不同功能的源文件放在不同的目录中,每个目录都有一个Makefile. subsystem: cd subdir && $(MAKE)(或$(MAKE) -C subdir) SHELL和MAKEFLAGS变量都要传递到下层Makefile中
引用其它的Makefile
使用include关键字可以把别的Makefile包含进来 includefilename可以是当前操作系统Shell的文件模式(可以保含路径和通配符) include foo.make *.mk $(bar) 等价于: include foo.make a.mk b.mk c.mk e.mk f.mk make的工作方式
1、读入所有的Makefile。 2、读入被include的其它Makefile。 3、初始化文件中的变量。 4、推导隐晦规则,并分析所有规则。 5、为所有的目标文件创建依赖关系链。 6、根据依赖关系,决定哪些目标要重新生成。 7、执行生成命令。
文件搜寻
make把VPATH变量作为自动查找的路径. VPATH = src:../headers 上面的的定义指定两个目录,“src”和“../headers”, make会按照这个顺序进行搜索(加上当前目录). 目录由":"分隔. vpath是另外一个设置文件搜索路径的方法, 它比VPATH更灵活. 三种用法: 1、vpath为符合模式 的文件指定搜索目录 。 2、vpath 清除符合模式 的文件的搜索目录。 3、vpath 清除所有已被设置好了的文件搜索目录。 vapth使用方法中的 需要包含“%”字符。“%”的意思是匹配零或若干字符, 例如,“%.h”表示所有以“.h”结尾的文件。 指定了要搜索的文件集, 而 则指定了 的文件集的搜索的目录。 例如: vpath %.h ../headers
Makefile函数
1. wildcard: 展开成一列所有符合由其参数描述的文件名,文件以空格分开。 例如:SOURCES=$(wildcard *.c) 2. patsubst: 匹配替换。三个参数:要匹配的式样,用什么替换,要被处理的 由空格分割的字符串。 例如:OBJS=$(patsubst %.c, %.o, $(SOURCE)) 3. filter-out: 使用两个用空格分开的列表,它把第二列表中所有的存在于 第一列表中的项目删除 4. subst: 字符串替换函数, 三个参数:要替换的字符串,用什么替换,要被处理 字符串. 5. strip: 去空格函数, 去掉字串中开头和结尾的空字符. 6. findstring: 查找字符串函数. 如果找到,则返回找的字符串,否则返回空 字符串. 例如:$(findstring a, a b c) 7. ifeq: 如果两个参数相同, 把直到else(或endif)之间的代码加到makefile 中. 如果不同,则把else和endif之间的代码加入makefile. 8. ifneq: 与ifeq相反.
Makefile提示
1. “@”使命令的执行不显示 2. "-"忽略命令的出错,继续执行, 否则make将会退出 3. ";"使上一条的命令结果应用在下一条命令 4. export传递变量到下级Makefile中 如果不想传递,使用unexport 5. 使用真实的“$”字符,需要用“$$”来表示 6. "="与":="的区别 (1). "="右侧的变量可以使用后面定义的值 而":="右侧的变量必须使用前面定义的值 7. $MAKELEVEL记录了当前Makefile的调用层数 8. 变量的替换: $(var:a=b), 把变量“var”中 所有以“a”字串“结尾”的“a”替换成“b”字串
Makefile示例
CXXFLAGS=-g -Wall -O2 CXX=g++ EXECUTABLE=calcu SOURCES=$(wildcard *.cpp) OBJS=$(patsubst %.cpp,%.o,$(SOURCES)) .PHONY: all clean all: $(EXECUTABLE) clean: rm -f *.o $(EXECUTABLE): $(OBJS) $(CXX) $(CXXFLAGS) -o $(EXECUTABLE) $(OBJS)
when executing "make all" in shell with the above makefile, $(CXX) $(CXXFLAGS) -o $(EXECUTABLE) $(OBJS)" will be executed. And when executing **make clean, rm -f *.o will be executed. GNU Autotools
GNU autotools
1. GNU Auto Tools是一系列辅助开发、打安装包的自动化工具. 2. GNU autotools包括: GNU automake GNU autoconf GNU autoheader GNU libtool GNU autoscan
GNU autotools来龙去脉1. Autoconf:根据用户提供的configure.in文件,生成一个名为configure的脚本。 该脚本可以搜集有关移植性的平台相关信息,这些信息被用来生成Makefiles, 配置头文件和其它平台相关的文件。 2. Automake:根据用户提供的一个高层次的生成规则Makefile.am,生成Makefile文件的模板 Makefile.in。Automake生成的Makefiles符合GNU的Makefile标准, 用户无需再手工编写Makefile文件。 3. Libtool:使得生成内存位置无关的代码且让共享库在不同平台间移成为可能。 它可以不依赖autoconf和automake单独运行,另一方面,automake和libtool可以无缝地集成使用