为什么Makefile会检测到文件,即使它不存在?

时间:2015-11-29 17:05:24

标签: linux makefile

这是我的代码:

%.o: %.cpp 
    @mkdir -p bin/obj/$(@D) 
ifeq ($(wildcard bin/obj/$@),)
    $(CC) -c -o bin/obj/$@ $< $(CFLAGS) $(FLAGS)
else
    @echo "bin/obj/$@ exists"
endif

我有一个问题,当目录obj存在时,我总是弄错。

我在谈论这个条件:

($(通配符bin / obj / $ @),)

我不知道如何解决它。

Makefile始终打印该文件,即使我将其从磁盘中删除。

仅当我删除obj目录时才有效。

我该如何解决?

1 个答案:

答案 0 :(得分:2)

麻烦的是Make在执行规则之前评估条件,当$@尚未定义时(以及文件可能尚未创建时)。通配符语句的计算结果为$(wildcard /bin/obj/),如果该目录存在,将生成“bin / obj /”,我认为这样做。

解决这个问题的方法不止一种。最直接的是将条件放在命令中,以便Make将它传递给shell:

%.o: %.cpp
    @mkdir -p bin/obj/$(@D)
    @if [ -e bin/obj/$@ ]; then echo it exists; else $(CC) ...; fi