Makefile的基本标准为:
- target: tar_1 tar_2 tar_3 ...
- command1
- command2
- ...
注意:其中command必须用tab空格。eg:
- main: main.o stack.o maze.o
- gcc main.o stack.o maze.o -o main
常用的特殊变量有:
- $? ,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。
- $^ ,表示规则中的所有条件,组成一个列表,以空格分隔。
eg:上面的可以改写为:
- main: main.o stack.o maze.o
- gcc $^ -o $@
如果一个目标在Makefile中的所有规则都没有命令列表,make会尝试在内建的隐含规则(Implicit Rule)数据库中查找适用的规则。make的隐含规则数据库可以用make -p命令打印,打印出来的格式也是Makefile的格式,包括很多变量和规则,其中和我们这个例子有关的隐含规则有:
- # default
- OUTPUT_OPTION = -o $@
- # default
- CC = cc
- # default
- COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
- %.o: %.c
- # commands to execute (built-in):
- $(COMPILE.c) $(OUTPUT_OPTION) $<
#为注释符号,如前面所述,$@指目标文件
。通常把CFLAGS定义成一些编译选项,例如-O、-g等,而把CPPFLAGS定义成一些预处理选项,例如-D、-I等。
%.o 和 %.c 是一种特殊规则,称为模式规则,在上面的脚本中发现main.o没有command列表,所以make会自动寻找隐含规则,发现隐藏规则中有这样一种模式规则,main.o符合%.o的格式,则说明此时此刻 % 就等于 main. %.c 也就等于 main.c
同理,stack.o也没有command列表,则make到隐藏规则中找隐含规则, 此时% == stack。
阅读(602) | 评论(0) | 转发(0) |