GNU请无视通配符指定一个假的规则?

问题描述 投票:2回答:1

我正在学习有关编译一些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,我不认为我做了一个错字或其他简单的错误。

  1. 我是怎么上述Makefile错过?
  2. 我怎样才能让我跑less a.s执行make a-test
makefile wildcard
1个回答
0
投票

没有什么对a-test做,因为这将使唯一的规则是隐式模式的规则:

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

并且,每手动4.6 Phony Targets

隐含规则搜索(见隐含规则)跳过了.PHONY目标。

并且,因为它是.PHONY,它仅仅是不存在确实让出来过期。

为了解决这个问题,同时保留phoiness,更换:

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

有:

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

那么规则是静态模式规则,不再是一个隐含的一个。

© www.soinside.com 2019 - 2024. All rights reserved.