这是我的代码:
%.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目录时才有效。
我该如何解决?
答案 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