makefile的使用

  • 一、makefile的三要素
  • 1、makefile三要素是
  • 2、怎么描述三要素之间的关系
  • 二、makefile项目管理
  • 三、makefile的变量、模式规则
  • 1、make变量三大类
  • 2、makefile变量的应用
  • 3、模式匹配
  • 4、默认规则
  • 四、Makefile条件分支
  • 五、Makefile常用函数
  • 1、patsubst:模式替换函数
  • 2、notdir:取文件名
  • 3、wildcard:获取匹配模式文件名函数
  • 4、foreach


一、makefile的三要素

1、makefile三要素是

目标、依赖和命令。

2、怎么描述三要素之间的关系

1 .PHONY:targetb           #.PHONY:指定targetb为伪命令
  2
  3 targeta:targetb targetc   #targeta表示命令
  4         echo "targeta"
  5
  6 targetb:                  #targetb表示命令
  7         echo "targetb"
  8
  9 targetc:                  #targetc表示命令
 10         echo "targetc"

.PHONY: 可以用来指定伪目标

二、makefile项目管理

1 mp3:main.o mp3.o
  2     gcc main.c mp3.c -o mp3
  3
  4 main.o:
  5     gcc -c main.c -o main.o
  6 mp3.o:
  7     gcc -c mp3.c -o mp3.o
  8
  9 .PHONY:clean
 10 clean:
 11     rm mp3
~

三、makefile的变量、模式规则

1、make变量三大类

(1)系统变量

1 .PHONY:all
  2
  3 all:
  4     echo "$(CC)"   #系统变量指代编译器
  5     echo "$(AS)"   #系统变量指代汇编器
  6     echo "$(MAKE)" #系统变量值make工具

(2)自定义变量

//  =,延迟赋值
 B=$(A)
//  :=,立即赋值
 B:=$(A)
//  ?=,空赋值:只有 B 变量为空的时候赋值语句才有效
 B?=123
//  +=,追加赋值,如果A=123,B=456,则追加赋值的结果是456 123
 B+=$(A)

(3)自动化变量
$ < :第一个依赖文件
$^:全部的依赖文件
$@:目标

2、makefile变量的应用

// 没有使用 make 变量前
  1 mp3:main.o mp3.o
  2     gcc main.c mp3.c -o mp3
  3
  4 main.o:
  5     gcc -c main.c -o main.o
  6 mp3.o:
  7     gcc -c mp3.c -o mp3.o
  8
  9 .PHONY:clean
 10 clean:
 11     rm mp3
~
// 使用 make 变量后,通用性加强
  1 cc=gcc
  2 TARGET=mp3
  3 OBJS=main.o mp3.o
  4
  5 $(TARGET):$(OBJS)
  6     $(cc) $^ -o $@
  7
  8 main.o:
  9     $(cc) -c main.c -o main.o
 10 mp3.o:
 11     $(cc) -c mp3.c -o mp3.o
 12
 13 .PHONY:clean
 14 clean:
 15     rm mp3
~

3、模式匹配

%,匹配任意对个非空字符
shell:*通配符

4、默认规则

.o文件默认使用.c文件来进行编译

四、Makefile条件分支

ifeq(var1,var2)   //如果var1与var2相等
else
endif
ifneq(var1,var2)    //如果var1与var2不相等
else
endif

五、Makefile常用函数

1、patsubst:模式替换函数

$(patsubst PATTERN,REPLACEMENT,TEXT)
**例子:** $(patsubst %.c,%.o,x.c.c bar.c) 
把字串“x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果
是“x.c.o bar.o”

2、notdir:取文件名

函数功能:从文件名序列“NAMES…”中取出非目录部分。目录部分是指最后一个
斜线(“/”)(包括斜线)之前的部分。删除所有文件名中的目录部分,
只保留非目录部分。

3、wildcard:获取匹配模式文件名函数

例子
$(wildcard *.c)
返回值为当前目录下所有.c 源文件列表。

4、foreach

“foreach”函数的语法:
$(foreach VAR,LIST,TEXT)
¾ 函数功能:这个函数的工作过程是这样的:如果需要(存在变量或者函数的引
用),首先展开变量“VAR”和“LIST”的引用;而表达式“TEXT”中的变量
引用不展开。执行时把“LIST”中使用空格分割的单词依次取出赋值给变量
“VAR”,然后执行“TEXT”表达式。重复直到“LIST”的最后一个单词(为
空时结束)。“TEXT”中的变量或者函数引用在执行时才被展开,因此如果在
“TEXT”中存在对“VAR”的引用,那么“VAR”的值在每一次展开式将会到
的不同的值。
¾ 返回值:空格分割的多次表达式“TEXT”的计算的结果。
我们来看一个例子,定义变量“files”,它的值为四个目录(变量“dirs”代表的 a、