自動依存関係伝搬などの最新の機能を使用するように、レガシーCMakeセットアップを書き直している最中です。(つまり、のtarget_include_directories(<target> PUBLIC <dir>)
代わりになどを使用しinclude_directories(<dir>)
ます。)現在、一連のグローバルディレクトリプロパティを設定することにより、すべてのプロジェクト依存関係情報を手動で処理しています。
私のテストでは、新しいビルドのターゲットが、古いビルドがリンクしないライブラリにリンクするいくつかの例を見つけました。明示的にリンクしているわけではないので、これはターゲットの依存関係から発生していることを知っていますが、どの依存関係を再帰的に調べてCMakeLists.txt
、依存関係の階層を見つけるまで依存関係の階層をたどる必要があるかを見つける必要があります。問題のライブラリを取り込むもの。私たちは数十のライブラリーを持っているので、これは簡単なプロセスではありません。
CMakeは、ターゲットごとに、どの依存関係が明示的に追加され、どの依存関係が推移的な依存関係を通じて伝播されたかを確認する方法を提供しますか?
--graphviz
出力にはこの違いが示されているように見えるため、CMakeは内部的にコンテキストを認識しています。ただし、tree
コマンドラインで依存関係情報を表示する-のようなスクリプトを記述し、Graphvizファイルの解析は悪夢とハックの両方のように聞こえます。
私の知る限り、この情報は含まれてcmake-file-api
いません。codemodel/target/dependencies
フィールドは機能するかもしれないと思いましたが、ローカルと推移的な依存関係が混在しています。また、backtrace
各依存関係のフィールドは、現在のターゲットのadd_executable
/ add_library
呼び出しにのみ関連付けられます。
--graphiz
オプションは、あなたの質問に答えますか?ドットファイルの解析が悪夢のように感じるのはなぜですか?ドットファイルは、人間が読める形式で接続されたポイントを表す、最も単純で一般的で柔軟な方法です。gvpr
ユーティリティあなたはAWKっぽいスタイルで彼らと何かを行うことができます、あなたは他の言語でそれらをインポートすることができます。ドットファイルは、ターゲット間の依存関係のツリー状の構造を文字通り表しているのに、求めている「見る方法」ではないのはなぜですか。