【问题标题】:Makefile with sed throwing *** target pattern contains no '%'. Stop带有 sed 抛出 *** 目标模式的 Makefile 不包含“%”。停止
【发布时间】:2020-04-13 17:51:11
【问题描述】:

我有一个 Makefile,我需要在其中将图像名称传递给另一个脚本,但问题是,图像名称在其行中有:和 - 例如:image.name-v1:latest。根据 google make 文件具有 : in 变量会导致问题。如何在 Makefile 中解决此问题。下面是我正在尝试的示例代码,其中 IMAGE 具有 image.name-v1:latest

IMAGE2 ?= ''
.PHONY: image
image:
    IMAGE2 := $(subst :,\:,$(IMAGE_R)) ## IMAGE_R is a run time variable for make target
    rr/image.sh $(IMAGE2)

错误:

IMAGE2 := docker-rs\:latest ## Test Image using Image Reference
/bin/sh: 1: IMAGE2: not found
Makefile:75: recipe for target 'image' failed
make: *** [image] Error 127

外壳脚本:image.sh

#!/bin/bash
set -ex
IMAGE="$1"
echo "Image:  $IMAGE"

【问题讨论】:

  • 您收到此特定错误的原因是IMAGE2 := ... 是一个makefile 行,但您通过在image: 目标之后使用TAB 缩进它来将其放入配方中。所有配方行都传递给 shell 以运行。 shell 不能“运行”这个 make 变量赋值。您需要将IMAGE2 := ... 行保留在配方的外部,就像您对IMAGE2 ?= '' 行所做的那样。看看@code_fodder 是如何在下面写的。
  • 但这是一个传递给图像目标的变量,那么如何将它传递给其他地方呢?
  • 对不起,我不明白这个问题。除了高级用途之外,在 makefile 中声明的所有 make 变量都是全局变量,它们在所有配方中都可用。
  • 感谢这个工作,只是把 IMAGE2 的外在制作配方

标签: shell sed makefile gnu-make


【解决方案1】:

您可以尝试像这样转义冒号:

# Mock IMAGE with colon in name
IMAGE := test:123
# Create new variable adding an escapeing slash
IMAGE2 := $(subst :,\:,$(IMAGE))

# Use IMAGE2 from here on
$(info IMAGE $(IMAGE))
$(info IMAGE2 $(IMAGE2))

.PHONY: xyz-pp
xyz-pp: $(IMAGE2)

.PHONY: $(IMAGE2)
$(IMAGE2):
    @echo "1234" > $(IMAGE2)
    @ls
    @rr/image.sh $(IMAGE2)

我在子文件夹rr中添加了一个脚本:

echo "------------- SCRIPT ----------"
echo PARAM: $1
echo $(find -name "$1")
echo "------------- SCRIPT ----------"

输出:

> make
IMAGE test:123
IMAGE2 test\:123
makefile  rr  test:123
------------- SCRIPT ----------
PARAM: test:123
./test:123
------------- SCRIPT ----------

所以这里我只是将“:”替换为“:”到一个变量 IMAGE2 中,然后使用它。

注意:我只是通过回显您的命令(因为我没有那个文件)并触摸 IMAGE2 来创建文件来测试这一点

【讨论】:

  • 这导致另一个问题,image.sh 无法找到 IMAGE2
  • @SaurabhArora 这不是 makefile 的问题,而是脚本中的问题。使用带冒号的文件名并非易事。我已更新答案以显示文件名已成功传递到脚本中。该脚本按预期运行并打印参数。 find 函数也会按预期找到文件。由于文件名中的冒号,其他 bash / shell 函数可能存在问题 - 我建议您在 makefile 外部测试该问题(仅通过单独运行脚本)并提出单独的问题来解决该问题。跨度>
  • 这行得通,我只需要将 IMAGE2 := $(subst :,\:,$(IMAGE_R)) 放在@MadScientist 提到的配方之外,感谢您的帮助!!!
  • @SaurabhArora ...嗯,哈哈...当我说要问另一个问题时,我并不是要改变这个问题! - 最好问一个新问题。我的答案现在不再回答发布的问题 - 所以它没有真正意义,请记住下次 - 这样做的目的是保持问题和答案的质量,以便以后搜索/阅读它们的人可以获得最大的好处: )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多