該腳本主要是根據ninja生成的graphviz dot file文本文件,然後根據其中一個label節點,查找 其父子節點。方便理清該節點的編譯鏈接關係。該腳本生成某一個label節點的父子節點dot描述內容,存爲dot類文件。然後使用dot工具,將dot文件生成png或者Pdf文件。
#!/bin/bash
#set -x
PARA_N=2
if [ $# -lt $PARA_N ];then
echo usage:$0 label graph
exit 1
fi
TMP_DOT=tmp.dot #target dot file
TMP_TMP=tmp.tmp #temporary file
TMP_CHILDREN_ID=children.id #temporary file
TMP_PARENT_ID=parent.id #temporary file
label_id=$1
dot_file=$2
dot_n=$3
#echo $label_id $dot_file
IGNORE_ID_TXT=ignore_id.txt
#find current label id
head -n 4 $dot_file > $dot_n.$TMP_DOT
grep "$label_id\" \[label" $dot_file | grep -v "\->" > $TMP_TMP
label_num=`cat $TMP_TMP | wc -l`
if [ $label_num -gt 1 ];then
echo ignore $label_id
echo $label_id >> $IGNORE_ID_TXT
rm $TMP_TMP $dot_n.$TMP_DOT
exit 1
fi
#label_id=`cat $TMP_TMP|awk -F\" '{ print $2 }'`
grep $label_id $dot_file >> $dot_n.$TMP_DOT
sed -i "s/$label_id\" \[label/$label_id\" \[color=red, label/g" $dot_n.$TMP_DOT
#find label's parents
grep $label_id $dot_file | grep "\-> \"$label_id\"" > $TMP_TMP
cat $TMP_TMP|awk -F\" '{ print $2 }' > $TMP_PARENT_ID
parent_num=`cat $TMP_PARENT_ID|wc -l`
parent_id=
while read line
do
parent_id=$line
grep "\"$parent_id\" \[label" $dot_file|grep -v "\->" >> $dot_n.$TMP_DOT
done < $TMP_PARENT_ID
#find label's children
grep $label_id $dot_file | grep "\"$label_id\" \->" > $TMP_TMP
cat $TMP_TMP|awk -F\" '{ print $4 }' > $TMP_CHILDREN_ID
child_num=`cat $TMP_CHILDREN_ID|wc -l`
child_id=
while read line
do
child_id=$line
grep "\"$child_id\" \[label" $dot_file|grep -v "\->" >> $dot_n.$TMP_DOT
done < $TMP_CHILDREN_ID
echo } >> $dot_n.$TMP_DOT
rm $TMP_TMP $TMP_CHILDREN_ID $TMP_PARENT_ID
#echo finished!
比如我這裏生成了“.tmp.dot文件”,利用dot工具:
Jqh_1@DESKTOP-E2P227J MINGW64 /f/draw_lable
$ ./draw_label.sh fuchsia.zbi fuchsia.graph
Jqh_1@DESKTOP-E2P227J MINGW64 /f/draw_lable
$ dot -Tpdf -o tmp.pdf .tmp.dot
打開tmp.pdf文件,會有一個簡圖如下:
我把當前的label標爲紅色,其父子節點爲黑色。接下來繼續分析fuchsia和zircon,所有節點 關係。
爲了將zircon.graph整個關係圖畫出來,我新增了一個腳本文件main_draw.sh,調用draw_label.sh文件,實現全部畫出,只是會生成n個文件。腳本內容如下:
#!/bin/bash
PARA_NUM=2
DOT_FILE=$1
FMT_FILE=$2
#set -x
if [ $# -lt $PARA_NUM ];then
echo usage:$0 dot_file
exit 1
fi
#save label id to id.tmp file
ID_TMP=id.tmp
grep "\" \[label=" $DOT_FILE | grep -v "\->" | awk -F\" '{ print $2 }'> $ID_TMP
#begain main draw function
label_id=
drawsh=./draw_label.sh
n=0
while read line
do
label_id=$line
$drawsh $label_id $DOT_FILE $n
dot -T$FMT_FILE -o $n.tmp.$FMT_FILE $n.tmp.dot
rm $n.tmp.dot
let n=n+1
echo $n
done < $ID_TMP
rm $ID_TMP
echo finished!
只要稍微等一段時間,一般一個小時左右,畢竟有幾萬個節點。就會畫出整個關係圖了。