aboutsummaryrefslogtreecommitdiffhomepage
path: root/site/docs/query-how-to.html
blob: 7bf0b330e592506e022ceb6c4a2058a443b646c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
---
layout: documentation
title: Bazel Query How-To
---
<h1>Bazel query how-to</h1>

<p>
  This is a quick tutorial to get you started using Bazel's query language to
  trace dependencies in your code.
</p>

<p>
  For a language details and <code>--output</code> flag details, please see the reference
  manuals, <a href="query.html">Bazel query reference</a> and <a href="cquery.html">Bazel cquery reference</a>.
  You can get help by typing <code>bazel help query</code> or <code>bazel help cquery</code> on the command line.
</p>

<p>
  To execute a query while ignoring errors such as missing targets, use the
  <code>--keep_going</code> flag.
</p>

<h2>Contents</h2>

<ul>
<li><a href="#Finding_the_Dependencies_of_a_Ru">Finding the Dependencies of a Rule</a></li>
<li><a href="#Tracing_the_Dependency_Chain_bet">Tracing the Dependency Chain between Two
Packages</a>
<ul><li><a href="#Aside_implicit_dependencies">Aside: implicit dependencies</a></li></ul></li>
<li><a href="#Reverse_Dependencies">Reverse Dependencies</a></li>
<li><a href="#Miscellaneous_Uses">Miscellaneous Uses</a>
<ul><li><a href="#What_exists_">What exists ...</a>
<ul><li><a href="#What_packages_exist_beneath_foo_">What packages exist beneath
<code>foo</code>?</a></li>
<li><a href="#What_rules_are_defined_in_the_foo">What rules are defined in the <code>foo</code>
package?</a></li>
<li><a href="#What_files_are_generated_by_rule">What files are generated by rules in the <code>foo</code>
package?</a></li>
<li><a href="#What_s_the_set_of_BUILD_files_ne">What's the set of BUILD files needed to build
<code>//foo</code>?</a></li>
<li><a href="#What_are_the_individual_tests_th">What are the individual tests that a <code>test_suite</code> expands
to?</a>
<ul><li><a href="#Which_of_those_are_C_tests_">Which of those are C++ tests?</a></li>
<li><a href="#Which_of_those_are_small_Medium_">Which of those are small? Medium?
Large?</a></li></ul></li>
<li><a href="#What_are_the_tests_beneath_foo_t">What are the tests beneath <code>foo</code> that match a
pattern?</a></li>
<li><a href="#What_package_contains_file_java_">What package contains file
<code>//path/to/file/bar.java</code>?
</a></li>
<li><a href="#What_is_the_build_label_for_java">What is the build label for
<code>//path/to/file/bar.java</code>?
</a></li>
<li><a href="#What_build_rule_contains_file_ja">What build rule contains file
<code>//path/to/file/bar.java</code> as a
source?</a></li></ul></li>
<li><a href="#What_package_dependencies_exist_">What package dependencies exist ...</a>
<ul><li><a href="#What_packages_does_foo_depend_on">What packages does <code>foo</code> depend on? (What do I need to check out
to build <code>foo</code>)</a></li>
<li><a href="#What_packages_does_the_foo_">What packages does the <code>foo</code> tree depend on, excluding
<code>foo/contrib</code>?</a></li></ul></li>
<li><a href="#What_rule_dependencies_exist_">What rule dependencies exist ...</a>
<ul><li><a href="#What_genproto_rules_does_bar_">What genproto rules does bar depend
upon?</a></li>
<li><a href="#Find_the_definition_of_some_JNI_">Find the definition of some JNI (C++) library that is transitively
depended upon by a Java binary rule in the servlet
tree.</a>
<ul><li><a href="#_Now_find_the_definitions_of_all">...Now find the definitions of all the Java binaries that
depend on them</a></li></ul></li></ul></li>
<li><a href="#What_file_dependencies_exist_">What file dependencies exist ...</a>
<ul><li><a href="#What_s_the_complete_set_of_Java_">What's the complete set of Java source files required to build
QUX?</a></li>
<li><a href="#What_is_the_complete_set_of_Java">What is the complete set of Java source files required to build
QUX's tests?</a></li></ul></li>
<li><a href="#What_differences_in_dependencies">What differences in dependencies between X and Y exist
...</a>
<ul><li><a href="#What_targets_does_foo_depend_on_">What targets does <code>//foo</code> depend on that <code>//foo:foolib</code> does
not?</a></li>
<li><a href="#What_C_libraries_do_the_foo_test">What C++ libraries do the <code>foo</code> tests depend on that the <code>//foo</code>
production binary does <em>not</em> depend
on?</a></li></ul></li>
<li><a href="#Why_does_this_dependency_exist_">Why does this dependency exist ...</a>
<ul><li><a href="#Why_does_bar_depend_on_groups">Why does <code>bar</code> depend on
<code>groups2</code>?</a></li>
<li><a href="#Show_me_a_path_from_docker_updater">Show me a path from <code>docker/updater:updater_systest</code> (a <code>py_test</code>)
to some <code>cc_library</code> that it depends
upon:</a></li>
<li><a href="#Why_does_library_photos_frontend">Why does library <code>//photos/frontend:lib</code> depend on two variants of
the same library <code>//third_party/jpeglib</code> and
<code>//third_party/jpeg</code>?</a></li></ul></li>
<li><a href="#What_depends_on_">What depends on ...</a>
<ul><li><a href="#What_rules_under_bar_depend_o">What rules under bar depend on Y?</a></li>
<li><a href="#What_are_the_intra_package_direct_rdeps">What targets directly depend on T, in T's
package</a></li></ul></li>
<li><a href="#How_do_I_break_a_dependency_">How do I break a dependency ...</a>
<ul><li><a href="#What_dependency_paths_do_I_have_">What dependency paths do I have to break to make <code>bar</code> no longer
depend on X?</a></li></ul></li>
<li><a href="#Misc_">Misc ...</a>
<ul><li><a href="#How_many_sequential_steps_are_th">How many sequential steps are there in the <code>ServletSmokeTests</code>
build?</a></li></ul></li></ul></li>
</ul>

<p><a name="Finding_the_Dependencies_of_a_Ru"></a></p>

<h2>Finding the Dependencies of a Rule</h2>

<p>To see the dependencies of <code>//foo</code>, use the
<code>deps</code> function in bazel query:</p>

<pre>
$ bazel query "deps(//foo)"
//foo:foo
//foo:foo-dep
...
</pre>

<p>This is the set of all targets required to build <code>//foo</code>.</p>

<p><a name="Tracing_the_Dependency_Chain_bet"></a></p>

<h2>Tracing the Dependency Chain between Two Packages</h2>

<p>The library <code>//third_party/zlib:zlibonly</code> isn't in the BUILD file for
<code>//foo</code>, but it is an indirect dependency. How can
we trace this dependency path?  There are two useful functions here:
<code>allpaths</code> and <code>somepath</code></p>

<pre>
$ bazel query "somepath(//foo:foo, third_party/zlib:zlibonly)"
//foo:foo
//translations/tools:translator
//translations/base:base
//third_party/py/MySQL:MySQL
//third_party/py/MySQL:_MySQL.so
//third_party/mysql:mysql
//third_party/zlib:zlibonly
$ bazel query "allpaths(//foo, third_party/...)"
  ...many errors detected in BUILD files...
//foo:foo
//translations/tools:translator
//translations/tools:aggregator
//translations/base:base
//tools/pkg:pex
//tools/pkg:pex_phase_one
//tools/pkg:pex_lib
//third_party/python:python_lib
//translations/tools:messages
//third_party/py/xml:xml
//third_party/py/xml:utils/boolean.so
//third_party/py/xml:parsers/sgmlop.so
//third_party/py/xml:parsers/pyexpat.so
//third_party/py/MySQL:MySQL
//third_party/py/MySQL:_MySQL.so
//third_party/mysql:mysql
//third_party/openssl:openssl
//third_party/zlib:zlibonly
//third_party/zlib:zlibonly_v1_2_3
//third_party/python:headers
//third_party/openssl:crypto
</pre>

<p><a name="Aside_implicit_dependencies"></a></p>

<h3>Aside: implicit dependencies</h3>

<p>The BUILD file for <code>//foo</code> never references
<code>//translations/tools:aggregator</code>. So, where's the direct dependency?</p>

<p>Certain rules include implicit dependencies on additional libraries or tools.
For example, to build a <code>genproto</code> rule, you need first to build the Protocol
Compiler, so every <code>genproto</code> rule carries an implicit dependency on the
protocol compiler.  These dependencies are not mentioned in the build file,
but added in by the build tool.  The full set of implicit dependencies is
  currently undocumented. Using <code>--noimplicit_deps</code> allows you to filter out
  these deps from your query results.

<p><a name="Reverse_Dependencies"></a></p>

<h2>Reverse Dependencies</h2>

<p>You might want to know the set of targets that depends on some target.  e.g.,
if you're going to change some code, you might want to know what other code
you're about to break.  You can use <code>rdeps(u, x)</code> to find the reverse
dependencies of the targets in <code>x</code> within the transitive closure of <code>u</code>.</p>

Bazel's <a href="https://docs.bazel.build/versions/master/query.html#sky-query">Sky Query</a>
supports the <code>allrdeps</code> function which allows you to query rdeps in the entire
universe of the build.
<p><a name="Miscellaneous_Uses"></a></p>

<h2>Miscellaneous Uses</h2>

<p>You can use <code>bazel query</code> to analyze many dependency relationships.</p>

<p><a name="What_exists_"></a></p>

<h3>What exists ...</h3>

<p><a name="What_packages_exist_beneath_foo_"></a></p>

<h4>What packages exist beneath <code>foo</code>?</h4>

<pre>bazel query 'foo/...' --output package</pre>

<p><a name="What_rules_are_defined_in_the_gw"></a></p>

<h4>What rules are defined in the <code>foo</code> package?</h4>

<pre>bazel query 'kind(rule, foo:all)' --output label_kind</pre>

<p><a name="What_files_are_generated_by_rule"></a></p>

<h4>What files are generated by rules in the <code>foo</code> package?</h4>

<pre>bazel query 'kind("generated file", //foo:*)'</pre>

<p><a name="What_s_the_set_of_BUILD_files_ne"></a></p>

<h4>What's the set of BUILD files needed to build <code>//foo</code>?</h4>

<pre>bazel query 'buildfiles(deps(//foo))' --output location | cut -f1 -d:</pre>

<p><a name="What_are_the_individual_tests_th"></a></p>

<h4>What are the individual tests that a <code>test_suite</code> expands to?</h4>

<pre>bazel query 'tests(//foo:smoke_tests)'</pre>

<p><a name="Which_of_those_are_C_tests_"></a></p>

<h4>Which of those are C++ tests?</h4>

<pre>bazel query 'kind(cc_.*, tests(//foo:smoke_tests))'</pre>

<p><a name="Which_of_those_are_small_Medium_"></a></p>

<h4>Which of those are small?  Medium?  Large?</h4>

<pre>
bazel query 'attr(size, small, tests(//foo:smoke_tests))'

bazel query 'attr(size, medium, tests(//foo:smoke_tests))'

bazel query 'attr(size, large, tests(//foo:smoke_tests))'
</pre>

<p><a name="What_are_the_tests_beneath_foo_t"></a></p>

<h4>What are the tests beneath <code>foo</code> that match a pattern?</h4>

<pre>bazel query 'filter("pa?t", kind(".*_test rule", //foo/...))'</pre>

<p>The pattern is a regex and is applied to the full name of the rule. It's similar to doing</p>

<pre>bazel query 'kind(".*_test rule", //foo/...)' | grep -E 'pa?t'</pre>

<p><a name="What_package_contains_file_java_"></a></p>

<h4>What package contains file //path/to/file/bar.java`?</h4>

<pre> bazel query 'buildfiles(//path/to/file/bar.java)' --output=package</pre>

<p><a name="What_is_the_build_label_for_java"></a></p>

<h4>What is the build label for //path/to/file/bar.java?</h4>

<pre>bazel query //path/to/file/bar.java</pre>

<p><a name="What_build_rule_contains_file_ja"></a></p>

<h4>What rule target(s) contain file <code>//path/to/file/bar.java</code> as a source?</h4>

<pre>
fullname=$(bazel query //path/to/file/bar.java)
bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"
</pre>

<p><a name="What_package_dependencies_exist_"></a></p>

<h3>What package dependencies exist ...</h3>

<p><a name="What_packages_does_foo_depend_on"></a></p>

<h4>What packages does <code>foo</code> depend on? (What do I need to check out to build <code>foo</code>)</h4>

<pre>bazel query 'buildfiles(deps(//foo:foo))' --output package</pre>

<p>Note, <code>buildfiles</code> is required in order to correctly obtain all files
referenced by <code>subinclude</code>; see the reference manual for details.</p>

<p><a name="What_packages_does_the_foo_"></a></p>

<h4>What packages does the <code>foo</code> tree depend on, excluding <code>foo/contrib</code>?</h4>

<pre>bazel query 'deps(foo/... except foo/contrib/...)' --output package</pre>

<p><a name="What_rule_dependencies_exist_"></a></p>

<h3>What rule dependencies exist ...</h3>

<p><a name="What_genproto_rules_does_bar_"></a></p>

<h4>What genproto rules does bar depend upon?</h4>

<pre>bazel query 'kind(genproto, deps(bar/...))'</pre>

<p><a name="Find_the_definition_of_some_JNI_"></a></p>

<h4>Find the definition of some JNI (C++) library that is transitively depended upon by a Java binary rule in the servlet tree.</h4>

<pre>bazel query 'some(kind(cc_.*library, deps(kind(java_binary, //java/com/example/frontend/...))))' --output location</pre>
<p><a name="_Now_find_the_definitions_of_all"></a></p>

<h5>...Now find the definitions of all the Java binaries that depend on them</h5>

<pre>bazel query 'let jbs = kind(java_binary, //java/com/example/frontend/...) in
  let cls = kind(cc_.*library, deps($jbs)) in
    $jbs intersect allpaths($jbs, $cls)'
</pre>

<p><a name="What_file_dependencies_exist_"></a></p>

<h3>What file dependencies exist ...</h3>

<p><a name="What_s_the_complete_set_of_Java_"></a></p>

<h4>What's the complete set of Java source files required to build foo?</h4>

<p>Source files:</p>

<pre>bazel query 'kind("source file", deps(//path/to/target/foo/...))' | grep java$</pre>

<p>Generated files:</p>

<pre>bazel query 'kind("generated file", deps(//path/to/target/foo/...))' | grep java$</pre>

<p><a name="What_is_the_complete_set_of_Java"></a></p>

<h4>What is the complete set of Java source files required to build QUX's tests?</h4>

<p>Source files:</p>

<pre>bazel query 'kind("source file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$</pre>

<p>Generated files:</p>

<pre>bazel query 'kind("generated file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$</pre>

<p><a name="What_differences_in_dependencies"></a></p>

<h3>What differences in dependencies between X and Y exist ...</h3>

<p><a name="What_targets_does_foo_depend_on_"></a></p>

<h4>What targets does <code>//foo</code> depend on that <code>//foo:foolib</code> does not?</h4>

<pre>bazel query 'deps(//foo) except deps(//foo:foolib)'</pre>

<p><a name="What_C_libraries_do_the_foo_test"></a></p>

<h4>What C++ libraries do the <code>foo</code> tests depend on that the <code>//foo</code> production binary does <em>not</em> depend on?</h4>

<pre>bazel query 'kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo))'</pre>

<p><a name="Why_does_this_dependency_exist_"></a></p>

<h3>Why does this dependency exist ...</h3>

<p><a name="Why_does_bar_depend_on_groups"></a></p>

<h4>Why does <code>bar</code> depend on <code>groups2</code>?</h4>

<pre>bazel query 'somepath(bar/...,groups2/...:*)'</pre>

<p>Once you have the results of this query, you will often find that a single
target stands out as being an unexpected or egregious and undesirable
dependency of <code>bar</code>.  The query can then be further refined to:</p>

<p><a name="Show_me_a_path_from_docker_updater"></a></p>

<h4>Show me a path from <code>docker/updater:updater_systest</code> (a <code>py_test</code>) to some <code>cc_library</code> that it depends upon:</h4>

<pre>bazel query 'let cc = kind(cc_library, deps(docker/updater:updater_systest)) in
  somepath(docker/updater:updater_systest, $cc)'</pre>

<p><a name="Why_does_library_photos_frontend"></a></p>

<h4>Why does library <code>//photos/frontend:lib</code> depend on two variants of the same library <code>//third_party/jpeglib</code> and <code>//third_party/jpeg</code>?</h4>

<p>This query boils down to: "show me the subgraph of <code>//photos/frontend:lib</code> that
depends on both libraries".  When shown in topological order, the last element
of the result is the most likely culprit.</p>

<pre>bazel query 'allpaths(//photos/frontend:lib, //third_party/jpeglib)
                intersect
               allpaths(//photos/frontend:lib, //third_party/jpeg)'
//photos/frontend:lib
//photos/frontend:lib_impl
//photos/frontend:lib_dispatcher
//photos/frontend:icons
//photos/frontend/modules/gadgets:gadget_icon
//photos/thumbnailer:thumbnail_lib
//third_party/jpeg/img:renderer
</pre>

<p><a name="What_depends_on_"></a></p>

<h3>What depends on  ...</h3>

<p><a name="What_rules_under_bar_depend_o"></a></p>

<h4>What rules under bar depend on Y?</h4>

<pre>bazel query 'bar/... intersect allpaths(bar/..., Y)'</pre>

<p>Note: <code>X intersect allpaths(X, Y)</code> is the general idiom for the query "which X
depend on Y?" If expression X is non-trivial, it may be convenient to bind a
name to it using <code>let</code> to avoid duplication.</p>

<p><a name="What_are_the_intra_package_direct_rdeps"></a></p>

<h4>What targets directly depend on T, in T's package?</h4>

<pre>bazel query 'let t = T in rdeps(siblings($t), $t, 1)'</pre>

<p><a name="How_do_I_break_a_dependency_"></a></p>

<h3>How do I break a dependency ...</h3>

<p><!-- TODO find a convincing value of X to plug in here -->
<a name="What_dependency_paths_do_I_have_"></a></p>

<h4>What dependency paths do I have to break to make <code>bar</code> no longer depend on X?</h4>

<p>To output the graph to a <code>png</code> file:</p>

<pre>bazel query 'allpaths(bar/...,X)' --output graph | dot -Tpng &gt; /tmp/dep.png</pre>

<p><a name="Misc_"></a></p>

<h3>Misc ...</h3>

<p><a name="How_many_sequential_steps_are_th"></a></p>

<h4>How many sequential steps are there in the <code>//foo-tests</code> build?</h4>

<p>Unfortunately, the query language can't currently give you the longest path
from x to y, but it can find the (or rather <em>a</em>) most distant node from the
starting point, or show you the <em>lengths</em> of the longest path from x to every
y that it depends on.  Use <code>maxrank</code>:</p>

<pre>bazel query 'deps(//foo-tests)' --output maxrank | tail -1
85 //third_party/zlib:zutil.c</pre>

<p>The result indicates that there exist paths of length 85 that must occur in
order in this build.</p>