Como forço o make / GCC a me mostrar os comandos?

277

Estou tentando depurar um problema de compilação, mas não consigo obter o GCC (ou talvez seja make ??) para me mostrar os comandos reais do compilador e vinculador que está sendo executado.

Aqui está a saída que estou vendo:

  CCLD   libvirt_parthelper
libvirt_parthelper-parthelper.o: In function `main':
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:102: undefined reference to `ped_device_get'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:116: undefined reference to `ped_disk_new'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:122: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
/root/qemu-build/libvirt-0.9.0/src/storage/parthelper.c:172: undefined reference to `ped_disk_next_partition'
collect2: ld returned 1 exit status
make[3]: *** [libvirt_parthelper] Error 1

O que eu quero ver deve ser semelhante a este:

$ make
gcc -Wall   -c -o main.o main.c
gcc -Wall   -c -o hello_fn.o hello_fn.c
gcc   main.o hello_fn.o   -o main

Observe como este exemplo tem o gcccomando completo exibido. O exemplo acima mostra apenas coisas como "CCLD libvirt_parthelper". Não tenho certeza de como controlar esse comportamento.

hernejj
fonte
Você está executando um makefile ou apenas um gcccomando?
Blender
20
Parece a saída do Kbuild ou do Autotools . Tente make V=1.
JWW

Respostas:

275

Para invocar uma execução a seco :

make -n

Isso mostrará o que makeestá tentando fazer.

chrisaycock
fonte
31
Encontrei :) make V = 1 Embora a sugestão acima de "make -n" tenha funcionado também. :) Obrigado a todos por suas respostas.
Hernejj
76
A diferença é que make -nnão executa os comandos. A resposta correta émake V=1
m-ric
20
make V=1está funcionando apenas se o Makefile suportar. os makefiles da automake fazem isso, mas muitos outros não.
Larsr #
53
Para o CMake, use make VERBOSE=1; para ferramentas automáticas GNU make V=1.
Ruslan #
10
@ m-ric se você deseja executar realmente executar os comandos, considere make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli郝海东冠状病六四事件法轮功
175

Os makefiles da biblioteca, que são gerados pelas ferramentas automáticas (o que ./configurevocê precisa emitir) geralmente têm uma opção detalhada, portanto, basicamente, usar make VERBOSE=1ou make V=1deve fornecer os comandos completos.

Mas isso depende de como o makefile foi gerado.

A -dopção pode ajudar, mas fornecerá uma saída extremamente longa.

Gui13
fonte
60
Nota: Makefiles gerados por CMake suportam apenas VERBOSE=1, não V=1.
blinry
3
V = 1 funcionou para mim, compilando nuttx com mips-linux-gnu-gcc, obrigado.
18714 JJMeau_ictx
141

Construir método independente do sistema

make SHELL='sh -x'

é outra opção. Amostra Makefile:

a:
    @echo a

Resultado:

+ echo a
a

Isso define a SHELLvariável especial para makee -xinforma shpara imprimir a linha expandida antes de executá-la.

Uma vantagem -né que ele realmente executa os comandos. Eu descobri que em alguns projetos (por exemplo, kernel do Linux) que -npodem parar de funcionar muito mais cedo do que o habitual, provavelmente devido a problemas de dependência.

Uma desvantagem desse método é que você deve garantir que o shell que será usado shseja o padrão usado pelo Make como eles são POSIX, mas pode ser alterado com a SHELLvariável make.

Fazer sh -vseria legal também, mas o Dash 0.5.7 (Ubuntu 14.04 sh) ignora os -ccomandos (que parece ser como o makeusa) para que não faça nada.

make -p também lhe interessará, que imprime os valores das variáveis ​​definidas.

Makefiles gerados pelo CMake

make VERBOSE=1

Consulte: Usando o CMake com o GNU Make: Como posso ver os comandos exatos?

Ciro Santilli adicionou uma nova foto
fonte
11
Definitivamente a melhor resposta que não depende de quão bem o Makefile original foi escrito / gerado
nodakai
2
Se alguém pode explicar o downvote, me avise para que eu possa aprender e melhorar a informação ;-)
Ciro Santilli郝海东冠状病六四事件法轮功
make SHELL='$$SHELL -x'tornará $SHELLliteral o que não é avaliado. Usar make SHELL="$SHELL -x"funcionará.
Rick van der Zwet
1
esta é a melhor resposta genérica, em contraste com algumas outras respostas isto não dependem usando cmake
Mike76
2
make SHELL = 'sh -x' é super!
Jackie Yeh
22

Desde o GNU Make versão 4.0, o --traceargumento é uma boa maneira de dizer o que e por que um makefile faz, exibindo linhas como:

makefile:8: target 'foo.o' does not exist

ou

makefile:12: update target 'foo' due to: bar
Julien Palard
fonte
1
Este argumento imprime informações mais detalhadas do que o funcionamento a seco. É muito útil entender como criar sistemas com processos complexos de compilação, como o dpdk.
makerj
20

Usar make V=1

Outras sugestões aqui:

  • make VERBOSE=1 - não funcionou pelo menos nos meus ensaios.
  • make -n- exibe apenas operação lógica, não linha de comando sendo executada. Por exemploCC source.cpp

  • make --debug=j - funciona também, mas também pode ativar a construção com vários segmentos, causando saída extra.

TarmoPikaro
fonte
4
make VERBOSE=1é para o CMake. Suas avaliações foram provavelmente realizadas com projetos baseados em ferramentas automáticas GNU.
Ruslan
12

Eu gosto de usar:

make --debug=j

Mostra os comandos que executa:

https://linux.die.net/man/1/make

--debug [= BANDEIRAS]

Imprima informações de depuração além do processamento normal. Se os FLAGS forem omitidos, o comportamento será o mesmo que se -dfoi especificado. FLAGS pode ser um para todas as saídas de depuração (o mesmo que usar -d), bpara depuração básica , para depuração básica vmais detalhada, ipara mostrar regras implícitas, jpara detalhes sobre a invocação de comandos e mpara depuração enquanto refaz makefiles.

Santiago Villafuerte
fonte
7

Dependendo da sua versão do automake, você também pode usar este:

make AM_DEFAULT_VERBOSITY=1

Referência: AM_DEFAULT_VERBOSITY

Nota: eu adicionei esta resposta, pois V=1não funcionou para mim.

Ru Hasha
fonte