我正在学习一些有关将某些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,但我不认为自己有错别字或其他简单的错误。
Makefile
我想念什么?less a.s
时如何使Make执行make a-test
?答案 0 :(得分:0)
a-test
不需要做任何事情,因为唯一的规则就是隐式模式规则:
%-test: %.s
${LESS} $^
,并且根据手册4.6 Phony Targets:
对于.PHONY目标,将跳过隐式规则搜索(请参阅隐式规则)。
,由于它是.PHONY
,它的根本不存在确实使它过时了。
要解决此问题,同时保持恐惧,请替换:
%-test: %.s
${LESS} $^
具有:
${CODES_TEST}: %-test: %.s
${LESS} $^
然后,该规则是静态模式规则,不再是隐式规则。