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 ?
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 ?
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.
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.
Oui. Vous échapper les sauts de ligne avec `` :
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]
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.