我试图根据makefile输入测试文件是否存在。 makefile是以下
AAA = $(wildcard *.aaa)
%:
@echo $(AAA);
@echo "$*.aaa";
@echo "$(findstring $*.aaa, $(AAA))";
ifeq "$(findstring $*.aaa, $(AAA))" ""
@echo "No file named $*.aaa";
else
@echo "File named $*.aaa found";
endif
假设您在目录中有temp.aaa
个文件,那么make temp
的输出显然是:
temp.aaa
temp.aaa
temp.aaa
File named temp.aaa found
但是make abcd
输出的最后一行是错误的:
temp.aaa
abcd.aaa
File named abcd.aaa found
它无法测试ifeq
的条件,当它显然为真时返回false。我尝试了所有可能的语法变化,但现在我陷入困境。
答案 0 :(得分:2)
您不能在配方行之外使用$*
和其他自动变量。配方行只是那些以TAB字符开头并传递给shell的行。像ifeq
之类的make语句是预处理程序指令,并且在make开始运行配方之前很长时间内在makefile中读取时解析(早在make知道$*
的值之前定)。
您必须使用shell语法重写条件,因此它是配方的一部分:
%:
@echo $(AAA);
@echo "$*.aaa";
@echo "$(findstring $*.aaa, $(AAA))";
@if [ "$(findstring $*.aaa, $(AAA))" = "" ]; then \
echo "No file named $*.aaa"; \
else \
echo "File named $*.aaa found"; \
fi
如果您愿意,也可以使用make的$(if ...)
函数,以及您的GNU make版本是否足以支持它。