【问题标题】:How to prevent 'make clean' from building files scheduled for removal如何防止“make clean”构建计划删除的文件
【发布时间】:2012-07-17 05:23:59
【问题描述】:

如果我运行 make clean 两次,第二次调用将构建计划删除的依赖 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

make clean 目前的规则如下:

.PHONY: clean
clean:
    $(MAKE) MAKEDEPEND=off SUBDIR_ARGS=clean
    rm -f dependency1/Makefile
    rm -f dependency2/Makefile
    rm -f dependency3/Makefile
    rm -f dependency4/Makefile
    rm -f dependency4/src/config.h.in

【问题讨论】:

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

标签: makefile gnu-make


【解决方案1】:

我不能给你一个明确的答案,因为你还有很多 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 是隐式创建的,那么这些可能不起作用。您也许可以使用 --assume-old= 选项来防止 make 重新构建 makefile(我从未尝试在不存在的文件上使用它,所以 YMMV)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多