【问题标题】:how does `make single-target` command work in a makefile with `include directive``make single-target` 命令如何在包含指令的 makefile 中工作
【发布时间】:2019-10-22 05:57:29
【问题描述】:

我试图弄清楚makefile 如何与makemake sometarget 命令一起工作。据我所知,makefile 将首先读取整个 makefile,然后它会尝试更新命令中指定的目标。然后如果makefileinclude directive,它会读取makefile,然后尝试更新包含文件,如果包含文件更新则重新读取makefile。我的理解适用于 make 命令,但使用 `make single-target' 命令有问题。

也许我对makefile 的理解是错误的,我需要一些建议。

我在 Ubuntu 16.04 上使用 GNU Make 4.1 测试了我的玩具 makefile。

项目树是:

.
├── bar.mk
└── Makefile

0 directories, 2 files

bar.mk 是:

$(warning "Reading from file: bar.mk") 

Makefile 是:

include bar.mk
include BUILD.mk
$(warning Finished include)

all: test
    touch $@

test:
    @echo "target is test"

$(warning new warning)

BUILD.mk: bar.mk
    touch $@

.PHONY: clean
clean:
    rm -rf all BUILD.mk

当我使用make test 命令时,结果是:

bar.mk:1: "Reading from file: bar.mk"
Makefile:3: Finished include
Makefile:11: new warning
target is test

项目树是:

.
├── bar.mk
├── BUILD.mk
└── Makefile

0 directories, 3 files

不会重读makefile,从bash输出看,也不会执行touch BUILD.mk命令,BUILD.mk文件是怎么创建的?

【问题讨论】:

  • BUILD.mk,尝试用touch $@替换echo '$$(warning I am here)' >$@
  • @tripleee 谢谢。我试过你的建议,结果和原来的差不多。看起来像更新BUILD.mk文件而不打印文件创建命令,那么文件不需要更新,所以它不会重新读取整个Makefile。原理我不懂。
  • 我在这两种情况下都得到了更多的输出。演示:ideone.com/Jv8WJE

标签: makefile


【解决方案1】:

据我所知,makefile 将首先读取整个 makefile,然后它会尝试更新命令中指定的目标。那么如果makefileinclude directive,它会读取makefile,然后尝试更新包含文件,如果包含文件更新则重新读取makefile

不,这不太对:

  • make 在处理 include 指令之前不会将主 makefile 读取到其末尾。相反,当它在处理 makefile 时遇到include 指令时,它会立即中断对该 makefile 的处理,以立即读取并处理包含的文件。输出前两行的顺序表明正在发生这种情况。

  • 在读取和处理整个 makefile 和所有 included 文件后,GNU make 会检查是否有任何相关的 makefile 可以并且应该被重建。 (请注意,其他 make 实现不一定会这样做。)如果是这样,那么它会执行所有此类重建,然后从头开始。

  • 只有在所有 makefile 进入稳定状态后,才会在命令行上指定目标或构建默认目标。

不会重读makefile,从bash输出看,也不会执行touch BUILD.mk命令,BUILD.mk文件是怎么创建的?

这些结论似乎完全基于报告的输出,但您似乎只查看了与第二次通过 makefile 相对应的输出的尾部。没有理由相信 BUILD.mk 是由 make 执行规则创建的,这实际上反映了我的全部输出。

那只是当你运行makeBUILD.mk 不存在时。如果您再次运行它,BUILD.mk 将不会再次构建,因为它已经存在并且比它的先决条件更新,因此整个 makefile 只会读取一次。可能你只考虑了这样一次运行的输出而让自己感到困惑。

【讨论】:

    猜你喜欢
    • 2021-04-25
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多