配方改变后如何重建

Cel*_*ibi 5 makefile gnu-make

如果这个问题已经被问过,我深表歉意。寻找起来并不容易。

make设计时假设 Makefile 有点像神一样。它对您项目的未来了如指掌,除了添加新的源文件之外,永远不需要任何修改。这显然是不正确的。

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

这有两个主要限制:

  1. 它重建得太频繁了。添加链接器选项或新的源文件会重建所有内容。
  2. 如果我在命令行上传递变量(例如make CFLAGS=-O3.

我看到了几种正确执行此操作的方法,但乍一看似乎没有一种方法令人满意。

  1. 使每个目标都依赖于包含配方内容的文件。
  2. 将整个规则及其配方生成到一个要包含在 Makefile 中的文件中。
  3. 有条件地向目标添加依赖项,以在必要时强制重建它们。
  4. 使用eval函数生成规则。

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

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

Geo*_*kov 1

我有为多个平台编译的项目。当构建之前为不同架构编译的单个项目时,可以手动强制重建。然而,在为 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
Run Code Online (Sandbox Code Playgroud)

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