2016-08-10 11 views
12

失敗した実行で何をしているのかを調べる方法はありますか?cmakeたとえば、libbacktraceに依存するプログラムがあります。これはgcc foo.c -lbacktraceでリンクできます。私はCMakeLists.txt CMakeLists.txtをトレースする方法

よう
cmake_minimum_required(VERSION 2.8) 
find_library (BACKTRACE_LIBRARY backtrace) 
message (BACKTRACE_LIBRARY=${BACKTRACE_LIBRARY}) 

を書いて、cmake <path>を入力すると、それはBACKTRACE_LIBRARY=BACKTRACE_LIBRARY-NOTFOUNDを出力します。

問題の原因を特定するにはどうすればよいですか? cmakeはlibbacktraceの検索をあきらめる前にどのコマンドを実行していますか?それは全く何かを実行していますか? autoconfでは、コマンドはすべてconfig.logに記録されますが、この場合はCMakeOutput.logは空白です。同様に、cmake --traceは、一連のシステムcmakeファイルの後にCMakeLists.txtの内容をエコーし​​ます。この場合、この場合は役に立たなくなります。

この特定の呼び出しをfind_libraryにする方法を探しているわけではありません。これは単なる例です。私の質問です:私は期待どおりに動作していないCMakeLists.txtがあります。どこに、なぜそれが失敗したのかを理解するのに役立つツールは何ですか?

+0

ちょっとしたヒント:この種の問題については、私は["Test and Debug" Documentation Topic](http://stackoverflow.com/documentation/cmake/4098/test-and-debug)を開始しました。 – Florian

答えて

7

no CMake debugger or similar¹があります。何ができることは次のとおりです。

  1. はCMakeの出力を読み、時にはそれがすでに「行方不明INCLUDE_MYLIB_DIR」)のようなヒントを提供します。あなたがCMakeCache.txtを削除したり、ビルドディレクトリを削除したりして、結果がキャッシュされたために出力を見逃さないようにしてください。キャッシングに影響があったかどうかを繰り返して確認します。あなたは-Wdevでより多くの警告(CMakeスクリプトの作成者/開発者のためのものであり、ユーザーのものではない)が得られます。さらに便利なオプションは--warn-uninitialized,--warn-unused-varsおよび--check-system-varsです(詳細はdocumentationを参照)。

  2. CMakeCache.txtのような生成ファイルと、config.hのような生成する追加フ​​ァイル、またはDoxygenの入力ファイルを確認してください。あなたが期待する価値のある変数は、さらなる研究の指標です。

  3. CMakeFilesサブディレクトリのCMakeError.logとCMakeOuput.logを見てください。残念なことに、多くのテストはこれらのファイルに書き込まれませんが、いくつかは行います。例えば、Cコンパイラは、コンパイラ出力をそこに置いて、意図しないフラグや間違った(クロス)コンパイラで問題を見つけるのに役立ちます。

  4. でデバッグしてください。これは、問題がどこにあるかを大まかに知ったときに、messageで中間変数を出力することを意味します。これは、ブランチやサブ式(ANDまたはORを含む式の一部)の評価方法がわからないときに役立ちます。さらに、 "mylibのバージョンが3.2より大きい"ブランチのようなメッセージを内側に配置して、ワークフローに従うことができます。

  5. 複雑さを軽減します。あなたの問題がなくなるまで、知らないうちにすべてを投げてください。問題が再現するまで材料をもう一度追加してください。最小の例で問題を再現するために新しいモジュールを開始する方が簡単な場合もあります。意外にも、これはしばしば問題を突き止めるのに役立ちます。

  6. --debug-output(デバッグ出力用)--trace(完全トレース)と--trace-expand(トレース変数と展開変数)でデバッグしてください。これらのためには、ポイント5で進捗することが非常に役立ちます。そうしないと、アウトプットがあなたにあふれてしまうからです。

¹スティーブのCMake Daemon Toolsがあります。私は自分で使ったことはありませんが、デバッガにかなり近いと思われるイントロスペクションの可能性を提供すると主張しています。
編集:今はCMake-serverと呼ばれ、CMake 3.7の一部になる予定です。多くのツールとIDEがこれを採用し、CMakeの開発方法を改善すると期待できます。

3

上記のフラグ--trace(可変拡大兄弟--trace-expand)の横には、--debug-outputがあります。ドキュメントから

:デバッグモードで

--debug-output
プットcmakeの。

メッセージ(send_error)コールでスタックトレースのようなcmakeを実行している間に余分な情報を表示します。

これにより、必要な情報が得られる場合があります。たぶん--traceと組み合わせて。

+0

残念ながら、 '--trace-expand --debug-output'は、' CMakeLists.txt'の行をさらに別の方法でエコーします。これは、 'cmake'がどこで失敗しているのかを理解するのに役立ちます。しかし、私はすでにどのラインが失敗しているのかをすでに知っているケースにもっと興味があり、「cmake」がシーンの裏で何をしているのかについてより多くの情報が必要です。 –

+0

'find_library'の知識に基づいて、マニュアルで(CMake内ではなく)文書化されているようにパスを調べるだけです。 ' -NOTFOUND'はすべてです。CMakeはスクリプト内にあなたを与えます。 –

関連する問題