Makefile始终执行,即使它不应该';T

Makefile始终执行,即使它不应该';T,makefile,gnu-make,Makefile,Gnu Make,makefile noob在这里,我的makefile总是执行每个配方,即使这些文件是最新的。这是我的密码: vpath *.pdf ../../../Figures/Arrowshape/ChemicalNoise .PHONY : all clean all : Fig_VP-CN-Revols_MeanfromDist_Dac0.0_F0.0-4.0_0to2.pdf\ Fig_VP-CN-Revols_MeanfromDist_Dac0.0_F0.0-4.0_2to4.pdf

makefile noob在这里,我的makefile总是执行每个配方,即使这些文件是最新的。这是我的密码:

vpath *.pdf ../../../Figures/Arrowshape/ChemicalNoise

  .PHONY : all clean

all : Fig_VP-CN-Revols_MeanfromDist_Dac0.0_F0.0-4.0_0to2.pdf\
  Fig_VP-CN-Revols_MeanfromDist_Dac0.0_F0.0-4.0_2to4.pdf\
  Fig_VP-CN-Revols_MeanfromDistImshow_Dac0.0_F0.0-4.0.pdf

Fig_%.pdf : %.py
  $(warning Building $@ )
  python $<

Fig_%_2to4.pdf : %.py
   $(warning Building $@ )
   python $<

Fig_%_0to2.pdf : %.py
  $(warning Building $@ )
    python $<

  clean:
    rm all
vpath*.pdf../../../Figures/Arrowshape/ChemicalNoise
.骗子:都是干净的
全部:图VP-CN-Revols\U MeanfromDist\U Dac0.0\U F0.0-4.0\U 0to2.pdf\
图VP-CN-Revols平均值从0.0到0.0-4.0到4.pdf\
图VP-CN-Revols\U MeanfromDistImshow\U Dac0.0\U F0.0-4.0.pdf
图%.pdf:%.py
$(警告建筑$@)
蟒蛇$<
图2%\u 2to4.pdf:%.py
$(警告建筑$@)
蟒蛇$<
图%\u 0to2.pdf:%.py
$(警告建筑$@)
蟒蛇$<
清洁:
rm全部
我检查了pdf文件是否放在正确的文件夹中,名称是否匹配。我的语法有什么问题? 另外,我知道我的
清理
不起作用,但是我如何使它起作用?

当你说“放入正确的文件夹”时,那是哪个文件夹

它显然不是本地目录,因为如果它是您的makefile,它就可以工作

第一个错误是
vpath
的语法错误。参见手册
vpath
采用makefile模式(即包含零个或一个
%
字符的字符串);它不支持像
*.h
那样的shell全局绑定。这应该写在:

vpath %.pdf ../../../Figures/Arrowshape/ChemicalNoise
然而,即使有了这个修复,您的makefile也不会像您希望的那样工作,因为
vpath
并不打算查找目标。它旨在查找源文件(即不是由make创建的文件)

如果你想深入了解这一点,你可以阅读

要使makefile按需工作,必须添加路径,如下所示:

OUTDIR = ../../../Figures/Arrowshape/ChemicalNoise

all : $(OUTDIR)/Fig_VP-CN-Revols_MeanfromDist_Dac0.0_F0.0-4.0_0to2.pdf\
      $(OUTDIR)/Fig_VP-CN-Revols_MeanfromDist_Dac0.0_F0.0-4.0_2to4.pdf\
      $(OUTDIR)/Fig_VP-CN-Revols_MeanfromDistImshow_Dac0.0_F0.0-4.0.pdf

$(OUTDIR)/Fig_%.pdf : %.py
        $(warning Building $@ )
        python $<

$(OUTDIR)/Fig_%_2to4.pdf : %.py
        $(warning Building $@ )
        python $<

$(OUTDIR)/Fig_%_0to2.pdf : %.py
        $(warning Building $@ )
        python $<
OUTDIR=../../../Figures/Arrowshape/ChemicalNoise
全部:$(OUTDIR)/Fig\U VP-CN-Revols\U MeanfromDist\U Dac0.0\U F0.0-4.0\U 0to2.pdf\
$(OUTDIR)/Fig_VP-CN-Revols_mean from dist_Dac0.0_F0.0-4.0_2to4.pdf\
$(OUTDIR)/Fig_VP-CN-Revols_mean from distimshow_Dac0.0_F0.0-4.0.pdf
$(OUTDIR)/Fig_u%.pdf:%.py
$(警告建筑$@)
蟒蛇$<
$(OUTDIR)/Fig_u%\u 2to4.pdf:%.py
$(警告建筑$@)
蟒蛇$<
$(OUTDIR)/Fig_u%\u0to2.pdf:%.py
$(警告建筑$@)
蟒蛇$<

对于问题的干净部分,应该是
clean:
(换行符/选项卡)
rm$(全部)
all
在本例中是一个变量。您尝试删除一个文本名为
all
)的文件,但该文件不幸无法正常工作。它似乎使变量
all
为空。你确定
all
被视为变量吗?对不起,我的错--(出于某种原因,我以为你有
all:=
而不是
all:
--也就是说,这就是解决这个问题的方法--创建一个变量
all DEPS:=…
,然后执行
rm-f$(所有步骤)
在清洁配方中使用
all:$(所有步骤)
。这是你的主要规则。谢谢。正确的文件夹是指我提供的位置vpath对应于python脚本生成pdf文件的位置。你知道我的clean中rm all问题的解决方案吗?我不明白这个问题。你还没有说你希望它做什么。如果你希望它删除创建的文件您必须在
rm
命令中列出这些文件。您还应该使用
rm-f
,以便在它们不存在时不会失败。是的,clean应该从
all
中删除目标文件
rm-f
是一个很好的提示,谢谢。
rm-all
删除名为
all
的文件。如果要删除目标文件,必须列出它们;记住make基本上会调用shell命令(在扩展make变量/函数之后),因此在shell中输入删除文件的任何命令都是在makefile配方中输入的命令。