Bagaimana cara memaksa make / GCC untuk menunjukkan perintah kepada saya?

277

Saya mencoba men-debug masalah kompilasi, tetapi sepertinya saya tidak bisa mendapatkan GCC (atau mungkin itu membuat ??) untuk menunjukkan kepada saya perintah kompiler dan tautan yang sebenarnya sedang dijalankan.

Inilah output yang saya lihat:

  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

Apa yang ingin saya lihat harus serupa dengan ini:

$ 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

Perhatikan bagaimana contoh ini gccmenampilkan perintah lengkap yang ditampilkan. Contoh di atas hanya menunjukkan hal-hal seperti "CCLD libvirt_parthelper". Saya tidak yakin bagaimana mengendalikan perilaku ini.

hernejj
sumber
Apakah Anda menjalankan makefile, atau hanya sebuah gccperintah?
Blender
20
Ini tampak seperti Kbuild atau Autotools output. Coba make V=1.
jww

Jawaban:

275

Untuk menjalankan dry run :

make -n

Ini akan menunjukkan apa makeyang coba dilakukan.

chrisaycock
sumber
31
Ditemukan :) make V = 1 Meskipun saran di atas "make -n" bekerja dengan baik. :) Terima kasih atas tanggapan Anda.
hernejj
76
Perbedaannya adalah bahwa make -ntidak menjalankan perintah. Jadi jawaban yang benar adalahmake V=1
m-ric
20
make V=1hanya berfungsi jika Makefile mendukungnya. makefile automake melakukan itu, tetapi banyak yang lain tidak.
larsr
53
Untuk CMake, gunakan make VERBOSE=1; untuk autotool GNU make V=1.
Ruslan
10
@ m-ric jika Anda ingin menjalankan benar-benar menjalankan perintah, pertimbangkan make SHELL='sh -x': stackoverflow.com/a/32010960/895245
Ciro Santilli郝海东冠状病六四事件法轮功
175

File makefile perpustakaan, yang dihasilkan oleh autotool ( ./configureAnda harus mengeluarkan) sering memiliki opsi verbose, jadi pada dasarnya, menggunakan make VERBOSE=1atau make V=1harus memberi Anda perintah penuh.

Tapi ini tergantung pada bagaimana makefile dihasilkan.

The -dpilihan mungkin membantu, tapi itu akan memberikan output yang sangat panjang.

Gui13
sumber
60
Catatan: Makefiles yang dihasilkan CMake hanya mendukung VERBOSE=1, tidak V=1.
blinry
3
V = 1 bekerja untuk saya, kompilasi nuttx dengan mips-linux-gnu-gcc, terima kasih.
jcomeau_ictx
141

Membangun metode independen sistem

make SHELL='sh -x'

adalah pilihan lain. Sampel Makefile:

a:
    @echo a

Keluaran:

+ echo a
a

Ini menetapkan SHELLvariabel khusus untuk make, dan -xmemberi tahu shuntuk mencetak garis yang diperluas sebelum menjalankannya.

Satu kelebihan di atas -nadalah bahwa sebenarnya menjalankan perintah. Saya telah menemukan bahwa untuk beberapa proyek (misalnya kernel Linux) yang -nmungkin berhenti berjalan jauh lebih awal dari biasanya mungkin karena masalah ketergantungan.

Salah satu kelemahan metode ini adalah Anda harus memastikan bahwa shell yang akan digunakan adalah sh, yang merupakan default yang digunakan oleh Make karena POSIX, tetapi dapat diubah dengan SHELLvariabel make.

Melakukannya sh -vjuga akan keren, tetapi Dash 0.5.7 (Ubuntu 14.04 sh) mengabaikan -cperintah (yang sepertinya cara makemenggunakannya) sehingga tidak melakukan apa-apa.

make -p juga akan menarik bagi Anda, yang mencetak nilai-nilai variabel yang ditetapkan.

CMake menghasilkan Makefile

make VERBOSE=1

Lihat: Menggunakan CMake dengan GNU Make: Bagaimana saya bisa melihat perintah yang tepat?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
11
Pasti jawaban terbaik yang tidak bergantung pada seberapa baik Makefile asli ditulis / dihasilkan
nodakai
2
Jika ada yang bisa menjelaskan downvote, beri tahu saya agar saya dapat belajar dan meningkatkan informasi ;-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
make SHELL='$$SHELL -x'akan membuat $SHELLliteral yang tidak dievaluasi. Menggunakan make SHELL="$SHELL -x"akan berhasil.
Rick van der Zwet
1
ini adalah jawaban generik terbaik, berbeda dengan beberapa jawaban lain, ini tidak bergantung pada penggunaan cmake
Mike76
2
buat SHELL = 'sh -x' super!
Jackie Yeh
22

Sejak GNU Make versi 4.0, --traceargumennya adalah cara yang bagus untuk mengetahui apa dan mengapa makefile melakukan, menghasilkan baris seperti:

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

atau

makefile:12: update target 'foo' due to: bar
Julien Palard
sumber
1
Argumen ini mencetak informasi yang lebih rinci daripada run kering. Sangat membantu untuk memahami sistem yang memiliki proses pembangunan yang kompleks seperti dpdk.
makerj
20

Menggunakan make V=1

Saran lain di sini:

  • make VERBOSE=1 - tidak bekerja setidaknya dari cobaan saya.
  • make -n- Hanya menampilkan operasi logis, bukan baris perintah yang dieksekusi. MisalnyaCC source.cpp

  • make --debug=j - berfungsi juga, tetapi mungkin juga mengaktifkan bangunan multi-ulir, menyebabkan output tambahan.

TarmoPikaro
sumber
4
make VERBOSE=1adalah untuk CMake. Uji coba Anda kemungkinan besar dilakukan dengan proyek berbasis autotools GNU.
Ruslan
12

Saya suka menggunakan:

make --debug=j

Ini menunjukkan perintah yang dijalankan:

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

--debug [= BENDERA]

Cetak informasi debugging di samping pemrosesan normal. Jika FLAGS dihilangkan, maka perilakunya sama seperti jika -dditentukan. FLAGS mungkin untuk semua hasil debugging (sama seperti menggunakan -d), buntuk debugging dasar , untuk debugging dasar yang vlebih banyak, iuntuk menunjukkan aturan implisit, juntuk detail tentang pemanggilan perintah , dan muntuk debugging saat membuat ulang makefile.

Santiago Villafuerte
sumber
7

Bergantung pada versi automake Anda, Anda juga dapat menggunakan ini:

make AM_DEFAULT_VERBOSITY=1

Referensi: AM_DEFAULT_VERBOSITY

Catatan: Saya menambahkan jawaban ini karena V=1tidak berfungsi untuk saya.

Ru Hasha
sumber