La fonction “patsubst” dans le Makefile
De la docs:
$(patsubst PATTERN,REPLACEMENT,TEXT)
Trouve des espaces séparés mots dans le TEXTE qui correspond au MOTIF et
les remplace par de REMPLACEMENT. Ici MODÈLE peut contenir un%
qui agit comme un caractère générique, correspondant à n'importe quel nombre de caractères
l'intérieur d'un mot....
Les espaces entre les mots est plié en un seul espace caractères;
attaque et de fuite les espaces sont ignorés.
Maintenant, étant donné un makefile, est:
# The pattern for patsubst, does NOT contain '%'
foo := $(patsubst x,y,x x x)
# The pattern for patsubst, does contain '%'
bar := $(patsubst x%,y,x x x)
# The variable 'foo', is a result from a patsubst-pattern, that did NOT contain a '%'
# The variable 'bar', is a result from a patsubst-pattern, that did contain a '%'
all ::
@echo 'foo is: "$(foo)"'
@echo 'bar is: "$(bar)"'
En cours d'exécution, nous obtenons:
foo is: "y y y"
bar is: "y y y"
Donc, il est évident, que Faire, peut-être ou peut pas "pli" tous les espaces en un seul et unique espace.
Ou, ai-je fait quelque chose de mal.
OriginalL'auteur Ji Cha | 2015-08-24
Vous devez vous connecter pour publier un commentaire.
En fait tout est expliqué dans le doc:
signifie qu'un ou plusieurs espaces pour séparer les mots.
signifie qu'il sélectionner uniquement les mots qui correspondent à un modèle (qui peut inclure des espaces).
signifie que le pattern sélectionné sera remplacer par une nouvelle.
Une image vaut mille mots.
Pour
PATTERN = X
:Pour
PATTERN = X%
:Chose intéressante:
Lorsque vous utilisez le
%
personnage dans votre profil, vous pouvez ré-utiliser dans la zone de remplacement, comme ceci:Mais quand vous avez de l'espace dans le caractère
%
variable, faire dépouiller dans le remplacement.EDIT: Après la lecture de la le code source, les choses intéressantes sont:
function.c +146
: La fonctionpatsubst_expand_pat
misc.c +337
: La fonctionfind_next_token
misc.c +325
: La fonctionnext_token
Voici donc le problème:
%
dans lepattern
, c'est une simple substitution (qui gardent les espaces).text
par les mots et de se débarrasser de tous les espaces (à l'aide de la isblank fonction).pattern-rules
etpattern-specific variables
, accepte de Faire un chaîne vide, comme un match pour%
. Oui,%
-les règles de correspondance, ne sont pas compatibles dans les fonctionnalités de Faire. Et nous, pouvons-nous tous les deux d'accord, que%
adapté (dans mon exemple) le vide-chaîne, et seulement lui. Il l'a prouvé 🙂Pour être clair, dans votre exemple
%
appariésspace space
dans la chaîne d'entrée. Et effectivement remplacé par le vide-chaîne dans la chaîne de sortie.Je suis en total désaccord. Les règles pour
$(patsubst pattern,replacement,text)
quand il y a est un%
dans lepattern
, sont les suivants: 1)Sitext
est vide OU rendu vide après la variable d'expansion, alors, la fonction se développe - toujours - une chaîne vide. 2) Si,text
est non-vide, alors si elle contient des WS, alors tout d'abord séparer les mots, effectivement se débarrasser tous white-space, puis faites par chaque argument - le "pattern-matching", où les règles de correspondance ne nécessitent pas l'%
pour correspondre à une chaîne non vide. Oui, c'sémantique, mais il importe, comme l'a démontré dans le dernier paragraphe de votre post.Voir mon edit à la fin. Vous avez raison, effectivement se débarrasser des espaces de caractères avant de faire le remplacement lorsque le
pattern
ont un%
.OriginalL'auteur jml