Problema
Quero ver as dependências para um ou mais destinos de um makefile. Então, estou procurando um programa que possa analisar makefiles e, em seguida, representar as dependências em algum formato de árvore (recuo, ascii-art, ...) ou como um gráfico (ponto, ...).
Semelhante
Existem programas que fazem isso para outras situações:
- pactree ou debtree pode exibir as dependências para pacotes de software no respectivo formato em uma árvore como formato ascii ou como
dot
gráfico, gcc -M source_file.c
exibe as dependências do arquivo de origem C como uma regra de criação,- pstree exibe uma representação ascii da árvore de processos.
Progresso
Pesquisando na web, encontrei pouca ajuda . Isso me levou a tentar
make --always-make --silent --dry-run some_target | \
grep --extended-regexp 'Considering target file|Trying rule prerequisite'
mas parece que eu tenho que hackear um pouco mais de código de análise em perl ou python para representar isso como uma bela árvore / gráfico. E ainda não sei se realmente vou obter o gráfico completo e correto dessa maneira.
Exigências
Seria bom limitar o gráfico de algumas maneiras (nenhuma regra embutida, apenas um determinado destino, apenas um pouco de profundidade), mas na maioria das vezes estou apenas procurando uma ferramenta que me dê as dependências de alguma maneira "razoável", humana. formato visível (como os programas em "Similar").
Questões
- Existem programas que podem fazer isso?
- Receberei as informações completas e corretas
make -dnq ...
? - Existe uma maneira melhor de obter essas informações?
- Já existem scripts / tentativas para analisar essas informações?
fonte
printf 'A\n B\n D\n C\n D\n'
. (Quem disse que eu não posso colocar novas linhas nos comentários? :) #dot
gráficos de pedidos são obviamente bons.) Atualizarei a pergunta um pouco para torná-la mais clara (espero).Respostas:
Tente makefile2graph do mesmo autor, existe uma ferramenta similar MakeGraphDependencies escrita em
java
vez dec
.Em seguida, use um editor de gráficos vetoriais para destacar as conexões necessárias.
fonte
Eu encontrei um tipo de hack para, pelo menos, gerar informações claramente estruturadas sobre qual destino depende de quais pré-requisitos. A desvantagem é que é bastante intrusivo. Em outras palavras, você precisa alterar seu makefile para agrupar as receitas de compilação de todos os seus destinos em uma pequena função condicional. Vou postar um breve exemplo:
Neste exemplo, estou usando a função getRecipe enrolada à mão para agrupar a receita de cada destino individual e, em seguida, decido se realmente executar essa receita ou simplesmente gerar qual destino está sendo construído e de quais pré-requisitos depende. O último acontece apenas se a variável
DEPENDENCY_GRAPH
estiver configurada (por exemplo, como uma variável de ambiente). No exemplo, a receita da compilação nada mais é do que um eco dizendo que o destino está sendo construído, mas você pode obviamente substituí-la por um comando de sua escolha.Com
DEPENDENCY_GRAPH
definido como 1, isso resulta na saída:o que deve ser fácil de analisar e depois converter em um gráfico de pontos.
Com
DEPENDENCY_GRAPH
não definido ou definido como 0, a saída é:ou, em outras palavras, a receita de compilação normal é usada. Ainda não testei se isso funciona de maneira confiável com receitas complicadas. Um problema em que eu já me deparei é que ele não funciona com receitas de várias linhas.
Por exemplo, na receita de construção do último destino, se além de dizer que o destino está sendo construído, eu realmente queria
touch
o arquivo:make
parece pensar que atouch $@
parte é apenas parte do eco na linha anterior:Se eu deixar de fora a barra invertida na linha anterior,
make
reclama a*** unterminated call to function
chamada ': falta)'. Stop.
Se alguém tiver uma idéia de comomake
jogar bem, eu sou todo ouvidos. :)EDIT: O outro problema com essa abordagem é que isso funcionará apenas se não existirem resultados de compilação, pois
make
obviamente não executa a receita de compilação de um destino que considera atualizado.fonte
;
apóstarget $@
o comando touch funcionarmake -B
opção que faz incondicionalmente todos os destinos.Eu usei o remake --profile (um substituto para o drop-in
make
), que gerou uma árvore de dependência em um formato de callgrind.Em seguida, o gprof2dot pode gerar uma imagem da árvore de destino.
fonte
remake --profile
apenas produz o gráfico de dependência para o destino que ele executa? Ou pode, de alguma forma, gerar o gráfico para todos os destinos?remake --targets -r | grep -v %| grep -v '\t*\.'|xargs remake -n --profile -B
parece promissor.