如何使用makefile检查是否存在具有特定扩展名的文件

如何使用makefile检查是否存在具有特定扩展名的文件,makefile,gnu-make,Makefile,Gnu Make,我想检查makefile中是否存在具有特定扩展名的文件,但是这段代码不起作用: ejecutar: $(OUTPUT) clean ifeq (,$(wildcard *.dat)) ./$(OUTPUT) < $(OUTPUT).dat >$(OUTPUT).txt else ./$(OUTPUT) < $(OUTPUT).dat >$(OUTPUT).txt ejecutar:$(输出)清除 ifeq(,$(通配符*.dat)

我想检查makefile中是否存在具有特定扩展名的文件,但是这段代码不起作用:

ejecutar: $(OUTPUT) clean
    ifeq (,$(wildcard *.dat))
        ./$(OUTPUT) < $(OUTPUT).dat >$(OUTPUT).txt
    else
    ./$(OUTPUT) < $(OUTPUT).dat >$(OUTPUT).txt
ejecutar:$(输出)清除
ifeq(,$(通配符*.dat))
./$(输出)<$(输出).dat>$(输出).txt
其他的
./$(输出)<$(输出).dat>$(输出).txt

据说错误在ifeq行中。

配方中的内容应该是shell脚本,而不是Makefile语法。在读取Makefile时,任何进行解释的内容都会被展开,通常情况下,您希望您的配方在执行特定配方时按原样进行检查。(这是一个常见的初学者常见问题。)

检查通配符是否与shell脚本中的任何文件匹配也出人意料地不明显

ejecutar: $(OUTPUT) clean
    set -- *.dat \
    ; if [ -e "$$1" ]; then \
        ./$< < $<.dat >$<.txt; \
    else \
        ./$< < $<.dat >$<.txt; \
    fi
ejecutar:$(输出)清除
设置--*.dat\
; 如果[-e“$$1”];然后\

./$<$$您可以在配方中使用GNU make函数,而不是像
ifeq
等指令。在这种情况下,GNU make的
通配符
函数比shell更易于使用,因为如果没有匹配项,它将扩展为空字符串,而不是全局表达式。所以,
if[-n'$(通配符*.dat)];然后…
就足够了。这本身不是一个坏的解决办法,但我想一箭双雕。但是,如果其中一个文件包含文字单引号,则该操作将失败。True。如果你担心的话,你当然可以解决这个问题。。。在make函数中修复引号实际上更简单,因为它不关心引号。只需
$(subst'、“'”、$(…)
或类似工具即可。