我正在学习有关编译一些C代码转换成特定的汇编一些课程。我决定,所产生的组件应手动检查,所以我想出了less something.s
为“测试”规则。
由于制作的粉丝,但是,新手,我写这个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; }
然后我在猛砸输入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 a-test
?没有什么对a-test
做,因为这将使唯一的规则是隐式模式的规则:
%-test: %.s
${LESS} $^
并且,每手动4.6 Phony Targets:
隐含规则搜索(见隐含规则)跳过了.PHONY目标。
并且,因为它是.PHONY
,它仅仅是不存在确实让出来过期。
为了解决这个问题,同时保留phoiness,更换:
%-test: %.s
${LESS} $^
有:
${CODES_TEST}: %-test: %.s
${LESS} $^
那么规则是静态模式规则,不再是一个隐含的一个。