aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Kristina Chodorow <kchodorow@google.com>2016-12-19 16:58:42 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-12-19 18:56:06 +0000
commitb9f914fa56a00530d38b597dc853aad50d1decfb (patch)
tree85cc1b5ed6bce7b0c265aabfe353ef5c83cfbe00
parentcd4cc09fa6ef96380a3d0888f825dfd1dbada651 (diff)
Make Bazel build dot
This change has several parts, it: * Adds a "make" repository rule, which runs ./configure && make on a repository. * Modifies the tar.gz decompressor to restore timestamps. This was an issue with dot, as make examines the timestamp to determine if files need to be rebuilt. Because Bazel was not preserving the archive's timestamp, it was rebuilding things that it did not need to (and, I think, exposed some bugs in dot's Makefile). * Actually add dot as an external repository. I made the dot-graph target manual, so it won't be downloaded/built by the default //... target. * Remove dot scrubbing from the Bazel export process. * Added some names to download_and_extract params, because it's really annoying to only be able to reference them positionally. -- PiperOrigin-RevId: 142452055 MOS_MIGRATED_REVID=142452055
-rw-r--r--WORKSPACE9
-rw-r--r--scripts/docs/BUILD2
-rw-r--r--scripts/docs/generate_dot_graphs.py6
-rw-r--r--site/versions/master/docs/build-ref.html239
-rw-r--r--site/versions/master/docs/query.html572
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java10
-rw-r--r--tools/build_defs/repo/make.bzl66
8 files changed, 220 insertions, 690 deletions
diff --git a/WORKSPACE b/WORKSPACE
index 666b8dfe9e..9d2c79654a 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -64,3 +64,12 @@ new_local_repository(
path = "./third_party/protobuf/3.0.0/",
build_file = "./third_party/protobuf/3.0.0/com_google_protobuf_java.BUILD",
)
+
+load('//tools/build_defs/repo:make.bzl', 'make')
+make(
+ name = "dot",
+ urls = ["http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.38.0.tar.gz"],
+ strip_prefix = 'graphviz-2.38.0',
+ sha256 = '81aa238d9d4a010afa73a9d2a704fc3221c731e1e06577c2ab3496bdef67859e',
+ exports = ["cmd/dot/dot"],
+)
diff --git a/scripts/docs/BUILD b/scripts/docs/BUILD
index 53452e22e0..5e0a704755 100644
--- a/scripts/docs/BUILD
+++ b/scripts/docs/BUILD
@@ -12,6 +12,8 @@ py_library(
py_binary(
name = "generate_dot_graphs",
srcs = ["generate_dot_graphs.py"],
+ data = ["@dot//:cmd/dot/dot"],
+ tags = ["manual"],
visibility = ["//site:__pkg__"],
deps = [":dot-converter"],
)
diff --git a/scripts/docs/generate_dot_graphs.py b/scripts/docs/generate_dot_graphs.py
index 306d5e12b0..f8d26e0449 100644
--- a/scripts/docs/generate_dot_graphs.py
+++ b/scripts/docs/generate_dot_graphs.py
@@ -18,6 +18,8 @@ import os
from scripts.docs.dot_converter import DotConverter
-if __name__ == "__main__":
- converter = DotConverter(["dot", "-Tsvg"], os.environ.copy())
+if __name__ == '__main__':
+ converter = DotConverter(
+ ['%s/external/dot/cmd/dot/dot' % os.environ['PWD'], '-Tsvg'],
+ os.environ.copy())
converter.convert()
diff --git a/site/versions/master/docs/build-ref.html b/site/versions/master/docs/build-ref.html
index b90ac48439..96521c09e5 100644
--- a/site/versions/master/docs/build-ref.html
+++ b/site/versions/master/docs/build-ref.html
@@ -99,115 +99,19 @@ src/my/app/tests/test.cc
</p>
<div style='margin:auto; text-align: center'>
-<svg width="582pt" height="188pt"
- viewBox="0.00 0.00 581.89 188.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 184)">
-<title>G1</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-184 577.888,-184 577.888,4 -4,4"/>
-<!-- Target -->
-<g id="node1" class="node">
-<title>Target</title>
-<ellipse fill="none" stroke="black" cx="376.795" cy="-162" rx="40.0939" ry="18"/>
-<text text-anchor="middle" x="376.795" y="-158.3" font-family="arial" font-size="14.00">Target</text>
-</g>
-<!-- Rule -->
-<g id="node2" class="node">
-<title>Rule</title>
-<ellipse fill="none" stroke="black" cx="241.795" cy="-90" rx="30.5947" ry="18"/>
-<text text-anchor="middle" x="241.795" y="-86.3" font-family="arial" font-size="14.00">Rule</text>
-</g>
-<!-- Target&#45;&gt;Rule -->
-<g id="edge1" class="edge">
-<title>Target&#45;&gt;Rule</title>
-<path fill="none" stroke="black" d="M351.402,-147.834C329.151,-136.296 296.735,-119.487 272.926,-107.142"/>
-<polygon fill="black" stroke="black" points="274.432,-103.98 263.943,-102.484 271.21,-110.195 274.432,-103.98"/>
-</g>
-<!-- File -->
-<g id="node6" class="node">
-<title>File</title>
-<ellipse fill="none" stroke="black" cx="376.795" cy="-90" rx="30.5947" ry="18"/>
-<text text-anchor="middle" x="376.795" y="-86.3" font-family="arial" font-size="14.00">File</text>
-</g>
-<!-- Target&#45;&gt;File -->
-<g id="edge5" class="edge">
-<title>Target&#45;&gt;File</title>
-<path fill="none" stroke="black" d="M376.795,-143.697C376.795,-135.983 376.795,-126.712 376.795,-118.112"/>
-<polygon fill="black" stroke="black" points="380.295,-118.104 376.795,-108.104 373.295,-118.104 380.295,-118.104"/>
-</g>
-<!-- Package group -->
-<g id="node9" class="node">
-<title>Package group</title>
-<ellipse fill="none" stroke="black" cx="499.795" cy="-90" rx="74.187" ry="18"/>
-<text text-anchor="middle" x="499.795" y="-86.3" font-family="arial" font-size="14.00">Package group</text>
-</g>
-<!-- Target&#45;&gt;Package group -->
-<g id="edge8" class="edge">
-<title>Target&#45;&gt;Package group</title>
-<path fill="none" stroke="black" d="M400.802,-147.337C418.506,-137.262 442.911,-123.373 463.059,-111.906"/>
-<polygon fill="black" stroke="black" points="465.018,-114.819 471.978,-106.831 461.555,-108.735 465.018,-114.819"/>
-</g>
-<!-- cc_library -->
-<g id="node3" class="node">
-<title>cc_library</title>
-<ellipse fill="none" stroke="black" cx="59.7947" cy="-18" rx="59.5901" ry="18"/>
-<text text-anchor="middle" x="59.7947" y="-14.3" font-family="arial" font-size="14.00">cc_library</text>
-</g>
-<!-- Rule&#45;&gt;cc_library -->
-<g id="edge2" class="edge">
-<title>Rule&#45;&gt;cc_library</title>
-<path fill="none" stroke="black" d="M216.87,-79.4136C188.038,-68.3243 140.006,-49.8505 104.633,-36.2453"/>
-<polygon fill="black" stroke="black" points="105.607,-32.8704 95.0176,-32.5473 103.095,-39.4038 105.607,-32.8704"/>
-</g>
-<!-- java_test -->
-<g id="node4" class="node">
-<title>java_test</title>
-<ellipse fill="none" stroke="black" cx="191.795" cy="-18" rx="54.6905" ry="18"/>
-<text text-anchor="middle" x="191.795" y="-14.3" font-family="arial" font-size="14.00">java_test</text>
-</g>
-<!-- Rule&#45;&gt;java_test -->
-<g id="edge3" class="edge">
-<title>Rule&#45;&gt;java_test</title>
-<path fill="none" stroke="black" d="M230.449,-73.1159C224.298,-64.5051 216.557,-53.6674 209.621,-43.9567"/>
-<polygon fill="black" stroke="black" points="212.453,-41.9004 203.793,-35.7973 206.757,-45.9691 212.453,-41.9004"/>
-</g>
-<!-- ... -->
-<g id="node5" class="node">
-<title>...</title>
-<ellipse fill="none" stroke="black" cx="291.795" cy="-18" rx="27" ry="18"/>
-<text text-anchor="middle" x="291.795" y="-14.3" font-family="arial" font-size="14.00">...</text>
-</g>
-<!-- Rule&#45;&gt;... -->
-<g id="edge4" class="edge">
-<title>Rule&#45;&gt;...</title>
-<path fill="none" stroke="black" d="M253.14,-73.1159C259.469,-64.2555 267.482,-53.0373 274.57,-43.1152"/>
-<polygon fill="black" stroke="black" points="277.529,-44.9929 280.494,-34.8212 271.833,-40.9242 277.529,-44.9929"/>
-</g>
-<!-- Source -->
-<g id="node7" class="node">
-<title>Source</title>
-<ellipse fill="none" stroke="black" cx="376.795" cy="-18" rx="40.0939" ry="18"/>
-<text text-anchor="middle" x="376.795" y="-14.3" font-family="arial" font-size="14.00">Source</text>
-</g>
-<!-- File&#45;&gt;Source -->
-<g id="edge6" class="edge">
-<title>File&#45;&gt;Source</title>
-<path fill="none" stroke="black" d="M376.795,-71.6966C376.795,-63.9827 376.795,-54.7125 376.795,-46.1124"/>
-<polygon fill="black" stroke="black" points="380.295,-46.1043 376.795,-36.1043 373.295,-46.1044 380.295,-46.1043"/>
-</g>
-<!-- Generated -->
-<g id="node8" class="node">
-<title>Generated</title>
-<ellipse fill="none" stroke="black" cx="489.795" cy="-18" rx="54.6905" ry="18"/>
-<text text-anchor="middle" x="489.795" y="-14.3" font-family="arial" font-size="14.00">Generated</text>
-</g>
-<!-- File&#45;&gt;Generated -->
-<g id="edge7" class="edge">
-<title>File&#45;&gt;Generated</title>
-<path fill="none" stroke="black" d="M396.997,-76.4854C413.512,-66.2547 437.203,-51.579 456.513,-39.6169"/>
-<polygon fill="black" stroke="black" points="458.378,-42.579 465.036,-34.3375 454.691,-36.6283 458.378,-42.579"/>
-</g>
-</g>
-</svg>
+<div class='graphviz dot'><!--
+digraph G1 {
+ node [shape=ellipse];
+ Target -> Rule;
+ Rule -> cc_library
+ Rule -> java_test
+ Rule -> "..."
+ Target -> File;
+ File -> Source;
+ File -> Generated;
+ Target -> "Package group"
+}
+--></div>
<p><i>Hierarchy of targets.</i></p>
</div>
@@ -524,103 +428,26 @@ testdata/input.txt
</p>
<div style="margin:auto; text-align:center">
-<svg width="157pt" height="246pt"
- viewBox="0.00 0.00 156.50 246.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 242)">
-<title>G1</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-242 152.5,-242 152.5,4 -4,4"/>
-<!-- r1 -->
-<g id="node1" class="node">
-<title>r1</title>
-<polygon fill="none" stroke="black" points="88.5,-173 34.5,-173 34.5,-137 88.5,-137 88.5,-173"/>
-<text text-anchor="middle" x="61.5" y="-152.5" font-family="arial" font-size="10.00" fill="#006000">rule</text>
-</g>
-<!-- s1 -->
-<g id="node3" class="node">
-<title>s1</title>
-<ellipse fill="none" stroke="black" cx="14.5" cy="-223.5" rx="14.5" ry="14.5"/>
-<text text-anchor="middle" x="14.5" y="-221" font-family="arial" font-size="10.00" fill="#006000">in</text>
-</g>
-<!-- r1&#45;&gt;s1 -->
-<g id="edge1" class="edge">
-<title>r1&#45;&gt;s1</title>
-<path fill="none" stroke="black" d="M49.3963,-173.125C42.9655,-182.224 35.0324,-193.449 28.3559,-202.895"/>
-<polygon fill="black" stroke="black" points="25.3432,-201.094 22.4297,-211.28 31.0596,-205.134 25.3432,-201.094"/>
-</g>
-<!-- s2 -->
-<g id="node4" class="node">
-<title>s2</title>
-<ellipse fill="none" stroke="black" cx="61.5" cy="-223.5" rx="14.5" ry="14.5"/>
-<text text-anchor="middle" x="61.5" y="-221" font-family="arial" font-size="10.00" fill="#006000">in</text>
-</g>
-<!-- r1&#45;&gt;s2 -->
-<g id="edge2" class="edge">
-<title>r1&#45;&gt;s2</title>
-<path fill="none" stroke="black" d="M61.5,-173.125C61.5,-180.918 61.5,-190.27 61.5,-198.729"/>
-<polygon fill="black" stroke="black" points="58.0001,-198.782 61.5,-208.782 65.0001,-198.782 58.0001,-198.782"/>
-</g>
-<!-- s3 -->
-<g id="node5" class="node">
-<title>s3</title>
-<ellipse fill="none" stroke="black" cx="108.5" cy="-223.5" rx="14.5" ry="14.5"/>
-<text text-anchor="middle" x="108.5" y="-221" font-family="arial" font-size="10.00" fill="#006000">in</text>
-</g>
-<!-- r1&#45;&gt;s3 -->
-<g id="edge3" class="edge">
-<title>r1&#45;&gt;s3</title>
-<path fill="none" stroke="black" d="M73.6037,-173.125C80.0345,-182.224 87.9676,-193.449 94.6441,-202.895"/>
-<polygon fill="black" stroke="black" points="91.9404,-205.134 100.57,-211.28 97.6568,-201.094 91.9404,-205.134"/>
-</g>
-<!-- r2 -->
-<g id="node2" class="node">
-<title>r2</title>
-<polygon fill="none" stroke="black" points="148.5,-101 94.5,-101 94.5,-65 148.5,-65 148.5,-101"/>
-<text text-anchor="middle" x="121.5" y="-80.5" font-family="arial" font-size="10.00" fill="#006000">rule</text>
-</g>
-<!-- r2&#45;&gt;r1 -->
-<g id="edge5" class="edge">
-<title>r2&#45;&gt;r1</title>
-<path fill="none" stroke="black" d="M106.669,-101.303C99.4753,-109.695 90.7033,-119.93 82.8097,-129.139"/>
-<polygon fill="black" stroke="black" points="80.0114,-127.025 76.1609,-136.896 85.3262,-131.581 80.0114,-127.025"/>
-</g>
-<!-- s4 -->
-<g id="node6" class="node">
-<title>s4</title>
-<ellipse fill="none" stroke="black" cx="121.5" cy="-155" rx="14.5" ry="14.5"/>
-<text text-anchor="middle" x="121.5" y="-152.5" font-family="arial" font-size="10.00" fill="#006000">in</text>
-</g>
-<!-- r2&#45;&gt;s4 -->
-<g id="edge4" class="edge">
-<title>r2&#45;&gt;s4</title>
-<path fill="none" stroke="black" d="M121.5,-101.303C121.5,-110.01 121.5,-120.7 121.5,-130.171"/>
-<polygon fill="black" stroke="black" points="118,-130.175 121.5,-140.175 125,-130.176 118,-130.175"/>
-</g>
-<!-- o1 -->
-<g id="node7" class="node">
-<title>o1</title>
-<ellipse fill="none" stroke="black" cx="61.5" cy="-83" rx="14.5" ry="14.5"/>
-<text text-anchor="middle" x="61.5" y="-80.5" font-family="arial" font-size="10.00" fill="#006000">out</text>
-</g>
-<!-- o1&#45;&gt;r1 -->
-<g id="edge6" class="edge">
-<title>o1&#45;&gt;r1</title>
-<path fill="none" stroke="black" d="M61.5,-97.8297C61.5,-106.081 61.5,-116.847 61.5,-126.744"/>
-<polygon fill="black" stroke="black" points="58.0001,-126.981 61.5,-136.981 65.0001,-126.981 58.0001,-126.981"/>
-</g>
-<!-- o2 -->
-<g id="node8" class="node">
-<title>o2</title>
-<ellipse fill="none" stroke="black" cx="121.5" cy="-14.5" rx="14.5" ry="14.5"/>
-<text text-anchor="middle" x="121.5" y="-12" font-family="arial" font-size="10.00" fill="#006000">out</text>
-</g>
-<!-- o2&#45;&gt;r2 -->
-<g id="edge7" class="edge">
-<title>o2&#45;&gt;r2</title>
-<path fill="none" stroke="black" d="M121.5,-29.2788C121.5,-36.6355 121.5,-45.9556 121.5,-54.7067"/>
-<polygon fill="black" stroke="black" points="118,-54.9286 121.5,-64.9286 125,-54.9286 118,-54.9286"/>
-</g>
-</g>
-</svg>
+<div class='graphviz dot'><!--
+digraph G1 {
+ graph [rankdir=BT];
+ node [fontname="Courier-Bold",fontsize=10,fontcolor="#006000"];
+
+ node [shape=box,label="rule"]; r1; r2;
+
+ node [shape=circle,width=.4,fixedsize=1];
+ node [label="in"]; s1; s2; s3; s4;
+ node [label="out"]; o1; o2;
+
+ r1 -> s1;
+ r1 -> s2;
+ r1 -> s3;
+ r2 -> s4;
+ r2 -> r1;
+ o1 -> r1;
+ o2 -> r2;
+}
+--></div>
<p><i>Source files, rules, and generated files.</i></p>
</div>
diff --git a/site/versions/master/docs/query.html b/site/versions/master/docs/query.html
index a5068c8eef..c3802b4133 100644
--- a/site/versions/master/docs/query.html
+++ b/site/versions/master/docs/query.html
@@ -599,423 +599,96 @@ x intersect (y union z)</pre>
<table style='margin: auto'><tr>
<td style='text-align: center'>
-<svg width="153pt" height="288pt"
- viewBox="0.00 0.00 153.40 288.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(0.839179 0.839179) rotate(0) translate(4 339.193)">
-<title>somepath1</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-339.193 178.798,-339.193 178.798,4 -4,4"/>
-<!-- n1 -->
-<g id="node1" class="node">
-<title>n1</title>
-<ellipse fill="none" stroke="black" cx="40" cy="-314.394" rx="18" ry="18"/>
-</g>
-<!-- n2 -->
-<g id="node2" class="node">
-<title>n2</title>
-<ellipse fill="pink" stroke="black" cx="41" cy="-236.798" rx="18" ry="18"/>
-</g>
-<!-- n1&#45;&gt;n2 -->
-<g id="edge1" class="edge">
-<title>n1&#45;&gt;n2</title>
-<path fill="none" stroke="black" d="M40.2269,-296.24C40.3484,-287.058 40.5009,-275.531 40.6382,-265.147"/>
-<polygon fill="black" stroke="black" points="44.1413,-264.93 40.774,-254.884 37.1419,-264.837 44.1413,-264.93"/>
-</g>
-<!-- n3 -->
-<g id="node3" class="node">
-<title>n3</title>
-<ellipse fill="pink" stroke="black" cx="18" cy="-162" rx="18" ry="18"/>
-</g>
-<!-- n2&#45;&gt;n3 -->
-<g id="edge2" class="edge">
-<title>n2&#45;&gt;n3</title>
-<path fill="none" stroke="black" d="M35.7809,-219.279C32.9579,-210.344 29.4064,-199.103 26.2211,-189.021"/>
-<polygon fill="black" stroke="black" points="29.5485,-187.935 23.1984,-179.454 22.8737,-190.044 29.5485,-187.935"/>
-</g>
-<!-- n10 -->
-<g id="node10" class="node">
-<title>n10</title>
-<ellipse fill="pink" stroke="black" cx="37" cy="-90" rx="18" ry="18"/>
-</g>
-<!-- n2&#45;&gt;n10 -->
-<g id="edge9" class="edge">
-<title>n2&#45;&gt;n10</title>
-<path fill="none" stroke="black" d="M42.9371,-218.86C44.7656,-200.425 46.9578,-170.088 45,-144 44.3634,-135.518 43.1616,-126.336 41.8792,-118.036"/>
-<polygon fill="black" stroke="black" points="45.3237,-117.412 40.2483,-108.112 38.4164,-118.547 45.3237,-117.412"/>
-</g>
-<!-- n3&#45;&gt;n10 -->
-<g id="edge10" class="edge">
-<title>n3&#45;&gt;n10</title>
-<path fill="none" stroke="black" d="M22.5027,-144.411C24.7033,-136.304 27.404,-126.354 29.8755,-117.248"/>
-<polygon fill="black" stroke="black" points="33.2878,-118.038 32.5296,-107.47 26.5322,-116.204 33.2878,-118.038"/>
-</g>
-<!-- n4 -->
-<g id="node4" class="node">
-<title>n4</title>
-<ellipse fill="pink" stroke="black" cx="87" cy="-18" rx="18" ry="18"/>
-<text text-anchor="middle" x="87" y="-14.3" font-family="arial" font-size="14.00">E</text>
-</g>
-<!-- n5 -->
-<g id="node5" class="node">
-<title>n5</title>
-<ellipse fill="none" stroke="black" cx="97" cy="-236.798" rx="18" ry="18"/>
-</g>
-<!-- n6 -->
-<g id="node6" class="node">
-<title>n6</title>
-<ellipse fill="none" stroke="black" cx="121" cy="-162" rx="18" ry="18"/>
-</g>
-<!-- n5&#45;&gt;n6 -->
-<g id="edge5" class="edge">
-<title>n5&#45;&gt;n6</title>
-<path fill="none" stroke="black" d="M102.446,-219.279C105.413,-210.281 109.15,-198.944 112.492,-188.808"/>
-<polygon fill="black" stroke="black" points="115.851,-189.796 115.658,-179.203 109.203,-187.604 115.851,-189.796"/>
-</g>
-<!-- n6&#45;&gt;n4 -->
-<g id="edge6" class="edge">
-<title>n6&#45;&gt;n4</title>
-<path fill="none" stroke="black" d="M115.99,-144.365C112.931,-133.96 109.038,-120.252 106,-108 100.867,-87.3 95.8646,-63.6851 92.2822,-45.9844"/>
-<polygon fill="black" stroke="black" points="95.6398,-44.9258 90.2466,-35.8064 88.7758,-46.2987 95.6398,-44.9258"/>
-</g>
-<!-- n9 -->
-<g id="node9" class="node">
-<title>n9</title>
-<ellipse fill="none" stroke="black" cx="133" cy="-90" rx="18" ry="18"/>
-</g>
-<!-- n6&#45;&gt;n9 -->
-<g id="edge8" class="edge">
-<title>n6&#45;&gt;n9</title>
-<path fill="none" stroke="black" d="M123.905,-144.055C125.261,-136.145 126.907,-126.54 128.425,-117.688"/>
-<polygon fill="black" stroke="black" points="131.882,-118.237 130.122,-107.789 124.982,-117.054 131.882,-118.237"/>
-</g>
-<!-- n7 -->
-<g id="node7" class="node">
-<title>n7</title>
-<ellipse fill="pink" stroke="black" cx="97" cy="-314.394" rx="20.5982" ry="20.5982"/>
-<text text-anchor="middle" x="97" y="-310.694" font-family="arial" font-size="14.00">S1</text>
-</g>
-<!-- n7&#45;&gt;n2 -->
-<g id="edge4" class="edge">
-<title>n7&#45;&gt;n2</title>
-<path fill="none" stroke="black" d="M84.8488,-296.991C76.7726,-286.089 66.0734,-271.646 57.2656,-259.756"/>
-<polygon fill="black" stroke="black" points="60.0158,-257.588 51.2509,-251.636 54.391,-261.755 60.0158,-257.588"/>
-</g>
-<!-- n7&#45;&gt;n5 -->
-<g id="edge3" class="edge">
-<title>n7&#45;&gt;n5</title>
-<path fill="none" stroke="black" d="M97,-293.532C97,-284.887 97,-274.612 97,-265.254"/>
-<polygon fill="black" stroke="black" points="100.5,-265.213 97,-255.213 93.5001,-265.213 100.5,-265.213"/>
-</g>
-<!-- n8 -->
-<g id="node8" class="node">
-<title>n8</title>
-<ellipse fill="none" stroke="black" cx="154" cy="-236.798" rx="20.5982" ry="20.5982"/>
-<text text-anchor="middle" x="154" y="-233.098" font-family="arial" font-size="14.00">S2</text>
-</g>
-<!-- n8&#45;&gt;n6 -->
-<g id="edge7" class="edge">
-<title>n8&#45;&gt;n6</title>
-<path fill="none" stroke="black" d="M145.673,-217.428C141.606,-208.456 136.653,-197.53 132.254,-187.827"/>
-<polygon fill="black" stroke="black" points="135.411,-186.313 128.095,-178.651 129.036,-189.204 135.411,-186.313"/>
-</g>
-<!-- n10&#45;&gt;n4 -->
-<g id="edge11" class="edge">
-<title>n10&#45;&gt;n4</title>
-<path fill="none" stroke="black" d="M47.1182,-74.8345C53.9632,-65.2515 63.1483,-52.3924 70.9784,-41.4303"/>
-<polygon fill="black" stroke="black" points="73.9325,-43.3162 76.8968,-33.1445 68.2363,-39.2475 73.9325,-43.3162"/>
-</g>
-<!-- n11 -->
-<g id="node11" class="node">
-<title>n11</title>
-<ellipse fill="none" stroke="black" cx="33" cy="-18" rx="18" ry="18"/>
-</g>
-<!-- n10&#45;&gt;n11 -->
-<g id="edge12" class="edge">
-<title>n10&#45;&gt;n11</title>
-<path fill="none" stroke="black" d="M36.0112,-71.6966C35.5704,-63.9827 35.0407,-54.7125 34.5493,-46.1124"/>
-<polygon fill="black" stroke="black" points="38.0423,-45.8883 33.9774,-36.1043 31.0537,-46.2878 38.0423,-45.8883"/>
-</g>
-</g>
-</svg>
+<div class='graphviz dot'><!--
+digraph somepath1 {
+ graph [size="4,4"]
+ node [label="",shape=circle];
+ n1;
+ n2 [fillcolor="pink",style=filled];
+ n3 [fillcolor="pink",style=filled];
+ n4 [fillcolor="pink",style=filled,label="E"];
+ n5; n6;
+ n7 [fillcolor="pink",style=filled,label="S1"];
+ n8 [label="S2"];
+ n9;
+ n10 [fillcolor="pink",style=filled];
+
+ n1 -> n2;
+ n2 -> n3;
+ n7 -> n5;
+ n7 -> n2;
+ n5 -> n6;
+ n6 -> n4;
+ n8 -> n6;
+ n6 -> n9;
+ n2 -> n10;
+ n3 -> n10;
+ n10 -> n4;
+ n10 -> n11;
+}
+--></div>
<p><code>somepath(S1 + S2, E)</code>,<br/>one possible result.</p>
</td>
<td style='padding: 40px; text-align: center'>
-<svg width="153pt" height="288pt"
- viewBox="0.00 0.00 153.40 288.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(0.839179 0.839179) rotate(0) translate(4 339.193)">
-<title>somepath2</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-339.193 178.798,-339.193 178.798,4 -4,4"/>
-<!-- n1 -->
-<g id="node1" class="node">
-<title>n1</title>
-<ellipse fill="none" stroke="black" cx="40" cy="-314.394" rx="18" ry="18"/>
-</g>
-<!-- n2 -->
-<g id="node2" class="node">
-<title>n2</title>
-<ellipse fill="none" stroke="black" cx="41" cy="-236.798" rx="18" ry="18"/>
-</g>
-<!-- n1&#45;&gt;n2 -->
-<g id="edge1" class="edge">
-<title>n1&#45;&gt;n2</title>
-<path fill="none" stroke="black" d="M40.2269,-296.24C40.3484,-287.058 40.5009,-275.531 40.6382,-265.147"/>
-<polygon fill="black" stroke="black" points="44.1413,-264.93 40.774,-254.884 37.1419,-264.837 44.1413,-264.93"/>
-</g>
-<!-- n3 -->
-<g id="node3" class="node">
-<title>n3</title>
-<ellipse fill="none" stroke="black" cx="18" cy="-162" rx="18" ry="18"/>
-</g>
-<!-- n2&#45;&gt;n3 -->
-<g id="edge2" class="edge">
-<title>n2&#45;&gt;n3</title>
-<path fill="none" stroke="black" d="M35.7809,-219.279C32.9579,-210.344 29.4064,-199.103 26.2211,-189.021"/>
-<polygon fill="black" stroke="black" points="29.5485,-187.935 23.1984,-179.454 22.8737,-190.044 29.5485,-187.935"/>
-</g>
-<!-- n10 -->
-<g id="node10" class="node">
-<title>n10</title>
-<ellipse fill="none" stroke="black" cx="37" cy="-90" rx="18" ry="18"/>
-</g>
-<!-- n2&#45;&gt;n10 -->
-<g id="edge9" class="edge">
-<title>n2&#45;&gt;n10</title>
-<path fill="none" stroke="black" d="M42.9371,-218.86C44.7656,-200.425 46.9578,-170.088 45,-144 44.3634,-135.518 43.1616,-126.336 41.8792,-118.036"/>
-<polygon fill="black" stroke="black" points="45.3237,-117.412 40.2483,-108.112 38.4164,-118.547 45.3237,-117.412"/>
-</g>
-<!-- n3&#45;&gt;n10 -->
-<g id="edge10" class="edge">
-<title>n3&#45;&gt;n10</title>
-<path fill="none" stroke="black" d="M22.5027,-144.411C24.7033,-136.304 27.404,-126.354 29.8755,-117.248"/>
-<polygon fill="black" stroke="black" points="33.2878,-118.038 32.5296,-107.47 26.5322,-116.204 33.2878,-118.038"/>
-</g>
-<!-- n4 -->
-<g id="node4" class="node">
-<title>n4</title>
-<ellipse fill="pink" stroke="black" cx="87" cy="-18" rx="18" ry="18"/>
-<text text-anchor="middle" x="87" y="-14.3" font-family="arial" font-size="14.00">E</text>
-</g>
-<!-- n5 -->
-<g id="node5" class="node">
-<title>n5</title>
-<ellipse fill="none" stroke="black" cx="97" cy="-236.798" rx="18" ry="18"/>
-</g>
-<!-- n6 -->
-<g id="node6" class="node">
-<title>n6</title>
-<ellipse fill="pink" stroke="black" cx="121" cy="-162" rx="18" ry="18"/>
-</g>
-<!-- n5&#45;&gt;n6 -->
-<g id="edge5" class="edge">
-<title>n5&#45;&gt;n6</title>
-<path fill="none" stroke="black" d="M102.446,-219.279C105.413,-210.281 109.15,-198.944 112.492,-188.808"/>
-<polygon fill="black" stroke="black" points="115.851,-189.796 115.658,-179.203 109.203,-187.604 115.851,-189.796"/>
-</g>
-<!-- n6&#45;&gt;n4 -->
-<g id="edge6" class="edge">
-<title>n6&#45;&gt;n4</title>
-<path fill="none" stroke="black" d="M115.99,-144.365C112.931,-133.96 109.038,-120.252 106,-108 100.867,-87.3 95.8646,-63.6851 92.2822,-45.9844"/>
-<polygon fill="black" stroke="black" points="95.6398,-44.9258 90.2466,-35.8064 88.7758,-46.2987 95.6398,-44.9258"/>
-</g>
-<!-- n9 -->
-<g id="node9" class="node">
-<title>n9</title>
-<ellipse fill="none" stroke="black" cx="133" cy="-90" rx="18" ry="18"/>
-</g>
-<!-- n6&#45;&gt;n9 -->
-<g id="edge8" class="edge">
-<title>n6&#45;&gt;n9</title>
-<path fill="none" stroke="black" d="M123.905,-144.055C125.261,-136.145 126.907,-126.54 128.425,-117.688"/>
-<polygon fill="black" stroke="black" points="131.882,-118.237 130.122,-107.789 124.982,-117.054 131.882,-118.237"/>
-</g>
-<!-- n7 -->
-<g id="node7" class="node">
-<title>n7</title>
-<ellipse fill="none" stroke="black" cx="97" cy="-314.394" rx="20.5982" ry="20.5982"/>
-<text text-anchor="middle" x="97" y="-310.694" font-family="arial" font-size="14.00">S1</text>
-</g>
-<!-- n7&#45;&gt;n2 -->
-<g id="edge4" class="edge">
-<title>n7&#45;&gt;n2</title>
-<path fill="none" stroke="black" d="M84.8488,-296.991C76.7726,-286.089 66.0734,-271.646 57.2656,-259.756"/>
-<polygon fill="black" stroke="black" points="60.0158,-257.588 51.2509,-251.636 54.391,-261.755 60.0158,-257.588"/>
-</g>
-<!-- n7&#45;&gt;n5 -->
-<g id="edge3" class="edge">
-<title>n7&#45;&gt;n5</title>
-<path fill="none" stroke="black" d="M97,-293.532C97,-284.887 97,-274.612 97,-265.254"/>
-<polygon fill="black" stroke="black" points="100.5,-265.213 97,-255.213 93.5001,-265.213 100.5,-265.213"/>
-</g>
-<!-- n8 -->
-<g id="node8" class="node">
-<title>n8</title>
-<ellipse fill="pink" stroke="black" cx="154" cy="-236.798" rx="20.5982" ry="20.5982"/>
-<text text-anchor="middle" x="154" y="-233.098" font-family="arial" font-size="14.00">S2</text>
-</g>
-<!-- n8&#45;&gt;n6 -->
-<g id="edge7" class="edge">
-<title>n8&#45;&gt;n6</title>
-<path fill="none" stroke="black" d="M145.673,-217.428C141.606,-208.456 136.653,-197.53 132.254,-187.827"/>
-<polygon fill="black" stroke="black" points="135.411,-186.313 128.095,-178.651 129.036,-189.204 135.411,-186.313"/>
-</g>
-<!-- n10&#45;&gt;n4 -->
-<g id="edge11" class="edge">
-<title>n10&#45;&gt;n4</title>
-<path fill="none" stroke="black" d="M47.1182,-74.8345C53.9632,-65.2515 63.1483,-52.3924 70.9784,-41.4303"/>
-<polygon fill="black" stroke="black" points="73.9325,-43.3162 76.8968,-33.1445 68.2363,-39.2475 73.9325,-43.3162"/>
-</g>
-<!-- n11 -->
-<g id="node11" class="node">
-<title>n11</title>
-<ellipse fill="none" stroke="black" cx="33" cy="-18" rx="18" ry="18"/>
-</g>
-<!-- n10&#45;&gt;n11 -->
-<g id="edge12" class="edge">
-<title>n10&#45;&gt;n11</title>
-<path fill="none" stroke="black" d="M36.0112,-71.6966C35.5704,-63.9827 35.0407,-54.7125 34.5493,-46.1124"/>
-<polygon fill="black" stroke="black" points="38.0423,-45.8883 33.9774,-36.1043 31.0537,-46.2878 38.0423,-45.8883"/>
-</g>
-</g>
-</svg>
+<div class='graphviz dot'><!--
+digraph somepath2 {
+ graph [size="4,4"]
+ node [label="",shape=circle];
+
+ n1; n2; n3;
+ n4 [fillcolor="pink",style=filled,label="E"];
+ n5;
+ n6 [fillcolor="pink",style=filled];
+ n7 [label="S1"];
+ n8 [fillcolor="pink",style=filled,label="S2"];
+ n9; n10;
+
+ n1 -> n2;
+ n2 -> n3;
+ n7 -> n5;
+ n7 -> n2;
+ n5 -> n6;
+ n6 -> n4;
+ n8 -> n6;
+ n6 -> n9;
+ n2 -> n10;
+ n3 -> n10;
+ n10 -> n4;
+ n10 -> n11;
+}
+--></div>
<p><code>somepath(S1 + S2, E)</code>,<br/>another possible result.</p>
</td>
<td style='text-align: center'>
-<svg width="153pt" height="288pt"
- viewBox="0.00 0.00 153.40 288.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(0.839179 0.839179) rotate(0) translate(4 339.193)">
-<title>allpaths</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-339.193 178.798,-339.193 178.798,4 -4,4"/>
-<!-- n1 -->
-<g id="node1" class="node">
-<title>n1</title>
-<ellipse fill="none" stroke="black" cx="40" cy="-314.394" rx="18" ry="18"/>
-</g>
-<!-- n2 -->
-<g id="node2" class="node">
-<title>n2</title>
-<ellipse fill="pink" stroke="black" cx="41" cy="-236.798" rx="18" ry="18"/>
-</g>
-<!-- n1&#45;&gt;n2 -->
-<g id="edge1" class="edge">
-<title>n1&#45;&gt;n2</title>
-<path fill="none" stroke="black" d="M40.2269,-296.24C40.3484,-287.058 40.5009,-275.531 40.6382,-265.147"/>
-<polygon fill="black" stroke="black" points="44.1413,-264.93 40.774,-254.884 37.1419,-264.837 44.1413,-264.93"/>
-</g>
-<!-- n3 -->
-<g id="node3" class="node">
-<title>n3</title>
-<ellipse fill="pink" stroke="black" cx="18" cy="-162" rx="18" ry="18"/>
-</g>
-<!-- n2&#45;&gt;n3 -->
-<g id="edge2" class="edge">
-<title>n2&#45;&gt;n3</title>
-<path fill="none" stroke="black" d="M35.7809,-219.279C32.9579,-210.344 29.4064,-199.103 26.2211,-189.021"/>
-<polygon fill="black" stroke="black" points="29.5485,-187.935 23.1984,-179.454 22.8737,-190.044 29.5485,-187.935"/>
-</g>
-<!-- n10 -->
-<g id="node10" class="node">
-<title>n10</title>
-<ellipse fill="pink" stroke="black" cx="37" cy="-90" rx="18" ry="18"/>
-</g>
-<!-- n2&#45;&gt;n10 -->
-<g id="edge9" class="edge">
-<title>n2&#45;&gt;n10</title>
-<path fill="none" stroke="black" d="M42.9371,-218.86C44.7656,-200.425 46.9578,-170.088 45,-144 44.3634,-135.518 43.1616,-126.336 41.8792,-118.036"/>
-<polygon fill="black" stroke="black" points="45.3237,-117.412 40.2483,-108.112 38.4164,-118.547 45.3237,-117.412"/>
-</g>
-<!-- n3&#45;&gt;n10 -->
-<g id="edge10" class="edge">
-<title>n3&#45;&gt;n10</title>
-<path fill="none" stroke="black" d="M22.5027,-144.411C24.7033,-136.304 27.404,-126.354 29.8755,-117.248"/>
-<polygon fill="black" stroke="black" points="33.2878,-118.038 32.5296,-107.47 26.5322,-116.204 33.2878,-118.038"/>
-</g>
-<!-- n4 -->
-<g id="node4" class="node">
-<title>n4</title>
-<ellipse fill="pink" stroke="black" cx="87" cy="-18" rx="18" ry="18"/>
-<text text-anchor="middle" x="87" y="-14.3" font-family="arial" font-size="14.00">E</text>
-</g>
-<!-- n5 -->
-<g id="node5" class="node">
-<title>n5</title>
-<ellipse fill="pink" stroke="black" cx="97" cy="-236.798" rx="18" ry="18"/>
-</g>
-<!-- n6 -->
-<g id="node6" class="node">
-<title>n6</title>
-<ellipse fill="pink" stroke="black" cx="121" cy="-162" rx="18" ry="18"/>
-</g>
-<!-- n5&#45;&gt;n6 -->
-<g id="edge5" class="edge">
-<title>n5&#45;&gt;n6</title>
-<path fill="none" stroke="black" d="M102.446,-219.279C105.413,-210.281 109.15,-198.944 112.492,-188.808"/>
-<polygon fill="black" stroke="black" points="115.851,-189.796 115.658,-179.203 109.203,-187.604 115.851,-189.796"/>
-</g>
-<!-- n6&#45;&gt;n4 -->
-<g id="edge6" class="edge">
-<title>n6&#45;&gt;n4</title>
-<path fill="none" stroke="black" d="M115.99,-144.365C112.931,-133.96 109.038,-120.252 106,-108 100.867,-87.3 95.8646,-63.6851 92.2822,-45.9844"/>
-<polygon fill="black" stroke="black" points="95.6398,-44.9258 90.2466,-35.8064 88.7758,-46.2987 95.6398,-44.9258"/>
-</g>
-<!-- n9 -->
-<g id="node9" class="node">
-<title>n9</title>
-<ellipse fill="none" stroke="black" cx="133" cy="-90" rx="18" ry="18"/>
-</g>
-<!-- n6&#45;&gt;n9 -->
-<g id="edge8" class="edge">
-<title>n6&#45;&gt;n9</title>
-<path fill="none" stroke="black" d="M123.905,-144.055C125.261,-136.145 126.907,-126.54 128.425,-117.688"/>
-<polygon fill="black" stroke="black" points="131.882,-118.237 130.122,-107.789 124.982,-117.054 131.882,-118.237"/>
-</g>
-<!-- n7 -->
-<g id="node7" class="node">
-<title>n7</title>
-<ellipse fill="pink" stroke="black" cx="97" cy="-314.394" rx="20.5982" ry="20.5982"/>
-<text text-anchor="middle" x="97" y="-310.694" font-family="arial" font-size="14.00">S1</text>
-</g>
-<!-- n7&#45;&gt;n2 -->
-<g id="edge4" class="edge">
-<title>n7&#45;&gt;n2</title>
-<path fill="none" stroke="black" d="M84.8488,-296.991C76.7726,-286.089 66.0734,-271.646 57.2656,-259.756"/>
-<polygon fill="black" stroke="black" points="60.0158,-257.588 51.2509,-251.636 54.391,-261.755 60.0158,-257.588"/>
-</g>
-<!-- n7&#45;&gt;n5 -->
-<g id="edge3" class="edge">
-<title>n7&#45;&gt;n5</title>
-<path fill="none" stroke="black" d="M97,-293.532C97,-284.887 97,-274.612 97,-265.254"/>
-<polygon fill="black" stroke="black" points="100.5,-265.213 97,-255.213 93.5001,-265.213 100.5,-265.213"/>
-</g>
-<!-- n8 -->
-<g id="node8" class="node">
-<title>n8</title>
-<ellipse fill="pink" stroke="black" cx="154" cy="-236.798" rx="20.5982" ry="20.5982"/>
-<text text-anchor="middle" x="154" y="-233.098" font-family="arial" font-size="14.00">S2</text>
-</g>
-<!-- n8&#45;&gt;n6 -->
-<g id="edge7" class="edge">
-<title>n8&#45;&gt;n6</title>
-<path fill="none" stroke="black" d="M145.673,-217.428C141.606,-208.456 136.653,-197.53 132.254,-187.827"/>
-<polygon fill="black" stroke="black" points="135.411,-186.313 128.095,-178.651 129.036,-189.204 135.411,-186.313"/>
-</g>
-<!-- n10&#45;&gt;n4 -->
-<g id="edge11" class="edge">
-<title>n10&#45;&gt;n4</title>
-<path fill="none" stroke="black" d="M47.1182,-74.8345C53.9632,-65.2515 63.1483,-52.3924 70.9784,-41.4303"/>
-<polygon fill="black" stroke="black" points="73.9325,-43.3162 76.8968,-33.1445 68.2363,-39.2475 73.9325,-43.3162"/>
-</g>
-<!-- n11 -->
-<g id="node11" class="node">
-<title>n11</title>
-<ellipse fill="none" stroke="black" cx="33" cy="-18" rx="18" ry="18"/>
-</g>
-<!-- n10&#45;&gt;n11 -->
-<g id="edge12" class="edge">
-<title>n10&#45;&gt;n11</title>
-<path fill="none" stroke="black" d="M36.0112,-71.6966C35.5704,-63.9827 35.0407,-54.7125 34.5493,-46.1124"/>
-<polygon fill="black" stroke="black" points="38.0423,-45.8883 33.9774,-36.1043 31.0537,-46.2878 38.0423,-45.8883"/>
-</g>
-</g>
-</svg>
+<div class='graphviz dot'><!--
+digraph allpaths {
+ graph [size="4,4"]
+ node [label="",shape=circle];
+ n1;
+ n2 [fillcolor="pink",style=filled];
+ n3 [fillcolor="pink",style=filled];
+ n4 [fillcolor="pink",style=filled,label="E"];
+ n5 [fillcolor="pink",style=filled];
+ n6 [fillcolor="pink",style=filled];
+ n7 [fillcolor="pink",style=filled, label="S1"];
+ n8 [fillcolor="pink",style=filled, label="S2"];
+ n9;
+ n10 [fillcolor="pink",style=filled];
+
+ n1 -> n2;
+ n2 -> n3;
+ n7 -> n5;
+ n7 -> n2;
+ n5 -> n6;
+ n6 -> n4;
+ n8 -> n6;
+ n6 -> n9;
+ n2 -> n10;
+ n3 -> n10;
+ n10 -> n4;
+ n10 -> n11;
+}
+--></div>
<p><code>allpaths(S1 + S2, E)</code>.</p>
</td>
</tr></table>
@@ -1490,73 +1163,16 @@ genrule(
</p>
<table style='margin: auto'><tr><td>
-<svg width="169pt" height="260pt"
- viewBox="0.00 0.00 169.00 260.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 256)">
-<title>mygraph</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-256 165,-256 165,4 -4,4"/>
-<!-- //a:a -->
-<g id="node1" class="node">
-<title>//a:a</title>
-<polygon fill="none" stroke="black" points="65.5,-108 11.5,-108 11.5,-72 65.5,-72 65.5,-108"/>
-<text text-anchor="middle" x="38.5" y="-86.3" font-family="arial" font-size="14.00">//a:a</text>
-</g>
-<!-- //a:a.cc -->
-<g id="node2" class="node">
-<title>//a:a.cc</title>
-<polygon fill="none" stroke="black" points="77,-36 0,-36 0,-0 77,-0 77,-36"/>
-<text text-anchor="middle" x="38.5" y="-14.3" font-family="arial" font-size="14.00">//a:a.cc</text>
-</g>
-<!-- //a:a&#45;&gt;//a:a.cc -->
-<g id="edge1" class="edge">
-<title>//a:a&#45;&gt;//a:a.cc</title>
-<path fill="none" stroke="black" d="M38.5,-71.6966C38.5,-63.9827 38.5,-54.7125 38.5,-46.1124"/>
-<polygon fill="black" stroke="black" points="42.0001,-46.1043 38.5,-36.1043 35.0001,-46.1044 42.0001,-46.1043"/>
-</g>
-<!-- //b:b -->
-<g id="node3" class="node">
-<title>//b:b</title>
-<polygon fill="none" stroke="black" points="120.5,-180 66.5,-180 66.5,-144 120.5,-144 120.5,-180"/>
-<text text-anchor="middle" x="93.5" y="-158.3" font-family="arial" font-size="14.00">//b:b</text>
-</g>
-<!-- //b:b&#45;&gt;//a:a -->
-<g id="edge2" class="edge">
-<title>//b:b&#45;&gt;//a:a</title>
-<path fill="none" stroke="black" d="M79.9045,-143.697C73.3773,-135.389 65.432,-125.277 58.2534,-116.141"/>
-<polygon fill="black" stroke="black" points="60.8695,-113.805 51.9391,-108.104 55.3653,-118.13 60.8695,-113.805"/>
-</g>
-<!-- //b:b.cc -->
-<g id="node4" class="node">
-<title>//b:b.cc</title>
-<polygon fill="none" stroke="black" points="161,-108 84,-108 84,-72 161,-72 161,-108"/>
-<text text-anchor="middle" x="122.5" y="-86.3" font-family="arial" font-size="14.00">//b:b.cc</text>
-</g>
-<!-- //b:b&#45;&gt;//b:b.cc -->
-<g id="edge3" class="edge">
-<title>//b:b&#45;&gt;//b:b.cc</title>
-<path fill="none" stroke="black" d="M100.669,-143.697C103.935,-135.813 107.874,-126.304 111.502,-117.546"/>
-<polygon fill="black" stroke="black" points="114.82,-118.683 115.414,-108.104 108.353,-116.003 114.82,-118.683"/>
-</g>
-<!-- //c:c -->
-<g id="node5" class="node">
-<title>//c:c</title>
-<polygon fill="none" stroke="black" points="92.5,-252 38.5,-252 38.5,-216 92.5,-216 92.5,-252"/>
-<text text-anchor="middle" x="65.5" y="-230.3" font-family="arial" font-size="14.00">//c:c</text>
-</g>
-<!-- //c:c&#45;&gt;//a:a -->
-<g id="edge5" class="edge">
-<title>//c:c&#45;&gt;//a:a</title>
-<path fill="none" stroke="black" d="M62.2432,-215.871C57.6415,-191.67 49.188,-147.211 43.7086,-118.393"/>
-<polygon fill="black" stroke="black" points="47.0748,-117.359 41.7684,-108.189 40.198,-118.667 47.0748,-117.359"/>
-</g>
-<!-- //c:c&#45;&gt;//b:b -->
-<g id="edge4" class="edge">
-<title>//c:c&#45;&gt;//b:b</title>
-<path fill="none" stroke="black" d="M72.4214,-215.697C75.5747,-207.813 79.3783,-198.304 82.8814,-189.546"/>
-<polygon fill="black" stroke="black" points="86.194,-190.689 86.6583,-180.104 79.6946,-188.089 86.194,-190.689"/>
-</g>
-</g>
-</svg>
+<div class='graphviz dot'><!--
+digraph mygraph {
+ node [shape=box];
+"//a:a" -> "//a:a.cc"
+"//b:b" -> "//a:a"
+"//b:b" -> "//b:b.cc"
+"//c:c" -> "//b:b"
+"//c:c" -> "//a:a"
+}
+--></div>
</td><td>
<pre>
minrank
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java
index c76bf58b5b..55cd813d47 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/CompressedTarFunction.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
+import java.util.Date;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
@@ -78,6 +79,11 @@ public abstract class CompressedTarFunction implements Decompressor {
Files.copy(
tarStream, filename.getPathFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
filename.chmod(entry.getMode());
+
+ // This can only be done on real files, not links, or it will skip the reader to
+ // the next "real" file to try to find the mod time info.
+ Date lastModified = entry.getLastModifiedDate();
+ filename.setLastModifiedTime(lastModified.getTime());
}
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
index 70e8a9f7d6..c20da5a8d9 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
@@ -527,7 +527,8 @@ public class SkylarkRepositoryContext {
@ParamType(type = String.class),
@ParamType(type = SkylarkList.class, generic1 = String.class),
},
- doc = "List of mirror URLs referencing the same file."
+ doc = "List of mirror URLs referencing the same file.",
+ named = true
),
@Param(
name = "output",
@@ -538,7 +539,8 @@ public class SkylarkRepositoryContext {
},
doc =
"path to the directory where the archive will be unpacked,"
- + " relative to the repository directory."
+ + " relative to the repository directory.",
+ defaultValue = "''"
),
@Param(
name = "sha256",
@@ -570,9 +572,9 @@ public class SkylarkRepositoryContext {
named = true,
doc =
"a directory prefix to strip from the extracted files."
- + "\nMany archives contain a top-level directory that contains alfiles in"
+ + "\nMany archives contain a top-level directory that contains all files in the"
+ " archive. Instead of needing to specify this prefix over and over in the"
- + " <code>build_file</code>, this field can be used to strip it extracted"
+ + " <code>build_file</code>, this field can be used to strip it from extracted"
+ " files."
),
}
diff --git a/tools/build_defs/repo/make.bzl b/tools/build_defs/repo/make.bzl
new file mode 100644
index 0000000000..9e7f478cf5
--- /dev/null
+++ b/tools/build_defs/repo/make.bzl
@@ -0,0 +1,66 @@
+# Copyright 2016 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+""""Respositry rules for converting Makefile-based projects to Bazel."""
+
+def _impl(ctx):
+ """Downloads, extracts, and runs configure && make on an archive."""
+ ctx.download_and_extract(
+ url = ctx.attr.urls,
+ stripPrefix = ctx.attr.strip_prefix,
+ sha256 = ctx.attr.sha256,
+ )
+
+ result = ctx.execute(['./configure'])
+ if result.return_code != 0:
+ print(result.stdout)
+ print(result.stderr)
+ fail('error running configure')
+ # TODO(kchodorow): allow specifying make rules here.
+ result = ctx.execute(['make'])
+ if result.return_code != 0:
+ print(result.stdout)
+ print(result.stderr)
+ fail('error running make')
+
+ # Check that all expected files were created.
+ missing_files = []
+ for f in ctx.attr.exports:
+ if not ctx.path(f).exists:
+ missing_files += [f]
+ if missing_files:
+ fail('file(s) %s were not created' % ', '.join(missing_files))
+
+ ctx.file('WORKSPACE', """
+# Automatically generated WORKSPACE file.
+workspace(name = 'name')
+""".format(name = ctx.name))
+ ctx.file('BUILD', """
+exports_files({exports})
+
+{build_file_content}
+""".format(
+ exports = ctx.attr.exports,
+ build_file_content = ctx.attr.build_file_content))
+
+
+make = repository_rule(
+ implementation = _impl,
+ attrs = {
+ 'urls':attr.string_list(mandatory = True),
+ 'exports':attr.string_list(mandatory = True),
+ 'strip_prefix':attr.string(default = ''),
+ 'sha256':attr.string(default = ''),
+ 'build_file_content':attr.string(default = ''),
+ }
+)