make总结(一):基础

一、make是一条条规则组成的。规则由目标,依赖,命令组成。

  1. 执行make “target”是为了生成我们想要的目标,单独执行make则会生成默认目标(第一个目标)。而为了生成目标会先去生成依赖,造成链式反应。

  2. make中有所谓的假目标,用.PHONY定义。因为make通常将目标当做文件(或目录)来处理,当目录文件名与目标重叠时会造成无法执行想要目标。

      采用假目标后,执行make “target”一定会执行相应规则中的命令。

二、make中的变量

  1. 自动变量:$@, $^, $<

  2. 特殊变量:MAKE, MAKECMDGOALS.

      MAKE:当前处理Makefile的命令名是什么。 MAKECMDGOALS:当前构建的目标名。

  3. 几种变量赋值方式:=, :=, ?=, +=

    =: 所谓递归扩展变量。:= :所谓简单扩展变量。+=:追加变量。 ?= :条件赋值。

  4. makefile中的变量可以来自make命令的参数(可以覆盖makefile中的原来的值, override foo=x可以避免覆盖),也可以来自shell环境。

  5. 变量赋值的同时完成文件名后缀的替换:bar:=$(foo:.c=.o)

三、利用“模式”精简规则

  1. 模式类似于通配符,但是有区别。%多用于规则描述。

  2. 关于%和*:此两者均为通配符,但更准确的讲,%为Makefile规则通配符,一般用于规则描述,如

    %.o:%c

    $(CC)  $< -o $@

    表示所有的目标文件及其依赖文件,或者$(filter %.c ,SOURCES)

    此处SOURCES表示包含.c .cc .cpp等多类型源文件,该过滤器函数将c文件过滤出来,而%.c即为此过滤器规则。

    通配符*则不具备上述功能。尤其是在Makefile,当变量定义或者函数调用时,该通配符的展开功能就失效了,即不能正常使用了,

    此时需要借助wildcard函数。二者应用范围不同。

四、make中的函数

  1. 函数调用格式:$(func args) 

  2. wildcard: 通配符函数 $(wildcard pattern)

    SRC=$(wildcard *.c)

  3. patsubst:模式替换函数 $(patsubst pattern, replacement, text)

  4. abspath: 绝对路径函数 $(abspath name)

  5. addprefix: 增加前缀 $(addprefix prefix, name)

  6. addsuffix: 增加前缀 $(addsuffix suffix, name) 

  7. eval: 再次解析text $(eval text)

  8. filter: 过滤器函数 $(filter pattern, name)

  9. filter-out: 过滤器函数 $(filter-out pattern, name)

  10. notdir:从路径抽取文件名 $(notdir name)

  11. realpath: 获取真实路径名 $(realpath name)

  12. strip 去除多余空格 $(strip string)

五、举例

  假想项目simple,simple目录里有main.c foo.c,内容如下:

1 extern void foo();
2 
3 int main()
4 {
5     foo();
6     return 0;
7 }
main.c
1 #include <stdio.h>
2 
3 void foo() 
4 {
5     printf("this is foo()\n");
6 }
foo.c

  Makefile内容如下:

 1 .PHONY:clean
 2 
 3 CC=gcc
 4 RM=rm
 5 
 6 ALL=simple
 7 SRCS=$(wildcard *.c)
 8 OBJS=$(patsubst %.c, %.o, $(SRCS))
 9 
10 
11 $(ALL):$(OBJS)
12     $(CC) -o $@ $^
13     
14 %.o:%.c
15     $(CC) -c -o $@ $^
16 clean:
17     rm $(OBJS) $(ALL)
Makefile

 

posted on 2015-12-31 16:14  pdsrazor  阅读(417)  评论(0)    收藏  举报

导航