Makefile

Makefile 文件命名和规则

文件命名:一个Makefile可以有一个或者多个规则

目标... :依赖 ...
命令 (shell命令)

目标:最终要生成的文件
依赖:生成目标所需要的文件或者是目标
命令:通过执行命令对依赖操作生成目标(命令前必须 Tab 缩进)

Makefile 中的其它规则一般都是为第一条规则服务的。

命令在执行之前,需要先检查规则中的依赖是否存在

  • 如果存在,执行命令
  • 如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如果找到了,则执行该规则中的命令

检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间

  • 如果依赖的时间比目标的时间晚,(依赖更新了)需要重新生成目标
  • 如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被
    执行

自定义变量

变量名 = 变量值:var = hello
对变量名取值:$(var)

一些预定义的变量

预定义变量只能在规则的命令中使用

AR : 归档维护程序的名称,默认值为 ar
CC : C 编译器的名称,默认值为 cc
CXX : C++ 编译器的名称,默认值为 g++
$@ : 目标的完整名称
$< : 第一个依赖文件的名称
$^ : 所有的依赖文件

app:main.c a.c b.c
  gcc -c main.c a.c b.c

app:main.c a.c b.c
  $(CC) -c $^ -o $@

简单的模式匹配

常用的函数

$(wildcard PATTERN...)
功能:获取指定目录下指定类型的文件列表

参数:PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多
个目录,一般使用空格间隔

返回:得到的若干个文件的文件列表,文件名之间使用空格间隔

示例:$(wildcard .c ./sub/.c)
返回值格式: a.c b.c c.c d.c e.c f.c

$(patsubst ,,)
功能:查找中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式,如果匹配的话,则以替换

可以包括通配符%,表示任意长度的字串。如果中也包含%,那么,中的这个%将是中的那个%所代表的字串。(可以用\来转义,以\%来表示真实含义的%字符)

返回:函数返回被替换过后的字符串

$(patsubst %.c, %.o, x.c bar.c)
返回值格式: x.o bar.o

一个简单的Makefile

src=$(wildcard ./*.c)
objs=$(patsubst %.c,%.o,$(src))
target=app

$(target):$(src)
        $(CC) $(src) -o target

%.o:%.c
        $(CC) -c $< -o $@

.PHONY:clean
clean:
        rm $(objs) -f

posted @ 2021-06-03 19:10  陌天森  阅读(75)  评论(0编辑  收藏  举报