在shell函数中解析Makefile通配符%

时间:2010-09-02 17:10:58

标签: shell makefile wildcard

似乎make在调用shell函数之前没有解析通配符%,在这种情况下:

%.exe: $(shell cat %.txt)
    gcc $? -o $@

如果我在shell上输入:

$ make test.exe

shell抱怨它找不到“%.txt”,但我希望它能找到“test.txt”。

无论如何都有解决方法吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以使用GNU make的二级扩展功能:

$ cat Makefile
all : x.exe
.PHONY: all
.SECONDEXPANSION:
%.exe: $$(shell cat $$(basename $$(@F)).txt)
    @echo "$@ depends on $^"

$ cat x.txt 
a
b
c

$ touch a b c

$ make
x.exe depends on a b c

答案 1 :(得分:2)

foo.txtfoo.exe格式包含Makefile的依赖关系:

foo.exe: foo.o bar.o baz.o

然后在include中使用Makefile行:

include foo.txt

最后,更新您的模式规则:

%.exe:
    gcc -o $@ $^

答案 2 :(得分:0)

我认为你正在尝试这样做:

.SUFFIXES: .exe .txt
.txt.exe:
        gcc $? -o $@

答案 3 :(得分:0)

好吧,从外部文件加载(动态生成)依赖项的常用方法是使用 include 。即您可以修复您的示例,您只需在%.txt文件生成期间添加目标。在Makefile中你可以写下这样的东西:

DEPS = $(OBJS:.o=.txt)

-include $(DEPS)

BTW,这些依赖文件的常用后缀是%.d。

关注web site shows an intelligent approach to integrate the dependency generation in your Makefile. I.e.然后根据需要生成和更新依赖文件。不需要'make deps'步骤或类似的东西。