【问题标题】:Is it possible to include a file generated in previous stages of the Makefile?是否可以包含在 Makefile 的先前阶段生成的文件?
【发布时间】:2021-06-17 07:28:09
【问题描述】:

假设我想使用以下 Makefile:

config:
    echo "STR = YAY" > params

-include params

do_print: config
    echo $(STR)

为此,我需要分两步运行make,首先make config 生成params 文件,然后我才能运行make do_print,它会打印YAY。 我正在寻找一种运行make do_print 将能够生成params 文件的方法,包括它并在“一次通过”中执行打印。

谢谢

【问题讨论】:

  • 您是否尝试将您的目标命名为params(实际上是什么)而不是config(不是什么)?正如您所写,make 无法猜测 config: 规则构建 params
  • 谢谢,我把它改成了params config:,这样它就可以向后兼容,让用户可以像往常一样拥有它,而且它似乎可以解决问题。
  • 请注意,如果它是动态生成的并且内容可能会发生变化,您应该添加.PHONY: params 以便在每次运行时重新生成它。否则make 在文件存在时会很高兴,无论里面是什么。
  • @raspy 将其声明为假的并不像您期望的那样真正起作用:params 每次都会重新制作,但make 不会重新启动并重新读取它。这种(未记录的)行为避免了无限循环。所以,如果你真的想每次都重新生成和重新阅读它,但只需要一次,最好使用 G.M.解决方案或类似的东西。

标签: makefile include


【解决方案1】:

您的makefile 的主要问题是您没有向make 提供正确的信息。依赖关系。以下...

config:
    echo "STR = YAY" > params

告诉make,运行命令将创建/更新名为config 的非虚假目标。但事实并非如此。它实际上创建/更新了一个名为params 的文件。因为params 是一个真实的文件,也是你想要包含的文件,只需重命名目标并相应地调整makefile 的其余部分。此外,您需要(我认为?)使用虚假依赖项来强制每次调用make 时执行params 规则,并确保仅在必要时更新params(以防止无限循环)。尝试类似...

.PHONY: FORCE

params: FORCE
    echo "STR = YAY" > $@.temp
    diff -q $@ $@.temp || cp $@.temp $@

-include params

do_print: params
    echo $(STR)

【讨论】:

  • 你真的不想强制params,而不是.PHONY FORCE。您的 make 调用将永远运行。
  • 但是目标params只有在它实际上与新生成的临时文件params.temp不同时才会被更新/重新读取。所以diff ... || cp ... 命令应该会阻止它不断更新,对吧?
【解决方案2】:

如果您不想使用另一个目标,那么您可以在下面使用,但不确定您的用例:

$(shell echo "STR = YAY" > params)
-include params

do_print:
    echo $(STR)


正如@Renaud Pacalet 所建议的,您可以更改目标的名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2016-10-13
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2022-11-03
    相关资源
    最近更新 更多