wild字符%如何在makefile规则中起作用

时间:2009-09-09 07:43:07

标签: build makefile target rules

我有一个makefile。

我需要在src1和src2下的源文件下在C:/ bin /下构建一组目标。

让他们在订单中被要求

$ {DEST_DIR} /a.o $ {DEST_DIR} /b.o $ {DEST_DIR} /c.o $ {DEST_DIR} /d.o

在makefile的某些部分

DEST_DIR = C:/ bin

SRC_DIR1 = C:/ src1

SRC_DIR2 = C:/ src2

我的规则如下

#规则#1

$ {DEST_DIR} /%.o:$ {SRC_DIR1} /%。c

  #the command required to build the target
  echo "Source: $< Target: $@ "

#规则#2

$ {DEST_DIR} /%.o:$ {SRC_DIR2} /%。c

  #the command required to build the target
  echo "Source: $< Target: $@ "

让a.c和b.c在SRC_DIR1中,c.c和d.c在SRC_DIR2中

当我构建它时,为a.o和b.o建立规则#1,然后将规则#2替换为c.o和d.o

我没想到会没事的。因为我期望它为c.o的规则#1而且抛出一个错误,说“没有规则来制作目标c.c”。但它适用于规则#2并在SRC_DIR2中从c.c构建c.o。

有人可以解释一下它的运作方式吗?在这种情况下外卡字符%如何工作以及如何进行规则匹配?

1 个答案:

答案 0 :(得分:1)

Make不会允许两组命令,例如a.o,但即使目标模式完全相同,也会允许重叠模式规则。

当您要求c.o时,由于“c.o”没有特定规则,因此请查看匹配的模式规则。从the GNU make manual开始:“为了应用模式规则,其目标模式必须与所考虑的文件名匹配,并且其所有先决条件(在模式替换之后)必须命名存在或可以创建的文件。”所以第一条规则不适用,并且继续前进到第二条规则,即确实如此。