Linux上のCMakeで構築された大規模なC++プロジェクトに取り組んでいます。 CMakeは正常に実行され、モジュールとアプリケーションのツリーに多数のMakefileを生成します。 GNU make
を実行するとリンカーエラーが発生します。実行する前にmake
を取得して正確なコマンドを出力するにはどうすればよいですか?
-dオプションはコマンドを出力しませんが、役に立たない多くの情報を出力します。
-nオプションはすべてのコマンドを出力しますが、それらを実行しませんので、問題が正確にあったかどうかはわかりません。 make -nのstdoutを調べると、関連するコマンドが表示されません。以前のコマンドの結果に応じて一部のコマンドが変更されるのではないかと思われます。Makefileの階層構造により、実際に何が起こっているのかを判断することは困難です。
Makeのmanページに役立つと思われる他のオプションはありません。
私はこれがうまくいくと確信しています:
make VERBOSE=1
これをCMakeLists.txtに追加して、永続的に設定することもできます。
set(CMAKE_VERBOSE_MAKEFILE on)
これは CMake FAQ で説明されています。
Automakeで生成されたMakefileの場合:
make V=1
GNU makeに適用され、CMakeで生成されたかどうかに関係なく、Makefileで動作するオプションは、makeに--trace
オプションを使用します。これにより、コマンドmake
は実行中であり、まだ実行しています。
これは、VERBOSE=1
またはV=1
がCMake/automakeで生成されたメイクファイルの印刷をトリガーするコマンドだけでなく、すべてのコマンドに適用されます。
Linuxでのもう1つの代替方法は、strace -f -e trace=execve make <make options>
のように strace の下でmakeを実行することです。 straceの出力には、実行されるeveryプロセスが含まれます。make、makeを実行するシェルスクリプトなど。
たとえば、CMakeで生成されたmakefileが/usr/bin/cmake -E __run_co_compile <lots of options ...>
を実行しているのに、これが実行される正確なコンパイラー呼び出しは何なのか疑問に思うかもしれません。それはstraceメソッドで取得できます。