web-dev-qa-db-fra.com

Fonction "patsubst" dans Makefile

À partir de docs :

$(patsubst PATTERN,REPLACEMENT,TEXT)

Recherche les mots séparés par des espaces dans TEXT qui correspondent au MOTIF et les remplace par REMPLACEMENT. Ici, le MOTIF peut contenir un % qui agit comme un caractère générique, correspondant à n'importe quel nombre de caractères dans un mot.
...
L'espace entre les mots est plié en un seul espace caractères; les espaces blancs avant et arrière sont supprimés.



Maintenant, étant donné un makefile, c'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)"'



Exécution, nous obtenons:

foo is: "y    y    y"
bar is: "y y y"



Donc, il est évident que Make, may or may not "plie" tous les espaces en un seul espace .

Ou, ai-je fait quelque chose de mal.

16
Ji Cha

En fait tout est expliqué dans le doc :

Recherche les mots séparés par des espaces dans TEXT ...

signifie qu'un ou plusieurs espaces doivent séparer les mots.

... qui correspondent au MOTIF ...

signifie qu'il ne sélectionne que les mots qui correspondent à un modèle (qui peut inclure certains espaces).

... et les remplace par REMPLACEMENT.

signifie que les motifs sélectionnés seront remplacés par un remplacement.


Une image vaut mieux que mille mots.

Pour PATTERN = X:

           +----  SEPARATORS  ----+
           |                      |
   +-------+-------+     +--------+------+
   |               |     |               | 
X  space space space  X  space space space  x
|                     |                     |
+---------------------+---------------------+
                      |
                   PATTERNS

Pour PATTERN = X%:

                 +----  SEPARATORS  ---+
                 |                     |
               +-+-+                 +-+-+
               |   |                 |   | 
X  space space space  X  space space space  x
|            |        |            |        |
+------+-----+        +------+-----+        |
       |                     |              |
       +---  PATTERNS  ------+--------------+

Chose intéressante:

Lorsque vous utilisez le % caractère dans votre modèle, vous pouvez le réutiliser dans le remplacement, comme ceci:

$(patsubst x%,y%,xa xb xc)
# Will be "ya yb yc"

Mais lorsque vous avez un espace dans le % variable, make les supprimera dans le remplacement.

$(patsubst x%,y%,xa   xb   xc)
# Will also be "ya yb yc"

EDIT: Après avoir lu le code source , les choses intéressantes sont:

Voici donc le comportement:

  1. Sinon % dans le pattern, c'est une simple substitution (qui garde les espaces).
  2. Sinon, il divise le text par des mots et supprime tous les espaces (en utilisant la fonction isblank ).
  3. Enfin, il fait le remplacement
17
jml