これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、MAC OS オンライン エミュレーターなど、複数の無料オンライン ワークステーションのいずれかを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド mppg です。
プログラム:
NAME
makeppgraph -- 依存関係グラフのグラフィカルな分析
DESCRIPTION
?: -?、 A: -NS、
--args-ファイル、
--引数ファイル、 B: -NS、
- なぜなら、
--ビルド理由、 C: &cwd, D: -NS、
-NS、
--依存関係、
&dir,
- ドット、
- 下、
--下向きに、 G: -NS、
--graphviz、 H: -NS、
- ヘルプ、
&家、
--html、 I: -私、
-私、
- 含む、
--include-dir、
--含む、 L: -l、
- ログ、
--ログファイル、 M: -NS、
-NS、
&makepp,
$MAKEPPGRAPHFLAGS、
- マージ、
--モジュール、 O: -o、
- 出力、 P: -NS、
- プレーン、 R: -NS、
--名前の変更、 S: -s、
-- 別々の方向、
&suf, T: -NS、
- 文章、 U: -u、
- 上、
--上向きに、
&usr, V: -V、
- バージョン
メイクグラフ [ オプション ...] [ パターン ...]
mppg [ オプション ...] [ パターン ...]
「百聞は一見に如かず」と言います。 それでは、依存関係を描画するか、含めましょう
いろいろな角度からグラフ化。 ギャラリーをご覧ください
<http://makepp.sourceforge.net/gallery/> 何ができるかについてのアイデアを得るために。
各ノードはソース ファイルまたはターゲットを表し、ファイル名のパターンに従って色分けされています。
ファイルのノードは長方形です。 偽のターゲットのノードは楕円形です。 実線の各エッジは次を表します
直接的な依存関係。 代わりに、または追加で、インクルード関係を次のように表示できます。
点線。 より詳細ではあるがあまりきれいではないテキスト ビューについては、makepplog を参照してください。
ただし、小規模なビルドであっても、その複雑さは驚くべきものになる可能性があることに注意してください。 これは
.o ファイルとシステム インクルードを使用すると、簡単にソース ファイルの XNUMX 倍のノードを持つことができます。 しかし
それは何もありません -- エッジの数はしばしばノードの数をはるかに超えます。
ステートメントを含めます。 通常、交差のないレイアウトは不可能です。
実際のプロジェクトでは、複雑さが狂ってしまいます。 テンプレートベースのソースなどのテクニック
ファイル生成、プリプロセッサ (埋め込み SQL、インターフェイス定義言語、Qt など)
ライブラリ) または中央ディレクトリへのファイルの公開 (たとえば、"-I" または "-L" を XNUMX つだけ持つ)
オプション) グラフを爆発させます。 エッジの幅がわずか XNUMX ピクセルであっても、最終的には
十字に交差するエッジの広い黒い縞。
実際に何が起こっているのかを理解したら、運が良ければ、方法を見つけることができるかもしれません
ビルドのセットアップを簡素化します。 しかし、そこに到達する前に、大幅に削減する必要があります。
表示する情報の量。 そのために、さまざまな選択、名前の変更、
「makeppgraph」でのマージの可能性。 両者のバランスが取れなくなったとき
何を表示しながらも、適切に表示できるようになるまでグラフを縮小する
表示したい場合は、テキスト グラフにフォールバックできます。
出力 書式
グラフのレイアウト、表示、および操作は複雑なタスクであり、
「makeppgraph」。 代わりに、専用ツール用の入力ファイルを生成します。 それは
最初の入力ファイルに適切なサフィックスを置き換えるか追加する出力ファイル。 もしそうなら
is .makepp/ログ、デフォルト、出力ファイルはスキップします .makepp ディレクトリにつながる
ログ.udg. 最初の入力が - (stdin)、出力は stdout に送られます。
uDraw(グラフ)
uDraw(グラフ)でhttp://www.informatik.uni-bremen.de/uDrawGraph/>あなたはかなり得ます
親または子を選択したり、エッジの反対側を見つけたりできる最新の GUI。
サブグラフを非表示にします。 ノード距離などのオプションを微調整し、エッジにスプラインを使用
グラフをきれいにすることができます。
上記の機能により、これは非常に便利なツールになっていますが、いくつかの小さな機能があります。
ヒッチ:
· 長時間の瞑想の後、メモリ不足でクラッシュする可能性があります。
何かを表示した -- ノードの数を減らす必要があるという明確な兆候
および/またはさらにエッジを付けます。
· グラフの属性と表示オプションを強力に分離します。 これは、あなたができないことを意味します
生成されたグラフに、それが横向きになるという事実を入れます (つまり、
短い名前に変更された場合でも、ファイル名は
高さよりも幅が広い)。 回避策として、それをデフォルトにしたくない場合、または
毎回メニューからオリエンテーションを選択すると、小さなスターター スクリプトが提案されます。
UDG_HOME=/where/ever/uDrawGraph-3.1 をエクスポート
TMP=`mktemp -t udg.XXXXXX` || 1番出口
トラップ "rm -f $TMP" EXIT
echo "[menu(file(open_graph(\"${1-log.udg}\"))),menu(layout(orientation(left_right)))]" >$TMP
$UDG_HOME/bin/uDrawGraph -init $TMP
· ノードの境界線の色はまだサポートされていません。 このため、「--because」が二重に表示されます
赤いはずの境界線。
· 複数のファイルを XNUMX つのノードにマージすると、両方でセルフ エッジが発生する
「--dependencies」と「--includes」、これらの XNUMX つだけがランダムに表示されます
「2*」のラベルが付いた、点線または線引きされたもの。
グラフビズ
グラフビズhttp://www.graphviz.org/> 複数のコマンド ライン ツールで構成されており、
uDraw(Graph) よりも多くのエクスポート形式。 これには、静的な画像形式だけでなく
diaのようなデザイナープログラムへの入力も。 を作成するためのユーティリティ「twopi」があります。
放射状レイアウト。これは、グラフが真のツリーに近い場合に便利です。つまり、
依存関係はファンアウトしますが、他のノードと共通の依存関係を持つノードはほとんどありません。 いくつかあります
利用可能なビューアはどれも、グラフの構造に沿ってナビゲートするのに役立ちません:
ドッティ
独自の表示ツールである dotty は、uDraw(Graph) よりも自由に使用できるという利点があります。
レイアウトによって割り当てられたレベルに制限されることなく、ノードをドラッグします。 いつ
画面が端でいっぱいになっている場合、ノードを XNUMX つドラッグすると、どこにあるかの良い印象が得られます
そのノードのエッジはにつながります。 ただし、変更すると情報も失われます。
それ以外は時代遅れの Xlib ツールです。 それはまた、迷惑な小さなものを表示します
各エッジの真ん中に円があり、それを取り除くオプションはないようです。
ZGRビューア
ZGRビューアhttp://zvtm.sourceforge.net/zgrviewer.html> は個別にダウンロード可能です
快適なズームとパンを備えた Java ビューアー。 グラフは表示のみ可能です。
ノードの移動。 ビュー エリアには XNUMX つのボタンがあり、追加の機能を提供します。
ファンシーなセミ 3D ズームのバリエーションですが、基本的な機能とは異なり、
Java の設定によっては非常に遅くなります。 私のSun Linux Javaの場合、次の
は途方もない後押しをしました:
エクスポート J2D_PIXMAPS=共有 USE_DGA_PIXMAPS=1
グラッパ
Grappa は、個別にダウンロード可能な Java 1.2 ビューアーです。 ラッパーシェルはありません
script、jar にマニフェストが含まれていない、どのソースにも main 関数が含まれていない、および
アプレットビューアを使用すると、「開始アプレット」でぶら下がるXNUMXつの背の高いウィンドウが生成されます
メッセージなので、これをテストする方法がわかりません。 デモ Web サイトで試用できます。
アプレット
エッジを選択すると赤く太くなるので、もう一方の端を手動でスクロールして
見失わずにご覧いただけます。 それ以外とノードのズームと削除
便利な機能はないようです。 有効な XNUMX 進数の色を無視します
仕様。
SVG バックエンドがエクスポートできるファイル タイプの XNUMX つである SVG は、すでにかなり古いものです。 しかし、いくつかの
ブラウザにはまだ問題があります。 object タグのみで埋め込む場合 Opera
拡大縮小し、他の人はそれをクリップします。これはサムネイルには役に立ちません。 として見ると
独自のドキュメントであり、Opera と Konqueror のみがスケーリングを許可し、Firefox はスケーリングします。
ラベルのみ。 ラベルはテキストですが、ブラウザはラベルを検索できません。
プラグインをインストールしない限り、IE6には手がかりがありません。 のような専用アプリケーション
Inkscapeは、より良いサービスを提供できます。
HTML
これは、任意のブラウザーで閲覧できる単純な順序付けられていないリスト ツリー形式です。 君は
サブツリーを折りたたんで色を表示できる JavaScript と CSS が必要です。 いつもの
グラフはツリーではありません。これは、すべてのサブツリーでノードを繰り返すことで回避できます
必要ですが、すべての属性を確認できる最初のオカレンスへのリンクとして。 期限
IE の限られた Unicode サポートに対応するために、代わりに垂直矢印がインクルード関係に使用されます。
通常の点線矢印の。
テキスト グラフ
これは、任意のテキスト ビューアで閲覧できる単純なインデント ベースの形式です。 これ
通常、他の形式よりもはるかに大きなグラフを学習できることを意味します。 Emacs では、
この小さなラッパーで非常に強力なグラフ ナビゲーションにアウトラインとフォールドアウトを使用できます
モード:
(派生モードのテキストグラフ モードのアウトライン モード「グラフ」を定義します。
(ビューモード)
(set (make-local-variable 'outline-regexp) " *.")
(set (make-local-variable 'outline-level)
(ラムダ () (/ (- (試合終了 0) (試合開始 0) -1) 2)))
(set (make-local-variable 'outline-font-lock-keywords)
'(("^ *\\(?:{[az,]+} \\)?\\([^{\n]+\\)" (1 (outline-font-lock-face) nil t) ))))
(setq imenu-generic-expression
'((nil "^ *\\(?:{[az,]+} \\)?\\(.+?\\)\\(?:{[az,]+}\\)?$" 1))))
行には、中括弧の間にカンマ区切りの注釈を付けることができます
「-p, --plain」オプション。 これらがターゲットの前に来るとき、それらは関係に属します
つまり、前の行のインデントが少なくなります。 彼らがターゲットを追うとき、
それらはターゲット自体に関係します。 それらは次のとおりです。
なぜなら
これがターゲットの前に来ると、親はこのために構築されました。 いつ
その後、ターゲットには再構築される固有の理由がありました。
双方向の
この依存または包含は両方向に進みます。
include
親にはこのファイルが含まれます。 この注釈は、表示されている場合にのみ付与されます
依存関係。
偽物
これは偽のターゲットです。
繰り返される
このターゲットとその子に関する情報は、すでに以前に提供されています。
OPTIONS
パターンを指定しない場合、makeppgraph は可能なすべてのノードで動作を開始します。
makepp のログから抽出します。 XNUMX つ以上のパターンを指定した場合 (「?」、「*」、「**」および/またはを使用)
"[...]")、ファイル システム内のものと一致し、ファイル システム内でも発生するすべての操作を実行します。
ログ。 これらの場合、デフォルトで「上向き」、つまり依存するすべてのターゲットが選択されます。
および/またはそれらのいずれかおよび「下向き」を含む、つまり、すべてのターゲットおよび/またはソース。
それらは依存および/または包含します。 (グラフは
ノードの幅のため、左「上」から右「下」に最適に表示されます。)
-A ファイル名
--args-file=ファイル名
--arguments-file=fイルネーム
ファイルを読み取り、引用符で囲まれた空白や改行で区切られている可能性があるものとして解析します。
オプション。
-b
- なぜなら
--ビルド理由
依存関係のためにノードが再構築された場合、そのエッジは赤で表示されます。 悲しいかな
makepp は最適化を適用して、ターゲットの再構築が必要な時期を検出します。
多くの場合、どのファイルが再構築をトリガーしたかはわかりません。 ノードが再構築された場合
理由が別のファイルに起因しない場合、ノードの境界線は赤になります。 と
uDraw(Graph) では境界線の色がサポートされていないため、代わりに二重境界線が使用されます。
-D
-依存関係
makepp によって決定された依存関係のグラフを描画します。 これがデフォルトです
「-i、--includes」も指定されていない限り。
-d
- 下
--下向き
このオプションは、XNUMX つ以上のパターンを提供する場合にのみ意味があります。 それはその後だけです
一致したファイルが依存するターゲットおよび/またはソースを選択します。
含める。
-g
--graphviz
- ドット
Graphviz を作成する 。ドット デフォルトの uDraw(Graph) の代わりにファイル .udg ファイルにソフトウェアを指定する必要があります。
-h
--html
ブラウザを作成する .htmlを デフォルトの uDraw(Graph) の代わりにファイル .udg ファイルにソフトウェアを指定する必要があります。
-?
- 助けて
オプションの簡単な概要を印刷します。
-I ディレクトリにジョブを開始します。
--include =ディレクトリにジョブを開始します。
--include-dir =ディレクトリにジョブを開始します。
Add ディレクトリにジョブを開始します。 Perl ロード パス @INC に。
-i
-含む
依存関係の代わりに (または "-D, --dependencies" を追加して) 描画します
インクルード関係のグラフ。 これは、必要な範囲でのみログに記録されます
分析する。 全体像を把握するには、新しい完全なビルドが必要です。
-l ファイル名
--log =ファイル名
--log-file =ファイル名
この ファイル名 makepp がログを書き込んだ場所です。 ディレクトリである場合もあります。
と呼ばれるファイル .makepp/ログ or ログ 検索されます。 標準入力から読み取るには、次のように指定する必要があります -
として ファイル名。 このオプションが指定されていない場合は、デフォルトで現在のディレクトリが使用されます。
このオプションは、たとえば、次のすべてのログをマージするために複数回指定できます。
「--traditional-recursive-make」。 しかし、makepp から隠した依存関係は、
もちろん、邪悪な再帰パラダイムはここには現れません。
-M モジュール[=引数,...]
--module =モジュール[=引数,...]
モジュールをロードし、エクスポートされた関数をインポートします。
-m パーコード
--merge=パーコード
実行する パーコード すべてのターゲットとその依存関係。 詳細については、マージを参照してください
このオプション。
-o ファイル名
--output =ファイル名
出力をこのファイルに書き込みます。
-p
- プレーン
色や点線などの属性は使用しないでください。 これは特に便利です
「-t、--text」出力の整頓。 その形式では、双方向のエッジが失われます
これを「-s、--separate-directions」と組み合わせない限り。
-r パーコード
-名前の変更=パーコード
実行する パーコード すべてのターゲットとその依存関係。 詳細については、名前の変更を参照してください
このオプションについて。
-s
--個別の方向
両端の矢印を XNUMX つずつ描くのではなく、XNUMX つの別々の矢印を描いて、簡単に操作できるようにします。
スポット。
-t
- テキスト
人間が読める形式を作成する 。TXT デフォルトの uDraw(Graph) の代わりにファイル .udg ファイルにソフトウェアを指定する必要があります。
-u
- 上
--上向き
このオプションは、XNUMX つ以上のパターンを提供する場合にのみ意味があります。 それはその後だけです
一致したファイルに依存する、および/または含むターゲットを選択します。
-V
- バージョン
バージョン番号を出力します。
書き換え
この章のテクニックは通常、適切なサイズのグラフを得るために不可欠です。 として
これらは Perl コードとして定式化されており、言語が役立つことを知っています。 しかし、あなたはできるはずです
ここまたはギャラリーの例を使用して、多くのことを達成する
<http://makepp.sourceforge.net/gallery/>.
名前の変更
これは、「-r, --rename」オプションが指定された場合に発生する最初の名前の書き換えです。 為に
すべての名前に遭遇すると、perlcode が呼び出されます。 $_ でファイル名を取得し、変更する可能性があります
それ。 これは、makepp が完全修飾ファイル名をログに記録するため、しばしば必要になります。
簡単に半分の画面幅になります。
XNUMX つには、名前を「undef」または空の文字列に書き換えることができます。 これで解消します
グラフからのノード。 この最初の段階でノードを削除すると、
このノードが中間にあった場合、依存関係のチェーン。
さまざまな名前を同じ文字列に書き換えて、それらをすべて同じ文字列に強制することもできます
ノードは、結合された依存関係と依存関係を蓄積します。
一方、名前を(通常は)短い名前に変更して、名前を減らすことができます
ノードの幅。絶対ファイル名ではかなり大きくなる可能性があります。 いくつかあります
コードも実行されるパッケージ「Mpp::Rewrite」の定義済み関数を使用できます
このため。 これらは何かを行った場合に true を返すため、次のように組み合わせることができます。
--rename='cwd(1) || &ホーム || &usr'
&cwd
cwd 数
cwd 数、 名前[、 セパレータ]
パスの先頭から現在の作業ディレクトリを削除します。 また、数字で、
多くのレベルアップした親ディレクトリを適切な数のディレクトリに置き換えます .. /
ディレクトリ (該当する場合)。 この場合、代替を与えることができます 名、 のような
「..」の代わりに「:」を積み上げ、さらに代替 セパレーター 代わりに '' のように
の '/'。 最初のケースでは、あなたが得るかもしれない :/:/a/b、XNUMX番目はさらに短い ::a/b
../../a/b. から何かを引き出す場合、数値を渡すと便利です
近所の木。 または、 SRC ほとんどのアクションがあるディレクトリなので、
そこでmakeppgraphを呼び出しますが、他のディレクトリとの関係も見たいです。
「--rename」オプションを指定しない場合、&cwd がデフォルトです。 名前を変更したくない場合は、
あなたはいくつかを与えることができます パーコード 何もしない「--rename=1」のように。
&dir
これは、グラフの複雑さを大幅に軽減します。 すべてのファイルをその
ディレクトリ。 それは次の質問に相当します:「ディレクトリがファイルに依存するファイル
他のどのディレクトリから?」依存関係グラフは常に非循環的であることに注意してください
(そうでなければ、makepp はどこからビルドを開始すればよいかわかりません)。
見る。 たとえば、 dir1/a に依存します dir2/b と dir2/a on dir1/b として表示されます
間の相互依存 dir1 と dir2. 巡回グラフには明らかな開始点がないため、
点、レイアウトが変な場合があります。
このセクションの他の関数とは異なり、これは他の関数と排他的ではありません。 そう
論理的に結合したくない場合があります。
--rename='&dir; &cwd || &家'
&家
ホームディレクトリを次のように置き換えます ~/.
&makepp
makepp インストール ディレクトリを |分|.
&suf
眠い 数
これはまた、グラフの複雑さを大幅に軽減します。 それは持っているすべてのファイルを減らします
アスタリスクの接尾辞とその接尾辞。 どの種類のファイルが依存しているかがわかります
他の種類。 引数が 0 の場合、
"/"、"~"、または "|" のいずれかのディレクトリ。 (&home または &usr によって入力された場合
それらを最初に呼び出します)。 正の引数を指定すると、その数のディレクトリ レベルが残ります
最初に。 負の引数を指定すると、その数のディレクトリ レベルが削除されます。
終わり。 だから /a/b/c/d/e/xy 次のようになります。
&suf *.y
suf 0 /*.y
suf 1 /a/*.y
suf 2 /a/b/*.y
suf -1 /a/b/c/d/*.y
suf -2 /a/b/c/*.y
親戚の場合 a/b/c/d/e/xy 次のようになります。
&suf *.y
サフ 0 *.y
suf 1 a/*.y
suf -1 a/b/c/d/*.y
&usr
/, /usr, /usr /lオーカル, /usr /X11, /usr /X11R6, /usr /X11R7 or /opt、
ディレクトリ bin, etc, i含む, lib or sウサギ、これらの言葉のイニシャルは
バー間で連結されます。
例えば /usr /lローカル/bイン/フーバー になる |ウルブ|フーバー or /usr /iインクルード/ネット/if.h になる
|ui|net/if.h. `l' は、XNUMX 文字の間にある場合は `local' を表し、`lib' を表すことに注意してください。
最後の手紙として。
マージ
これは、「-m, --merge」オプションが指定された場合に発生する XNUMX 番目の名前の書き換えです。 これ
APIはまだ開発中です! 現在、ターゲットは $_ と依存関係で渡されます
引数として。 perlcode が値を返す場合、その値はターゲットと
依存関係を解消し、それらを XNUMX つのノードにマージします。 いくつかの定義済み関数が役立ちます。
c2o 任意の C/C++ ソースとその結果 .o ファイルに追加して、それらを XNUMX つのノードにマージします。
ソース パスの接尾辞 ">o" のように some/where/foo.cc>o、たとえ .o ファイルが入っています
別のディレクトリ。
exe 任意の .o ファイルと、同じ notdir ベース名の結果の実行可能ファイルに、
接尾辞または .exeファイルにアスタリスクを追加して、それらを XNUMX つのノードにマージします。 .o ファイルにソフトウェアを指定する必要があります。
これは現在、 C2O.
x2 同じ名前のファイルのペアの場合、通常はヘッダーまたはライブラリに公開されます
中央ディレクトリに追加して、それらをXNUMXつのノードにマージします *2 依存関係に。
ENVIRONMENT
Makeppgraph は次の環境変数を参照します。
$MAKEPPGRAPHFLAGS
この環境変数内のフラグはすべて、コマンド ライン オプションとして解釈されます。
明示的なオプション。 引用符は makefile と同様に解釈されます。
onworks.net サービスを使用してオンラインで mppg を使用する