全部博文(1493)
分类: LINUX
2013-02-27 09:37:21
原文地址:Makefile 学习摘要 作者:fengling2222
1、 GNU C的字符解析:
扩展后缀名的解析
.c C语言源代码; .C .cc C++语言源代码
.i 与处理后的C源代码 .ii 预处理后的C++源代码
.o 编译后的目标代码 .a, .so 编译后的库代码
Makefile的自动化变量
$@ 目标文件名(或集合)
$< 依赖文件名(或集合)
$% 库中包涵的目标成员文名件(或集合)
$* 目标模式中"%"及其之前的部分名 (或集合)
$^ 依赖文件名的集合,有重复的只保留一个;
$? 所有比目标文件新的依赖文件名的集合,不删除重复的目标文件;
$+ 依赖文件名集合,不删除重复的目标文件;
$(@D) 表示"$@"的目录部分(不以斜杠作为结尾)
$(@F) 表示"$@"的文件部分,不含目录;相当于函数"$(notdir $@)"
命令行解析
-o FILE : 指定输出文件名;
-c : 只编译不连接;
-Dxx=yy : 定义预处理宏xx,其值为yy
-Idirname: 把dirname下的头文件加到搜索目录中;
-Ldirname: 把dirname下的库文件加载到搜索目录中;
-static : 链接静态库,
-lFOO : 链接一个libFOO.so的库;
-On : n=0、1、2、3;指定优化等级为n
-ansi : 支持ANSI/ISO C的标准语法;
-pedansi: 允许发出ANSI/ISO C标准多列出的所有警告;
-Wall : 发出GCC提供的所有警告;
-werror : 把所有警告变成错误,并终止编译;
-v : 显示在编译过程的每一步中用到的命令;
Makefile的伪目标解析
all 所有目标的目标,其功能一般是编译所有的目标;
clean 删除所有被make创建的文件;
install 把目标执行文件拷贝到指定的目标中去;
print 例出改变过的源文件
tar 把源程序打包备份一个tar文件
dist 创建一个压缩文件,一般是把tar文件压成Z或gz文件
TAGS 更新所有的目标,以备完整地重编译使用
check 一般用来测试makefile的流程
test 一般用来测试makefile的流程
;
2、 Makefile
◆ Makefile中的内容:
显示规则、隐晦规则、变量定义、文件指示、注释
◆ 引用其他makefile: include
例如:include firmware.mk
◆ make支持三各通配符:“*”,“?”和“[...]”; %表示模式变量
◆ 需要转义字符“\”输出的符号:%,*,?
要输出”$”字符,需写成“$$”;
◆ makefile 中的特殊变量或标记:
.PHONY: 指定伪目标 VPATH = 用于表示头文件目录
◆ 文件搜索 VPATH 和 vpath ; 目录用”:”分隔;
VPATH: (变量) 搜索目录;
如:VPATH = src:../header:/include 搜索目录src,../header, /include 3个目录
vpath :(关键字)为指定模式的文件指定搜索目录;
用法有3:
1、vpath
为符合模式
2、vpath
清除符合模式
3、vpath
清除所有已被设置好了的文件搜索目录。
例如:
vpath %c foo:bar
vpath % blish
表示“.c”结尾的文件,先在foo目录搜索,再在bar目录搜索,最后在blish目录搜索;
◆ 静态模式
语法:
# 目标文件集合 :目标模式集合:依赖模式集合
# 执行命令
例如:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
◆ 命令执行:当多个命令写在一行时,需用“;”分隔;
◆ 在命令行前加“-”可以忽略命令出错;如: -rm –f *.o
◆ 定义命令包:
define cmdname
commands;
commands
endef
使用命令包时:
Foo.c:foo.y
$(cmdname)
◆ 变量定义:
变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,但最好用小括号“()”或是大括号“{}”把变量给包括起来
1、使用“=”定义变量的值;如: foo = $(bar),其值可以在后面定义;
2、使用“:=”定义变量的值;如: x := foo,其值只能使用已经在前面定义好的;
3、使用“?=”定义变量的值;如: FOO ?= bar,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做;
其等价于:
ifeq ($(origin FOO), undefined)
FOO = bar
endif
◆ 变量值的替换:
一般替换: “$(var:a=b)”或是“${var:a=b}”
如: foo := a.o b.o c.o
bar := $(foo:.o=.c)
静态模式替换:
如:foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
◆ 变量值的追加符号: +=
◆ 使用define endef 换行给变量赋值;定义时不能使用[TAB]键开头;
◆ 条件判断关键字
1. ifeq (
2. ifneq (
3. ifdef … else … endif
4. ifndef … else … endif
◆ 字符串处理函数
1. 字符串替换函数:$(subst
2. 模式字符串替换函数: $(patsubst
3. 除去字符串开头和结尾的空字符:$(strip
4. 查找字符串: $(findstring
5. 过滤字符串: $(filter
6. 反过滤字符串:$(filter-out
7. 按升序排序:$(sort ) ;
按照字符单词的升序排序;
8. 取单词函数:$(word
9. 取单词串:$(wordlist ,返回第s到e的单词串;
10. 单词个数统计:$(words
11. 取首单词:$(firstword
◆ 文件名操作函数
1. 取目录:$(dir
2. 取文件:$(notdir
3. 取后缀:$(suffix
4. 取前缀:$(basename
5. 加后缀:$(addsuffix
6. 加前缀:$(addprefix
7. 连接:$(join
◆ foreach 循环函数
语法: $(foreach ,,
含义:把参数中的单词逐一取出放到参数所指定的变量中,然后再执行
例如:names := a b c d
files := $(foreach n,$(names),$(n).o)
返回值:“a.o b.o c.o d.o”
◆ if判断函数 $(if
◆ call函数:
语法: $(call
含义:
例如:reverse = $(1) $(2)
foo = $(call reverse,a,b)
返回值:foo的值就是“a b”
◆ origin 函数:告知变量的来源
语法:$(origin
返回值:“undefined”, “default”, “environment”, “file”, “command line”, “override”, “automatic”
◆ shell函数:在makefile中执行shell命令
语法:$(shell
◆ 指定makefile编译:如:make -f makefile-tft35
◆ makefile中把"%"所匹配的内容叫做"茎";”茎“可以被传递;
以上学习摘要来自于学习陈浩的《跟我一起写makefile》,在阅读过程中,对其内容做了一些整理,原文件附件;