【问题标题】:Make: evaluating result of call: recipe commences before first target制作:评估调用结果:配方在第一个目标之前开始
【发布时间】:2021-07-05 10:03:28
【问题描述】:

我有几个文件用于我的 GNU make 设置。在this.mk中,我有

define this_template
THIS = $(1)
THIS_DIR = $(2)
THIS_LIBNAME = $(3)
THIS_EXTERNAL_DIRS = $(4)
...
endef

在我的 Makefile 中,我有

include this.mk
... # define VAR1 and VAR2
include util/make.mk
...

util/make.mk 包含一行:

$(eval $(call this_template,UTIL,$(VAR1),plutil,$(VAR2)))

但是,当我运行 make 时,我得到了

util/make.mk:1: *** 配方在第一个目标之前开始。停下来。

阅读与此错误消息相关的其他问题,我的理解是,此错误是由评估一个字符串引起的,该字符串以一种看起来像是在食谱内部的方式开始。但是,我正在评估的不是。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    此错误意味着 (a) 该行以 TAB 开头(或者更具体地说,如果您的 GNU make 版本支持,则该字符定义为 .RECIPE_PREFIX), (b)它不被识别为任何类型的 make 命令,例如规则介绍等。

    鉴于您在这里与我们分享的内容,这不可能发生。所以肯定有一些你没有与我们分享的事情发生。也许其他包含的 makefile 之一正在修改 this_template 变量以包含其他内容。

    调试eval 问题的方法总是相同的,无论它们是什么:将eval 更改为info,这样make 就会打印出它要评估的内容。这通常可以很明显地表明问题所在。所以使用:

    $(info $(call this_template,UTIL,$(VAR1),plutil,$(VAR2)))
    $(eval $(call this_template,UTIL,$(VAR1),plutil,$(VAR2)))
    

    看看 make 会告诉你什么。

    【讨论】:

    • 我试过了,一切看起来都和它应该的一样。
    • 啊。原来生成的“代码”有if <some_condition <some_target/recipe> <endif>。这就是它不喜欢的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多