【问题标题】:GNU Make ignoring a phony rule specified by wildcard?GNU Make忽略通配符指定的虚假规则?
【发布时间】:2019-02-07 13:51:46
【问题描述】:

我正在学习一些关于将一些 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. 当我运行 make a-test 时,如何让 Make 执行 less a.s?

【问题讨论】:

    标签: makefile wildcard


    【解决方案1】:

    对于a-test 没有什么可做的,因为唯一的规则就是隐式模式规则:

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

    并且,根据手册4.6 Phony Targets:

    .PHONY 目标会跳过隐式规则搜索(请参阅隐式规则)。

    而且,因为它是.PHONY,它的不存在确实使它过时了。

    要解决这个问题,同时保留虚假,请替换:

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

    与:

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

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

    【讨论】:

    • 感谢您的提示。问题 2:如何让规则运行? (我没有添加这个问题 - 它已经在我的帖子中,在底部)
    • 抱歉,我忽略了您想要解决方法。已更新。
    • 如果${CODES_TEST} 包含2个或更多关键字怎么办? (这就是为什么它是复数)
    • @iBug 规则中可以有任意数量的目标,但无论如何有一个更好的主意。
    • 好的,谢谢,我有一些工作 Makefile 与您的最新编辑完全相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多