是否有可能在一个Makefile中创建一个多行字符串变量

我想创建一个makefile变量,它是一个多行字符串(电子邮件发布公告的如身体)。 就像是

ANNOUNCE_BODY=" Version $(VERSION) of $(PACKAGE_NAME) has been released It can be downloaded from $(DOWNLOAD_URL) etc, etc"

但我似乎无法找到一个方法来做到这一点。 可能吗?

--------------解决方案-------------

是的,你可以使用定义关键字来声明一个多行变量,就像这样:

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

It can be downloaded from $(DOWNLOAD_URL).

etc, etc.
endef

最棘手的部分是让你多行变量背出生成文件。 如果你只是做使用的明显的事情“回声$(ANNOUNCE_BODY)”,你会看到,其他人已经张贴在这里的结果 - 壳试图为命令本身来处理变量的第二个和后续行。

但是,您可以导出变量值,是壳作为一个环境变量,然后从壳作为一个环境变量(不是make变量)引用它。 例如:

export ANNOUNCE_BODY
all:
@echo "$$ANNOUNCE_BODY"

注意使用$$ANNOUNCE_BODY显示一个shell环境变量的引用,而不是$(ANNOUNCE_BODY)这将是一个经常使变量引用。 此外,一定要使用在你的变量参考报价,以确保新行不是由shell本身的解释。

当然,这个特定的特技可以是平台和壳体敏感。 我测试了它在Ubuntu Linux和GNU bash的3.2.13; 情况因人而异。

另一种“让你多行变量背出Makefile中”(埃里克Melski标注为“棘手的问题”),是计划使用subst功能,以取代推出的新行define您的多行字符串用\n 然后使用-e与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))

GNU'化妆'手动,6.8:定义多行变量

你为什么不使用你的字符串的\ n字符来确定最终的行? 另外添加额外的反斜杠添加多行。

ANNOUNCE_BODY=" \n\
Version $(VERSION) of $(PACKAGE_NAME) has been released \n\
\n\
It can be downloaded from $(DOWNLOAD_URL) \n\
\n\
etc, etc"

就在附言埃里克Melski的回答是:你可以在文本中包含命令的输出,但是你必须使用的Makefile的语法“$(壳富)”,而不是shell语法“$(富)”。 例如:

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

It can be downloaded from $(DOWNLOAD_URL).

endef

我相信,跨平台使用最安全的答案是使用一个回音每行:

ANNOUNCE.txt:
rm -f $@
echo "Version $(VERSION) of $(PACKAGE_NAME) has been released" > $@
echo "" >> $@
echo "It can be downloaded from $(DOWNLOAD_URL)" >> $@
echo >> $@
echo etc, etc" >> $@

这避免了使对回声可用的版本的任何假设。

您应该使用“定义/ endef”制作结构:

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

It can be downloaded from $(DOWNLOAD_URL).

etc, etc.
endef

然后,你应该通过这个变量的值,以shell命令。 但是,如果你做到这一点使用使变量替换,就会造成命令分割成多个:

ANNOUNCE.txt:
echo $(ANNOUNCE_BODY) > $@ # doesn't work

Qouting也不会有帮助。

传递价值的最佳方式是通过环境变量传递给它:

ANNOUNCE.txt: export ANNOUNCE_BODY:=$(ANNOUNCE_BODY)
ANNOUNCE.txt:
echo "$${ANNOUNCE_BODY}" > $@

注意:

  1. 可变输出为这个特定的目标,这样就可以重复使用的环境不会得到很大的污染;
  2. 使用环境变量(双qoutes和大括号的变量名);
  3. 各地使用的变量报价。 没有他们的换行符将丢失,所有的文字将出现在一行。

是。 你逃脱的换行\

VARIABLE="\
THIS IS A VERY LONG\
TEXT STRING IN A MAKE VARIABLE"

更新

嗯,你想换行? 然后不,我不认为有任何方式的香草制作。 但是,你总是可以在命令部分使用此文档

[这不能正常工作,请参阅从MadScientist评论]

foo:
echo <<EOF
Here is a multiple line text
with embedded newlines.
EOF

随着GNU时许.ONESHELL选项是你的朋友,当谈到多行的shell代码片段。 从其他的答案放在一起的提示,我得到:

VERSION = 1.2.3
PACKAGE_NAME = foo-bar
DOWNLOAD_URL = $(PACKAGE_NAME).somewhere.net

define nwln

endef

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

It can be downloaded from $(DOWNLOAD_URL).

etc, etc.
endef

.ONESHELL:

# mind the *leading* <tab> character
version:
@printf "$(subst $(nwln),\n,$(ANNOUNCE_BODY))"

确保,当复制和粘贴上面的例子到编辑器,任何<tab>字符将被保留,其他的version目标将突破!

这不给这里的文件,但它的方式,也适用于管显示多行消息。

=====

MSG = this is a\\n\
multi-line\\n\
message

method1:
@$(SHELL) -c "echo '$(MSG)'" | sed -e 's/^ //'

=====

您也可以使用GNU的可调用宏:

=====

MSG = this is a\\n\
multi-line\\n\
message

method1:
@echo "Method 1:"
@$(SHELL) -c "echo '$(MSG)'" | sed -e 's/^ //'
@echo "---"

SHOW = $(SHELL) -c "echo '$1'" | sed -e 's/^ //'

method2:
@echo "Method 2:"
@$(call SHOW,$(MSG))
@echo "---"

=====

下面是输出:

=====

$ make method1 method2
Method 1:
this is a
multi-line
message
---
Method 2:
this is a
multi-line
message
---
$

=====

不是一个真正的有用的答案,但只是为了表明,'定义'不工作,回答了斧头(不适合评论):

VERSION=4.3.1
PACKAGE_NAME=foobar
DOWNLOAD_URL=www.foobar.com

define ANNOUNCE_BODY
Version $(VERSION) of $(PACKAGE_NAME) has been released
It can be downloaded from $(DOWNLOAD_URL)
etc, etc
endef

all:
@echo $(ANNOUNCE_BODY)

它给出了一个错误的命令'这是无法找到,因此它试图解释ANNOUNCE体作为命令的第二行。

它的工作对我来说:

ANNOUNCE_BODY="first line\\nsecond line"

all:
@echo -e $(ANNOUNCE_BODY)

GNU Makefile中可以做的事情如下所示。 这是丑陋的,我不会说你应该这样做,但我确实在某些情况下。

PROFILE = \
\#!/bin/sh.exe\n\
\#\n\
\# A MinGW equivalent for .bash_profile on Linux. In MinGW/MSYS, the file\n\
\# is actually named .profile, not .bash_profile.\n\
\#\n\
\# Get the aliases and functions\n\
\#\n\
if [ -f \$${HOME}/.bashrc ]\n\
then\n\
. \$${HOME}/.bashrc\n\
fi\n\
\n\
export CVS_RSH="ssh"\n
#
.profile:
echo -e "$(PROFILE)" | sed -e 's/^[ ]//' >.profile

make .profile创建一个.profile文件,如果不存在。

使用该溶液,其中该应用程序将只使用GNU生成文件在POSIX壳环境。 该项目是不是一个开源项目中,平台兼容性是一个问题。

我们的目标是创建一个Makefile,有利于双方建立和使用一种特殊的工作空间的。 Makefile的带来与它一起各种简单的资源,而无需像其它特殊归档等,这是,从某种意义上说,一个shell归档。 那么过程可以说这样的话砸这个Makefile中工作的文件夹中。设置工作区进入make workspace ,然后做等等,进入make blah ,等等。

什么可能很麻烦就是搞清楚什么壳报价。 以上做这项工作,靠近指定位置的文件在Makefile中的想法。 无论是用于一般用途一个好主意,是一个整体的其他问题。

分类:变量 时间:2015-03-14 人气:0
本文关键词: 变量,生成文件
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.936 (s). 10 q(s)