【问题标题】:making all rules depend on the Makefile itself制定所有规则取决于 Makefile 本身
【发布时间】:2010-10-06 10:12:51
【问题描述】:

当我更改一个 Makefile 时,它​​的规则可能已经改变,因此应该重新评估它们,但 make 似乎不这么认为。

有没有办法在 Makefile 中说,它的所有目标,不管是哪一个,都依赖于 Makefile 本身? (不管它的名字。)

我正在使用 GNU make。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    这看起来像是 Make 应该能够做的一件更简单、有用、合乎逻辑的事情,但事实并非如此。

    这是一种解决方法。如果 clean 规则设置正确,Make 可以在 makefile 被更改时执行它,使用空的 dummy 文件作为标记。

    -include dummy
    
    dummy: Makefile
        @touch $@
        @$(MAKE) -s clean
    

    这适用于大多数目标,即作为实际文件并被 clean 删除的目标,以及依赖于它们的任何目标。副作用目标和一些PHONY 目标会漏网。

    【讨论】:

    • 不错的技巧,但如果我想重新制作所有依赖项(在我目前的项目中这大约需要 30 分钟),我会自己打电话给make clean
    • 这就提出了一个相关的问题:如何为make clean自动生成规则?我现在的 Makefile 没有。
    • @reinierpost:等一下。如果makefile已被更改,您是否不希望重新制作所有依赖项?您不希望它们都依赖于 makefile 本身吗?这不是重点吗?
    • @reinierpost:至于生成clean 规则,听起来好像你在解决错误的问题。你有多少目标?
    • @reinierpost:对文本文件使用 Make 是不寻常的,但不是诅咒。对于您的问题,可能有一个很好的解决方法,但您想要的 exact 解决方案并不存在。你误读了我写的关于列表的内容:可能有几十个列表,但新目标只会出现在其中的一两个上。
    【解决方案2】:

    由于 GNU make 版本 4.3 现在可以使用这两个 special variable:

    1. .EXTRA_PREREQS
      • 为每个目标添加新的先决条件
    2. MAKEFILE_LIST
      • 获取make文件的路径

    让每个目标都依赖于当前的 make 文件:

    将以下行放在文件顶部附近(在任何包含之前,因为它会影响 MAKEFILE_LIST):

    .EXTRA_PREREQS:= $(abspath $(lastword $(MAKEFILE_LIST)))
    

    让每个目标都依赖于当前的 make 文件以及包含的 make 文件

    将以下行放在文件末尾:

        .EXTRA_PREREQS+=$(foreach mk, ${MAKEFILE_LIST},$(abspath ${mk}))
    

    【讨论】:

      【解决方案3】:

      我知道的唯一答案是将 makefile 显式添加到依赖项中。例如,

      %.o: %.c makefile
              $(CC) $(CFLAGS) -c $<
      

      【讨论】:

      • $(CPPFLAGS) 添加到规则中以匹配对应的implicit rule 是个好主意
      猜你喜欢
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      相关资源
      最近更新 更多