make / GCCにコマンドを表示させるにはどうすればよいですか?


277

コンパイルの問題をデバッグしようとしていますが、GCC(またはmakeか?

これが私が見ている出力です:

  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

私が見たいものはこれに似ているはずです:

$ 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

この例では、完全なgccコマンドが表示されていることに注意してください。上記の例は単に「CCLD libvirt_parthelper」のようなものを示しています。この動作を制御する方法がわかりません。


makefileを実行していますか、それとも単なるgccコマンドですか?
ブレンダー2011

20
これは、KbuildまたはAutotoolsの出力のように見えます。お試しくださいmake V=1
jww 2016年

回答:


275

予行演習を呼び出すには:

make -n

これは何makeをしようとしているのかを示します。


31
それを見つけた:) make V = 1上記の "make -n"の提案も機能しましたが。:)ご回答ありがとうございます。
hernejj

76
違いはmake -n、コマンドを実行しないことです。したがって、正解はあるmake V=1
M-RIC

20
make V=1Makefileがサポートしている場合にのみ機能します。automakeのmakefileはそれを行いますが、他の多くは行いません。
larsr 2014年

53
CMakeの場合はを使用しmake VERBOSE=1ます。GNU autotoolsの場合make V=1
Ruslan

10
あなたは、実際に実行したコマンドを実行したい場合は、@ M-RICは考えるmake SHELL='sh -x'stackoverflow.com/a/32010960/895245
チロSantilli郝海东冠状病六四事件法轮功

175

autotools(./configureユーザーが発行する必要がある)によって生成されるライブラリメイクファイルには、多くの場合、詳細オプションがあるため、基本的に、完全なコマンドを使用するmake VERBOSE=1make V=1、完全なコマンドを提供する必要があります。

しかし、これはメイクファイルがどのように生成されたかに依存します。

この-dオプションは役立つかもしれませんが、出力が非常に長くなります。


60
注:CMakeで生成されたMakefileはのみをサポートしVERBOSE=1、はサポートしませんV=1
blinry 14年

3
V = 1でうまくいき、nuttxをmips-linux-gnu-gccでコンパイルしました。ありがとうございます。
jcomeau_ictx 14

141

システムに依存しない方法を構築する

make SHELL='sh -x'

別のオプションです。サンプルMakefile

a:
    @echo a

出力:

+ echo a
a

これは、特殊な設定SHELLのための変数をmake、と-x伝えsh、それを実行する前に展開ラインを印刷します。

利点の1つ-nは、実際にコマンドが実行されることです。-n依存関係の問題が原因で、通常よりかなり早く実行が停止する可能性のあるいくつかのプロジェクト(Linuxカーネルなど)については、

このメソッドの欠点の1つはsh、使用されるシェルがであることを確認する必要があることです。これは、POSIXであるため、Makeで使用されるデフォルトのシェルですが、SHELLmake変数で変更できます。

実行sh -vすることもクールですが、Dash 0.5.7(Ubuntu 14.04 sh)は-cコマンドを無視するため(make使用方法と思われます)、何も実行しません。

make -p 設定された変数の値を出力するのも興味深いでしょう。

CMakeで生成されたMakefile

make VERBOSE=1

参照:CMakeをGNU Makeで使用する:正確なコマンドを確認するにはどうすればよいですか?


11
間違いなく、元のMakefileがどの程度適切に作成/生成されたかに依存しない最良の答え
nodakai

2
誰かが反対票を説明できる場合は、私に知らせて情報を学習および改善できるようにしてください;-)
Ciro Santilli郝海东冠状病六四事件法轮機能

make SHELL='$$SHELL -x'は、$SHELL評価されないリテラルを作成します。使用してmake SHELL="$SHELL -x"動作します。
Rick van der Zwet、2016

1
これは最も一般的な回答であり、他のいくつかの回答とは対照的に、これはcmakeの使用に依存しません
Mike76

2
SHELL = 'sh -x'はスーパーです!
ジャッキー・イェ2018

22

GNU Makeバージョン4.0以降、この--trace引数は、makefileが何を、なぜ行うのかを伝えるための優れた方法であり、次のような行を出力します。

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

または

makefile:12: update target 'foo' due to: bar

1
この引数は、予行演習よりも詳細な情報を出力します。dpdkのような複雑なビルドプロセスを持つmakeシステムを理解することは非常に役立ちます。
makerj 2017

20

使用する make V=1

ここでの他の提案:

  • make VERBOSE=1 -少なくとも私の裁判では機能しませんでした。
  • make -n-実行中のコマンドラインではなく、論理演算のみを表示します。例えばCC source.cpp

  • make --debug=j -動作しますが、マルチスレッドビルドが有効になり、余分な出力が発生する可能性があります。


4
make VERBOSE=1CMake用です。あなたの試用は、GNU autotoolsベースのプロジェクトで最も可能性が高いです。
ルスラン、

12

私は使いたい:

make --debug=j

実行するコマンドを示します。

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

--debug [= FLAGS]

通常の処理に加えて、デバッグ情報を出力します。FLAGSが省略されている場合、動作は-d指定された場合と同じです。FLAGSは、すべてのデバッグ出力(を使用するのと同じ-d)、b基本的なデバッグ、vより詳細な基本的なデバッグ、i暗黙のルールの表示、jコマンドの呼び出しの詳細、およびmメイクファイルの再作成中のデバッグに使用できます


7

automakeのバージョンに応じて、これを使用することもできます。

make AM_DEFAULT_VERBOSITY=1

リファレンス:AM_DEFAULT_VERBOSITY

注:V=1うまくいかなかったので、この回答を追加しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.