2012-06-14 2 views
4

J'ai donc makefile avec une dépendance cible comme ceci:Puis-je avoir plus d'un signe% dans une cible makefile?

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xml$(lang))) 

et la cible targetName ressemble à ceci:

targetName%.xml%: MODEL\=% targetName.xml* 

Mais il ne fonctionne pas. Je reçois cette erreur:

make[1]: *** No rule to make target `targetNameMYMODEL.xmlen', needed by `all'. Stop. 

cependant d'appeler « tous » avec un langage codé en dur dans la cible de targetName comme cela fonctionne:

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xmlen)) 

et appelant « tous » sans la langue dans tout ou targetName fonctionne bien aussi. Je pense que Makefile n'aime pas avoir deux signes de pourcentage dans le nom de la cible.

En outre, puisque j'ai en quelque sorte hérité de ce makefile, quelqu'un peut-il me dire ce que signifie ce MODEL \ =%? Il y a une autre cible qui ressemble à ceci: MODEL%: ; mais je ne suis pas sûr de savoir ce que signifie \ =%.

Edit: Donc, pour clarifier davantage la base de cette Reponse:

J'ai une liste de, disons, 5 modèles et une liste de dire 5 langues, l'objectif est de générer 25 fichiers, un pour chaque combinaison des langues et des modèles.

targetName% .xml target à l'origine créer un fichier appelé targetName.xml mais maintenant j'en ai besoin pour construire quelque chose comme targetName.xml C'est pourquoi j'avais besoin des deux signes%.

Je parcours ces deux listes avec un foreach imbriqué comme indiqué ci-dessus, mais j'ai du mal à passer ces variables aux cibles. J'ai essayé d'exporter la variable de langue à partir de l'instruction foreach, j'ai essayé de placer le contenu du targetName% .xml dans une boucle for pour faire une boucle dans les langages là. Ce dernier ne fonctionne pas car il y a des commandes Makefile (comme eval par exemple) dans la partie 'do' de la boucle.

Répondre

2

Vous avez raison, Make n'aime pas deux symboles % dans le nom de la cible. C'est juste une des façons dont le traitement générique de Make n'est pas tout ce que l'on pourrait souhaiter. Il existe un moyen de générer automatiquement toutes les règles de modèle en effectuant une itération sur les valeurs d'une variable (et en utilisant % pour l'autre) automatiquement; c'est un peu moche, mais si c'est ce que tu veux on peut te montrer.

Mais cette ligne est un gâchis:

targetName%.xml%: MODEL\=% targetName.xml* 

Outre le problème de deux jokers dans la cible, les derniers PREQ, targetName.xml* signifiera exactement cela: une cible (ou un fichier) appelé targetName.xml*. L'astérisque ne sera pas développé, pas à une liste de tous les fichiers existants qui commencent par targetName.xml, ou toute autre chose.

Ensuite, il y a MODEL\=%, ce qui indique que l'auteur de ce makefile était un peu confus (et ne croyait pas aux tests). Si la valeur du caractère générique est foo, cela indique un prérequis qui est une cible (ou un fichier) nommée MODEL=foo. Le \ "échappe" le =, de sorte que Make n'abandonnera pas, mais c'est simplement la suppression d'un message d'erreur sain.Je pense que l'auteur avait à l'esprit était quelque chose comme ceci:

targetName%.xml: MODEL=% 

targetName%.xml: $(wildcard targetName.xml*) 
    do some things 

La première règle n'est pas une condition préalable spécifiant, il est définissant une variable spécifique à la cible. Ainsi, lorsque Make tente de générer targetNamefoo.xml par doing some things, la variable MODEL aura la valeur foo dans le contexte de cette commande. La deuxième règle a une liste preq, générée par wildcard; vous ne pouvez pas mélanger des variables et des préqs spécifiques à une cible dans une ligne.

Nous pouvons donner d'autres conseils, mais il serait utile si nous pouvions voir un peu plus clairement ce que vous essayez de faire.

Questions connexes