149 votes

Est-il possible de créer une variable de chaîne multiligne dans un Makefile

Je veux créer une variable de makefile qui est une chaîne multiligne (par exemple le corps d’un email communiqué annonce). quelque chose comme

Mais je n’arrive pas à trouver un moyen de le faire. Est-ce possible ?

215voto

Eric Melski Points 8325

Oui, vous pouvez utiliser le définir des mots clés pour déclarer un multi-ligne variable, comme ceci:

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

It can be downloaded from $(DOWNLOAD_URL).

etc, etc.
endef

La partie la plus délicate est l'obtention de votre multi-ligne de la variable de retour de l'makefile. Si vous venez de faire la chose la plus évidente de l'utilisation de "echo $(ANNOUNCE_BODY)", vous verrez le résultat que les autres ont posté ici: le shell essaie de traiter la deuxième ligne et les lignes suivantes de la variable que les commandes elles-mêmes.

Toutefois, vous pouvez exporter la valeur de la variable en tant que-est de la carapace comme une variable d'environnement, puis de référence de la coquille comme une variable d'environnement (PAS une variable). Par exemple:

export ANNOUNCE_BODY
all:
    @echo "$$ANNOUNCE_BODY"

Notez l'utilisation de l' $$ANNOUNCE_BODY, indiquant un environnement shell variable de référence, plutôt que d' $(ANNOUNCE_BODY), ce qui serait régulièrement faire référence à une variable. Assurez-vous également d'utiliser des guillemets autour de la variable de référence, afin de s'assurer que les retours à la ligne ne sont pas interprétés par le shell lui-même.

Bien sûr, cette astuce peut être de la plateforme et de shell sensibles. Je l'ai testé sur Ubuntu Linux avec GNU bash 3.2.13; YMMV.

30voto

malcook Points 351

Une autre approche de l'obtention de votre multi-ligne de la variable de retour de l'makefile "(noté par Eric Melski comme " la partie la plus délicate), c'est planifier l'utilisation de l' subst fonction pour remplacer les retours à la ligne introduit avec define dans votre multi-ligne de chaîne avec \n. Ensuite, utilisez -e, echo pour les interpréter. Vous devrez peut-être régler le .=SHELL bash pour obtenir un écho qui fait cela.

Un avantage de cette approche est que vous aussi vous mettre d'autres caractères d'échappement dans votre texte et de les faire respecter.

Ce genre de fait une synthèse de toutes les approches mentionnées jusqu'à présent...

Vous vous retrouvez avec:

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})'

Notez les guillemets simples sur la dernière écho sont cruciales.

15voto

superwhoopy Points 31

En supposant que vous ne voulez pas imprimer le contenu de votre variable sur la sortie standard, il y a une autre solution :

7voto

Charlie Martin Points 62306

Oui. Vous échapper les sauts de ligne avec `` :

mise à jour

Ah, vous voulez les sauts de ligne ? Alors non, je ne pense pas qu'il y a un moyen de vanille faites. Toutefois, vous pouvez toujours utiliser un here-document dans la partie commande

[Cela ne pas travailler, voir commentaire de MadScientist]

1voto

ax. Points 22269

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X