非虚假目标表现得像假目标

时间:2018-04-18 05:47:18

标签: makefile gnu-make

我正在开发一个启动项目。在我的启动根目录中有一个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未在构建中获得touch(它未获得更新)

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

GNU Make 4.1 专为x86_64-pc-linux-gnu而打造

1 个答案:

答案 0 :(得分:0)

Y.Z()并不总是按照您期望的方式处理文件夹依赖项。

应该在make $(TOP_DIR)/boot内使用文件依赖关系,或者更好的是,使用$(wildcard ...)函数的所有源文件。

像:

$(TOP_DIR)/boot/.exists

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