【问题标题】:Makefile missing separator. Stop. error with eval and variablesMakefile 缺少分隔符。停止。 eval 和变量的错误
【发布时间】:2019-03-27 15:46:30
【问题描述】:

这不是空间 VS。标签问题。

我正在编写一些 Make 目标来依次运行 Terraform 和 Helm,并且我需要捕获部分 Terraform 输出以传递给后续的 Helm 目标。这是我到目前为止所得到的:

TF        := terraform
RND_ENV   := deployment/envs/rnd
RND_PLAN  := tfplan-rnd.out
RND_APPLY := tfapply-rnd.out

.PHONY: init-rnd plan-rnd apply-rnd deploy-rnd

init-rnd:
    @$(TF) init $(RND_ENV)

plan-rnd: init-rnd
    @$(TF) plan -out=$(RND_PLAN) $(RND_ENV)

apply-rnd: plan-rnd
    $(TF) apply -no-color $(RND_PLAN) | tee $(RND_APPLY)
    $(shell grep my_output_var $(RND_APPLY) | awk '{print $$3}' > .my_output_var)
    @rm $(RND_APPLY)

# ...further steps omitted...

再一次,我可以向您保证,我在 Makefile 中使用的是 TABS 而不是 SPACES。我已经检查并仔细检查了。但是,当我运行make apply-rnd 时,它成功运行init-rnd 目标,成功运行plan-rnd 目标,但随后在该目标的第一行中断并显示以下消息:

Makefile:15: *** 缺少分隔符。停下来。

我假设它与管道有关?或者也许是变量的使用?

无论如何,当我在 Bash 中手动运行这些命令时,这些相同的命令仍然有效......我只需要让它们在这个 Makefile 中工作。

【问题讨论】:

    标签: makefile


    【解决方案1】:

    你为什么在这里使用evaleval 函数旨在评估 makefiles。您正在尝试向它传递不是 makefile 语法的 shell 命令,因此您会收到错误。

    只需在 shell 中运行命令:删除 eval 函数。

    【讨论】:

    • 我添加了 eval 以使其正常工作。即使它不存在,我也会得到完全相同的错误。我会更新我的问题以反映这一点。
    • 您也应该删除$(shell...)。您已经在 shell 中:只需键入要运行的命令。在配方中使用evalshell 是一个很大的反模式。但是我在这里无法理解您的cmets。当make 解析 makefile 时会发生此错误,并且make 总是在开始构建任何目标之前解析整个makefile。因此,无论您尝试构建什么目标,每次运行 make 时都应该看到它。
    • 我明白这一点。请参阅我评论的第二部分。如果您确实仅在运行某些make xxxx 命令而不是其他命令时看到此错误,这意味着这里发生了一些您没有向我们展示的事情。也许有一个递归的 make 调用,或者你只在命令行上给出了一些目标时才包含一个 makefile,或者其他什么。我建议您使用make -d 运行并尝试看看这里有什么不同。
    • 没关系,我完全错了。我被误导了,因为我认为 Makefile 错误中的行号告诉我问题发生在同一行。然而,从它后面的行中删除 shell 确实解决了这个问题。
    猜你喜欢
    • 2022-01-05
    • 2023-03-21
    • 1970-01-01
    • 2020-05-02
    • 2019-02-06
    • 2022-01-20
    • 2013-09-26
    相关资源
    最近更新 更多