Makefile:ifeq因findstring而失败

时间:2015-01-15 16:25:11

标签: makefile

我试图根据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。我尝试了所有可能的语法变化,但现在我陷入困境。

1 个答案:

答案 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版本是否足以支持它。