Chinaunix首页 | 论坛 | 博客
  • 博客访问: 917927
  • 博文数量: 84
  • 博客积分: 4334
  • 博客等级: 上校
  • 技术积分: 1610
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-27 07:49
文章分类

全部博文(84)

文章存档

2012年(5)

2011年(21)

2010年(58)

分类: Python/Ruby

2012-03-16 12:00:21

Makefile的基本标准为:

点击(此处)折叠或打开

  1. target: tar_1 tar_2 tar_3 ...
  2.        command1
  3.        command2
  4.        ...
注意:其中command必须用tab空格。
eg:

点击(此处)折叠或打开

  1. main: main.o stack.o maze.o
  2.      gcc main.o stack.o maze.o -o main
常用的特殊变量有:
  •  $@ ,表示规则中的目标。
  •  $< ,表示规则中的第一个条件。
  •  $? ,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。
  •  $^ ,表示规则中的所有条件,组成一个列表,以空格分隔。

eg:上面的可以改写为: 

  1. main: main.o stack.o maze.o
  2.     gcc $^ -o $@
如果一个目标在Makefile中的所有规则都没有命令列表,make会尝试在内建的隐含规则(Implicit Rule)数据库中查找适用的规则。make的隐含规则数据库可以用make -p命令打印,打印出来的格式也是Makefile的格式,包括很多变量和规则,其中和我们这个例子有关的隐含规则有:

点击(此处)折叠或打开

  1. # default
  2. OUTPUT_OPTION = -o  $@

  3. # default
  4. CC = cc

  5. # default
  6. COMPILE.c = $(CC)  $(CFLAGS)  $(CPPFLAGS)  $(TARGET_ARCH)  -c

  7. %.o: %.c
  8. # commands to execute (built-in):
  9.    $(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。


阅读(2865) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~