前段时间一直在编译程序,看Makefile看得头疼,索性整理一下,以备后用,以后应该会不定期更新~
1. $@: 目标文件的名称
2. $^: 所有的依赖文件,以空格分开,不包含重复的依赖文件
3. $<: 第一个依赖文件的名称
4. $?: 构造所需文件列表中更新过的文件
4. Makefile中的函数定义被包裹在define和endef当中,如下:
-
define func
-
@echo "This is $(0)"
-
@echo "param 1 is $(1)"
-
@echo "param 2 is $(2)"
-
endef
通常,调用自定义的方法是在规则中,使用$(call
)方式进行调用
6. notdir: 去除所有的目录信息
7. patsubst:替代的意思
-
OBJ = $(patsubst %.c %.o $(SRC))
在SRC中找到所有.c文件,之后将它们全部替换成.o
8. wildcard:
获取当前目录下所有.c文件
9. strip:去掉字符串中多余的空格
-
STR = a b c
-
LOSTR = $(strip $(STR))
结果输出为:a b c
10. ifneq:判断两个参数是否相同
若有一个参数为空,则判断另一个参数是否为空
11. filter和filter-out:过滤函数和范过滤函数
-
#filter 返回匹配PATTERN的TEXT
-
$(filter PATTERN, TEXT)
-
#filter-out 返回没有匹配PATTERN的TEXT
-
$(filter-out PATTERN, TEXT)
12. foreach:循环
-
$(foreach <var>, <list>, <text>)
取出list当中的每一个变量,放到var中,再执行text当中的命令,整体返回结果以空格分割
13. info, warning, error: 显示对应信息
-
$(info text)
-
$(warning text)
-
$(error text)
14. eval: 将eval后的命令的结果展开到Makefile当中,执行make命令
-
define func
-
v = 123
-
endef
-
$(eval $(call func))
若没有eval命令,则变量v在外部不可见,若加了eval命令,则v在外部可见
15. %和\*区别:%为Makefile规则通配符,一般用于规则描述;\*则不具备该功能,
16. if:
-
$(if <CONDITION>, THEN-PART[,ELSE-PART])
17. VPATH和vpath:
VPATH: 其本身是变量。为make时额外需要添加的目录,只对make命令起作用,不对gcc等编译命令起作用,两个目录之间用冒号':'间隔;
vpath: 其本身不是变量,是一个make的关键字
-
#为符合模式pattern的文件指定搜索目录dirs
-
vpath <pattern> <dirs>
-
#清除符合模式pattern的文件的搜索目录
-
vpath <pattern>
-
#清除所有已经被设置好了的文件搜索目录
-
vpath
18. sort:排序
19. $和$$的区别:$A是在Makefile当中找到变量A;$$(a)则是在规则语句中获取shell当中的变量A,规则语句之间要用";\\"连接相邻的行(各行共享变量)
20. @:如果将@添加到命令行前,这个命令将不被make回显出来
-
#输出--compiling
-
@echo --compiling
-
#输出echo --compiling
-
echo --compiling
21. -:通常用于忽略删除不存在文件,或创建已经存在的文件(夹)这类错误
有道云笔记连接:
阅读(2544) | 评论(0) | 转发(0) |