隐式规则的先决条件中的通配符

时间:2013-03-22 04:46:06

标签: makefile

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”。 Stop.`

如何修改Makefile以满足我的要求?

3 个答案:

答案 0 :(得分:4)

您可以使用辅助扩展

BUILT_DIR = /tmp/obj 
SRC = /source/dir  
.SECONDEXPANSION:
/tmp/obj/%/builtin.o : $$(wildcard $(SRC)/%/*.c)
      gcc $^ -o $@

答案 1 :(得分:0)

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

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

最后放弃。

我刚刚确认相同的Makefile,只有在*.c目录中没有$(SRC)/hfa个文件时才会收到相同的错误。

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

从您的问题来看,您的要求是什么并不十分清楚。

答案 2 :(得分: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