【问题标题】:Makefile compare string inputMakefile 比较字符串输入
【发布时间】:2021-10-01 09:19:34
【问题描述】:

为了更好地理解 Makefile 中的字符串变量,我尝试做这个例子:

KEYWORD=Nothing

test:
    $(call myFunc)

define myFunc
ifeq ($(KEYWORD), "Apple")
    echo "You have found the key"
else
    echo "Try again"
endif
endef

但是当我打字的时候

make test KEYWORD="Fork"

打印错误

syntax error near unexpected token `Fork,'
`ifeq (Fork, "Apple")'

我也试过了:

  • 将 Apple 或 'Apple' 放入 ifeq
  • 在 "," 之后是否加空格:ifeq ($(KEYWORD), "Apple")
  • 使用 KEYWORD=Fork 运行命令
  • 使用 shell 做到了吗(如果 [ ${KEYWORD} -eq "Apple" ])

我的想法已经用完了,因为我不明白 Makefille / Shell 如何解释分配 KEYWORD="Fork"

谢谢

【问题讨论】:

  • 顺便说一句,你应该用KEYWORD=Nothing替换$KEYWORD=Nothing
  • 是的,打错了,我没有把$放到我的文件里,sy(在帖子中编辑)

标签: shell makefile


【解决方案1】:

MadScientist 发现了问题。也许您正在寻找的解决方案只是更早地评估条件。例如:

KEYWORD ?= NOTHING
...
ifeq ($(KEYWORD), Apple)
define myFunc
        echo "You have found the key"
endef
else
define myFunc
        echo "Try again"
endef
endif

【讨论】:

  • 它只打印 Try again with command like "make test KEYWORD="......"
  • 您需要在赋值中使用KEYWORD ?= NOTHING,除非您希望关键字包含双引号,否则您可能希望使用Apple 而不是"Apple"
【解决方案2】:

首先,$(call myfunc) 与写作$(myfunc) 100% 相同。 make 中的call 函数只是扩展了一个变量,其中首先绑定了一些其他局部值(参数)。如果您不提供任何本地值,那么您只是在扩展变量。

扩展变量只是将变量引用替换为它扩展的内容。所以写:

FOO = bar
foo:
        echo $(FOO)

与写作100%相同:

foo:
        echo bar

所以在你的情况下,

test:
        $(call myFunc)

等同于:

test:
        $(myFunc)

等同于:

test:
        ifeq ($(KEYWORD), "Apple")
            echo "You have found the key"
        else
            echo "Try again"
        endif

这就是您得到输出的原因:这些不是有效的 shell 命令,但由于您已将变量作为配方的一部分进行了扩展,因此它们会作为配方的一部分发送到 shell。

【讨论】:

  • 感谢您的回答,我已经使用最后一个代码进行了测试(没有在上面创建函数和变量)并运行命令 make test KEYWORD="Fork"(并且没有“”)。它打印相同的错误
  • 这并没有说明如何使它工作,因为您没有要求这样做:您想了解变量,所以这是对您看到的行为的解释,因此您可以了解正在发生的事情以及 make 如何解释您的变量。如果问题是需要进行哪些更改才能使其正常工作,您应该问:)。需要明确的是,make 如何解释 KEYWORD=fork 并没有什么神秘之处;它可以按您的预期工作。您遇到的问题是您如何使用变量myFunc。
猜你喜欢
  • 1970-01-01
  • 2015-07-02
  • 2022-06-29
  • 2020-02-29
  • 1970-01-01
  • 2021-08-22
  • 2019-02-06
  • 2018-01-20
  • 2017-04-14
相关资源
最近更新 更多