一个简单的Makefile
Makefile规则
target ... : prerequisites ...
command
...
target 为目标文件,他可以是可执行文件,也可以是object file 或者标签
prerequisites 是生成target所需要的文件
command 是make所需要执行的命令(任意的shell命令)
一个简单的Makefile示例
一个工程有3个头文件,8个源文件,在同一个文件夹下,生成可执行文件edit
defs.h command.h buffer.h
main.c kbd.c command.c display.c insert.c search.c file.c utils.c
edit : main.o kbd.o command.o display.o insert.o search.o file.o utils.o
gcc main.o kbd.o command.o display.o insert.o search.o file.o utils.o -o edit
main.o : main.c defs.h
gcc -c main.c
kbd.o : defs.h command.h
gcc -c kbd.c
command.o : command.c defs.h command.h
gcc -c command.c
display.o : display.c defs.h command.h
gcc -c display.c
insert.o : insert.c defs.h command.h
gcc -c insert.c
search.o : search.c defs.h buffer.h
gcc -c search.c
file.o : file.c defs.h command.h buffer.h
gcc -c file.h
utils.o : utils.c buffer.h
gcc -c utils.h
clean:
rm -f edit main.o kbd.o command.o display.o insert.o search.o file.o utils.o
make工作方式
默认情况下:
1. make会在当前目录下找名字“Makefile”或者“makefile”的文件
2. 如果找到,它会找文件中第一个目标文件(edit),并把这个问价做为最终文件
3. 如果edit不存在,或者edit所依赖的后面的文件修改时间要比edit这个文件新,那么他就会执行后面所定义的命令来生成edit这个文件
4. 如果edit依赖的文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o
Makefile改进
OBJ = main.o kbd.o command.o display.o insert.o search.o file.o utils.o
edit:$(OBJ)
gcc $(OBJ) -o edit
main.o:main.c defs.h
gcc -c main.c
kbd.o:defs.h command.h
gcc -c kbd.c
command.o:command.c defs.h command.h
gcc -c command.c
display.o:display.c defs.h command.h
gcc -c display.c
insert.o:insert.c defs.h command.h
gcc -c insert.c
search.o:search.c defs.h buffer.h
gcc -c search.c
file.o:file.c defs.h command.h buffer.h
gcc -c file.h
utils.o:utils.c buffer.h
gcc -c utils.h
# .PHONY 伪目标
.PHONY:clean
clean:
rm -f edit $(OBJ)