makefile
makefile简单用法
1,执行的时候,如果没有知道目标,则默认执行makefile里的第一个目标,一般项目上都是把all作为第一个目标。
2,【#】代表注释
3,函数:
- wildcast:可以进行文本匹配
- patsubst:内容替换
4,系统变量:
- $@:代表目标
- $<:代表全部依赖
- $^:第一个依赖
- $?:第一个发生了变化的依赖
5,杂项:
- 【@】在规则前:代表不在终端中输入改命令
- 【-】在规则前:代表即便该条命令出错,也往下执行
6,伪目标用法:
伪目标【.PHONY】的使用场景是:一般makefile都会有一个clean的目标,为了清理.o文件,但是如果有个文件的名为clean,再执行【make clean】就会提示【make:‘clean’ is up to date.】。也就是说make认为clean已经存在了,没有必要再执行clean了,所以导致clean不能够被执行。【.PHONY】的作用就是告诉make,【.PHONY】后面的目标是不生成任何文件的,所以不会去检查有没有已经存在的clean文件了。
7,一般项目上的经验:
- 用all作为伪目标,all后面放实际的目标
- 【.PHONY】的目标为,clean和all
- clean的时候,一般在rm命令后面,加-f选项,目的是防止没有删除目标的时候,出错误。
例子:
#取得src目录下所有的.c文件
srcFile=$(wildcard ./src/*.c)
#把变量srcFile里的.c替换成.o
objFile=$(patsubst %.c, %.o, $(srcFile))
#伪目标
all:app
app:$(objFile) main.o
gcc -o $@ -I./include $^
%.o:%.c
gcc -c $^ -o $@ -I./include
test:
@echo $(srcFile)
@echo $(objFile)
#伪目标
.PHONY:clean all
clean:
-@rm -f $(objFile)
-@rm -f main.o
目录结构:
├── include
│ └── head.h
├── main.c
├── main.o
├── makefile
├── obj
└── src
├── add.c
├── add.o
├── mul.c
├── mul.o
├── sub.c
└── sub.o