【问题标题】:How do I include a built *.mk into Makefile more idiomatically? Also why `.PHONY: .DEFAULT` fails?如何更惯用地将构建的 *.mk 包含到 Makefile 中?还有为什么 .PHONY: .DEFAULT 会失败?
【发布时间】:2016-09-27 20:34:59
【问题描述】:

我希望 make 构建一些东西并重用一些生成的 makefile 作为包含。

这是我目前所拥有的简化模型:

生成文件

all: myprogram

.PHONY: .DEFAULT

.DEFAULT:
    ${MAKE} something_tricky.mk
    ${MAKE} -f actual_makefikle.mk $@

.SUFFIXES:

something_tricky.mk:
        echo "TRICKY_VARIABLE=qwerty" > something_tricky.mk

actual_makefile.mk

include something_tricky.mk
all: myprogram

myprogram:
        echo ${TRICKY_VARIABLE} > $@

它有点像工作,但有问题。例如.PHONY: .DEFAULT 不起作用,所以我无法自动重建任何文件。

我的问题:

  • 如何使.PHONY: .DEFAULT 工作?
  • 有没有其他方法可以将所有目标委托给其他 Makefile(在构建它的一些依赖项之后)
  • 对于这些我不知道的事情,有没有更简单更好的模式? (期望放弃以 Makefile 为中心的方法并采用更高级的构建系统)

【问题讨论】:

    标签: makefile include gnu-make


    【解决方案1】:

    Make 将自动尝试重新制作任何包含的 makefile,然后重新开始。以下应该工作

    include something_tricky.mk
    
    .PHONY: all
    all: myprogram
    
    myprogram: $(MAKEFILE_LIST)
        echo $(TRICKY_VARIABLE) > $@
    
    something_tricky.mk:
        echo TRICKY_VARIABLE=qwerty > something_tricky.mk
    

    【讨论】:

    • 谢谢。那时不需要.PHONY。我虽然未能include 是一个停止错误。
    • @Vi。如果文件不存在,或者 make 不知道如何制作,则无法包含文件只会停止 make,这里不是这种情况,因为我们提供了一个规则来制作 something_tricky.mk
    • @Vi。 all 仍然应该是 PHONY 配方,虽然规则本身对于这个 makefile 不是绝对必要的,但您可以简单地将 myprogram 作为第一个目标。
    • 没有.PHONY: all 会失败,为什么需要它?我试过没有它,它似乎工作......或者你的意思是all应该总是.PHONY不管这个目标-包含组合?
    • @Vi。这只是一种预防措施,任何实际上没有使用该目标名称创建文件的目标都应该是PHONY。如果出于某种原因,makefile 文件夹中有一个名为 all 的文件,则该规则将停止工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2011-01-09
    • 1970-01-01
    • 2011-06-19
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多