CMake:推移的な依存関係がどこから来ているのかを知る方法は?


10

自動依存関係伝搬などの最新の機能を使用するように、レガシー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呼び出しにのみ関連付けられます。


1
どのようにしない--graphizオプションは、あなたの質問に答えますか?ドットファイルの解析が悪夢のように感じるのはなぜですか?ドットファイルは、人間が読める形式で接続されたポイントを表す、最も単純で一般的で柔軟な方法です。gvprユーティリティあなたはAWKっぽいスタイルで彼らと何かを行うことができます、あなたは他の言語でそれらをインポートすることができます。ドットファイルは、ターゲット間の依存関係のツリー状の構造を文字通り表しているのに、求めている「見る方法」ではないのはなぜですか。
KamilCuk

@KamilCuk公正だ。追加のパッケージをインストールしたり、独自のパーサーを作成したりせずに読み込める、JSONのようなより標準化された形式を望んでいたと思います。依存関係グラフは複数の形式で利用できると想定しました(たとえば、CMakeサーバーAPIをまだ試す必要があります)。しかし、ドットファイルがその情報を取得する最も簡単な(または唯一の)方法である場合、それは問題ありません。
0x5453

1
私はこれらを違った形で示すGraphvizにあまり多くの賭けをするつもりはありません。それを区別するコードはここリンクされています。非常に洗練されていません。
kert、

回答:


4

dotによって生成されたファイルを解析しgraphviz、必要な詳細を抽出できます。以下は、それを行うためのサンプルpythonスクリプトです。

import pydot
import sys

graph = pydot.graph_from_dot_file(sys.argv[1])
result = {}

for g in graph:
    # print(g)
    for node in g.get_node_list():
        if node.get("label") != None:
            result[node.get("label")] = []

    for edge in g.get_edges():
        result[g.get_node(edge.get_source())[0].get("label")].append(g.get_node(edge.get_destination())[0].get("label"))

for r in result:
    print(r+":"+",".join(result[r]))

このスクリプトを追加してcmakeからカスタムターゲットとして実行することもできるため、ビルドシステムから呼び出すことができます。ここでサンプルcmakeプロジェクトを見つけることができます


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