Makefile 如何预防';保持清洁';从计划删除的建筑文件中删除

Makefile 如何预防';保持清洁';从计划删除的建筑文件中删除,makefile,gnu-make,Makefile,Gnu Make,如果我运行makeclean两次,第二次调用将生成计划删除的依赖项makefile。如何让Makefile识别计划删除的文件并跳过对该目录的递归调用?换句话说,如果makefile已经存在于每个子目录中,则仅在子目录中进行清理。我不知道GNU Make语法,但我正在寻找类似于: Dependencies=[dependency1,dependency2,dependency3,dependency4] DoNotMake=[bool1,bool2,bool3,bool4] for all (i

如果我运行makeclean两次,第二次调用将生成计划删除的依赖项makefile。如何让Makefile识别计划删除的文件并跳过对该目录的递归调用?换句话说,如果makefile已经存在于每个子目录中,则仅在子目录中进行清理。我不知道GNU Make语法,但我正在寻找类似于:

Dependencies=[dependency1,dependency2,dependency3,dependency4]
DoNotMake=[bool1,bool2,bool3,bool4]
for all (i < 4): 
    if (! Dependencies(i)/Makefile):
        DoNotMake(i)=true

我不能给你一个明确的答案,因为还有很多你的makefile你还没有发布,但这里有一些我们做的事情来解决类似的问题

make变量
MAKECMDGOALS
包含当前make目标。如果您想在运行
make clean
时避免执行某些操作,可以执行以下操作:

ifeq (,$(findstring $(MAKECMDGOALS),clean))
  # Whatever you place here won't be run when you run 'make clean'
endif
您还可以添加一点shell脚本,以便仅在子makefile存在时调用它:

some_target:
    [ -f $(SUB_FOLDER)/Makefile ] && $(MAKE) -C $(SUB_FOLDER)

如果您的makefile是隐式创建的,那么这些可能无法工作。您可以使用
--假设旧=
选项来防止make重新构建makefiles(我从未尝试在不存在的文件上使用它,所以YMMV)。

我不能给您一个明确的答案,因为您还有很多makefile没有发布,但这里有一些我们用来解决类似问题的方法

make变量
MAKECMDGOALS
包含当前make目标。如果您想在运行
make clean
时避免执行某些操作,可以执行以下操作:

ifeq (,$(findstring $(MAKECMDGOALS),clean))
  # Whatever you place here won't be run when you run 'make clean'
endif
您还可以添加一点shell脚本,以便仅在子makefile存在时调用它:

some_target:
    [ -f $(SUB_FOLDER)/Makefile ] && $(MAKE) -C $(SUB_FOLDER)

如果您的makefile是隐式创建的,那么这些可能无法工作。您可以使用
--假设old=
选项来防止make重新构建makefiles(我从未尝试在不存在的文件上使用它,所以YMMV)。

Makefile的其他部分通过递归
$(make)
调用。我们无法分析那里发生的情况,因为您尚未发布Makefile代码的这些部分。您希望保持一致性,还是不生成文件?为什么配方中有
$(MAKE)
,你希望它做什么?@tripleee:我在寻找依赖关系生成文件以回答你的问题,发现它们不存在,这对我来说是一个很大的线索(嗯,运行“MAKE clean”会显式删除它们!)您的语句解决了第二个难题,即依赖项生成文件是通过$(MAKE)调用的。因此,对“makeclean”的第二次调用必须构建makefile来运行递归调用,然后才能删除它们!现在的问题是:如何防止“makeclean”构建稍后将被删除的Makefile?如果没有您的代码,我们还能说什么呢?Makefile的其他部分是通过递归
$(make)
调用调用的。我们无法分析那里发生的情况,因为您尚未发布Makefile代码的这些部分。您希望保持一致性,还是不生成文件?为什么配方中有
$(MAKE)
,你希望它做什么?@tripleee:我在寻找依赖关系生成文件以回答你的问题,发现它们不存在,这对我来说是一个很大的线索(嗯,运行“MAKE clean”会显式删除它们!)您的语句解决了第二个难题,即依赖项生成文件是通过$(MAKE)调用的。因此,对“makeclean”的第二次调用必须构建makefile来运行递归调用,然后才能删除它们!现在的问题是:如何防止“makeclean”构建稍后将被删除的makefile?如果没有您的代码,我们还能说什么比“不要这样做”?