2009-02-04 7 views
3

J'ai une liste d'objets dans une variable Makefile appelée OBJECTS qui est trop grande pour le tampon de commande. Par conséquent, je suis en utilisant la méthode suivante pour créer un fichier répertoriant les objets (pour passer à ar):Créer un fichier à partir d'une grande variable Makefile

objects.lst: 
    $(foreach OBJ,$(OBJECTS),$(shell echo "$(OBJ)">>[email protected])) 

Bien que cela fonctionne, il est extrêmement lent (sur Cygwin au moins) et je n'aime pas compter sur commandes shell et redirection.

Additionnellement foreach n'est pas prévu à cet effet - il est évalué avant toute commande, ce qui signifie que je ne peux pas par exemple rm -f objects.lst avant de l'ajouter.

Y a-t-il un meilleur moyen? Je ne veux pas utiliser l'archivage incrémental car cela cause des problèmes avec plusieurs tâches. La seule chose que je peux penser est d'analyser le Makefile avec un script séparé pour lire la liste d'objets ou pour stocker la liste d'objets dans un fichier séparé. Les deux solutions ont leurs propres problèmes cependant.

Répondre

1

Dans l'exemple suivant, également remplacé l'écho avec un simple script Perl pour diviser les arguments sur de nouvelles lignes, mais c'est le jist de celui-ci ..

objects.lst: 
    echo $(wordlist 1,99,$(OBJECTS))>[email protected] 
    echo $(wordlist 100,199,$(OBJECTS))>>[email protected] 
    echo $(wordlist 200,299,$(OBJECTS))>>[email protected] 
    echo $(wordlist 300,399,$(OBJECTS))>>[email protected] 
    ... 
1

Essayez quelque chose comme:

OBJECTS:=a b c d 
objects.lst: 
     echo > [email protected] <<EOF  $(OBJECTS) 

à savoir faire usage de la fonctionnalité <<EOF qui est intégré dans la coque. Il n'a aucune limite de longueur maximale.

+0

a frappé encore des erreurs avec cette marque : execvp:/bin/sh: Liste d'arguments trop longue make: *** [objects.lst] Erreur 127 – sholte

0

Que diriez-vous quelque chose comme ceci:

OBJECTS_AM=$(filter a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS)) 
OBJECTS_NZ=$(filter-out a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS)) 

objects.lst: 
$(shell echo "$(OBJECTS_AM)">[email protected]) 
$(shell echo "$(OBJECTS_NZ)">>[email protected]) 

Vous pourriez avoir besoin de le diviser une ou deux fois, mais ce n'est pas si mal, d'autant plus que la distribution des noms de fichiers ne change pas si souvent que ça.

+0

Merci pour cela, cela m'a inspiré ma propre solution en utilisant wordlist, ce qui assure un nombre cohérent d'objets dans chaque variable. –

0

Voici un patch pour gnu faire qui vous permet de directement écrire une variable dans un fichier. Il crée une nouvelle fonction « writefile » fonction, similaire à la « info » existant, sauf qu'il prend un argument de nom de fichier et écrit dans le fichier:

https://savannah.gnu.org/bugs/?35384

Questions connexes