Makefile的规则
target:prerequisites
(tab) command
...
...
target是一个目标文件,可以是执行文件,也可以是一个标签。
prerequisites是生成这个target所需的文件
command是make需要执行的命令。
示例
edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit main.o kbd.o command.o display.o insert.o search.o files.o utils.o
把内容保存为"Makefile"或"makefile"的文件中,然后在该目录下直接输入命令"make"就可以生成执行文件edit。
如果要删除执行文件和所有的中间目标文件,执行"make clean"。
注意:
在定义好依赖关系后,后续的那一行定义了如何生成目标文件的系统命令,一定要以一个tab键开头。
在makefile中的命令必须要以[Tab]键开始。
makefile中使用变量
objects=main.o kbd.o command.o display.o insert.o search.o files.o utils.o定义变量
使用变量:$(objects)
清空目标文件的规则
clean:
rm edit $(object)
更好的做法:
.PHONY:clean //表示clean是一个"伪目标"
clean: //clean规则不要放在文件开头,否则会变成make默认目标
-rm edit $(object) //rm命令前面加一个减号的意思是:某些文件出现问题,不要管,继续做后面的事
注释
makefile中只有行注释,其注释是用"#"字符,如果在makefile中使用"#"字符,可以用反斜杠进行转义。
Makefile的文件名
makefile、Makefile也可以使用别的文件名书写Makefile 比如" Make.AIX",若要指定特定的makefile,可以使用make -f Make.AIX和make --file Make.AIX
引用其他的Makefile
在makefile中使用include关键字可以把别的makefile包含进来
语法是:include<filename>
include前面可以有些空字符,但是绝不能以[Tab]键开始,include和<filename>可以用一个或多个空格隔开。
举例:
有几个makefile:a.mk、b.mk、c.mk、 foo.make、e.mk、f.mk
include foo.make *.mk $(bar)
等价于 include foo.make a.mk b.mk c.mk e.mk f.mk
如果文件都没有指定绝对路径或相对路径,make会在当前目录下首先查找,如果当前目录下没有找到,那么make会在以下目录下查找:
1)make执行时,有"-I" 或"--include-dir"参数,那在指定目录下查找
2)如果目录<prefix>/inlude(一般是:/usr/local/bin 或/usr/include)存在的话,make也会去查找。
3)如想让make不理那些无法读取的文件,而继续执行,可以在include前加一个减号"-"。如:-include <filename>
书写规则