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以满足我的要求?
答案 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