【问题标题】:GNU makefile how to and when to quote stringsGNU makefile 如何以及何时引用字符串
【发布时间】:2014-06-13 08:37:27
【问题描述】:

如何以及何时在 make 文件中引用字符串?最佳做法是什么?

下面是引用的方式吗?

$(warning  $(shell ls -ld "$(CURDIR)" ) )

我熟悉 Bash,您通常在其中引用变量以允许嵌入空格。你会在 makefile 中这样做吗?

我应该如何用字符串做赋值语句?

vara := "$(CURDIR)"

varb := $(CURDIR)

varc := /home/me/source

vard := "/home/me/source"

等号后面的空格呢?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    你不应该因为make而引用任何东西。 Make 无法以任何方式理解或解析单引号或双引号字符。您在 makefile 中编写的每个引用字符都将保留为文字引号,并按原样传递给 make 调用的命令。

    因此,如果 shell 需要并且可以解释带引号的字符串,那么您应该使用引号。如果 shell 不期望或不会正确解释带引号的字符串,则不应使用引号。

    在您的示例中,引号是否可接受取决于这些变量的使用方式。如上所述,make 不会对引号做任何特殊处理,这意味着 vard(例如)包含文字字符串 "/home/me/source"(包括引号)。

    如果您使用该值的方式让 shell 为您处理引号,那么没问题:

    all: ; echo $(vard)
    

    将打印/home/me/source(无引号),因为shell 会解释它们。但是,如果您在 make 上下文中使用该变量,例如作为目标或先决条件:

    all: $(vard)
    $(vard): ; echo $@
    

    那么这是正确的,因为目标和先决条件是文字字符串"/home/me/source"(包括引号)。

    一般来说,最好不要在变量中的文件名周围使用引号,而是在配方中的 make 变量周围添加引号。当然,如果变量包含整个 shell 脚本,而不仅仅是文件名,那么您应该在脚本中添加适当的引用。

    【讨论】:

    • ifequ "$(varx)" "a" 是我困惑的部分原因。
    • 这样做的一个结果是 make 不能在文件名中包含空格。空格是列表分隔符,正如 MadScientist 指出的那样,不可引用。 make 通常会将这样的文件名分解成无用的片段。
    • 可能与 OP 的意图无关,但其他用户可能会来到这里并且不理解 make variables(如$(VARX))和 shell variables之间的区别i> 喜欢$${VARZ} - 请注意双美元符号$$ 用于区分它们在您想将shell变量作为变量传递给命令的情况下没有扩展那么你可能想使用单引号,例如:将$ORIGIN传递给链接器,然后使用带有单引号的cc -Wl,-rpath='$${ORIGIN}' -shared -fPIC -Wall $(SRC) -o $(DIR)/$(LIB)来防止它在shell中扩展。
    • 关于我的评论,请参阅MadScientists's answer on how to correctly pass $ORIGIN to the linker in a make file,其中使用了单引号和双美元符号,但-Wl,option 的语法与我的示例略有不同
    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    相关资源
    最近更新 更多