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 版本足够新以支持它。
我正在尝试根据 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 版本足够新以支持它。