【问题标题】:How to remove dependency definitions from a Make target?如何从 Make 目标中删除依赖项定义?
【发布时间】:2013-01-25 07:06:14
【问题描述】:

我正在开发一个使用嵌套 Makefile 构建的大型项目(约 3x10^6 行代码)。我有一个文件 (subdirs.mk),它添加了一些方便的规则来操作所有子目录(可能是并行的)。它包括以下规则:

$(SUBDIRS_INCLUDES):
$(MAKE) -C $(patsubst %-includes,%,$@) includes

SUBDIRS_INCLUDES := $(patsubst %,%-includes,$(SUBDIRS))

includes: $(SUBDIRS_INCLUDES)

它还为install、clean、test等提供了类似的规则。

在我的上层 Makefile 之一中,我有以下代码:

SUBDIRS = dir1 dir2 dir3
include $(BUILD_TOOLS)/subdirs.mk

includes: $(BUILD_DIR)/version.h

我希望includes 目标在这种情况下只制作 $(BUILD_DIR)/version.h,跳过所有子目录中的运行包含。不过,我还是想用 subdirs.mk,因为它提供了其他有用的功能(前面提到的test 和install 目标)。

有没有办法清除 includes 目标的依赖关系?

【问题讨论】:

    标签: makefile dependencies


    【解决方案1】:

    为两个目标之一使用除 includes 之外的其他名称。 Make 没有“减去”或“删除”依赖项的概念。

    【讨论】:

    • 有道理。当然,我确信为这些目标使用面向用户的名称的理由是,使用它们的文件不必定义除 SUBDIRS 之外的任何内容。不过,我想我可能会做这样的事情。
    【解决方案2】:

    Irix 是 Silicon Graphics (SGI) 的 Unix 变体,它通过在您的 subdirs.mk 文件中提供一个变量来解决这个问题,该文件是所有包含规则的开头。然后,在包含 subdirs.mk 之前,在所有子 makefile 中设置此前缀。

    虽然需要吸收很多内容,但这些文件:commondefs 和 commonrules 提供了您正在寻找的解决方案。

    【讨论】:

    • 您注意到这在 Irix 上可用。它也可以在其他平台上使用吗? (我们还在 Linux、Mac 和 Windows 上构建)。
    • 我提供的链接来自一个开源项目,所以我想你可以抓住这些文件将它们集成到任何基于 make 的系统中,如果这就是你的要求的话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多