1 | #!/bin/sh |
---|
2 | |
---|
3 | set -e |
---|
4 | |
---|
5 | merge=1 |
---|
6 | |
---|
7 | file="$1" |
---|
8 | if [ -z "$file" ]; then |
---|
9 | file="deps" |
---|
10 | fi |
---|
11 | |
---|
12 | dot="${file}.dot" |
---|
13 | svg="${file}.svg" |
---|
14 | |
---|
15 | norm() |
---|
16 | { |
---|
17 | echo $1 | tr / _ |
---|
18 | } |
---|
19 | |
---|
20 | colour() |
---|
21 | { |
---|
22 | case $1 in |
---|
23 | Ice) col=lightblue;; |
---|
24 | IceUtil) col=blue;; |
---|
25 | Glacier2) col=navy;; |
---|
26 | stdlib) col=green;; |
---|
27 | omero) col=red;; |
---|
28 | omero/model) col=yellowgreen;; |
---|
29 | omero/api) col=plum;; |
---|
30 | omero/cmd) col=orange;; |
---|
31 | omero/util) col=turquoise;; |
---|
32 | *) col=black;; |
---|
33 | esac |
---|
34 | echo $col |
---|
35 | } |
---|
36 | |
---|
37 | group() |
---|
38 | { |
---|
39 | unit=$1 |
---|
40 | case "${1%/*}" in |
---|
41 | omero/api|omero/cmd|omero/model|omero/util|Ice|IceUtil|Glacier2) |
---|
42 | unit="${unit%/*}";; |
---|
43 | typeinfo|map|stdexcept|iosfwd|sstream|ostream|iostream|exception|vector|algorithm|string) |
---|
44 | unit="stdlib";; |
---|
45 | |
---|
46 | esac |
---|
47 | echo "$unit" |
---|
48 | } |
---|
49 | |
---|
50 | cat <<EOF > "$dot" |
---|
51 | strict digraph G { |
---|
52 | graph [compound=true]; |
---|
53 | EOF |
---|
54 | |
---|
55 | if [ "$merge" = "1" ]; then |
---|
56 | cat <<EOF >> "$dot" |
---|
57 | $(norm Ice) [label="Ice",color=$(colour Ice)]; |
---|
58 | $(norm IceUtil) [label="IceUtil",color=$(colour IceUtil)]; |
---|
59 | $(norm Glacier2) [label="Glacier2",color=$(colour Glacier2)]; |
---|
60 | $(norm stdlib) [label="stdlib",color=$(colour stdlib)]; |
---|
61 | EOF |
---|
62 | else |
---|
63 | cat <<EOF >> "$dot" |
---|
64 | subgraph cluster_$(norm Ice) { |
---|
65 | label = "Ice"; |
---|
66 | style = solid; |
---|
67 | node [shape=box,color=lightblue]; |
---|
68 | |
---|
69 | $(norm Ice/BasicStream) [label="BasicStream"]; |
---|
70 | $(norm Ice/BuiltinSequences) [label="BuiltinSequences"]; |
---|
71 | $(norm Ice/Current) [label="Current"]; |
---|
72 | $(norm Ice/Direct) [label="Direct"]; |
---|
73 | $(norm Ice/Exception) [label="Exception"]; |
---|
74 | $(norm Ice/FactoryTableInit) [label="FactoryTableInit"]; |
---|
75 | $(norm Ice/IncomingAsync) [label="IncomingAsync"]; |
---|
76 | $(norm Ice/Incoming) [label="Incoming"]; |
---|
77 | $(norm Ice/LocalException) [label="LocalException"]; |
---|
78 | $(norm Ice/LocalObject) [label="LocalObject"]; |
---|
79 | $(norm Ice/ObjectFactory) [label="ObjectFactory"]; |
---|
80 | $(norm Ice/ObjectF) [label="ObjectF"]; |
---|
81 | $(norm Ice/Object) [label="Object"]; |
---|
82 | $(norm Ice/OutgoingAsync) [label="OutgoingAsync"]; |
---|
83 | $(norm Ice/Outgoing) [label="Outgoing"]; |
---|
84 | $(norm Ice/ProxyF) [label="ProxyF"]; |
---|
85 | $(norm Ice/Proxy) [label="Proxy"]; |
---|
86 | $(norm Ice/SlicedDataF) [label="SlicedDataF"]; |
---|
87 | $(norm Ice/SlicedData) [label="SlicedData"]; |
---|
88 | $(norm Ice/StreamF) [label="StreamF"]; |
---|
89 | $(norm Ice/StreamHelpers) [label="StreamHelpers"]; |
---|
90 | $(norm Ice/UndefSysMacros) [label="UndefSysMacros"]; |
---|
91 | } |
---|
92 | subgraph cluster_$(norm IceUtil) { |
---|
93 | label ="IceUtil"; |
---|
94 | style = solid; |
---|
95 | node [shape=box,color=lightblue]; |
---|
96 | |
---|
97 | $(norm IceUtil/Config) [label="Config"]; |
---|
98 | $(norm IceUtil/Iterator) [label="Iterator"]; |
---|
99 | $(norm IceUtil/Optional) [label="Optional"]; |
---|
100 | $(norm IceUtil/ScopedArray) [label="ScopedArray"]; |
---|
101 | } |
---|
102 | subgraph cluster_$(norm Glacier2) { |
---|
103 | label ="Glacier2"; |
---|
104 | style = solid; |
---|
105 | node [shape=box,color=lightblue]; |
---|
106 | |
---|
107 | $(norm Glacier2/Session) [label="Session"]; |
---|
108 | } |
---|
109 | subgraph cluster_$(norm stdlib) { |
---|
110 | label = "stdlib"; |
---|
111 | style = solid; |
---|
112 | node [shape=box,color=$(colour stdlib)]; |
---|
113 | |
---|
114 | $(norm typeinfo) [label="typeinfo"]; |
---|
115 | $(norm map) [label="map"]; |
---|
116 | $(norm stdexcept) [label="stdexcept"]; |
---|
117 | $(norm iosfwd) [label="iosfwd"]; |
---|
118 | $(norm sstream) [label="sstream"]; |
---|
119 | $(norm ostream) [label="ostream"]; |
---|
120 | $(norm iostream) [label="iostream"]; |
---|
121 | $(norm exception) [label="exception"]; |
---|
122 | $(norm vector) [label="vector"]; |
---|
123 | $(norm algorithm) [label="algorithm"]; |
---|
124 | $(norm string) [label="string"]; |
---|
125 | } |
---|
126 | EOF |
---|
127 | fi |
---|
128 | |
---|
129 | for component in omero omero/model omero/cmd omero/api omero/util; do |
---|
130 | echo "Processing component: $component" |
---|
131 | |
---|
132 | if [ "$component" != "omero" -a "$merge" = "1" ]; then |
---|
133 | cat <<EOF >> "$dot" |
---|
134 | $(norm $component) [label="$component",color=$(colour $component)]; |
---|
135 | EOF |
---|
136 | else |
---|
137 | cat <<EOF >> "$dot" |
---|
138 | subgraph cluster_$(norm $component) { |
---|
139 | label ="$component"; |
---|
140 | style = solid; |
---|
141 | colour = $(colour $component); |
---|
142 | node [shape=box,color=$(colour $component)]; |
---|
143 | |
---|
144 | EOF |
---|
145 | |
---|
146 | sources=$( (find "$component" -maxdepth 1 -name "*.h"; find "$component" -maxdepth 1 -name "*.cpp") | sort) |
---|
147 | units=$(echo "$sources" | sed -e "s;\.h\$;;" -e "s;\.cpp\$;;" | uniq) |
---|
148 | echo "$units" |
---|
149 | |
---|
150 | for unit in $units; do |
---|
151 | echo " Processing unit: $unit" |
---|
152 | name=${unit#*/} |
---|
153 | name=${name#*/} |
---|
154 | cat <<EOF >> "$dot" |
---|
155 | $(norm $unit) [label="$name"]; |
---|
156 | EOF |
---|
157 | done |
---|
158 | if [ component != "omero" ]; then |
---|
159 | cat <<EOF >> "$dot" |
---|
160 | } |
---|
161 | EOF |
---|
162 | fi |
---|
163 | fi |
---|
164 | done |
---|
165 | |
---|
166 | # Process deps |
---|
167 | for component in omero omero/model omero/cmd omero/api omero/util; do |
---|
168 | sources=$( (find "$component" -maxdepth 1 -name "*.h"; find "$component" -maxdepth 1 -name "*.cpp") | sort) |
---|
169 | |
---|
170 | for source in $sources; do |
---|
171 | echo -n " Processing source: $source" |
---|
172 | unit=$(echo "$source" | sed -e "s;\.h\$;;" -e "s;\.cpp\$;;") |
---|
173 | name=${unit#*/} |
---|
174 | name=${name#*/} |
---|
175 | deps=$(grep "#include" "$source" | sed -e "s;#include.*<\(.*\)>.*;\1;") |
---|
176 | for dep in $deps; do |
---|
177 | dep=$(echo "$dep" | sed -e "s;\.h\$;;" -e "s;\.cpp\$;;") |
---|
178 | echo -n "." |
---|
179 | # Drop self-references |
---|
180 | if [ "$(norm $unit)" = "$(norm $dep)" ]; then continue; fi |
---|
181 | # Don't generate inter-module deps except for the omero component |
---|
182 | # if [ "${unit%/*}" != "$component" -o "$component" = "omero" ]; then |
---|
183 | if [ "$merge" = "1" ]; then |
---|
184 | unit=$(group "$unit") |
---|
185 | dep=$(group "$dep") |
---|
186 | fi |
---|
187 | cat <<EOF >> "$dot" |
---|
188 | $(norm $unit) -> $(norm $dep) [color=$(colour $dep)]; |
---|
189 | EOF |
---|
190 | # fi |
---|
191 | done |
---|
192 | echo "done." |
---|
193 | done |
---|
194 | done |
---|
195 | |
---|
196 | cat <<EOF >> "$dot" |
---|
197 | } |
---|
198 | EOF |
---|
199 | |
---|
200 | ccomps -Cx "$dot" | dot | gvpack -array_1 | neato -n2 -Tsvg > "$svg" |
---|
201 | egrep -v -- "->.*(Ice|Glacier|stdlib)" "$dot" | ccomps -C | dot | gvpack -array_1 | neato -n2 -Tsvg > "noice-$svg" |
---|