当前位置:  开发笔记 > 编程语言 > 正文

是否可以在Makefile中创建多行字符串变量

如何解决《是否可以在Makefile中创建多行字符串变量》经验,为你挑选了3个好方法。

我想创建一个多行字符串的makefile变量(例如电子邮件发布公告的正文).就像是

ANNOUNCE_BODY="
Version $(VERSION) of $(PACKAGE_NAME) has been released

It can be downloaded from $(DOWNLOAD_URL)

etc, etc"

但我似乎找不到办法做到这一点.可能吗?



1> Eric Melski..:

是的,您可以使用define关键字声明一个多行变量,如下所示:

define ANNOUNCE_BODY
Version $(VERSION) of $(PACKAGE_NAME) has been released.

It can be downloaded from $(DOWNLOAD_URL).

etc, etc.
endef

棘手的部分是让你的多行变量退出makefile.如果您只是使用"echo $(ANNOUNCE_BODY)"这一显而易见的事情,您将看到其他人在此处发布的结果 - shell尝试将变量的第二行和后续行作为命令本身处理.

但是,您可以将变量值按原样导出到shell作为环境变量,然后将其作为环境变量(不是make变量)从shell引用.例如:

export ANNOUNCE_BODY
all:
    @echo "$$ANNOUNCE_BODY"

注意使用$$ANNOUNCE_BODY,表示shell环境变量引用,而不是$(ANNOUNCE_BODY),这将是一个常规的make变量引用.还要确保在变量引用周围使用引号,以确保shell本身不会解释换行符.

当然,这个特殊技巧可能是平台和shell敏感的.我在Ubuntu Linux上使用GNU bash 3.2.13进行了测试; 因人而异.


实际上,这不适用于标准品牌,只有gnu品牌.

2> malcook..:

"让你的多行变量退出makefile"的另一种方法(由Eric Melski称为"棘手的部分")是计划使用该subst函数替换define多行字符串中引入的换行符\n.然后使用-e with echo来解释它们.您可能需要设置.SHELL = bash以获得执行此操作的回显.

这种方法的一个优点是你还可以将其他类似的转义字符放入文本中并使其得到尊重.

这种综合了到目前为止提到的所有方法......

你结束了:

define newline


endef

define ANNOUNCE_BODY=
As of $(shell date), version $(VERSION) of $(PACKAGE_NAME) has been released.  

It can be downloaded from $(DOWNLOAD_URL).  

endef

someTarget:
    echo -e '$(subst $(newline),\n,${ANNOUNCE_BODY})'

请注意,最终回波上的单引号至关重要.


请注意,"echo -e"不可移植.您应该更喜欢printf(1).
但是,我必须在`define ANNOUNCE_BODY`之后删除`=`以使其运行.

3> 小智..:

假设您只想在标准输出上打印变量的内容,还有另一种解决方案:

do-echo:
    $(info $(YOUR_MULTILINE_VAR))

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有