Makefile:ifeq 因 findstring 而失败

Makefile: ifeq fails with findstring

我正在尝试根据 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 

当 returns 显然为真时,它无法测试 ifeq 的条件。我已经尝试了所有可能的语法变体,但现在我被卡住了。

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

你必须使用 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 版本足够新以支持它。