2
BUILT_DIR = /tmp/obj 
SRC = /source/dir  

/tmp/obj/%/builtin.o : $(SRC)/%/*.c
      gcc $^ -o $@

但你知道:

为了应用模式规则,其目标模式必须与所考虑的文件名匹配,并且其所有先决条件(在模式替换之后)必须命名存在或可以生成的文件。

如果我执行make /tmp/obj/hfa/builtin.o,make会抱怨:

make: *** No rule to make target/tmp/obj/hfa/builtin.o'。停下来。`

如何修改 Makefile 以满足我的要求?</p>

4

3 回答 3

5

您可以使用二次扩展

BUILT_DIR = /tmp/obj 
SRC = /source/dir  
.SECONDEXPANSION:
/tmp/obj/%/builtin.o : $$(wildcard $(SRC)/%/*.c)
      gcc $^ -o $@
于 2013-03-22T06:35:33.390 回答
0

您看到的错误表明没有与模式匹配的 .c 文件,$(SRC)/hfa/*.c因为%转换为hfa. 所以 make 不能使用你定义的规则。

然后 Make 开始使用隐式规则进行构建,它也不会匹配。

最后make放弃了。

我刚刚确认了相同的 Makefile,并且仅当目录中没有*.c文件时才会出现相同的错误$(SRC)/hfa

否则,我会看到 gcc 命令被执行。

从你的问题来看,你的要求是什么还不是很清楚。

于 2013-03-22T05:03:05.053 回答
0

对我有用的规则配置:

bar-%-foo:
  @touch $@

.SECONDEXPANSION:
foo-%-bar: bar-$$*-foo
  @echo "@: $@"
  @echo "<: $<"
  @touch $@

foo-bar: foo-biz-bar foo-baz-bar
.PHONY: foo-bar

和演示:

$:make foo-bar
@: foo-biz-bar
<: bar-biz-foo
@: foo-baz-bar
<: bar-baz-foo
rm bar-biz-foo bar-baz-foo

$:ls | grep foo
foo-baz-bar
foo-biz-bar
于 2020-07-23T15:27:48.600 回答