Eu tenho um makefile bastante grande que cria vários destinos dinamicamente computando nomes de variáveis. (por exemplo, foo $ (VAR): $ (PREREQS)). Existe alguma maneira de o gnu make ser convencido a cuspir uma lista de alvos depois de expandir essas variáveis?
Eu gostaria de ser capaz de obter os alvos para um makefile arbitrário. Estou tentando escrever uma função de conclusão para meu shell.
make -pn | sed -rn '/^[^# \t\.%].*:[^=]?/p'
make -pnr
. O-r
remove regras implícitas.Retirado do complemento make arg, que funciona perfeitamente.
fonte
~/bin
vez de usar um alias. Funciona bem; obrigado!alias mkl="make -qp | awk -F':' '/^[a-zA-Z0-9][^\$#\/\t=]*:([^=]|\$)/ {split(\$1,A,/ /);for(i in A)print A[i]}' | sort"
que vai economizar 2 minutos de jogos de citações :-)| sort -u
parece mais útil :)Não tenho certeza se isso é apenas uma coisa gnu make, mas funciona bem:
make help
fonte
Vários respondentes sugeriram o uso de
make -pn
, que imprimirá o banco de dados de regras, mas não executará nada - mais ou menos. O problema com essa abordagem é que-n
ainda invoca todas as marcas recursivas e ainda faz muito mais trabalho do que o necessário, porque imprime todos os comandos que teria invocado em uma compilação regular. Uma solução mais eficiente seria criar um makefile trivial, dummy.mk, com estes conteúdos:Agora invoque make as
make -p -f Makefile -f dummy.mk __all_targets__
. Em qualquer construção substancial, a diferença na quantidade de produção gerada pelo make é significativa. Por exemplo:O tempo de execução também foi dramaticamente melhor - 2.063s para a primeira versão, 0.059s para a segunda.
fonte
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
parece sugerir algo semelhante, mas amigável, a sabermake -p -f/dev/null
-f /dev/null
impedirá amake
análise dos makefiles regulares, então você obterá uma impressão apenas das regras embutidas. É por isso que minha solução especifica-f Makefile -f dummy.mk
. Mas isso também não é suficiente, porque com-n
,make
irá em frente e começará a executar as regras no makefile também. Infelizmente, não estou ciente de nenhuma modificação que possa simplificar a solução apresentada originalmente.-n
..."Confira a conclusão do bash para make no GitHub.
fonte
Edit: FYI, o repositório git de conclusão debian bash em outra resposta agora incorpora uma versão aprimorada deste script adaptado para casos de uso de conclusão bash.
Este é um script muito mais completo do que o script de conclusão debian bash porque fornece resultados para regras geradas que é o que a pergunta pede e a resposta mais votada (script de conclusão debian bash no servidor git debian) não vai longe o suficiente.
Este não é o script original ao qual vinculei, mas é muito mais simples e um pouco mais rápido.
fonte
Este é o código para o alias baseado na solução Todd Hodes
fonte
Isso dará uma boa saída:
fonte
Há uma solução muito boa com alguma magia sed e egrep aqui: https://gist.github.com/pvdb/777954
fonte
Acho que estou um pouco atrasado para esta festa, mas se você está procurando um comando específico, pode tentar
Isso geralmente funciona, embora ainda possa incluir algumas coisas não-alvo, como uma
vpath
diretiva. Se você não dependemake
das regras integradas de, você pode usarmake -qpR
como o primeiro comando no pipeline.fonte
Solução Ruby:
fonte
Estou trabalhando em solaris 10 e turbo C shell. A solução fornecida não funciona para meu projeto makefile. mesmo depois de alterar a linha de comando acima para a sintaxe tcsh. No entanto, descobri que você pode obter uma solução fácil usando
versão remake:
é
e alguns outros dados de versão sem importância
fonte
Procurei a mesma pergunta e encontrei este giro:
Isso remove todas as linhas de comentário, regras de padrão (linhas que começam com tabulações), todos os intrínsecos (exemplo
.c.o
e%.o: %.c
padrões).fonte
Encontrei esta solução em outro tópico:
Você também pode adicioná-lo ao seu
Makefile
:E execute
make list
.fonte
Claro, mas quando você quer que ele os cuspa?
Para relatar o nome do alvo quando ele executa a regra, coloque uma linha na regra:
Para cuspi-los todos de uma vez, você pode criar um alvo PHONY separado:
E isso pode ser um pré-requisito de seu destino padrão:
EDITAR:
Você quer uma maneira de mostrar todos os alvos possíveis de um makefile arbitrário, o que eu suponho que significa não intrusivamente. Bem...
Para fazer isso exatamente, e ser capaz de lidar com makefiles sofisticados, por exemplo, envolvendo regras construídas por
eval
instruções, você teria que escrever algo próximo a um emulador Make. Impraticável.Para ver os alvos das regras simples, você poderia escrever um makefile que atuaria como um scanner makefile, operando em um makefile arbitrário:
Este seria um trabalho impressionante. Tem certeza de que o objetivo vale o esforço?
fonte
fonte
:=
).