makefile详解

①Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释。
  1.显式规则:描述如何生成规则的目标,它列出了目标依赖的文件,指定了产生或更新目标的命令
  2.隐式规则:描述如何生成基于文件名的一类文件,说明目标可能依赖于和其文件名类似的文件,指定了相应的命令。
  3.变量定义:定义一个变量
  3.指令:类似与编译器的伪指令,包含:指示make读入另一个makefile,决定是否忽略makefile中的一部 分
  4.注释:以‘#’开始直到行末,除非遇到续行符号。在’define’和命令中不能有注释,其它情况下注 释可出现在任何地方。
②内建的特殊目标
  某些名字作为目标存在时有特殊含义。
  a) .PHONY 该目标的依赖被认为是phony目标,处理这些目标时,命令无条件被执行,不管文件名是否
      存在及其最后修改时间
  b) .SUFFIXES 该目标的依赖被认为是一个后缀列表,在检查后缀规则时使用
  c) .DEFAULT 该目标的规则被使用在没有规则(显式的或隐含的)的目标上。如果’DEFAULT’命令定
      义了,则对所有不是规则目标的依赖文件都会执行该组命令
  d) .PRECIOUS 该目标的依赖文件会受到特别对待:如果make被kill或命令的执行被中止,这些目标并不
      删除;而且如果该目标是中间文件,在不需要时不会被删除。可以将隐含规则的目标模式(如%.o)
      做为’.PRECIOUS’的依赖文件,这样可以保存这些规则产生的中间文件。
  e) .INTERMEDIATE 该目标的依赖文件被当作中间文件;如果该目标没有依赖文件,则makefile中所有的
      目标文件均被认为是中间文件。
  f) .IGNORE 在执行该目标的依赖规则的命令时,make会忽略错误,此规则本身的命令没有意义。如果该
      规则没有依赖关系,表示忽略所有命令执行的错误,这种用法只是为了向后兼容;由于会影响到所
      有的命令,所以不是特别有用,推荐使用其它更有选择性忽略错误的方法。
  g) .SILENT 在执行该目标的依赖规则的命令时,make并不打印命令本身。该规则的命令没有意义。
      在’.SILIENT’没有依赖关系时,表示执行makefile中的所有命令都不会打印,该规则只是为了向
      后兼容提供的。
  h) .EXPORT_ALL_VARIABLES 只是作为一个目标存在,指示make将所有变量输出到子进程中。
      定义的隐含规则的后缀作为目标时,也认为它是特殊目标;两个后缀的连接也是一样,比
      如’.c.o’。这些目标是后缀规则,一中定义隐式规则的过时方法(但仍然广泛使用)。后缀通常        以’.’开始,
      所以特殊目标也以’.’开始。
※②静态模式规则(TARGETS ...: TARGET-PATTERN: DEP-PATTERNS ...)
  静态模式规则(static pattern rules)可以指定多个目标,并且使用目标名字来建议依赖文件的名字;
比普通多目标规则更通用因为不需要依赖关系是相同的:依赖关系必须类似但不需要相同。
目标的依赖文件名通过将DEP-PATTERNS中的’%’替换为词干形成:如果依赖模式为’%.c’,在替换词干’foo’可以得到’foo.c’。
objects = foo.o bar.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
依赖模式中不包含’%’也是合法的,此依赖文件对所有的目标均有效。
bigoutput littleoutput : %output : text.g
generate text.g -$* > $@
③隐式规则
省略
④双冒号规则
    同一目标的双冒号规则事实是完全孤立的,每条规则被被单独处理,就象不同目标的规则一样;
规则按照在makefile中出现的次序被处理,此类规则真正有意义的是那些于命令执行次序无关的。
    这种规则有时比较晦涩不是特别有用;它提供了一种机制:通过不同依赖文件的更新来对目标进行不同的处理,
这种情形很罕见。每个这种规则应当提供命令,如果没有,适用的隐式规则将使用。

posted on 2016-03-01 14:25  zhudi006  阅读(550)  评论(0)    收藏  举报

导航