Makefile教程:11-14
Makefile11:make参数
就是指定make
运行时,可以带上的参数。下面就是根据作用来分类,具体的就需要到时候去查了。
- 指定makefile的文件
- 指定文件执行的路径前缀
- 展示所有变量
- 执行相关的
- 忽略文件更新时间,重新执行依赖
- 忽视错误,继续执行 & 取消忽视错误,继续执行
- 重新执行时,忽略一些发生修改的文件
- 禁止自动推导
- 不输出运行的命令
- 限制同时启动的命令数量
- 调试
- 仅展示命令,不执行
- 展示是否有目标发生更新
- 根据指定文件,确定依赖这个文件的相关命令
- 设定调试时,展示的调试信息多与少
- 目标文件相关的
- 更新文件的更新时间
- 搜索目标文件
- 类似makefile中的关键字
- inlcude
- override
Makefile 12:隐含规则
makefile 隐含规则就是makefile会自动推导依赖,而在这其中,其实就是由一些内置设置好的命令,然后这些命令是由一个一个变量组成的,我们可以修改这些变量来达到控制隐含规则的目的。
这里举上面隐含规则时中的代码例子,原来的makefile文件是:
index: main.o functions.o
gcc main.o functions.o -o main
.PHONY:
clean:
rm -rf main.o functions.o
这个时候运行:make
就是运行:
cc -c -o main.o main.c
cc -c -o functions.o functions.c
gcc main.o functions.o -o main
其中隐含规则运行的命令格式是:
$(CC) –c $(CFLAGS) $(CPPFLAGS)
其中CC
就是编译器,默认是cc
,所以上面运行的命令就是cc -c -o main.o main.c
,所以我们可以强制修改其为gcc
,只需要像设定变量一样就可以了:
CC = gcc
index: main.o functions.o
gcc main.o functions.o -o main
.PHONY:
clean:
rm -rf main.o functions.o
这个时候运行make
,执行的就是:
gcc -c -o main.o main.c
gcc -c -o functions.o functions.c
gcc main.o functions.o -o main
有了这个基础,就能看懂作者想表达的是啥了。具体的隐含规则我就没有去查了。
Makefile 13:自动化变量,修改隐含规则
自动变量
自动变量的一些例子,比如 @ , @, @,<的内容就是在makefile中,一些含义随着情况发生改变,代表一类数据的变量。
其中:
$@
,代表本条命令中的所有目标$%
,库函数中,代表本条命令中的所有目标$<
,代表本条命令中的所有依赖$?
,代表比目标新的(断一下句子)依赖目标的集合,比如目标A依赖目标B和目标C,其中目标B发生修改,那么在目标A的命令中,$?
就代表目标B$^
,所有依赖目标的集合,注意$<
代表的是依赖,而$^
代表的是依赖目标的集合$+
,作用和$^
一样,只是它不去重$(@D)
,这个可以拆成这样来看:$@
,然后其代表目录,所以$(@D)
,即所有目标的目录部分(不包含/
)$(@F)
,$(@D)
代表目录,那么$(@F)
就代表文件
同理,$(%D)
,$(%F)
也可以这样用,所以这里用$(*D)
,$(*F)
来代表上面的组合。
修改隐含规则
这个其实本质上很简单,就是使用%
来匹配字符,然后设定隐含规则的的内容,这里以makefile自动推导中的例子:
CC = gcc
index: main.o functions.o
gcc main.o functions.o -o main
.PHONY:
clean:
rm -rf main.o functions.o
上面是原本的makefile,其中有自动推导的规则在其中,下面我们显式表示规则:
CC = gcc
index: main.o functions.o
gcc main.o functions.o -o main
# 这里就是我们修改了隐含规则
%.o: %.c
gcc -c $< -o $@
.PHONY:
clean:
rm -rf main.o functions.o
修改后执行的命令:
gcc -c main.c -o main.o
gcc -c functions.c -o functions.o
gcc main.o functions.o -o main
这个时候你会不会好奇,如果1个目标符合两个模式,它会如何抉择?
比如:
CC = gcc
index: main.o functions.o
gcc main.o functions.o -o main
%.o: %.c
gcc -c $< -o $@
# main.o 既符合上面的模式,也符合下面的,问,它会运行哪一个?
main.o: main.c
cc -c main.c -o main.o
.PHONY:
clean:
rm -rf main.o functions.o
答案是会运行main.o: mian.c
的部分,原因我也暂时不知道。
Makefile 14:更新函数库文件
这个没有相关的经验,就直接跳过了。。。。。。