2015-01-15 53 views
0

我试图测试一个文件是否存在基于生成文件输入。生成文件是以下Makefile:ifeq与查找字符串失败

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。我尝试了所有可能的语法变体,但现在我卡住了。

回答

2

您不能在配方行外使用$*和其他自动变量。配方行只有那些以TAB字符开头并传递给shell的行。诸如ifeq等的make语句是预处理器指令,并且在make开始运行配方(并且在知道$*的值将会是什么之前很久)之前在makefile中进行读取时被解析。

你需要重写你的条件使用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 

您还可以使用化妆的$(if ...)功能,如果你想,如果你的GNU版本做够新以支持它。