Makefile
目标:依赖
命令
命令前必须有且仅有一个 Tab 符号 指令前加上 '@' , 该条指令本身不会在命令行中输出
一个简单的 Makefile
文件 t.c
CC=gcc
CFLAGS=-Wall
sim:t.o
gcc t.o -o sim
clean:
@rm -f sim t.o
.PHONY : clean // 伪目标, 避免当前目录下有一个clean文件, make clean 无法执行
执行指令:
# make // 执行 Makefile 文件
# make clean // 调用 clean: 指定的指令
修改如下:
CC=gcc
CFLAGS=-Wall
sim:t1.o
gcc t1.o -o sim
t1.o:t.c
gcc -c t.c -o t1.o
clean:
rm -f sim t.o t1.o
make 后生成的文件是 t1.o sim 说明:
- 依赖的是另一个目标, 互相依赖, 形成依赖树
- 依赖(的指令)在目标(的指令)前执行
语句
条件语句是ifeq –else-endif、ifneq-else-endif、ifdef-else-endif
特殊目标
Makefile 中一般有这些目标
- all:执行主要的编译工作,通常用作缺省目标,放在最前面。
- Install:执行编译后的安装工作,把可执行文件、配置文件、文档等分别拷到不同的安装目录。
- clean:删除编译生成的二进制文件。
- distclean:删除除源文件之外的所有中间生成文件,如配置文件,文档等。
- tags:为vim等编辑器生成tags文件。
- help:打印当前Makefile的帮助信息,比如有哪些目标可以有make指定去执行
因为这些目标一般不需要"依赖", 如果目录中有一个与目标同名的文件, 会有 "make: `xxx' is up to date" 报错, 解决方法是使用 .PHONY 声明这是伪目标
隐含规则
在 不写出 这个规则的情况下, 如果有, 就会调用对应的隐含规则;
- 自动从 .c 文件推到出 .o; "x:x.o"
- CFLAGS/CXXFLAGS 被隐含传递给编译器