2009-02-05 6 views
1

J'ai un Makefile où la plupart de mes cibles sont créées de manière générique à travers une séquence en boîte. Il semble que l'achèvement de bash suggère seulement des complétions pour des cibles normales, par ex.Achèvement de Bash pour faire avec des cibles génériques dans un Makefile

target_name: 
     #[email protected] 

et non pour les cibles génériques. Y a-t-il un moyen de faire que l'achèvement de bash complète toutes les cibles, même si elles ne sont pas rendues explicites comme l'exemple ci-dessus? Pour être plus spesific, disons que je définis une liste de noms de cibles, et faire quelque chose comme ceci:

list=target1 target2 
$(list): 
     #[email protected] 

est-il un moyen de rendre ces cibles disponibles pour l'achèvement bash? Ou, encore plus avancé, disons que j'ai deux listes et que je veux que les cibles soient faites de toutes les combinaisons possibles des éléments des deux listes. Puis-je également avoir ces cibles disponibles pour l'achèvement de bash?

Répondre

4
$ make -qp | grep '^[^.#].*: ' 
all: bin1 bin2 bin3 
bin1: obj1.o obj2.o obj3.o 
obj1.o: obj1.c obj1.h 
... 
$ make -qp | sed -n -e 's/^\([^.#[:space:]][^:[:space:]]*\): .*/\1/p' 
all 
bin1 
obj1.o 
...

Les -q empêche de tout Faire réellement en cours d'exécution, et le -p demande à vider sa base de données.

Ensuite, tout ce que vous devez faire est d'écrire et d'enregistrer un completion function (example).

+0

Avec quelques modifications à la substitution sed, votre méthode fonctionne. J'ai donc marqué votre réponse comme correcte. Merci :) –

1

Il n'y a pas de solution de travail, AFAIK.

Cette commande:

make -qsp 2>/dev/null | egrep '^[^#%\.=]*:[^=]' | awk -F ': ' '{ print $2}' 

élargira vos objectifs de makefile.

Vous pouvez essayer de l'ajouter dans votre /etc/bash_competion, mais je pense qu'il faudra plus de débogage pour faire face à des situations plus complexes.

Questions connexes