J'ai un makefile assez grand qui crée un certain nombre de cibles à la volée en calculant les noms à partir de variables. (par exemple foo $ (VAR): $ (PREREQS)). Est-il possible que gnu make puisse être convaincu de cracher une liste de cibles après avoir étendu ces variables?
J'aimerais pouvoir obtenir les cibles d'un makefile aribitrary. J'essaye d'écrire une fonction de complétion pour mon shell.
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
. Le-r
supprime les règles implicites.Tiré de la finition make arg, qui fonctionne comme un charme.
la source
~/bin
plutôt que d'utiliser un alias. Fonctionne très bien; Merci!alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
qui vous fera gagner 2 minutes de citation de parties :-)| sort -u
semble plus utile :)Je ne suis pas sûr qu'il ne s'agisse que d'une création gnu, mais cela fonctionne bien:
make help
la source
Plusieurs intervenants ont suggéré d'utiliser
make -pn
, qui imprimera la base de données des règles mais n'exécutera rien - plus ou moins. Le problème avec cette approche est qu'elle appelle-n
toujours toutes les marques récursives, et elle fait toujours beaucoup plus de travail que nécessaire, car elle imprime toutes les commandes qu'elle aurait appelées dans une construction régulière. Une solution plus efficace serait de créer un makefile trivial, dummy.mk, avec ce contenu:Invoquez maintenant make as
make -p -f Makefile -f dummy.mk __all_targets__
. Sur toute construction substantielle, la différence dans la quantité de sortie générée par make est significative. Par exemple:Le temps d'exécution était également nettement meilleur - 2,063s pour la première version, 0,059s pour la seconde.
la source
time make -pn | wc -l
":1338738 real 0m47.754s.
"time make -f Makefile -f dummy.mk -pn __all_targets__ | wc -l
":938621 real 0m40.219s
.make
semble suggérer quelque chose de similaire mais convivial, à savoirmake -p -f/dev/null
-f /dev/null
empêcheramake
d'analyser les makefiles normaux, vous obtiendrez donc une impression uniquement des règles intégrées. C'est pourquoi ma solution précise-f Makefile -f dummy.mk
. Mais ce n'est pas suffisant non plus, car avec-n
,make
ira de l'avant et commencera également à exécuter les règles dans le makefile. Malheureusement, je ne suis pas au courant de modifications pouvant simplifier la solution telle que présentée à l'origine.-n
..."Vérifiez l' achèvement de bash pour make sur GitHub.
la source
Edit: Pour info, le référentiel de debian bash completion git dans une autre réponse intègre désormais une version améliorée de ce script adaptée aux cas d'utilisation de l'achèvement bash.
C'est un script beaucoup plus complet que le script d'achèvement debian bash car il fournit des résultats pour les règles générées, ce que la question demande et la réponse la plus votée (script d'achèvement debian bash sur le serveur debian git) ne va pas assez loin.
Ce n'est pas le script original auquel j'ai lié mais il est beaucoup plus simple et est un peu plus rapide.
la source
Il s'agit du code d'alias basé sur la solution Todd Hodes
la source
Cela donnera une belle sortie:
la source
Il existe une très belle solution avec un peu de magie sed et egrep ici: https://gist.github.com/pvdb/777954
la source
Je suppose que je suis un peu en retard à cette fête, mais si vous cherchez une commande spécifique, vous pouvez essayer
Cela fonctionne principalement, même si cela peut encore inclure des éléments non ciblés comme une
vpath
directive. Si vous ne dépendez pasmake
des règles intégrées de, vous pouvez utilisermake -qpR
comme première commande dans le pipeline.la source
Solution rubis:
la source
Je travaille sur Solaris 10 et une coque turbo C. La solution donnée ne fonctionne pas pour mon projet makefile. même après avoir modifié la ligne de commande ci-dessus en syntaxe tcsh. Cependant, j'ai découvert que vous pouvez obtenir une solution simple en utilisant
refaire la version:
est
et quelques autres données de version sans importance
la source
Je suis allé à la recherche de la même question et j'ai proposé cette version:
Cela supprime toutes les lignes de commentaires, les règles de modèle (lignes commençant par des tabulations), tous les éléments intrinsèques (exemple
.c.o
et%.o: %.c
modèles).la source
J'ai trouvé cette solution dans un autre thread:
Vous pouvez également l'ajouter à votre
Makefile
:Et exécutez
make list
.la source
Bien sûr, mais quand voulez-vous qu'il les recrache?
Pour signaler le nom de la cible lorsqu'elle exécute la règle, placez une ligne dans la règle:
Pour les recracher tous en même temps, vous pouvez créer une cible PHONY distincte:
Et cela peut être une condition préalable de votre cible par défaut:
EDIT:
Vous voulez un moyen d'afficher toutes les cibles possibles d'un makefile arbitraire, ce qui, je suppose, signifie de manière non intrusive. Bien...
Pour le faire exactement, et être capable de gérer des makefiles sophistiqués, par exemple impliquant des règles construites par des
eval
instructions, il faudrait écrire quelque chose de proche d'un émulateur Make. Pas pratique.Pour voir les cibles des règles simples, vous pouvez écrire un makefile qui agirait comme un scanner de makefile, fonctionnant sur un makefile arbitraire:
Ce serait un travail impressionnant. Êtes-vous sûr que l'objectif en vaut la peine?
la source
la source
:=
).