gpt4 book ai didi

makefile - 配方更改后如何重建

转载 作者:行者123 更新时间:2023-12-04 13:44:21 25 4
gpt4 key购买 nike

如果这个问题已经被问到,我很抱歉。搜索起来并不容易。
make设计时假设 Makefile 有点像上帝。它对您项目的 future 无所不知,除了添加新的源文件外,永远不需要任何修改。这显然不是真的。

我曾经让我在 Makefile 中的所有目标都依赖于 Makefile 本身。因此,如果我更改 Makefile 中的任何内容,则整个项目都会重建。

这有两个主要限制:

  • 它重建太频繁了。添加链接器选项或新的源文件会重建所有内容。
  • 如果我在命令行上传递一个变量,它就不会重建,比如 make CFLAGS=-O3 .

  • 我看到了一些正确的方法,但乍一看似乎都不令人满意。
  • 使每个目标都依赖于包含配方内容的文件。
  • 将整个规则及其配方生成到一个文件中,该文件将包含在 Makefile 中。
  • 有条件地向目标添加依赖项,以强制在必要时重建它们。
  • 使用 eval函数生成规则。

  • 但是所有这些解决方案都需要一种不常见的方法来编写配方。要么将整个规则作为一个字符串放在一个变量中,要么将配方包装在一个可以做一些魔术的函数中。

    我正在寻找的是一种以尽可能简单的方式编写规则的解决方案。尽可能少的额外垃圾。人们通常如何做到这一点?

    最佳答案

    我有为多个平台编译的项目。在构建以前为不同架构编译的单个项目时,可以手动强制重建。然而,当为 OpenWRT 编译所有项目时,手动清理是无法管理的。

    我的解决方案是创建一个标识平台的标记。如果丢失,一切都会重新编译。

    ARCH ?= $(shell uname -m)
    CROSS ?= $(shell uname -s).$(ARCH)

    # marker for the last built architecture
    BUILT_MARKER := out/$(CROSS).built

    $(BUILT_MARKER) :
    @-rm -f out/*.built
    @touch $(BUILT_MARKER)

    build: $(BUILT_MARKER)
    # TODO: add your build commands here

    如果您的标志太长,您可以将它们减少到校验和。

    关于makefile - 配方更改后如何重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51602926/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com