OSDN Git Service

make product-graph now filtered
authorJoe Onorato <joeo@google.com>
Tue, 8 May 2012 00:15:15 +0000 (17:15 -0700)
committerJoe Onorato <joeo@google.com>
Fri, 17 Aug 2012 05:36:40 +0000 (22:36 -0700)
Change-Id: I6bd93a87902e20a24c1c58152fb578ef1f4cb208

core/tasks/product-graph.mk
tools/filter-product-graph.py [new file with mode: 0755]

index 6442252..70b5de8 100644 (file)
 
 products_pdf := $(OUT_DIR)/products.pdf
 products_graph := $(products_pdf:%.pdf=%.dot)
+ifeq ($(strip $(ANDROID_PRODUCT_GRAPH)),)
+products_list := $(INTERNAL_PRODUCT)
+else
+ifeq ($(strip $(ANDROID_PRODUCT_GRAPH)),--all)
+products_list := --all
+else
+products_list := $(foreach prod,$(ANDROID_PRODUCT_GRAPH),$(call resolve-short-product-name,$(prod)))
+endif
+endif
+
+$(products_graph): PRIVATE_PRODUCTS := $(products_list)
 
 $(products_graph):
-       @echo Product graph DOT: $@
+       @echo Product graph DOT: $@ for $(PRIVATE_PRODUCTS)
        $(hide) ( \
                echo 'digraph {'; \
                echo 'graph [ ratio=.5 ];'; \
@@ -27,12 +38,17 @@ $(products_graph):
                        echo \"$(d)\" -\> \"$(p)\";)) \
                $(foreach prod, \
                        $(sort $(foreach p,$(ALL_PRODUCTS), \
-                               $(foreach d,$(PRODUCTS.$(strip $(p)).INHERITS_FROM), \
-                                       $(d))) \
+                               $(foreach d,$(PRODUCTS.$(strip $(p)).INHERITS_FROM), $(d))) \
                                $(foreach p,$(ALL_PRODUCTS),$(p))), \
-                       echo \"$(prod)\" [ label=\"$(dir $(prod))\\n$(notdir $(prod))\"];) \
+                       echo \"$(prod)\" [ \
+                                       label=\"$(dir $(prod))\\n$(notdir $(prod))\\n\\n$(PRODUCTS.$(strip $(prod)).PRODUCT_MODEL)\\n$(PRODUCTS.$(strip $(prod)).PRODUCT_DEVICE)\" \
+                                       $(if $(filter $(prod),$(PRIVATE_PRODUCTS)), \
+                                               style=\"filled\" fillcolor=\"#FFFDB0\",) \
+                               ];) \
                echo '}' \
-       ) > $@
+       ) \
+       | ./build/tools/filter-product-graph.py $(PRIVATE_PRODUCTS) \
+       > $@
 
 # This rule doesn't include any nodes that don't inherit from
 # anything or don't have anything inherit from them, to make the
diff --git a/tools/filter-product-graph.py b/tools/filter-product-graph.py
new file mode 100755 (executable)
index 0000000..b3a5b42
--- /dev/null
@@ -0,0 +1,68 @@
+#!/usr/bin/env python
+# vim: ts=2 sw=2 nocindent
+
+import re
+import sys
+
+def choose_regex(regs, line):
+  for func,reg in regs:
+    m = reg.match(line)
+    if m:
+      return (func,m)
+  return (None,None)
+
+def gather(included, deps):
+  result = set()
+  for inc in included:
+    result.add(inc)
+    for d in deps:
+      if inc == d[1]:
+        result.add(d[0])
+  return result
+
+def main():
+  deps = []
+  infos = []
+  def dependency(m):
+    deps.append((m.group(1), m.group(2)))
+  def info(m):
+    infos.append((m.group(1), m.group(2)))
+
+  REGS = [
+      (dependency, re.compile(r'"(.*)"\s*->\s*"(.*)"')), 
+      (info, re.compile(r'"(.*)"(\s*\[.*\])')), 
+    ]
+
+  lines = sys.stdin.readlines()
+  lines = [line.strip() for line in lines]
+
+  for line in lines:
+    func,m = choose_regex(REGS, line)
+    if func:
+      func(m)
+
+  # filter
+  sys.stderr.write("argv: " + str(sys.argv) + "\n")
+  if not (len(sys.argv) == 2 and sys.argv[1] == "--all"):
+    targets = sys.argv[1:]
+
+    included = set(targets)
+    prevLen = -1
+    while prevLen != len(included):
+      prevLen = len(included)
+      included = gather(included, deps)
+
+    deps = [dep for dep in deps if dep[1] in included]
+    infos = [info for info in infos if info[0] in included]
+
+  print "digraph {"
+  print "graph [ ratio=.5 ];"
+  for dep in deps:
+    print '"%s" -> "%s"' % dep
+  for info in infos:
+    print '"%s"%s' % info
+  print "}"
+
+
+if __name__ == "__main__":
+  main()