【问题标题】:Non phony target behaves like a phony target非虚假目标的行为类似于虚假目标
【发布时间】:2018-04-18 05:47:18
【问题描述】:

我正在做一个启动项目。在我的引导根目录中有一个 makefile,其中包含以下代码,这让我很困惑:

.DEFAULT_GOAL = all

.PHONY: all

all: xboot

xboot: $(TOP_DIR)/boot
    @echo "Building Boot" $(TOP_DIR)
    $(MAKE) -C $(TOP_DIR)/boot/src

现在,问题是,当通过调用make 执行此makefile 时任何 时间,xboot 收据始终 运行。看起来这个xboot 目标就像一个虚假目标。来自GNU Documentation 关于虚假目标:

虚假不会被继承:虚假目标的先决条件是 自己不是假的,除非明确声明是这样。

表示xboot 目标不是假的,但它的收据一直在运行。我找不到任何解释。

项目事实- 目录$(TOP_DIR)/boot 包含$(TOP_DIR)/boot/src$(TOP_DIR)/boot/include 下的源和标头,目录$(TOP_DIR)/boot 在构建时没有得到touched(它没有得到更新)

试图了解我玩弄的行为- 我尝试了touching $(TOP_DIR)/boot,和/或尝试了touching 并在项目的任何位置创建文件xboot,但行为保持不变。

GNU Make 4.1 为 x86_64-pc-linux-gnu 构建

【问题讨论】:

  • 我假设实际上 is 是由该目标创建的xboot 文件?否则它将永远被重新制作。
  • @Someprogrammerdude 看看我的最后一句话——Trying to understand the behavior I played around- I tried touching $(TOP_DIR)/boot, and/or tried touching and creating file xboot file anywhere on the projects, but behavior remains the same.
  • 它不应该在“[原文如此]项目的任何地方”,而是在与您显示的 makefile 相同的目录中。 并且它需要全新创建并且$(TOP_DIR)/boot更新。 而且xboot 依赖于一个目录 是没有意义的,而应该依赖于@ 创建的文件(或多个文件) 987654340@.
  • @Someprogrammerdude 关于我尝试触摸的xboot 文件的所有情况 - 是的,我做了所有事情,但行为仍然没有改变。目录依赖对我也没有意义
  • 尝试删除$(TOP_DIR)/boot 先决条件,看看问题是否仍然存在。如果是,则确认您的xboot 规则包含命令touch $@,然后执行make -d。你会在屏幕上得到大量的输出;您可以对其进行筛选,如果仍然找不到问题,可以将其添加到您的问题中。

标签: makefile gnu-make


【解决方案1】:

make 并不总是按照您期望的方式处理文件夹依赖关系。

应该在 $(TOP_DIR)/boot 中使用 file 依赖项,例如 $(TOP_DIR)/boot/.exists,或者更好的是,使用 $(wildcard ...) 函数的所有源文件。

喜欢:

xcode: $(widcard $(TOP_DIR)/boot/src/*.c $(TOP_DIR)/boot/src/*.h)

这将导致仅在代码更改时重建。

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 2017-01-26
    • 2012-11-30
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多