似乎make在调用shell函数之前没有解析通配符%,在这种情况下:
%.exe: $(shell cat %.txt)
gcc $? -o $@
如果我在shell上输入:
$ make test.exe
shell抱怨它找不到“%.txt”,但我希望它能找到“test.txt”。
无论如何都有解决方法吗?
谢谢!
答案 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.txt
以foo.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'步骤或类似的东西。