GNU是否忽略通配符指定的伪造规则?

时间:2019-02-07 13:51:47

标签: makefile wildcard

我正在学习一些有关将某些C代码编译为特定程序集的课程。我决定应该手动检查生成的程序集,因此我提出了less something.s作为“测试”规则。

作为Make的新手,我写了这个Makefile:

CODES := a

LESS ?= less
CODES_TEST := $(patsubst %,%-test,${CODES})

.PHONY: all test ${CODES_TEST} clean

all: $(patsubst %,%.s,${CODES})

test: all

%-test: %.s
        ${LESS} $^

%.s: %.c
        ${CC} ${CFLAGS} -S -o $@ $^

clean:
        rm -f *.o *.s

我有这个最小的a.c文件:

int asdfg(void) { return 54321; }

然后我在Bash中键入make a-test,希望less出现a.s的内容,只是被告知:

make: Nothing to be done for 'a-test'.

无论是否存在a.s,我都得到上述响应,如果我执行make a.s或仅执行make(通常运行第一个规则all),则通常会生成该响应。

我检查了我的Makefile,但我不认为自己有错别字或其他简单的错误。

  1. 以上Makefile我想念什么?
  2. 运行less a.s时如何使Make执行make a-test

1 个答案:

答案 0 :(得分:0)

a-test不需要做任何事情,因为唯一的规则就是隐式模式规则:

%-test: %.s
        ${LESS} $^

,并且根据手册4.6 Phony Targets

  

对于.PHONY目标,将跳过隐式规则搜索(请参阅隐式规则)。

,由于它是.PHONY,它的根本不存在确实使它过时了。

要解决此问题,同时保持恐惧,请替换:

%-test: %.s
        ${LESS} $^

具有:

${CODES_TEST}: %-test: %.s
    ${LESS} $^

然后,该规则是静态模式规则,不再是隐式规则。