我想创建一个多行字符串的makefile变量(例如电子邮件发布公告的正文).就像是
ANNOUNCE_BODY=" Version $(VERSION) of $(PACKAGE_NAME) has been released It can be downloaded from $(DOWNLOAD_URL) etc, etc"
但我似乎找不到办法做到这一点.可能吗?
是的,您可以使用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进行了测试; 因人而异.
"让你的多行变量退出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})'
请注意,最终回波上的单引号至关重要.
假设您只想在标准输出上打印变量的内容,还有另一种解决方案:
do-echo: $(info $(YOUR_MULTILINE_VAR))