1、makefile主要5个部分:
1.1、显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令)
1.2、隐晦规则 :: make的自动推导功能所执行的规则
1.3、变量定义 :: Makefile中定义的变量
1.4、文件指示 :: Makefile中引用其他Makefile; 指定Makefile中有效部分; 定义一个多行命令
1.5、注释 :: Makefile只有行注释 “#”, 如果要使用或者输出"#"字符, 需要进行转义, "#"
target ... : prerequisites ...
command ...
...
2、通配符:
* :表示任意一个或多个字符
? :表示任意一个字符
[...] :xx.[abcd]表示a,b,c,d中 的任意一个字符;[^abcd]表示除a,b,c,d以外的字符,[0~9]表示0~9任意一个数字
~ :表示用户的home目录
3、路径搜索
3.1 当前目录中找不到文件时, 按顺序从 src目录 ../parent-dir目录中查找文件
VPATH src:../parent-dir
3.2 .h结尾的文件都从 ./header 目录中查找
VPATH %.h ./header
3.3 清除示例2中设置的规则
VPATH %.h
3.4 清除所有VPATH的设置
VPATH
4、Makefile中的变量
4.1 变量定义(= or :=)
两者的区别: :=只能使用前面定义好的变量,=可以使用后面定义的变量
(1)
OBJS2 = $(OBJS1) programC.o
OBJS1 = programA.o programB.o
all:
@echo $(OBJS2)
执行make:
$make
programA.o programB.o programC.or
(2)
OBJS2 := $(OBJS1) programC.o
OBJS1 := programA.o programB.o
all:
@echo $(OBJS2)
执行make:
$make
programC.o
4.2 变量替换
# Makefile内容
SRCS := programA.c programB.c programC.c
OBJS := $(SRCS:%.c=%.o)
all:
@echo "SRCS: " $(SRCS)
@echo "OBJS: " $(OBJS)
# bash中运行make
$ make
SRCS: programA.c programB.c programC.c
OBJS: programA.o programB.o programC.o
4.3 变量追加值 +=
# Makefile内容
SRCS := programA.c programB.c programC.c
SRCS += programD.c
all:
@echo "SRCS: " $(SRCS)
# bash中运行make
$ make
SRCS: programA.c programB.c programC.c programD.c
4.4 变量覆盖 override
作用是使Makefile中定义的变量能够覆盖make命令参数中指定的变量
# Makefile内容 (没有用override)
SRCS := programA.c programB.c programC.c
all:
@echo "SRCS: " $(SRCS)
# bash中运行make
$ make SRCS=nothing
SRCS: nothing
#################################################
# Makefile内容 (用override)
override SRCS := programA.c programB.c programC.c
all:
@echo "SRCS: " $(SRCS)
# bash中运行make
$ make SRCS=nothing
SRCS: programA.c programB.c programC.c
4.5 目标变量
作用是使变量的作用域仅限于这个目标(target),而不是对整个Makefile都有效
# Makefile 内容
SRCS := programA.c programB.c programC.c
target1: TARGET1-SRCS := programD.c
target1:
@echo "SRCS: " $(SRCS)
@echo "SRCS: " $(TARGET1-SRCS)
target2:
@echo "SRCS: " $(SRCS)
@echo "SRCS: " $(TARGET1-SRCS)
# bash中执行make
$ make target1
SRCS: programA.c programB.c programC.c
SRCS: programD.c
$ make target2
SRCS: programA.c programB.c programC.c
SRCS:
5、Makefile命令前缀
可以加两种前缀 @和-,或者不用前缀
不用前缀:输出执行的命令以及命令执行结果,出错的话停止执行
@前缀:只输出命令执行的结果,出错的话停止执行
-前缀:命令执行有错的话,忽略错误,继续执行
6、伪目标
伪目标并不是一个“目标(target)”,不像真正的目标那样会生成一个目标文件
典型的伪目标是Makefile中用来清理编译过程中中间文件的clean伪目标
.PHONY: clean
clean:
-rm -f *.o
7、引用其他的Makefile
语法:include(filename 可以包含通配符和路径)
8、查看C文件的依赖关系
例子:
显示内核源码中virt/kvm/kvm_main.c 中的依赖关系
$ cd virt/kvm/
$ gcc -MM kvm_main.c
kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h