web-dev-qa-db-fra.com

GNU makefile comment et quand citer des chaînes

Comment et quand dois-je citer une chaîne dans un fichier make? Quelle est la meilleure pratique?

Est-ce que la façon suivante de citer?

$(warning  $(Shell ls -ld "$(CURDIR)" ) )

Je connais Bash où vous citez habituellement des variables pour permettre des espaces intégrés. Le faites-vous dans un makefile?

Comment dois-je faire des instructions d'affectation avec une chaîne?

vara := "$(CURDIR)"

varb := $(CURDIR)

varc := /home/me/source

vard := "/home/me/source"

Et l'espace après l'égal?

29
historystamp

Vous ne devez jamais citer quoi que ce soit à cause de make. Make ne comprend ni n'analyse en aucune façon les caractères entre guillemets simples ou doubles. Chaque caractère de citation que vous écrivez dans un makefile sera conservé sous forme de citation littérale et transmis tel quel aux commandes qui effectuent les invocations.

Donc, si le shell attend et peut interpréter une chaîne entre guillemets, vous devez utiliser des guillemets. Lorsque le shell n'attend pas ou n'interprète pas correctement une chaîne entre guillemets, vous ne devez pas utiliser de guillemets.

Dans vos exemples, l'acceptation ou non des guillemets dépend de la façon dont ces variables sont tilisées. Comme ci-dessus, make ne fera rien de spécial avec les guillemets, ce qui signifie que vard (par exemple) contient la chaîne littérale "/home/me/source" (y compris les guillemets).

Si vous utilisez cette valeur de manière à ce que le shell gère les guillemets pour vous, alors ça va:

all: ; echo $(vard)

imprimera /home/me/source (sans guillemets) car le Shell les interprète. Mais si vous utilisez la variable dans un contexte de création, par exemple en tant que cible ou condition préalable:

all: $(vard)
$(vard): ; echo $@

alors c'est pas juste, car la cible et la condition préalable sont les chaînes littérales "/home/me/source" (y compris les guillemets).

En général, il est préférable de ne pas utiliser de guillemets autour des noms de fichiers dans les variables, et plutôt d'ajouter les guillemets dans la recette autour de la variable make. Bien sûr, si la variable contient un script Shell entier, pas seulement un nom de fichier, vous devez ajouter des guillemets appropriés au script.

27
MadScientist