From 67f865f76693a39fbf4b3635ff1417359abdc678 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Mar 2026 20:04:19 +0000 Subject: [PATCH] chore: update documentation from upstream Bazel repo [skip ci] Synchronized pre-converted MDX files from upstream Bazel repository. --- community/images/Bitrise.png | Bin 70135 -> 0 bytes community/images/Gradle.png | Bin 7815 -> 0 bytes community/images/JetBrains.png | Bin 64014 -> 0 bytes community/images/Linkedin-Logo.png | Bin 6800 -> 0 bytes community/images/aspect-logo-2.png | Bin 9265 -> 0 bytes community/images/bitrise-logo.png | Bin 60749 -> 0 bytes community/images/develocity.png | Bin 34514 -> 0 bytes community/images/dropbox.png | Bin 60749 -> 0 bytes community/images/epam-logo.png | Bin 3589 -> 0 bytes community/images/flare-logo.png | Bin 13008 -> 0 bytes community/images/liulishuo.png | Bin 5665 -> 0 bytes community/images/oasis-logo.png | Bin 31110 -> 0 bytes community/images/sumglobal-logo.png | Bin 12207 -> 0 bytes community/images/tweag-logo.png | Bin 35747 -> 0 bytes community/images/typedb.png | Bin 37407 -> 0 bytes community/partners.mdx | 14 +- community/users.mdx | 9 +- concepts/build-files.mdx | 152 + concepts/dependencies.mdx | 375 + concepts/labels.mdx | 256 + concepts/runfiles.mdx | 83 +- concepts/visibility.mdx | 7 +- configure/coverage.mdx | 21 +- configure/integrate-cpp.mdx | 6 +- configure/windows.mdx | 1 + contribute/codebase.mdx | 60 +- contribute/docs-style-guide.mdx | 217 + contribute/search.mdx | 276 + docs.json | 4 +- docs/cc-toolchain-config-reference.mdx | 1150 ++ docs/user-manual.mdx | 2497 +++ extending/config.mdx | 789 + extending/exec-groups.mdx | 2 +- extending/platforms.mdx | 20 +- extending/toolchains.mdx | 94 +- external/faq.mdx | 1 + external/migration_tool.mdx | 728 + external/mod-command.mdx | 583 + external/registry.mdx | 172 + help.mdx | 14 +- install/compile-source.mdx | 2 +- install/ide.mdx | 21 +- install/index.mdx | 1 + install/mise.mdx | 10 + migrate/index.mdx | 2 - migrate/maven.mdx | 32 +- migrate/xcode.mdx | 68 +- query/cquery.mdx | 11 +- query/language.mdx | 1551 ++ query/quickstart.mdx | 38 +- reference/be/be-nav.mdx | 55 +- reference/be/c-cpp.mdx | 2116 +-- reference/be/common-definitions.mdx | 699 +- reference/be/extra-actions.mdx | 148 +- reference/be/functions.mdx | 532 + reference/be/general.mdx | 911 +- reference/be/java.mdx | 1845 +-- reference/be/make-variables.mdx | 374 +- reference/be/objective-c.mdx | 390 +- reference/be/overview.mdx | 139 +- reference/be/platforms-and-toolchains.mdx | 334 + reference/be/protocol-buffer.mdx | 377 +- reference/be/python.mdx | 1087 +- reference/be/shell.mdx | 136 +- reference/command-line-reference.mdx | 12946 ++++++++++++++++ reference/flag-cheatsheet.mdx | 562 + reference/glossary.mdx | 168 +- reference/skyframe.mdx | 4 +- reference/test-encyclopedia.mdx | 818 + remote/cache-local.mdx | 4 +- remote/dynamic.mdx | 178 + remote/output-directories.mdx | 10 +- rules/lib/builtins.mdx | 123 +- rules/lib/builtins/Action.mdx | 56 +- rules/lib/builtins/Args.mdx | 222 +- rules/lib/builtins/Aspect.mdx | 4 +- rules/lib/builtins/Attribute.mdx | 4 +- rules/lib/builtins/BuildSetting.mdx | 4 +- rules/lib/builtins/CcCompilationOutputs.mdx | 12 +- rules/lib/builtins/CcLinkingOutputs.mdx | 16 +- rules/lib/builtins/CompilationContext.mdx | 78 +- rules/lib/builtins/DirectoryExpander.mdx | 16 +- rules/lib/builtins/DottedVersion.mdx | 14 +- rules/lib/builtins/ExecGroupCollection.mdx | 4 +- rules/lib/builtins/ExecGroupContext.mdx | 6 +- rules/lib/builtins/ExecTransitionFactory.mdx | 4 +- rules/lib/builtins/ExpandedDirectory.mdx | 12 +- rules/lib/builtins/Facts.mdx | 26 +- rules/lib/builtins/FeatureConfiguration.mdx | 4 +- rules/lib/builtins/File.mdx | 70 +- rules/lib/builtins/Label.mdx | 73 +- rules/lib/builtins/LateBoundDefault.mdx | 4 +- rules/lib/builtins/LibraryToLink.mdx | 86 +- rules/lib/builtins/License.mdx | 4 +- rules/lib/builtins/LinkerInput.mdx | 24 +- rules/lib/builtins/LinkingContext.mdx | 6 +- rules/lib/builtins/Provider.mdx | 12 +- rules/lib/builtins/Subrule.mdx | 4 +- rules/lib/builtins/SymlinkEntry.mdx | 12 +- rules/lib/builtins/Target.mdx | 15 +- rules/lib/builtins/TemplateDict.mdx | 63 +- rules/lib/builtins/ToolchainContext.mdx | 4 +- rules/lib/builtins/actions.mdx | 558 +- rules/lib/builtins/apple_platform.mdx | 44 +- rules/lib/builtins/bazel_module.mdx | 24 +- rules/lib/builtins/bazel_module_tags.mdx | 5 +- rules/lib/builtins/configuration.mdx | 31 +- rules/lib/builtins/ctx.mdx | 354 +- rules/lib/builtins/depset.mdx | 32 +- rules/lib/builtins/exec_result.mdx | 18 +- rules/lib/builtins/extension_metadata.mdx | 4 +- rules/lib/builtins/fragments.mdx | 4 +- .../builtins/java_annotation_processing.mdx | 46 +- rules/lib/builtins/macro.mdx | 6 +- rules/lib/builtins/mapped_root.mdx | 6 +- rules/lib/builtins/module_ctx.mdx | 455 +- rules/lib/builtins/path.mdx | 67 +- rules/lib/builtins/propagation_ctx.mdx | 12 +- rules/lib/builtins/repo_metadata.mdx | 4 +- rules/lib/builtins/repository_ctx.mdx | 541 +- rules/lib/builtins/repository_os.mdx | 18 +- rules/lib/builtins/repository_rule.mdx | 4 +- rules/lib/builtins/root.mdx | 6 +- rules/lib/builtins/rule.mdx | 6 +- rules/lib/builtins/rule_attributes.mdx | 50 +- rules/lib/builtins/runfiles.mdx | 54 +- rules/lib/builtins/struct.mdx | 13 +- rules/lib/builtins/subrule_ctx.mdx | 24 +- rules/lib/builtins/tag_class.mdx | 4 +- rules/lib/builtins/template_ctx.mdx | 90 +- rules/lib/builtins/toolchain_type.mdx | 12 +- rules/lib/builtins/transition.mdx | 30 +- rules/lib/builtins/wasm_exec_result.mdx | 20 +- rules/lib/builtins/wasm_module.mdx | 6 +- rules/lib/core.mdx | 25 +- rules/lib/core/bool.mdx | 4 +- rules/lib/core/builtin_function_or_method.mdx | 4 +- rules/lib/core/dict.mdx | 138 +- rules/lib/core/float.mdx | 4 +- rules/lib/core/function.mdx | 4 +- rules/lib/core/int.mdx | 5 +- rules/lib/core/json.mdx | 92 +- rules/lib/core/list.mdx | 101 +- rules/lib/core/range.mdx | 4 +- rules/lib/core/set.mdx | 213 +- rules/lib/core/string.mdx | 424 +- rules/lib/core/tuple.mdx | 4 +- rules/lib/fragments.mdx | 21 +- rules/lib/fragments/apple.mdx | 12 +- rules/lib/fragments/bazel_android.mdx | 6 +- rules/lib/fragments/coverage.mdx | 8 +- rules/lib/fragments/cpp.mdx | 56 +- rules/lib/fragments/j2objc.mdx | 6 +- rules/lib/fragments/java.mdx | 84 +- rules/lib/fragments/objc.mdx | 52 +- rules/lib/fragments/platform.mdx | 12 +- rules/lib/fragments/proto.mdx | 4 +- rules/lib/globals.mdx | 13 +- rules/lib/globals/all.mdx | 448 +- rules/lib/globals/build.mdx | 249 +- rules/lib/globals/bzl.mdx | 379 + rules/lib/globals/module.mdx | 312 + rules/lib/globals/repo.mdx | 24 +- rules/lib/globals/vendor.mdx | 27 +- rules/lib/overview.mdx | 256 +- rules/lib/providers.mdx | 57 +- .../lib/providers/AnalysisTestResultInfo.mdx | 30 +- rules/lib/providers/CcInfo.mdx | 33 +- rules/lib/providers/CcToolchainConfigInfo.mdx | 4 +- rules/lib/providers/CcToolchainInfo.mdx | 135 +- rules/lib/providers/ConstraintCollection.mdx | 5 +- rules/lib/providers/ConstraintSettingInfo.mdx | 9 +- rules/lib/providers/ConstraintValueInfo.mdx | 5 +- rules/lib/providers/DebugPackageInfo.mdx | 56 +- rules/lib/providers/DefaultInfo.mdx | 70 +- rules/lib/providers/ExecutionInfo.mdx | 30 +- rules/lib/providers/FeatureFlagInfo.mdx | 29 +- rules/lib/providers/FilesToRunProvider.mdx | 26 +- .../IncompatiblePlatformProvider.mdx | 4 +- rules/lib/providers/InstrumentedFilesInfo.mdx | 12 +- rules/lib/providers/JavaRuntimeInfo.mdx | 72 +- rules/lib/providers/JavaToolchainInfo.mdx | 70 +- rules/lib/providers/MaterializedDepsInfo.mdx | 6 +- rules/lib/providers/ObjcProvider.mdx | 42 +- rules/lib/providers/OutputGroupInfo.mdx | 17 +- .../providers/PackageSpecificationInfo.mdx | 14 +- rules/lib/providers/PlatformInfo.mdx | 5 +- rules/lib/providers/RunEnvironmentInfo.mdx | 12 +- rules/lib/providers/TemplateVariableInfo.mdx | 6 +- rules/lib/providers/ToolchainInfo.mdx | 4 +- rules/lib/providers/ToolchainTypeInfo.mdx | 9 +- rules/lib/providers/file_provider.mdx | 4 +- rules/lib/providers/java_compilation_info.mdx | 24 +- rules/lib/providers/java_output_jars.mdx | 22 +- rules/lib/repo/cache.mdx | 75 + rules/lib/repo/git.mdx | 832 + rules/lib/repo/http.mdx | 1045 ++ rules/lib/repo/index.mdx | 2 +- rules/lib/repo/local.mdx | 166 + rules/lib/repo/utils.mdx | 727 + rules/lib/toplevel.mdx | 23 +- rules/lib/toplevel/apple_common.mdx | 103 +- rules/lib/toplevel/attr.mdx | 761 +- rules/lib/toplevel/cc_common.mdx | 975 +- rules/lib/toplevel/config.mdx | 105 +- rules/lib/toplevel/config_common.mdx | 25 +- rules/lib/toplevel/coverage_common.mdx | 37 +- rules/lib/toplevel/java_common.mdx | 257 +- rules/lib/toplevel/native.mdx | 194 +- rules/lib/toplevel/platform_common.mdx | 33 +- rules/lib/toplevel/proto.mdx | 13 +- rules/lib/toplevel/testing.mdx | 63 +- rules/windows.mdx | 21 +- run/bazelrc.mdx | 5 +- run/build.mdx | 700 + start/cpp.mdx | 2 +- upstream | 2 +- 217 files changed, 32751 insertions(+), 13848 deletions(-) create mode 100644 concepts/build-files.mdx create mode 100644 concepts/dependencies.mdx create mode 100644 concepts/labels.mdx create mode 100644 contribute/docs-style-guide.mdx create mode 100644 contribute/search.mdx create mode 100644 docs/cc-toolchain-config-reference.mdx create mode 100644 docs/user-manual.mdx create mode 100644 extending/config.mdx create mode 100644 external/migration_tool.mdx create mode 100644 external/mod-command.mdx create mode 100644 external/registry.mdx create mode 100644 install/mise.mdx create mode 100644 query/language.mdx create mode 100644 reference/be/functions.mdx create mode 100644 reference/be/platforms-and-toolchains.mdx create mode 100644 reference/command-line-reference.mdx create mode 100644 reference/flag-cheatsheet.mdx create mode 100644 reference/test-encyclopedia.mdx create mode 100644 remote/dynamic.mdx create mode 100644 rules/lib/globals/bzl.mdx create mode 100644 rules/lib/globals/module.mdx create mode 100644 rules/lib/repo/cache.mdx create mode 100644 rules/lib/repo/git.mdx create mode 100644 rules/lib/repo/http.mdx create mode 100644 rules/lib/repo/local.mdx create mode 100644 rules/lib/repo/utils.mdx create mode 100644 run/build.mdx diff --git a/community/images/Bitrise.png b/community/images/Bitrise.png index 07f85f1ec43bdb3641aae0ca32aacb6ad703276d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 70135 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

u3ejs$ z3coSBu8pHfpS154JmwgHP;DJdY!%UT*()7GSSi z>G77)=4R>1L*4Y`J*#b(!EZbJT>1VjOgTNsr8!?P$SnI!#UGq3*}nry5d*>5K07u} zO$BWxkNGI7V~2rzSoN7a@bK%p=@mlmxg;u`*#y+ow`8o@W3ZL&VL^!ZRj)NqUT{{R zMc;#u-@>p+8MxhpC*t>wcEUWG(9U6RuzuM~5Zc$%XZx{2iG7+JNa=Rkvk!jnS+iim zchq@iA4LaimIyi#l~E{yuxf6O%+ z#^clC^Va0r!iiX$K84rt93ZqGY8d=|`FzU@G`D9vn?212@Q2%{ zTIzHu_|n|GcW4Z5OU5e(96W{{BFhx-;Ckf5CM4VhwgxRhW9ip{=_#s@2@R( z$P*kl6l@zkLD7i69R`;@&SZ23`}|Cki@yFmy7%kIr`m^oUE>ylQTqCvP^cF!g5kpL zAoZ{yOyxDNH8=Ug@4F&Ygk-w>>YX|so&6o-9&b5{|J^@&ItpixS6?j7Y?Kf+=} zhoK|kO0Or=&iRNuWxYI zX-F4C7i9z*$X{a>c%8+{=@^$oAhCn$b#W=Rhv^Z(n52=yA~cdpbHT4<0Ia=?`Z0zQ zI?;lm^ki4)KuueA8$fYZXiKGAw0S}ePnQ2Jv&#$MpNAA)O&`L*f2vZ;deej z!b6Fgvz(E8vM#TB1faB5!1esfNx0bk4fO9!t-d_84xe`X>&RVZ)9dV<#UFQ+>OHJ8 zQ?qnX&dhB6X}pR2`~0c^Dz*A4WR`cFrY5}XXP!D-6)FV{X*?ZT8}W_FE0KdB{HG%6 ze&4Hp`Wot=FaI1lydSLv?kw$8)ANcmYts_I%cFdFNxsvPw-iW=*>|5!Ur+rG+Cq-< z6M?XGCjPe!8B+w`HF?=#mzcc^ZrFHk%wBeH+CDSCy;Wxb1q=36h& z3oh8E=nm++DYv^F-4ecqmc9ym8uJ-hu;qfY#U;hGZi}zP(}oLnF5e(d93HvmE4wiE z3+~&Uk^IS!%2vW+N&BxAypn|tzQc3cpPb9|xH{E?skyjpV%?lOqk`Od^l}k4u{9Si z%BML-R1fMn>^um za03QGvf5l)p>uzmrkj0%q(riLUyA9iaa>AY{=?N0AF%%Aqj-0#3IoKj{CUerRNE&{ z{ITrN1Zo)Vpin{_J0HECd~y0f-CTa_GF@3I6Z=Bt2<*bJkW=p8Kg%Str8~ITue}Tx zYXfTaaFx7_7u@Kk-%~|jl}S(bJcU=?!1B1Ayx>+Oi?%!9EG2Tr7Rfm2$ih9n=JdXH z_u!>fXeY}Mc)9xIU~@4O@R;c=RQbw;PQpTML6A0qYlDb>J?!di@RR_AUg+r zuYupMJHO3Er-N`$ZGId1KJDPkAuqT9uPZdn7<-g7yP|cYZn{??ZcFtZMhrVfw+*$T z_7|n;ddKSK0zn5a2EAjcr8EPq$67m^H~hQkQd=*<+piGQhZZ<`kxyFaJyp|V5?v%D zqo;vI7}btBqVztGwQnz$^V#G|Tk08nQ*zR*9%CX8j?4-tNn67e>c*2t4BNN5=)56_ zoRNB-En9Si!aI>8Ys$V|{q5u8`gkgxCPGc3=^A*r!)D?3`$~blS3S>`S{Tx3@t?;T zFIG7WvbRDX`SBJK&@Ri+K8bI7kTl!IFe!v5hUTKi_8fPm?Su;$TTD-L({CRN&%G+6 zkELhIL}mQNU2Wzj==f^e2}Rziff!ss9D2tVQ9ULOFM>hRELa{2ZhgA*2T!VI$vjO& zjGm|3(vsxJrL==pHYEwpdsm%lusk*4Z)>n?cqijdUQEAgp*MUF;m1eIJ4)#)#V-hH zy6Y3EL<(7NVCfCnVs#Bfefv}#<{;c;7DnGc|kb-cg^wGsyC&+wah zX9gCGy|@ipR5cp8!A_xxOrLs0(?uWa*;l231iFw29|`wpYBRPMNCuHh3Q0d}y1C4x z*;sf57J}b#g6p6bBtsGUQ1+UTX8JgR>P+Fys?EG(Ihp>WPD(z7Z(0^nGq|1&+xTP0 zZDBZg;ZOBvRAuZwH8E)$f$rwbGm0Yoc(B4QS&l3V4%hR#s&{FA>Q=BNERv?BHuEq? z8UYDfS7nqiEb_c=I&K$NIefKE#|+hcaV^8)e%JmZU;w_S z>*mzKT?2J07pv4KuoK|2zeVEMyKe3>#)NCP%o|Q?^PQWhO>*9yn$WAtcrK53?L2jc z!Bi&_>iM_ptrA`f+(9Ji?zBWPiL13P0A9(g+v8OLmph}u5yh*=88L-1x<~5fw22WQ z^AERj;O!>;v6}L;5i}9{3%k>J)8bh<`}KA|tK=n<9En|S_{L?}n!#^22Hn;nTgVBt zf7Gd2JV+PXytszaKDza%2ftFyPnw zhAK}@Tmx&j5`UiETl9qK)GU3hb7%3c7lZ|!%j^QLGZSG)99akkF`WD*-XYr0OP_xz z6dcJ=;Nfcvd`4#^|NAu0J|QT;y%MPpXd;s8Pk(>ufCNzxjhZX|Y+2xQTcot_zySS< z$0nW?@x55$+}7gin@0^j4%_$NNSaM=U1oJJKL-;vdz?bvJ%GN*!O?mu4Gk%~-TJ!y zm2B_BUrirdJR;kc7zo)+EGfM2*Lsw1(rE?Zr0s=hxWeFK+H}Zxp>FF(*Qu4XgU);6 z#z4L<5 z=y;$$ehfdbU|&(v>^5Sil|QwauP4=-R`axU&^|+@a5$@(Bo|EL4t8^&RAqSPggbur zY!$+fDm=+30RxdBO&8E2p0Ggaker-P^55x%9%@oqAke)9K8HJMF@T9~FU=3-5QIsq zSQx^U9&Le`%@}*4)dP7-UqsrI@Nm;eEP5a-^A>L1L{Yc?`$x~By zbsDYsOBPF1${YEK#wt0RuRPt<0-x@gYk&X#=O}ki>oQF46Xpr9tbWZ)W{a2QS85hh zBbn;fMO1O=y$GUQs^$_J2_C*ogTxJHw6byJj}I7Knt!H!DLg7s!HA&lGS4Kh(FalL zamCS?A57uRTN^l5@5#lf7G|Sv3|og6TJbHZpskwVs4Iv7$~Gm1o_!9YXNWOvMR~I& zk~)&lvm5w|J@nEBi%8u}ntj^MUC5Xy@TxkIvzZtC{Bgu3xKhTTn$*p0eYYd3ngm(r z8R#@UH=8-14^9PQJ)MVoG1BPD@-XQeRf4~|HPse)DorZtl0GEc+%c110yqpp2|||) z{sciM>-?eR9U5i4bBu{t>Lq4bIB9F~m_GGZ5sO0f zeW__7EW3_8ja69^&$BN^wl&}^I&{xD|;ONBSf zcx&!$I-b-T_&=Hzpkd9HPt)RPwZbHsTivLA(4R+TXX*eAM-^VK}@bO!kcZesRu2yEpJwI?c1~rSuDzpm8%wCL0OG@{+ZGDo3{eSN-j2|hHblDRcLa#VE<8l}B zhGA)KX}Z$~ju3L@#UZtsmn>N%>TunhKJi51u8cD?)GfE7n|pVP z-*5{SqzYnj6Ciut!!{cI!B_t^E4$u8p9bOP;iJS*NI1p0zx~dlBDOgj29G_fX*#s; zOOE{ZSauOpDV$WfL?w7{@vct7g9F*zpMUCnmrGi zUVO`Y_2emZ7h+$G;79L@{8T0K`T?AAmZi~jLSTn^CEhMDgJybYPZ7GT_#i~lw0wb* z58JdIfbQ#K+jAr2 zX7?0R4^epORq}hVF%q}T!hF>DCCb}Vf-FGpOZ%Gz&_EL1QLDAsv`jh&qv};;1bVxt z*NRhNod(5lL~gCguWTR)>wfx^&jd&)m1Jp1Fe>+a@M)0>)H~)|_GAk830A%RLf})} zT8XEDZofUf?ZPp&OA6p0HA*wZMBNS?fk!1QFD& z&&GcRY7sv(QFtmceJ_4~IBI3YIw7P0&?&<*CigWwkQ{YTiP3}CaJAR7!BEt|k&N0M zxZ|zL{r^-ZQmrYxv2N~ks~SG<3TpH{|0{`7w3HV3i|T%xl2%W?BmidgOLx6_an^JV zVw$fY-|31Ma{OF9I1)eRclP$R%yK<$K~=`=1t{8_2=pNBG!Mbq{~EP&Yd%hDX<;Bp z1u6-!}wcHvMHP(!#^8V!DHfKD+;`mfG5uMfH}0K z{}n<(psqC1cnRV;BBtOHdYk#)u(T1D-f`$yEY+SuHW-k?!10}LdGqVGzkzOx1BHAA zs&hO>b*IbxKPc^hsD{~mxKnzJLS6!)+o?v^Nh@Ic>X#@ya)AY+*Mux+?~o6E2W#g) zVy22Dnk-gfIpKHe@>dsBh5v@pD)I3`3}t> z0zF|?TR6IHAQ#N*LcEFVSG=DKC=89g5l-r`iV$Cb%2)=168uT{M}To0wZI>K|E&hA z_+^E~@JaewwG^AxT@9J2hi0w0b)SCe#bD(|au89%swmC3^#&D=dt@M1$Z_wgEz^)eCi>-iJPXc%E2^R zK21I1bOwul@B#0Mm)+&P8`PNjuV{aS0i>7EdY|0@PBv1ubz^MiXc za7SJI zhjR8ZcI~wUW&@ccjCTNcL^_PZq<@^!Cx9BAEeOEFX&k8I_wf z%VQMAvTrdxQZPXei3H7J_7mExz2I^;JQMzRJ(h>Gn{yDVuEtu5o6_VCUC%vveBw$a zhObh`Wok2`YBO=CCTxlA`?-&EZaKOs6Ej5&F^!W7bAKnP-D*G20ga&+*_A9Rim~q5X#?dMdcq? z2|EUvnr^iRvb>GGa^kH=t1=R845EZ2e8gPEk|liUO47Q8 zvVn9pID2$k=ysP%7BkV1V8_*}u}-qGHJbj1R=uUu5vqJ+scnEEb@^cvp`Q{>yl+jP~epR{|D0)8mK=JU7cirt#SX{MzFsXc*-bKYdF` zbK=Vnncl{CG$2Sm8MPa7UFB!r?p-`vaD^!gYxe|#1f6{N6bq8OOW{wMj_E?D}BJB2sY zx=a@0Y?`s9wE$S}Y(Z;fL@HuD2O}oPKkWPQ?%fu{Wcu226K(;((eiHYB1Rz)sZsz$ z;g>PX^DC{nRSXn0+Mdddkf-&)~4xubZvY8P)^w!-=xMrBO-QcLcL~C;!4|mJhNUt*n!(p zV=bk%+HTr*;IeaMn~ow%0Md{CcB-3G69h^!iqH`{qae>YD?a=;EYCT>+LxBWUtc^k zVSolzAT^&K5gJRAW|uHi#j^5XG54~7+a8TU_0Wj7d3pBT8jtk_|ns>GIs5@@j3 z{U+GHynA27X4bkoR9up7eL~8tkMEG(?fZ(^cWELu%wHWIVuN>*W}owI7P%vtU#a3U ze=%wHja<1gceR|oYs$rpj?KkmV(9u+XaQ~aHqTd--KMWJ|skLr5PF-S{^>~I=Z z75N72=#vd)<8%@!c<&Cgp6Tq)uUnrb+$~X? znPJHy)Mw_zOejS$xfOB{{c2tee#0gXADeyuX8;N^sYHN-Ze&06SqW_^)-68yg+u}R zcN-UrpW9hHX36kNguona{5-c2SCw(tX~I5a!O~l1L7QI=&cElAEQp(Go51p}c5_z} zcLJ?MX9*JgOF8A-VML5xWsWQ^peR2D-uyR6w`P!5l~DlHlA`t6l-m~AYDkuk&5LTb9r75T$b(IAXE88V2`tWMyb+53hKH@`nMSamc zT7!pFn0E(ox!Nr`vH}#7#=ue%z4M3rHwXgxvloNgueFV2c6~GMFd`Un%L|X!f1jp& zzs(pfis`2pL6$(9X<&nE1&H<-%N-9*D)c!!;5mNRpsu$D&M3-4rWu0!5>ur;XA^qy zj0E_2nvy_#V+M60KpGsa3t2xdGw}yUbTzVZv~9gnA5MCl8)LVO?u`8Ij~?6y6AbOz@2JJ_k5Bgk+#sDlk0m}%q+X{T5iQkD zsr}k~#}at@w*p@@s`;zxXMP)jDG0bP&BD+Z)=ciDyOutO$2%;w`OySC_ZVrrbeiST_^q~W&}%j!s-x|uZ~PRGq@7+D0A{Ou z77A8*txu&+2>9fv@q0+0{PQ$4KimCdCD9#%PXATt*Nve46VN>q1BZ#?gEWM+GJigd zscu+WUz*|QaYXq!Fbo~wSnx+TTj1i64qM0!S~Un|>3UB8N67!is^Aj)%plmx^A15F zHvP4`o9olMELJYqh-(7}*=@ib;j^v?)wWKX6d2DuVO6xU)*8DF^E~^=%u~M2AvaLY z9zkwEin-_yk+we}Y1aNbev_CRTbEl8DkZoU0%ZpQpt<)2L)#7CRNBqG+AMAI!guC) zT}XvM6~kAdz9nlC4Qz^5o>?(Kcb>Y)+z7m00I>cnfnAtx;zu3Rdlon^Xq+QyaUZrt z+H^|hhkhgo>waVV9R65~37}h?*Dhv1pdIYR#R6S+@3~4Izl1c60TwtZc&UWbS{AgT z5;nVpRx+=$GznjP`9(MK-{miv*|segb)-s}9AZs%iH+LXlx+6ulfj;Ok<7s5#hf`# z;T>mapXqEmn<>CJTcDq1%c$_^JQ`~vk%`j;D5KZ4&aS=YuMr98UZdt(i@O$u2Zf~Y zVpFC{6-7e(5-lD@+LpW&vibR=n`@gRYqP@6=4g3%ff>t|FbG}R7C8Bp!h5KoRSPPa z`7GH*PkbokOSI}8Dcg8z;5NT60CBOsn0=nYi-rEiYBT_@p#Q58)&bVKYOE?jeDtox zd2dXB3d?Rqk@`!s_Ijg1!srW#PC+0cZZg^s=Mk5;tcMf@NL$`8pyD}=Oh&l8*# zY-AlV6HN9MG&NImV|3?55;qeG7Ufmb&pqAY19XDGC6^cE9Y0eD3B#nchJYk(0L+N= zGlL*&#YiELEeW0*c$F+!n`L(G`dkIHw=X+@q*3%Bg7HIY^i^QK$Bqxg9Psdf8K9Te zSZZD31rqpTux~MQQha{4qAH_vn-ls-sQFQFv%G*p3A)4Nr)F*eV;IQ$>A|zaL^P}1 z={YQ}Y`41TCnA$}C`dHXFE=I&D3RnqTh*zyZ`@fhfvYqT(_#f^JUQY~VBWYe!YJ?+ z;U3Ze98uUW`FeItf9xu`+k5|5V-`VKX34GG*Smf_-md-GJrwq2t8(J_#+8P^>VY<08FVAv&)#WcY5b{*>kh2GLDO-pp1>Vpz6Mn zb&+)-ACe`t9a4yH>JP0Yj%1tSJq|mItG|uwmOE@gNjB<0>{`*pIhc8YXE+*iBVocs z^iD2xl>p-JMBQBKS~s`j0!aasYhAQ*II~qqwEqv~du}f@N6s{KbAte31Xg88WT{ii znL54diPXC8E2t_;&wc;WmPtaNpmre29cZju+X1+ntUaDQ6*1+?|ac_o^tEzc|a9{japSD8rSgtYE*_`IoB2m)42=RP$gg_NE= zY_pdx;TQ$r*)Z9;Q)uk9EJFoN7-VG+llZ_%0`h&rgct$CD4UAe@ywCz=!VGY9s`i0 zJoHW5P$WiwVs%=TmeCW+4uxjD-yvtP((5orV(@a6S_&a*D7&HX3UfV9=O7-x+KzCL z+mk+(x(J-4=1`C^g+@ASZewB_QN6Hj*+kL^Qoy?(ETnAz%SXx`X{Gi^RP;~US) zFUg!U<;H=S#uSP3E9^e^Sm9UMC9kuaPGHU&{MNax$YXYMqZYnGON?Xz#xR2B(~t$O z8zWV=I0r-5?g?7M$z%I?J_Uw=9tJNv1IFy~G10`Nn$-lMp2k3Zw zyuw>&U(JbA%Hv|@nG=t}eUUSZ)s5iCmcvTeLR$?`)ZklS{HD=z>kYS7sK`R58k08p zs|5Te$U5T2W~eO!!?UHOGjDv|3!!6^c&7GHDw;>7BAvzWtFTL%zobm@aT&AotGH&Z zLh01Y{4Da5QPHr}$zLR~@Wz-eQ8W5iVqiM+`O6ci7qKG+(ei#grh~PPgH_cBj3(FV z*eMkCPKyzO>gX3=M-rcf8h2WkFL|*332y5l3fXB~%uIck$=3QIm~4qb6rWMPzbjm< zQr-zspPsR%$MO3C@vNA70z^0UmjuUMKqio;BY|5RQsKRXCRC1|&1$>AN+wC(vpw^K z&!=v#SMYQJ?1+B&t9D}sg5S8@r>VD5y(?4?O`g$m*cj!dNRUVQf?&2mJ7BY6yy zzF;)m=tunB*hNgoFS$-{5X=np$Bjy>OEFUE?jUV=YJUZ^!HARA{^Ghypuf?N+M9S6 zx{obR4T>_PkdIM#I&!yFVD#e7fnZ?wE<+%?Sq9;*pVPfO)C7YNoKnKG7el-CPd9gF z+Uz(h(H6Tht-3y&K~1CS3Ux8NHq3l)-Ke}k1)48Kj5)UpmCaunF*my(qj}g|(3yt| zb(oIH>cO^u7C16vz`ScNLp`V8>jjwGal;ahw7fk`pG4Cx7eJII>R61ZZqsR4cS}M3 z5Ge5g5J7}~QAWjTJD3iFFYQeQ=eOC<{ZW+>9!`pz9vx^oV>v()_P{S9HVLKtZ*)Rwrf@_i@61o-iRUyp6sU?}!Enu|=oP`;}c!aHP0@<1RHwiL6U z(u|d1ybYU(yH1T~4v8;|7Qz(I0O*KC~KxcR% z^QfwkZ-p@0W(GD$-*dPdTvU@-y0@4;EHXPS-)@1zUeN#!!7=C5#A;IMtJ3tPX7aOT zOr;B?$LyG`03KEo-;>%;Fj_bx=0pY2L>H;xU{sz`0v<|E+2e40``!SFv`SRb`jI2n zNP0`{ZXcz|eTcq`I}t4{_%2d+5K^FZ`C+N~O_9pnUVn?axwW9~Q{tH_Z2)=70PQ2~ zJLpx-7Yi9_9oi^WX@$CM9u2!!p4R5FDJn0-;JS_br`lN~l>9>q71@y{-Ha*|ARkycBZfU9Fx}D`5IY>+O~! z$k_an^%W{M6!K6v_q}|l-0O$xb^pv2Z*rMm4C3_hFtIP)%D^R{b8NqI0632CkTSM! z#>&|PhU@BfzqLr^a3b{v&0wQfR9geE4&kBkyH4YerX?Cp1I#BuP-Hp5@DY1>)bzV2 zW5RM|qo+OFn?hFSQ*3Du1;rH++C81MRYAz?_->+ajx60d;MhKUDb5F&B7mag91_(z zAb%UUI%f)5dLXF@bibh(2GDKgf{i=1s8)FxNWo&NDTEy(vCukyZ5^=C;21?wdwC%RJC|)331+~Q+V5pA8Iq2EU*kH zqB(TFW&A0OM`M5y(SS4!&7g*w!wp+eO1nc2$^-?X(g(@oLn%qKYXDPX=FZ?vW25C~ z3B}YK%;%>jZvP$(3J7Y6VRR|*{D?CjB!v+D2eRSWSEtjMFkKS#Vz8kg=B8m)#x<0h zHrW3NdL!vaNP(HPQkw?vtzlGb;eCRB`HhuM6K%!hGzb`mf!CO!31f?TQ=TNL@S3~1 z5bXD+}q3OGa1cS^9uO%w?uvz41`-rJ9PO|oFJWcnch51NB<~5PTimg17 zh2Deb62>1a%EOxN<&;1A__Gg5AdX{T`N}*hZRFdA0U`m$x15MDxH#{KZ}x_Ev|KO@ z@v0sN&ImX*~>TsGE{Q~I?DKMN_L~1wTS}-1 ze}Oc=k*7NlBYb>k3Sm%cTt;_XY#`R?DS3)!OW}pe;qm#Qjm6p9VIRc6e5Qn9yEWJ6 z{{GnlG(RQHE)yKq^54T!OrgHRqLFHdLR=pYSz|%&<&8uvj6`j*gx(~Dr`-~I1SXV_ z*<9$RTsi@>sn7>f*!s|4bz(YcR<`%Ia8<@u#-0TBi&6KEp7*uAziDbN5{A=9AVREq z{{H@ZBN%`o-Ic^;4=eEQbaOQrZy8j-y19xUf1Xuke0!+=Pia9QCj0Sq_VkpG5Mpoo z3i3vr+|U;C%Wm$?@1DoX>x#+7kauFooX3Z^s}UrKrR{`!sr)h7a(Vl$Z)GOmi7_hV zc=T>=B;&2=$Vn$(k9>U;_Av2sI%876XJ^iKCua^+?k5nyBv2J-D&)zEZMVBv*I!ZZRz&;Zng>BZ-A!McEF zmpXn31*$3QnTN8r-SKo7Ml*BUS1guhwwY+-KQ->xD;f2vfDr>QbuAT~_u^(!;P27J z2ts@T*u+hf*a3px$`c_1(K}LjIM54bw&a8Dxes$}7x~A~I3fgH?juI4`fyg852I_x zAHu$3YHFag`(vq)S@@>KjtA3qalYM z$Bc8Y0N5M<+VkF&!t){O#Es=A&92{uR=+pK9Ed@NJ_*XJG&%^5_uyj25*1P4Xo_~7 zKD7>-6Bm9%BfqX6D!)N!?IJVG(<6v z{@1#s-~#NOuo#$gLg)+4d5+)jZO$$_M{y@&MH9W^sFwog-&RJo>A=NuU@lsusU2qA zPnYwVvs6;uoW;Q9NZ>93;JY%qPIhv0cgvM~O%)uh%J|LrimQ|{^Hv&o7G@su>Dnit zen?Ie3N{h2LByi?3H(=gtIZmd+b9)?Q=5qZZYqJALtC8er&|}2Kog<6v3*z{Ys(=t zpTEOkr^1a6xP}1p%H<3P$4-FKo@=FygH@yrr$3Ckn^1UmL`$Pm2ksJvmreV`bLWLB ztgXCNSDzL#*pY#HdHt2XFdlMxJ@K)nx8d?m$hWMlcPu?cKPrVM0o~jjJ#=4-1vqde zYu!(>v-C=O)m{g#1EcT>Zhzb(29*h$dhp*(RjkafY$6Ds`6$ou15-uPHb>*`Yrj)u zbnX6Qb0&nsJHnWQ`-GbwM?}mMthsJipIX>|83A&eRmF7rpwTK6zBIoQno8P4*DL#7 z*`B3LGw6vx3*ZU=%euv)1qIT*_)O12pKcirQauPlnlYTdJtdBW@0KHvpoQX6ETBVWn`?!J+Mqi84m}4OkH^*B_|^III*@!@{`;hTio9~QnM@E{ z|2~v@bE|SxRQx%cH0uO2BNH0L)qsHUxsVdj&!LM8kk(ckjkM0%JzJ3Q@l=M3jX~NP z38QH?$W;;M&IHQ#m;f#rt`O<2ohuKBfJ+fbhLh^5_}}2zY0$1C0eT3^v8ChoZYyR- z^Vw%rz9}PVpteS@KCpM8D{VTPwp#h8t%3I0CwC|i_g1=3#4QE?*aCvX`SF=!12GYM6ZxN zX~k!C@nAimEVIn&Lc-dM9lUzFu!w44zI-qYUUTwOT%malM85H%i^(0yrCCX{zZn&0 zI)$hlo9|1qObYl;D+XP65Y&x(7cuP;HG>hLM)M&j#-oB5-2$(;u@F@JWuKsDVN*OQ zghaiKm0OR_R*G=)(M-#cQcb$DNK2821r~{t#`I;$(s2Pmk^m5dNW33Lr{HJCnI1aS zi$g+EAfU~>PKHdr*M1r}7xdKk!!cXjdy-2oqL$QuUdtsEbwXEAhB8la04O=5XP{!* zDHwF8{ZoL>VUEP_dQ&RePY(_!mBH!Z&x(I-77n4jj*WE$h{IxDv-M9Sq(--$a05*& zRJPk$L>a-rK(xDDa68E7*lo1Aue%lGlkt^EXeQiKg6lFy?T3L9Q`W__YOcN%5M>R&Jsr;YV#P#{Z2*J^p2$$#h()vpvd()&8rM~o11r=v-2Mh`3|sut*k zd^DuJxwJmHB%K+=vZZVP&X*hROn{OljVa601P9zz%#PtZV57GnZi>J-fmdIe79DPY z%$su!ax_g-La(;1M@cv$3-s`X+b*5(<(BUO{lfi8W+phc z_LL7gD|Y$7pb~GUbs7DxsG_=E?!U7DjER%)&@bF{``aXLtgRZfKrJCDY1SWVeH!-4 z*@Ja+B=FDVmfDk#Er!DogLV}9DkDl$u4L6sNMn@x}2K8k_g;V%;nPxV671!FPHg)3W1S1nt*^{B{o)oT}YPU`G< zO*J=-vZerGfgJ+Y3Lm zXo@7Uvp?=U(zj*-y(FKp&cXKgfsv(-pIR*ZHlK4F!68<%5)J2lu~zC04_Qyk{i_KN zSSj&eM&;HIcM6jzehgVRrN<+vGj+U1d$0qJii`7)3`5(p<5d5sI^$`9|6-+Y#d4F@ zgKkS2<3O-`>fg#$TG(n-_%Fzncewt=w_FzX*KFY@S7MoR?^WP$V}`+ajFoFa{5;X; zo80=5PT`LJC^`SftaY85fHMnG?I5jH=8`T)obPJoK66w0=29W`MXTJ_YR&rBf9l`u z42(dUE#AI9fAr=3TeUlva+-&XeyS>*;e567_&zq)g-3E#+>|~U`y|SZ^rr|1oibp2 z%3`IoX`b$Eu`n_Exs%w{SteRoMJ5gp{^N`w_xZz!1Kn=rn1t@S_S!bsF@ss?6Ufk% ze-fwka&yUH&lh5gIEpu)RT3|moumy7;yE=RZhrB1S85o*3wxAQ5`SLog0B@;k(8G0 zQhse4RK$^=`qf?=6lCCWrM-45aX9JAl5$(e#ld@Cv)q)#fR{`{udINgw{EMu^GrC% zF?yR{@Z3eY(2lZ;UNJ^LeL*}tyf9^>S+W0}XFHeXJbbC3@z7tyeZ)3%=xH&?b{ym) ze@-7&p+Z4Cs8;5dOJ1pV(wDR4vU}=JVMc-!&Yc{Q{2=^NPJ>6xI1tBahRT$Y?kpK-!P!tsc8kQLL)(TY=bYcW#tF?;kK}rB2K;7sd zf~f49O8{9U8a5*c_nnE`z5fsQ<9(j{a6Yt;VRGi2-@EhtHkOnsV`FX%|i>W8@x&%bh58l2y>W}t!o zS);hQvJW@8!d3F@Nkm7}vr0s;Yq83)IWf<{*YxdwwKOmV&FN|TY>tP!S=^h>_T>rL zBAEnLwtV__Wj)b@4cIf~51T8i+aZg&e~i>BM)RIcBXxn?)&G8@(m35SQzVarD&Ic&?_uFkcX>W%S*k#{nmQ8fsLfrxB_XZ>Hy~899Z(aZ_Kkll)wfBtcoxzx>TekGTQ7@b z_3g{cADC_+4w6O%HxEGN!)VOi;Ei7e9{rKsd0M>U%KqH6hc$PW&Stc%#pY#Y1!r=B zxDAm{8-zP>huf!FJw3gUrSpgpjdA#B1?>E8@ajQBJ6AA1maOx z4Gg>gcv>snuG9I8`sO|Jo0IU8VsJ1$d6>67b8Y#T4@Z7GnuLUhh#G$w+>e>v2h@+U z@yOxmxa-Z8sr+RZB${AmPo81k&P<*c`*vD8C_PD?+WCUPpvW_z51Coxw)mKqQ5IL3pTB~5$Zvf#6XgH0 zjRK(e0{~DOTSeI5%RqHZM`}^SoUD=(?ib}|7b?YrJCl#IRy<vcYyisV#>2nwDR zIc66m!sg19dWP2qaInSXVOG$Ee9#4b0eFF#=~=mZdL!O$ zmrO2;^qGl)HM3z}gTV#oQre1-V;jr~dwy%CXwUahA=Hgf*uqW~_moyT^7sL`XGf;| zQq`j0gA2LJ9i8j2P_Sh>__e?a#AQ1iS`auejp&3azvK#cj@9UiD#PE5(!mxVs3%KY z11*s9>ls<&L0zfe2kzRZZE{T{YiytIat(Y^zQDXH*jJbqoD$bLW{IbyXDxGP9@zm; zmb-jLdEo15tN$ChGfO!CkhZisc+-D3`N4U<^9W~5JwZY{r0w$po}}A4K_jBu=Uc52 zcr0(+5Oo|cJ11F-B_r}!~8xS9$~4cSR|wE8x?nHRq(H-<=d`i z^ypovfsci=`e@LIn$^hfnG`h^K_}co3^A`rcusaXNr%0Z}hxxv+ zmZf3?yO_B~%0i1n+NtgnZw?=ls(_H9MpvjONk%ZUhsBZkvdd^eRu&mb#;%Z7&9#&j zq8{98x3?kR6FP^qV{)<*8>od*MHFgbDLa@)@Y%v6hqP(+jDZA6G?w`7KPIl09Pm95 z0J?)J5HCJIND2HaDDbm7Ml=`>9y3h3H+Tg|z93c4z!quTn=i22ANpJR)*(bV17Nq7 z@v({3ggnXDDZ~fd5*aun5BIE|`6wk(vJIO^<0^ahXk+RZB=?)Q_o)Gc?)#42<=6)oDt?z{@Fzr}0z=zaU6D!*Z%WM?EoGzWaz z`Np%7cr28Yi>R|w9x>W4NU||oU?NDupCV2GyVDMD{f}jr$uF3Cyd)!u zZ$J=O@)^l5`GSgiMsq6Mcu2I5Lg$ zxlpw5qTU;lnRy$Mh2a6G&*tp-m2fUuJKl;$qP&gx0%KYhUvIxzW6+D{$~=|S!_%zq z?Hst6Q%^@41M>x!_%7ze-Jk-YMYIj)S##w&0DctKX3y?ifq5@TI6AHTJh-BZB2HPA z-Hs3ssrvbWTWHx%CW+o%@m{BFP+d>$vNMta%&et2(!1JD_7`dnRQVE^ai9`B0eOXD zFsl+OH}|Kl&QyA>3*P>aw%)zqQ5hh2Q+@J5J8|x6q_^l$5tfzf#c^7k>>3bKI_L8axW;oGY`2ru`jN1iNyN$iD zlqI4KK+CUizYNham{shCSL~n2tofn8YFyIa*T4vE2#13)UMcWP@^Gm9cHFzw6H4BXWUSX_3?`pmLPYuQOOjLDQ+cdLXu=nI0LrZlHQ6#ggNW zTWA$occb_qUb33tgOx)_yaKf2a?_f2U19+U-e8$hxDLelXI_hAY-My(pO=P2HO{Qi zaU%|4wT@D>r@3_tZ|2s!g|U*fTw6g~!d;Iq^PD{)f9!r15(Y6~BaKa0;HvLwP^q z8ZVaKX1v~pSD?Hj?0p{6#SGAsN2p!G+-IQK-wx(XYVj-VWNv=p15B{lR2U8vkf8Q|pube(QFfH5$h=DdS z2%B)k2KbVnv4~QK{$n{>@L7)*l0~3CadV%AV&3N@^P>6;oXd`nrP7QHh?Yf;d3?k2 z-Js)Me>YcVqk746pQ-Xq=tKye#=f=-+Z`);l`n_^n`%sIt_-V*c$JN*;}Q(Zt~Z*6 z7*s!fBy-f{)p;!r(;Zx%Pan$Kqa3_)@O08{ubXxwbx+?`l);1@TEHhQXhqJj*!xPj zi5{W7=;j@$e$c3#WS?U%$$6cfl!clqb4JXs74~{99<}2<3=VP{K96O$<{U1lww9F! z2Q40c-CQXT;Uo3UI}MJ;1H^~H>HwcQkO!SufVXD()ZXFk?b?!-1$;`=Iaou&%X1qa zLu0IDL748tg4qb^8+5RCebqY&G~Us!n}=eh%-hGuJ@8bTyboAI60`BEsJZU0u@e8N z<-@S*T@Bv{bSI)YwzBc&$}u1%2;!?)H*iX*xj)|FRN@A&+8wS!jKc3T47 z*q!Due}5L4H>$(m7oj``9^_~HS@>x%yfA$1Uc{?aSf~+(ahy8RiJ-8qRJ8O)SBh8a zoG;TRrD)lCNhmh2hq?YBoxdzWKI*sIo*7>m1W{9HKvB@jE1a_4gl>eHDdOzG7x2gX zW`ujW9D&A>!oIVJW*QULk7wCiz6T zSh(TU;2+>H4&X{!z?B=GGxPD%vyz3_Zm_%q(#7E~eq!>1@B~ondXi)8J~CNY5TME9 z;)am&u!idxW&%lVo|}n2k)#hl)oem63=ClZ>B}!!NyJGOr~Z9yHgFglS$or(YP@y* z-~tC_J5EuyTSDqSvomj$A(8KIh5AYVavy6DL8b0PI%^gL2+$zUL$gO8*dNvUYy`N< zV7%VR(BQ6{mde{XEu{`^P}3Nxvcuk%MV&r~80=4!t+P^Y-IvNb2U0k{NG|LB{6 z%c(D|Zw1PoaQi?Dzkpw);d6kjB*;&EodcXh+{W1kso=sfBJv?beD zIpfJ-e2PeapKFg=xlAWwwT7YU9Uy9UI4&{BeL_^DQahQbYLU3i;D%VKm-nfEZ+p2=ef%adRMn%5L z{Q@$5+kIZL4^-$^w4f%~>Fo%X{ctT?@Z!JVuij?Gcchg0tR~_DkFT;AAR z`Hk&^nT<3Ex!dt#t)hyj&vr%>nI-t>9SsX&@9RzQMDG6!-;9%Z@LM$rJ6h4tSH$z1 zim>Q=}B<7u5LKIkd-1?6LM_`CB<1X#9u`D3Ry_<=DXtQ<5ag zfn2Y=$@DB2s0+b95}MY8eoNSpAI3H?20G}UIr+fu&!QIYrHf_YLTd{S*{gxS>B`n1zUC*J5R1((XA!_5wfVzzBfOyJ2Q4=AS}cEH;)#fTe?)g zP`m#6s2Cj^?Qhm9#(_#7i|U(>weMmYUGiM$2d-43nwy;Y=F+ZXq6!{nmMm`=D<~Z> z-^o1E4B3`fp?}z=X-N27kXxCx?0&miOFz^<(gtui-Z5zeP?-!I0;J-X&BDf18ce(?AyIz3>T*Wb6((hctguj%T-ywBH} z)%M(SVIlsnUhyI37c-`nUtXhnM|ovKz51DEzR<;OxO%nc6uYWP^Zc|}N` z=fX@Oc!!_xK3b7?SHhj(zGwN@mUdh!LQ~yCzw4c$^s_nWRDmZnUhXSWG(g|=jAWCT zE^12k)NXj82EC`g{RXF`nCv0>q30p(vPV$B@``%$cS=?8w>>u+>I$C3v_dUZUcLNL zjE5P^ughSZhxA_rk@<9ONjJ2VmFfDuW#Q9BuVT#UgrmO3X450Dp4IGw-wk8R?-)!p zA;KLhIYdMAJ^vTCE2PXl)dW@=C$TCng8vTAe8BRoig@)WYMw0rvv)=$BZn^;i#>P5 zyUVp>(*I&#RL7g#hd%-ObBu*tuwj=|cZcRV{pQ~|3`eyYwci-HCf-;#|GqQnn=5p) zrNYH7rYNx7L4|YZO7r_PK&*M{m9M7FI*$m2H&FQ@Df7x{WRcL&e zsdT`&Z}VixHhj{SvxB{_As__09OYf_So)2(z53kz8A!N|{_¨_m?OX?v|LeDf<* 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 diff --git a/community/images/Gradle.png b/community/images/Gradle.png index 1e5f5eb0172f3e1c335d301292ec092a98ce8ab3..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 7815 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 diff --git a/community/images/JetBrains.png b/community/images/JetBrains.png index 0f22176d92ea07baa519d9312b1f9d339639d30d..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 64014 zcmce72{@E}*zYrjk!(e>^QuH4m23%bQ9_8aZ=;gk*mpCdO%W=gtWi`9Ci^~vBzwrt z*!O)I!!R@F8Siq=b-wFd-}hbTTxYIJRFCKXfA0T%|L))YyYJ`4ZGA2F!vco^0ASa? zsc8fNOyG~uKMpZ~-!{o+81Ng!+eqsgkk>9W5B`P4t_9LSmYlM_;(}!VVVE@3eEqzS^u9n8gSkr?Ei=FPi^J7>~y5hxj(@!iTB8V8TQW#*UkGBD}n=Zg(ur3S+xi7{~Sg}*4ET#gz98~QfLn!-#?2U!}zVB zs9N`FMqWew_F-S;&;R3A;e9h1hKebB^=>F-&msQI+A|l-y8gXevRUIZ&S9@!gUJp_ z_FK4rS69xKN-SOuwrekwL$asmvpxQITb6wa{2txqi|#6uq@fP!_0L22Vd&qu6P=^` zSnEa~L2!=n>i1upGt|qa_IgdlU-zU7v=eO_~r(S+*+J6$#Gm8K^n;_^!yOtn6zI z{*hZZtzZP z+VR}fitKu=+=@Jxkvrl(#eU~=M@@5sTC20V!5fy6Ep^+Kj~?a!I%3;6VijzO4zBNp z!-kFSXG;t9Miuk)aGRn|a1fa<<@&9>-fDGo5H8PLAT;H!&>YCx*k%n!x-9)*BTkbpGgo`vw>t$|Ej=eiRzPu~ z%Gcb1GM*!VM?KN)mj*cVjeYcDZNyP{Lz4)P;&Sq9 z7Zl&72J1<{>NGXidwJRhIjYuDRNB@2OnE{zx}4!GKzIzQF?HQ?78aAeyG4(I*LR$W zrSS&VJ>!l;)N5tIDdRqYJ0DG~?am)Hw5p1fpI6UlFZE9$Rz7&cW}?m*4_zz6CC^!- z(x;Yd4%RQqoX9Ea;mkWYo4)7vyP?Dh7J`t zDe9%2r5mb1xq7RZr5bj=_0qfNl0QsTNO~db?S(P=N{h6*Zg;pbu-)nZdmuPJZgl?e zfuX*gkr@*0t{NM#Tj@DB9%JD<4FMn0aKu=zl3=zPS=qjC{H7+GU0RiqgV|$j$G>#| z=i?ZVztSN@|Mh{}pm!;_5N4VOR*c_x%=H25?W0H{r8@fU#ZC#Equ_odGNg1lli73b>P^yhzPDN^>nClY>4cn%qZ~ z1B*9bv5qF)UVP3NYAk0)z;l&C!sq-QQ;f;(B&LI?xVRIgOg?*Y2RxjYk6t`a?)60p z`!ALYN~BOMZ)WkCv7@#62t#@60p2)CdZ?bNqRLo&71eJe&u2pG>GPi~ zM1AB;wD-3D<-NYKyXVb#(e*@??WKw6sFkDZnFs0cTU$-V$IUsFUrViaYbCv*W*mB& z4@_kei-o<$Cs>L(4Al1e@KdKSP585rkiGY`zLQSTW%)kPE#<%xLnd$4=*X)?1cpD1g_G%%BVm#zH2D*6+TT(eQ?FV&i zmp!U&bhGX&p=)ETeO1-3X=)z-{jnCe^2OSRG|&jW(+CfQ=I}A>L6!t*(O3L6TCzr@ zcY+Si<_IO#UH#W-%3*At^7-C}W8z;&cCVf|!BsjK_~(RFtTRveFH`o%Ck4$8yYt8T&wmmc;tA{Wt)k5?=O7ahNy>Xyt$7RfG$GUQXE9v9M_(Bw{srY z`!{oL1xqi2k!-;+0(o>-=zZ-nGmRJAxpq&6`Or9T4GNKaPnp~-r!T}A0kAK1?8;g|l2G1XI*6_|5I%Gh?8)+)wwupgPTl8M|j8SR7M#HLUYv01=lw|`2w&-0R~;nBM#^qg1h}Pvi|9+@}{3H9UdNB zv$P<6Gr}><57k1P?67acm`T+W7Rb{tB%hh8jJ~==tMNt#e%KygYgNE9qT`6c-Xn;7 z=Rx@j{WJ8#>-x2nqjET4;`N!wqhGx8VQeiI$`+R5N<~{^#E&-EeAOdIm5)U-I}3+= z*iOfukTZ)7vp2cg!Vu6kfQ!zr&RK3yygvEj0NR`vgRe^!5?z|d6q`qKbn0|IjujN$ zLMpwGe7NAz`L1#SlVr4a`{rRT6DRl`;L7-tMv8#Jb3*q41N`kb=t(YaseW(4^rWu@w*oI|Y+3WB|CVI7}|9X20bLsFwywH*Bg@foKuegf!!C`z{cJ0>sfE3ml zy=BM$8oT8+XD4H{dqzCNacLoIzSQa+>CffIcRJ2++%m5tvq>w1Y0o1H*>PEIs*Yr# z+3{EC{k+Xhdp*NPiSR>Y2|L+ii^6uVif7DakBDm&E+9oG2y4Fu`}xqBjkwZYb6(%S zm)3Y+v0Qkba)Up}*Ul`uHV&pXf&|oaG>`ERopyd!&#pw@v~_~HT)-w8{{pcJGZ>s- zIoHdlvUw2g*VK!b5riGnQsi|uq+Cjh0&I`1szwiiy!Ybgw_?X$zq^#{cbsYaW6I2w z_b%`r4LB1Zns#^bcHcA3?^C4!9jwpDW3Fd+69rwsJZ8rajVUi+S1;9^DzZ?VPcruR z{SYkPZ3oZQfb#>U^ZpwHjpS1uFUJv#2eFIY8F+_`Iu{%rO1^Oq`!Z~|T>QlB@9NHK zQt!a!2hc*>nWI)EE2Z(IAWn3Wv-$E%w0dAP@SF)Ram`Uh@u0b}6SB`Z=ROMm{GTRVL> zD1*!+(HX`wrnUFoeHS{5 zIm3GlBPnfVn@*ztX;wy%eSp-uo99=vTo)sHdG>R72gUp%6HM?Dw)O1XPcZipYhLcs z@z8MU8db^J-B~ScP5svojgwkYC5uU1zGwEIBAb6ZbrOqr!a3i+f4p4%;O!n8$`bqK z-gvN)%=UI7^@>il)X?x#WG72!e%oAJK4~qYAeQG|baJv)V~scqC9`B*riox1$V#xn z2xVqvW$C@YEF&w6D=RCz)^BKJWN{mNVq(u1#LSw~l^|u(jW<{rG>K_!&sn(XvVU;$ zk`EL5#R*ffjoZ6OtD~s!jZ8BpEquDiy4}<&MPErrM~9WQZ+2?xp+g6DgB&pRrPDB^ zSHX=GQrW&qu1t069?@{;o+MC9W&?wwe~DgcQ=B{xCFSaTN+)hJq%#>#HD0q zN5y278yXsvmCM&pj~{Ove3?tDt)JaLrDZG6)$0I13DlIDcs|_lwp#dmC68l5*RNL= z6gnId;BPpFhQ^$1yt0ZqD>d%uf#})s@4Cc#ZUTZOBD6tA1F*fkQjIn3yu7@T!Et_F z&a<7di+P6gHh0)CJoqkhuCHSNrNL_IpIdJU2L|qDaXz_!93RGoq*(jsj~i-@o&{vh z-B%IEf#d%DD#|Z2L?tA;759xVpJuLu3aVWwZjaXL*wel^!lqz<2y=y6olD5hNy_qm z%87mfoCjd|^Gfc3RcJsw#)Gq3CSq>UZBD5L`30cwahre^<^lBe^t{_2IS{q%#>xHt z=N6kEy4{edq5Lf0o0`jstG&#I5e8!|#e=|cK&k*f06NB}44$^J`+ZjQG{0+(tBUb) z&;32}iI(=4P|-&Mo4~d<3(yi5C;#o!r%OS$ZW)QSee(R5%LxnMUgs}-^^r4^L{lb5 zgF))Dp7G79=N}VbghA`R{3uQUtj33=7KztQc6vP~QjwpCPY(f&g!leRXm2mC`;)}1 z5Adf@TE(Z^`9DavatbNmHj!_2cpkG0m~o>ue&9%bXGM~g(iQ`OTa0MPc_4b)(8Hux z6Tr;&lRobCHpP3Crqx{Oo;BMqWJE6q=@!`Q&-Ken$ji%Y+jPvfC#~+w6x=w~hT0mY z&@QhwzIrR}I*ea{(Cs_@D5m@kGhXw+4rNL&ulzWT1eq_Bx@zOyt!=q)5p6>mbIdG& z;Qr!cqQ*4`1|@m<+%Jx%w`vH-czIR4ulpqF?%k>yYw;juzryN6TR6kSO|Itf(+GzC zzRs~VRzLnW#(5YF|C+Po&Ge7qA%mOuCCpK0BO?4D@JhlPjQTDIqX*k!A8Kl9>axSJ zVM@Nges1OX`XUJWgR=W5BElU-4`4qD`9M@@3BGAQ7V~NdJWKTr`8n{#>8`+qZ8Ay&7xf6MUO= zexmlPsttY*h?;$QviRj5oqqxz-`7{)4&vAh0%9Zm{yr!eo)FwxbS@8y?}GK-v`zS0 zK3nZP8R*eYZdGFR(ANHHUwBmuq9h=??b7$f%66VNCN+p!afI~jb6jl&I~Z0-3L&W0 z0W6NDBZL8N2pnjgW&rXo7v*Iz;?rR!%Qgwvv(ZAnOHy3G@z7&D%LOxtBki6eZ@+d= zto6{nN*<@BA$SW_)E@nOE6yH!0~!fkv-Uk~Sx8S)4ETd%U(@JjoG(=o8Gp&dA3zqe zCs#1eA|;2meHnp%Lg^`&;~6T9c{ysKZj7})t0NaZs!lvJ6ntWuA&%d_l0%J0Wh$E&}icG#_61JBZ0o`Dgkhq*L zjUpTFjK7){Ymh-pojnTz(svd#>tT~Mn}_awwil<;h&Ai!redBjg^Lglewx1W>}Mo< z>J%9)xjw(~8u2OH?@++bt6R+fc ziK{|^p}qJ|_YEq)Ks~IM_m@;OudMBY7~`&;Nc$dGnU-B>AU49*dk?Mw+Q5IGsimJT zEYJ@Qf|eH&7tegnt6nO27;PU@5Syo_7%}7S7#eQ;HsxgoE*%*ABGNF#F}5Q_OH}Dc z1Useeoin5U4h&AsE;Lm$W>av4=jME<2dw0&)t}pE6cV;)AN{p+`pren&AH>YYjgyc zdSn3;J_gj<3!XXlpQ@9AS`_w%?O8DhJUz(^yuDILr^0&g3M48^%>r@XZ=~AmjILQu zSOcVAotomc5@S8^_m=5)UD4Q8D9m05?|9`BXP9q!Us|<+I#{^$$eKAY}KDK3bA zeK$+^O=T|Q950}yHq2?y>WeT|BrLSb()yd_fqt>@`HuE)NAbt=QRk$s(qdy({0aLQ z%nOk1h$uVz{KcR;QWVuCBucR!)s9h%R6>;gd(z#Jl)2EA}2|DEFmKIr%eHj@oJn1H)oD>)+w;nu^fc+S=?yfh3kNq5 zZxHw7B){1<63z_~x=0P3ONOcnj?FM4YS!t_P{M&pd#?ag8sI_zF&K=)! zlDhKewc+9d^GfW)ha9OYh?+Q7TAi#$HJJ&Y7+ny1ZQin&5_dlpd1_q(O;TsVbI>!b zUdZ$4D4@Nig*P;h&3!!ny|R*oMBm#47roH}5#AWo&VEnCR$LtRC|$;o0+c3pNaNl} zf%q#iQf~AEk*OX$QuO-a+tXWjBZJ+;W%`=4P|DyF7C!t#$ctspSy9@DQs@Y*Qaa_< z?HWXkoQ>=aaASd#5ipr88)XC!pGqhD{_c)BMPppUrPc#jjp&RF>xZhT%|HByz@IuV zo+W9Uk)%q+W>Gx!Ex@3UK1&sLHwhvZCOzQ8Q`7mq4AH||X0<#G-?}-tgj3VtO zVZ9d^O_ZsjJHwPvLA}XqtpCD%Pr?p0Z5O+q{}ed>X>`HRqoGDr2LEh+B{zHZSA?YU z72SkN6(Vhw7z)8^a0mypHbT*nk&!ZcyF$v&MZ@RJnV6(bfeOUyB99v*DILG14xh<* z;>%~&a-{zly$pL^+!WSc!yx*a04s!Fadb@~E$N$Dw_5_Wg}Lny;5% zwP@;B(@Qx7ebk^h<~v*urof69i%b*!Qdr)W8Cq8GKOfauN;+K^B1M!^r}_$@ix>Mw znvzIj+S^bwo*+uOD6-&01;^;g*HY|k=oIfcq)VhRFth=i5@p&`BgcWIhVFZn!WD)5 zfR6mURLwdzS2c8fBQ7R|G+DG65hPy|?sE2DEZv5deSlv#9};VaV!uv~>Kg}Ub$sK* zhZc49C2Xc4PkD-Db*%I6;DpHx@Njz0B)h|+je$tQA&bCc$$n0&dt4h2dxkD7?xz&y zB#FPj%mUV(3&y|FfoLUaC`fWO1Y0MZ|4O^`9Cj!EPuX{BL)-zR{7nePe}Bh(|&ptlg{1PS10zXO4 z#oQZ(utG3>)ztOXaM4KeT~pMm`RTPzofXg6ec16(IdDNb`z>Jg`T05_0ntXm-xq9u zZ;ohL+Vt1dv8j8=N3Su+)vNnGeV3N&t{?k{y}=zq2T@A|TUDy>F|?lT{%}W{1Ce9` z=|2)$O%y!qesdAI!$KOl!qqHXHwP2Bg1^I{B8`^gTF~VDN9ur<73#Hm7v2l6{rX?2CP@V~WRLFk|h= z8t)GUb352|J)lXMstv7E=uD0Pr>G=BQjgej#J?e*lFdx?P^z_u%&ok#* z>3^`s&5J>9?+Z77eSn>k>_5$m4mzTBEV!r9udj3hk zwQHv|mJx0J2m+!h{uns|Nq#Lc>n4gGk);l01O|LYwscoOKo0_ou-}O1_LG&lQJ=q* zl_|-}s!O?K)TGq^kWZG|+}GBWk>H2d3bk-$LJMy0CxNkC&qG2^JVh2@ zQRLseyO`%R_+BcLk9m#eclun5)AtvDM7RO7)6*bz8D)Wt?J#Yy^U-`1%EbT^=PJhQ|je@p{YLz=lm~=jgb{k;U9bKPg z>7&Z(V?x$`xtK2ZirHzyTrOh28UGUafs08i^>=(cZ^hDh5={}7x>e=*r?);k1fHh= ziWAZC^~Bv~9SY&gIBZOk0s9E4LiFwkHXbuIG9u9RRp|~&hLhn~Vp^9p5h|B0x4^G$<$jbM3 zc<5=Mp8dsxU6h*x-sce}l~;}8om0H@8=pl0jqtSQ*bpl`JpYl2nhsJ;M#4^xU0Mii zqv_|-l<8IXygqMF8g)!O`3&9m032Ate*{C~4e}#^fA#}+jfBb*$P@U8=poOBGHZrD zvn*liE;aS7R(0u(P?1~V@8}6x?t!Tdd{YGc+SB2N!3UfvLs1iZqfScn%2t=SN->|= zI1;X!^PvZ-q>1C~8R;)^5jMp5ON zW;z!1sqS9wbWnO8STVOKOd}{<9dl6H900ap)5s~7u+K9;J3qwUb{m^s?gBHy6BDDe z{&Lu5AoZfJMQatus?}ET*q>kpz|I+_0l_@n-@BVqP0Ox~P070{kIvy=BHTfZgtIGq zGNQ`|0X$e2pHvCH0cLB)Ia6k|C^s8Cwh?!gEUfZ1W9idetktfEHD!y3dOM?_U}MYX zFbhF6IO0=Slbm^Dyi@7a5)g)~CXU#=t?0 zpG{3sO}q;!kx0~X_DDrI{u#Xw-j-KMs$s=dY+v-NI8g|IvOQ^qoHOds=lGXQ0XNjL zu|bXrho<_~+xMzVU13xT0>Dy5SfN*S)!5TgTf4&)k>q$AcP*`PaiGB199Q$i{i*S; z;v+&jZ2Mx_YQhhYM%V$o$MaU-q=Evm^R#Gt#U}@)BlvHnM+Q;*fpx_jwHomdGq3%< zx!on7>yN-qj73xvGCR9J7r0#dTWNUTmoJtOmo&u2CPE{8ao=|lLzAd;?{{8l#_sFg zSx9#U`B_yi)n+aVQ&1FZM#Dta5W?3ZhMzU7ZkmI~&oXj22h+M22TO?%fC`rLE0sW8 zDId|G7{)~1ZB?cVn2}+^>C@4+CJAl0vYWMdXLo4tWol@}O6uo@C4u2N!#r2*^XPg$ zt8a?qYyR4ym4)=PqBD>FNP=Rcciz1wGE%y7god2k# z?yMB|{Mu}Gjm;S-6r60a!~tMV91R29k%5t|t+giY^|_)iZh#AGVhU!6m(;1t+k|KqPRKq2UD>ej9IOlZ9%2a^#>PC`x1a{fa# zsWrLeUCbvh9xn3k&grgnm_8@SQo)8H2tp6&EeeS$Q0|k1EJ;bZ++!Q%+DDFx@*tqS z=fS|b;{#Q(ehn7(FKT%zxv9g6N})R3HQawc=d);86CI%c$1I>VJ3dg=R)z$r1mlX8 zwMo{Es&SA~NX;&1>wV7DstwimTVO&@1N3V5nxXTwoe=(;>S5~Ulf|C+N?$<9ao@6Z zuKknMIjg1tAYRS`cr4{7Aw*VqZ~c)4fYNJ5qG&K`m%n;1yOpqf|h3jYo_r z_u9)zt=L=|mEHDc4QBM@d%OpLai@r@Y5;W_VC`4rX?0UnPYV%sXepK&jNG4yc^6o` z3);0I(*LUvtsP_fHk8_1!>c!;6PIxuF9wVL4)4hOu8|XK_D@(~y77P+J0YHj&uV)q z`*fPhtlPIcCQ#sb4Nvb*WmS^b8G#+t0*HVH^mVTnjqW)!;{D}AkVuNJY~Sb~eM6>* z5pr|qn>2$4yi5DweB%R%(0RJc&g!wJO$fwgh~m#`)z-54E#HFwi^;`}yrTfTm^|W- z??F7Tt<6^t3)Y(-p=M{b)?O>E+mM#}GLUrnZLK`arbkT}kUG|*NSDeN>{C*8no*fl z*wbsLs(gOej6@<;ed~DIG~lF2-c=(Jn*Pm@q@mC=B>=|j7`=m=_kClTMfOV2g;C|d zRqI0n>uQ49TzCz@qs@Ga^6YB{RXMP?f~W#jO0d6Y!s*8$N;>xhhL7OZom8a2 zW(NHK9CpZY*voNGFL&?Y3ep+bv}M_0d<&8-p62F6z9B$lRB12s$to=cYm@h!izAgK z7{NsV&%m~nrWn!Q^UaOMYP-Mxn@O<3=Hi=3qX;KJO3=*n*wTHhi&kB{fxueSDF74l zw>0+z@bH23ZymIKKnSq0skzRb`g9cvH_xsv!#_ugD}+=mp9?cFEuDoD|BZuLnB*gnS4lO3>4t>PANjoJ@2Q2A9 zp4%u7(AeK5?6q2=dainY_tPVk1jhD{Sa(>sV1F8CedTe=j2WA0-lOdWf7fQAbNZ50 z026vlx(VLV{(aIVHr!re)>8N2&}LD}U>id-KXUtuvaR1Cp#)%CZRN}8Z6}IfXW>$L zHdXPihbEtiE}z-TLy+L^$(e(dY7um&7pHbn-BT~qi#4jEnSs1V z12b+tk8KNyQakfnhWg=wm8CPQDNnXV2ai!_8b>Jt3Wvq18_yZ?U!>59zorZLT+4uadUNkb_4b}Z1Lh6 z_R4n$V(AvYgh?Oa zz)N8oY`=@4t2uY7oo?}kw)N%v?@84T>0F;avh#i*E=iyC5^9{`#d&@F5_eZ?nm8*#X(p`86+xF5;>Cr^&+yHKa z`_JRU_ES%^)Yf27bP8?yP!&F|l3l4p0&j0`1Sr_z^2R@o=Y98_`m*{}_cfo@eef{% z72G-tyIYw&Zk|0=u7JoffxrsU7= zZT_`Dbn960awP!va4~ueYwdkpIMU}AwFm{u_-_`|w&u9^4OxO<2Yc4KEbwZqTO-qI zOal>gAUQS+R>;Ec7)b8AExB!w$<`lJ-k~^Og3>#9{ao91aB$!tUXvin#QYsbtiM>% z@EugtVyTNPsnsDYuj@#__ckNgN;(`q+6G!Ep5)RE5i+lXz^G15t75dlae47oo5Jhi zVQma+Rji7$#35!h3!u`4uSn2nIp1H{R(UDW`lIj{+dBj`nUPQ}c`p-&MCzkyrL=ymxRMAJo;#Qw{ZM5ONfasrN z#@ySw)W@Io%aC9AnHKpNax9r-IL88c-8qtVy+f}7O3v(iG~KqZn)A=$=iC9;0o}ak zD@2D`5x^|{^~dDO)xkHdDful>vvz!BeiXWOv?Og`y6|RP7%}&e2_yEGUiyI}H{)L? zXoSZ+g7Pg5#0Lc3sdF)~{ciA*XlcW94D%|uQ(Dr@E<~niZatsO>kmfNBtM=fe};wG zqcWX?5gWYpKq{{}M#z^am|=uF=SwEKqlzEO)J5(0g=f!-5r17gykcD7BnOl%+7BzC zDPJF~fd}ABT~}Qd$+tQx1E&wNQphR(<1>$ecVL5N zi0_u6FGo40xAK>2G^RBO^f?DhAb-y1&h@YTp(e?!pfsy08gj4U+8n34g5AF02U~EG zV!L&9G@k(<$HZqg_c881Kvz%F*GQh0kg7@I_u@pheToLHb4#qG+UwNk`5#O{rdJmM z>@V?O;LuUIv>4!89_H_)fOW9UaPh87?YPq~KWIZC)Ah=c3hwG1b4n&%R`FyV`~ABp zqMCLz`Uo?$e`NLtIE!TR@{=y44judch2uD zx-Z*qt?s*TpmoXo*z{NKJk?cd#av?Ug2`1uhP6szf0c287m_s)*RU{S5L4y9g?QIx z3`j?n=;5d*B_vE2CHn;^*{ILV;FtmjBsnp0W?)m470I0g2;GB+17&yAJA9=4>Nn0k zSyBIfj1up^+|(U&X@4hl*PaJ$d;#2ujGQ;NyQWW9&cDhKI`$Jrb*oHQM=m2teFk#= zP8LkLJosy(Ojbrl%^yg69+~F%Nr;6k$*;}0nIwlNml6S`TevHfn~R2O9=BhGozw<5 zg5vl51O1r2%A_5il&b95%q&Bh{_W36sRGSm0TD99J(Y`AdT{ekMl?|%AjSro^APKx zI}s+{Bps!&(PuRoqbMn9cENt3XsuEQEZpe==S4C(8r1#tZ<`x-=7B7%y_LL&0^znGK2{qt2dh{dlzy`x>J*+An-sK6#hAP)`)csG876# zJC5z2n?XgQMvz|hts0^}1ScUpYoaUn<-Ou{;aJHMz%?Q)>LnORAwefAZw!63Z6a9+ zBDjrk=ZC%pTSTZ~()6KlJ)D~NY@1?cRaHnNZU3(K66Grl9|rT|LR+Vh&5HzkYoM^> z>cPZCfixyZc~PyHW_oE2n9aG}xd%z!N&$5Nt9?vJ^5t>zdgQ2L>y<5S+DN{2g*G>O zbh#{ev!(H=dr0Pex}}QQ!W#I^0*_gNbSM5hw+pw#aBG+2(3Z<;`n;P60EJ5+9*T^B zEM1ccZEdprjHl{|1!bo+2$f}TyDpdMaOjGQ2_uyGJRhJnFRsahKFQyYY3Nu`4RO?) zU%8HRe;4RTX|31QTBeoJQe*a3n@Bwf#Q4klr*a&;`DcoMR9}9^s0s9A!~9tlJop}4 zCvo{r6}l9;g01gpRf@^oyZ=Dj5Het9iV@O}fVTj{SB24_HfmWYXwr7gv5hR_Pbkqa z-1IK9cX-K9lA6fHkOUL2uDd=}+bvhpAP+KlHP zfncM(yu4C?F(GwyCcCuXy7w_*u!TG+0OHdn5T7K$_XAeiUP#pFR`@!~AsO$R;VfuH zEcEHC<6cjO0appMTo2F>YL1c5@SC=sSE$Q_g%dvwky%@5o3gkoDX$^uhH5@{3x`dQ z9%eWb6cIGTi#+PX#_}A%?h4*>I*)Ch{?=cu9q5+X^$z}bBUMgi}*h-MQrqb7ZU_K0L;P7CF0e@PdsA-3( zNq5wxWP9s{mjgrzkC#Sni-NiI{7b+iS)jkL{7r2Vw*lg2i2ruOoZ`diiHUn!U)jL< zw;d*rAMd_EvA&gdZUfmiIIxH+d0rjjuevQ8C-o$5ll4x?N>};AHm=ZiYuV~!)Lj6s zk-#05)}lwAS)M|K@~{}d*JUIAag1CJ{S74ogC+x^`o^bk7_=NRNNWcX`ZFd?TmSq#keJ<+J} z(G%NuUhI7M!)}EglYzOlBq|&&l1ny=0NN0|Q>I#woyRVU7W+@ce&96MA@Gx|=~04a-CmBqY<>ux%M^_X zl@6<8_tpKtV&vXNx)$s@Gu^KgcFlIK79)j$F^)vYQq54t2o{tpbRbGM>8zbaB&y;@ zbOERaHETs3Q}d;*sLaQRtThFffOZ@o84bAM-lf>QMI>G=Tx~|~cKZQ)>>*Ps$JI@R z!Ff>NC2$@Vf8OKJ;}OAFeN6OMko{~_scBUgKcA&0H*WvcsFOmHe6CDfO(*7D229LWs$yI<1CBw; zIx;nE^>#xHn{|qrba(c&E8Unq^t=35FG=kOHX*8{hc==Oj)?*al!x$cb`0{EPzjxU zbqn6JbMjeodul%wCk(PUv> zES?UkE+qxtd<rqCW`WWc7N>eHQNn~H#f0AVI_Qc;Vq!Q;=tPAipo?X#$3uz zDBB$@U$&NyzvHpAYYWQSxDOdy>uF~tXj91}ZxO#gJ*&kbWDA$3wYcy|sBGJ?p>tzO zlfF{_?t1`R7>=(%z>Yh?U+{DyVWv6(qYh^bD_neB`TBRHR6tJ$`cF{^bH@N%^*@~t zVfgX!%g>BGryQrR&85bxQEoPDo7T+@>E&%0o_rEB93#TASLVq+#*tuO^?OVsZl&kc zxPcL?OeKFmGrU}EP4I=wXt^t;9VHrF%KNZelnT!0r1;2TmFQ3Zm_H;abi&2J=4IH& z_0_}!aE{%|0mke&0FNvaz_MI0e(&S{ujPC-u067l=bjW~YdPz52XegQjSOuz^rEP0 z4RB?9BAB4F>+IRAc(l8141pLJKLnTx>_mMp)}3%VW_7nHGAbV&r(J($1`hY0KTMET zJ-qEZF(hdzkP;g!IGYo6paeb>lAmpJrerH%&45)8TlL!`N0ct2bBEY-oW*?b+ol=d z-~o;jH}H7WJ<+Qz=*CW(V9mZ!{HP}|7ThMQFhGIRTBKHyA zHwS9^U?g^KG`p`LpB>PyS|tsJ&7J8%}L8wtKmCr^M0!QfK<^95;u&(-jCt+#Dspq8B~fT`f9u52qfz5zCV!j41W5}-Qu^p^s^(uSncyV@0YZ3z=`)$@5@V^NZz zTu$$O(&9#ZN)FmA#lnLACLBn_o38u{F>C;M-b!6Z%;XQwE2Bp5MyERp|#d_Op>U=g~ZPS~p=O40u8nYdSO>Pu{N09%OgIB6Cx$uL8X9#Hm3k)EmN!RH6P{&o;iWKAOtWk_}fifwvEgmsq&nul^i@%@#&M# zO4aU?|8+o#`V4=R_gds7Z1(goJE@FNHott*xhTJxyiPDvC9l0Y#cDHf;K~J!+3cwj zw(AdGZWalOWZ6PB;5mSm)7Vc9xG{*MjRhmv?;^EBw#u(+;@zM6&hB)pR{Y>bC+x9f zxawyFcIszbkfUN#L(a$1yr%<#<+s>gE=67w1K+M{H%dkqR{yGka##2>>7VH4b~~F_AyOsZUhX^|}2Cw5^`xRxy5v z3~G6p{SUtkTPDDk9H^+UlfkG4rA+GGPtRG?a}}`{ANQHA2&j&{(EV6gaN45ex(WCO zh7{>MBUqskAXVSK-0R`w$wy8#1vPgsD;QKBtz9vOVb4J=S>XnIS8IXx-@bxaUi?bs z=No(eLm=k-NfG!H0iX7dE**Q4Eb^AW5r}_<4Ku`AKvC*}2_FF=H7XIDr+y|&#>s=c z8XU7kf~=(yY}Q3af=Z2?9P^|k1D-AHegmjif%b~ayOlaumDvd@ji5t=EhxQF$sF+2 z1+d2#k8>mwx+cyqk|K@;W#^KrR`~}xcHJwEPnlK;7^PaJGN+Or*azzhnh!kx^$Fri zI1=#dNyJmpyW2I|)w3O&za#B{np*FXKX=8jFrczx%M(|IkKNS&6CpLrv8sncJe}GN z%5-Sy&F)1UqKW>DPs+(ouu;I+cFzwPi}kf^jv%Vf6oIo^J))l5x7cZcdAJXoOF?p` z8>HXg`6cq>2+oR8#RHh-Alv)9HAuqW#QmnsQ5>d3NqF>` z%3GXWugz$M0yTZmqMvW2{792~@$%A4^LA><{VQ%- z!Cg0kyWGF7%%E>DDPF`J0bhI`c^n;t6j|Wpr$a`eq0TlwiN5aqf29qSV*3xL_hg$qMKFCf?TH+(54| z41E6!zc60ty8#IHa}3^tf<(TJ!J}dxSP^5u2N7K+#!NqX`8wRLGlC(@ zj6rRnO)haew0b;T^l7@OvOUY92-9Mvs2K-7@;AedWg#H_c{G8$m#t=sqp-#v6j~?= zs$Q}CAnxr_nQt*10^}I|7OpvV(z{rsicejLHxe()UfPPC*eL$i^Xe?6g#CB^A3!7@ zLz2swST-A`>hPc+z$!>f%(rcs8|ofp178NMigWN$oc7;O)y=9N^)Ua#Wm5nd*S97` z;WBA}pM;sHGL{^{>r9S5@ulVA+?Q-c$JxPmZd6q6E%+w9I@R zh_cU=-e6#>95o4RawLJg(l3af<2WsI> z9+6ZrY0sZ8A7oG+Tzt>$=^39v7w|}NL=UaE<5h-dw1B7BRmHp{c&_xTdML>+f?Y2Lx9%u5woppj^TV} zbTJoBB5AA7D8ijC8HPwBYkK|%P1haPRQ9xQ5(q66kzN-SRJ!!esw;@J6&8rJ1dyV% z2+|=0P+SY3(u<&ipwgmJrR0JFA}Ad~4}`Gu;vYj4!==Y4m94(bdhZm->>8P&s}RRecX zF}`Y05u#j_?>gnNP4@}Fr*F@$4qqyAsKeJVat?wj!qFa=MQi#XL8^Ui_urdo`_=mm z`vFzr##$1*eu+DpnR;@8( zmv|<(m2?cIcSVR`E)0hl*o!Q8P%->==Z&Qam6KHOc8ccB?&3?$?5HxeHOSE6(RYm< zb!NwnB%{Z?GT*9QK_8DZ*CaODbjt!I5r>NdtJa(Xx9XIR0g2O6#O}M@v8a-uqt@q8 zhzZLE)aKYztth3>yV^~^W(&S6z@PIh|?V}hVF`xHF*@T zJyCH9RmJn)e~DY)L@xsZw?uJJiqb(LND*Ufx?4k_Efss$c1uZv3!3^=>n6&|xJA$^ z-6a3jgBvNhQ%DClta8sY*v1XsG!@*nA$*>Oy~tBr zwoy+ktoXSN3_Y+nR5W=Y(lzxBIso!rgBQFuIZJNwiG8K4KD8*du&2V0EEI z?n0QB&*5UQ8NQ0E%lE=(H?wb`qLkbOe1eRfgZ(Mjd=ee_6d+C&X_$FRjqu> zT}IdG7>p8%VfLk-d}4-SEj{qSojNA5xh1a1|x!6pFYUCS8li*iWaBj>=sLv10+?f;kS|Q?{xnrQ^ zv}b6@A4k#dnI@CKN2#=92;<-UnmV;`?K-35!-MUEZc9u=evTLF!st_RQI?mUio-h$ z+1gnN10~TA!)oB&-taoLlE2}Ya!E`R3^~zv^Q&h6#P2oqHrX2w4loa^VwhJ2{g~$X0kA359s!TFNMU^m=cNX zBWHm`6Pi(6#I^}k2OL*@3y8I1MLA3S`73S#a*v`X&FnuYFD#astA<%aGAoJIaO1CV zx`=&sw>$A1M8t-A$z=oW(jC?-lAp?Y{(32ECN85&hhVHi@$-DBn*>=tRu}M@-LqRP zB~iCTxldwjcx~M%@5^Wg+-f*C^Ntrm5IX~k4@!gqrI<8H#^C&J!e^V4ikV+@;YTd_ zW{7Gn0?&TOGm>Ne0vdlBI#cu3KRNpPkk^T+X-pr?XPpP#5L4<-EVxrHIlt16`6TN# z4rojxu`bh?;%(96D>hve5d@=u)=wMS*TVcz49>w!?A+6Y+)4KR$%!^76aqpBhjUDc z51_151RdX0WGfS;lkJp$zjNWA>~~Gmm^#?fZG@-?jx}EQ`b{Bd)TpL75Lj}gwVr_X zSOg#o~381cvM6jLH832K=rqHkvES zU9OG3ZH*tee>-HzP{%eY`Wu{BXw&^e;KD-pd__@Pao<7+TB35hM(eG0JS(StdMh zs6Bbo(iNZyWHV!rUBm`*`l!Z@hx;L__&|6oNoUJDa?QKiA|fR1`w3)3*K)gG1E&yr zlZQ-}^-_h2y`I#3+PKpCpOlQ7WW74#K@DMa*HPgc5|l#plUF@|-5kxOjgtZp^0ksQY^VpM+=y1o62PaRI6E1&iQa$#@gQU*Qf6YSSxi zNNHtZ8g})w5$I-6PAS5=3A}I*Gy+P34n<#1-bk2T|9bSViBf>^Di3<@g4b!G|L9+3 zsqKc4_qr@&mwn4>F|QJi{>h{DfV0H9*+%z*Xagr&mryFfuzxd|@n<=kP@3}ETmngX z7~}$oIe1Ua$n?>uqdD_nD2=b;j`=pu)1iitON{*_Tra!duW4eM2TA>^d6HwQgdV+8 z925{DD#k(WzlEm}2vA6C)>j#M@Ca$@hV`-4B`pnXt5 zH6^-A2S=(o+Q2?CAw_i3L^$|U0A!u*kt>W|-}F_XLWWiY#Xy++7f?n8EgkRwFF;YW zMUeZ~%h9yflTqrXT3^7gnuuaaxVJsCFFOGmnFvg7lorcc(h>Eg4+SA{&F^%~E_;m1~b7IUri6`!tOA2AJGdA5^FyhpD zx!bm=!pgvzsXr0rH|TFOFJhM=aBGM(2|E-mm@G&Q(ZoNsi#VFZR)>?@i=QVL^0sF| zl`qlI1balCtxTT%lZr@1)BLl3Z6psE`jCeliO_xAbUrK(RdSQRA{=ml21#;Sx`G!q z!xxIvAbyx_jqs6jngPa+42TWP*}uAFRKBSLy>k2DD8UWO>T_MHV)-a#7}9Ka$GkGD zc_XYO%qJOv8818zX89vDf>@XSKsbEHW=atUAPd{{yh>HiY%nkC_b;%LXbszdAt&G<7eqmU z_7}}A$ItK}ihnb6wu1uNdsEmnomx%VT8!M^xXHovEIO!jIH2uqjJXSOpEo$<3rdw3 z1XQ^liWXCsPyL}Pyrf(F;vyCS(4m|H;&>PP(VSA=Z_poltc_Uw1!(0$tgW)&c;vrc zM#~Xvb_NpxrOA~7=)baC=8OKuM06#DEJ7ENWhJc6P~@r)O{Xpd-Ny* z{S}PfnJ@F;uecA`q8U(WgVXWwF!EEigNEfy5M^vR-b0Mg?8_<~EeX9H5{2q3#LS z?0sCfw>{4R$C39mvFn?QoQ?CiYaz}9_gMi4yeLk-G}Ja9GCV7>r#JJ zBzC*_xdJ3qPpt9fnhg)EQ}Oe=0D5(ANRif>8sRQoG6*sjd&d6)M1>iO7W+DNJstH= zk3$IO`zQfQad4_c1!UQE-2Q`~z0zlQCp*h}em-BJ8W#by5ms!GuohHr{m7#e$zKt7 zgbaqxQ4=(Fe?7)+o9Kp)hsptB8uZd0|F1)vqV=PN*I1m}p;yqA0J$*C3Vy6hpR;2i z4hNpkabV+T9$7sr=l$OP&gE%L0^kP~OXE3n3cElfp~&QCNLw_sug(!p02xA=$XG`V9VV6lk%h zU0=(?NGm;SDeJlJU|2X|^$N2IQSo`8DUec6;rdwA}Zm8{0K@Q|t5F#|&A$)oD_Oo#Q?G__D4u{xt(y+NS!4L{b zJL~@ZQLA+s&&vLV8XRN;G$bqEbslp4-R|$_h@X$zY3(!2XAcC_U5C8h%h)ZhL(#WS z*6Rhwi%X)AX)M~_`WgLg{Ehz?C`S5%P&^4Z^v=VVW>SOs(jYLRmwB&DG9L!YwvwJw zpN-F}J6A(*VysGd_JQ4g$QErO`8(xaK&FW@+gZkSa9Gg~Rl@c+mqg6r5!AOU>LHAH z2)A>9C*naFVR8>jqZA4PMv%F{v4Ie2Ub8VkF-mvji7nDph#a9xR0KK_qY+yN_Mei5 z7al;%X@Nut5G!!JSXMo14nA#~VTQ7g-6ZHXyw$s@PCyk13OtH^rZna9;3D=Gpy5vY z0L}g$AJPlCZAKOL;Q^mgol-X3kx-HWsp(`CQLK?&Mu)z*c`mRTzJTTRdo?ye1omzXY+^eVgt<82Qe+f6AgAAz<6xvAGFlFmj{d z$$B}4ltkMObAAmyK^qt0+Zc=7Tf6h3kiC+4>@#B2&($0jr@ZePRv-B;`!?y?hunmZ zmJ{Q%TyM6!?194{EOgaBc)_c_Sh;gz`+clp@Q$)r4Q{aPZaFpjf|we;(w4MhE*hEI zmHle6AxgnaGY-KyR@@O19bqC2ex*jenR*HJxx&(=poEYUN@_+41Ace;`7dJIM6@C= z-Byq5Aeo)Tm!Hp5jGnGU0mVM+HVD~mZ#IIuNX-cf4;C9C?4x);D6;#Q%EhDNOCeB` z?FBfz#?az03}IZu`U9^m`Wxv_LWw@u)Wy7uTL&I-hmQ)Q!lI!QQH0Wuoa8h}HmDc{ zG^_7}7}8ZYO7~HSDN2(rkBo83Pc68)#v0?d1+O{bbyzF`x(&e4Z9IDdZh(LrR!+$0 z+5qP2feRGDpemd>66ZK?$4y{H4>9pCx~}Cl^x7mIRg}t`-Z!NuQaB$T>0WTFFIe?E zF8h4H;8n+YL`r-Bg|xzysI=x@FF<~XVdc*u!Fa$zOp_v_2+OKC&bV(WxNk#R45x?l zi{;ZG>qYDUU^@XHft>F`A*K?jGO5oxSMn5^TrlXpQ6NIYcT+k{(#@tzA#KNX>a&^5 z8=${CF)Lu@N?tp#mJS{1s0&IFleWtb;mscA7!IydI}IYKeY@oLR@ zUMu7tRmuG^P%kX$@$+)cRl${&F-;#|2m=Ak!^B&Wo65+GmS3hqu-L=|hS?b>yg z!f@aZPZHi!9iORr7J>>;hX<&?DnzhB#c(RzfoeLRjGJI6gUVAAAqf)t;UyOy3X)by zmu={n;N`)SBQUW-%-wZp^`@u_F^2QqZ6UN~oUs-^7?2m%Z6~hAlm)__}E<}Zf?j8vv&n7%ywugMZocz0sSeU3Q8&qWd zZS);hUk!ZM$mleqdm7$@ALtMJ$rDW8*2Pmj+*nT`GV#tgravZp!Ew?lHPQlSHeYsaPniwU*w^AeeDRVduq^t#>t^V zW+;DwW7VfIp1yfJ{zE4 z0%8ppv301Dtfr#I%g$6(olzSHp~E3b69KxlAjp3q96GRUs3c`k@MQlByQhsdRQ+L( z0!ERm=RMSd6!GIIVFos4jv$Du(bcb!z5RA7MjYfiOK>_v2_Kbj@sC8BuN_R-$ zf4=J zj!R+_|0S-ip0TQ#9_kl%;Ur;(Gv~=n*m}c*W^sOL_tZLl-BvJerSuD}zm7SbaYpCw zC!}W8s23&@Wmk@YRt%FplHU5lTg%G5*SnIkXE*7jK*Mdbi1Ue!xfNGue2woO`sDoT zHT7VX=fDnqtFFN~%@5b~1kOL+HPyQP<-@J~i1i;Eb?^TH(7}fe2H^z<4I%oX(XX|& zBSPv(d!5_OAJQI0zuJxnUrH$3oxJ5g!n1WvVZS1BLf)M!3uwKJur$0~y%<+Lo~;?m zB^be&?&aN`v8nm5fA_c*4OB6H-c z%$bSImWaeID077xg383hBQk5clDYPt-zSS3(JUYp$Qk)K4hi{Z@MD8pKkmp>LiTiV z3RC?0_1^v*M#j9+c>Bkku6rw~36R*rUYfY_DuKum67Cn~s88^wvnVxU5EQ}5-C9k` zEo1d9&OOTs4u1dEXX*@>o}?_4@`lxYpAj{!PCJ9?M#3g z6MOxF?ZvZdNHFWStag@lPkfx6z zwpmvXC*?uC|0(+URKTLH_5^8`eL|IbwGx?2w+Bx%vhLtdTX3JNU3zlx<{9u^Nb>wb zOxs3K?jzk3zp9~$+jv^OO)9i@c`1CO{XwslI#i{b)7}OYqu212jHQEz&29B7(s_fC zDfg?3`~COFhSmSd(baV%&2Wz|3I-H({qns#Cpr+BqUn5}*uUS(`X{H}STTvd**bw= zi5G-ZtV5Elw`Wq)a&p)I-6Fk7YH~qNj8-Dj$05Yv#sx-9^FmlMR>NIR9&wSPr9%91 zhCKQ-<-Mhd8EM)I5IY7!BZb}NlaLkWsqITl#?HmW#p@k@aWiBbno{^ZK5MVd_qZV# zyQXRK964KDVrr+>j@!CnC-*ergrYg56N{wYY}oq6t~;K^D+diTY+YNLau4wAD#T#G zbiNvAd})en8`wd8ET1KPW7yBw&u2-0YcYPcE&8JsTwj>Kr>~@_(FP)6Ip-$oBu1lC zQo@EjEOS=cYsNL3cFeLJo{&z=PoAZ|8v!+wYOQV@qt7kt*m1|avO8awmwkLo^WnvN zW95ps^_5#fxN-YV*UGfJB6gP8)S#AA#J1@CN1Mr-_maCxp^AC9dyAFKUy%m-g|qQD zcb{6?z{#Y7;lRDe6?leW#ICTDP3BHg^aO2^Cg5)*bxJDc)SVM|M6iG5BQ)MB6Udie zTiwA*{`2{r)QRV;?5s?mV_##3ggJC{5}BFX6qDkZaU~1Sev&NOwGWm)bTq6+4K

  • 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 T%q7;#00000NkvXXu0mjfwZIMX diff --git a/community/images/bitrise-logo.png b/community/images/bitrise-logo.png index 27037ce6246a5d23fcecc491e25e6c5946324b04..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 60749 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 CKfJ^M diff --git a/community/images/develocity.png b/community/images/develocity.png index eb3eb65a782b28f5a0a3ba741ef7f1ec25fc2e0f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 34514 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

    !0z`nHMcL?VGhap0*n z4hI^AQp)V?fd_`9t2&(1xCR5zwoE-`d3@O5r2@28hF`3rLS`uSTwax)c=IGPFIG53 zGImIM|4_pgIRfTj?rs)l^!nG!o7_JmY<(|~r&{H+>m)YwINIMQZ1e0WxR2^=yoMpb z1Jl2l-wjMMg)FyPevef0i&INWxcgeEL^;}u58)arrO5usdnYJ4)I*m--2{u26Nr&= z-V$PsN)}5oD#;4uJQZ>ih771LFdKU`vQ#doAaVU`$NQlqW&d>Vn3jz}15&co)T=G) zo4tp;KM!Bulox8`|2Ay)ZO?R)RaLFs!f*YaM^d+@K$QFfI%C;OaO$s zVt`Z_iCVV*-GMa)DpHa0e*uUCcl?oJ)Tw zl09LW09PHnS-A_>{P7Ao1Vrk+L#T%vm86u`A>;v=D+99HiKh?+om6=Q&6^6NTqK5s z9;@e6QLb=E&SA|?sGCKyIgxb=FI8NATA5lBh1Dtu7H&mMya8`f+JUsQfLbySc)Jt1 zb?4jv_ldJ`$;s+9C!CLuvX#iUJW;RjV=Y14v&hl~=pR^{J2u-}`M zhT)eqATStC6!!gLSXPJ~ETHS}u04$E)>t5870w3X_u6hE7^*=at?r$z8!6Y-ouYl3d>+H7z|B7I0gKTfAyeukg5>Y z2`nLm4p%wVHmW3tXv*~UnTr5$9z=&sBV<$qVK#|;%i{>X~hgQ&3c>6E+janNrZtl=(5`qJVNyDFdvo&KaB#C|!K{nKEx5I#ND{Iiv_>cGx94nj8N zdAR2N`Cge970wwUR6N_?1;Zf-g)&^XiWNukMMxFkp0<4q16k$o`yV_1>Ith|JO1Yd zD?Q(yJgMb>XQuWP+S1d0$HWST7~7JxsSCTNvN|$a-1|)pdA11GOB3vTEI7LU9Cs&= zJ{ZCR*s@QB!0P_*?{{IvUGZNSSV0x@t;72`vZ|Gc&;;JTxD5I(klXXK?}6(K;X<`%WYx)``+wfQ zRAJ}E+CX>6IoCE(whbA62zdU`tlaqLs+hmF4nNsgdvdYe7Q+r}gMJ&F-=<2o#}(5Z zy1i9u@2=dZJWp7kONzeTzqo1^RKcgV`dwUEdEFnR=i-2A*MB$>4*2@d=h9U)eDouK z{oe3$dzEAej-52lrA!Nh!C)|)4t!_#LN^gwk<@A+A#j*T!p@$N3Wh^)Xj}5#gKjyI ti|t4d-mmz-N8vYvsbdWWgJDMa{{fkkKv;)-C@BB{002ovPDHLkV1kB-4OjpG diff --git a/community/images/dropbox.png b/community/images/dropbox.png index 125476a6645975cf51a55bf54ef1eb6e2ea6b3ac..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 60749 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


    hB&$4^c18P`S<5VG-tM&=6YFc3YQE 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 o$%#Zddbo7SoC~(^*t8`o?f<{vZHLu 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 LNkvXXu0mjfEDHRY diff --git a/community/images/flare-logo.png b/community/images/flare-logo.png index 84cb0e5b880224a14f4055c34aa3d89f006aab96..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 13008 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 Hu0mjf7NQtr diff --git a/community/images/oasis-logo.png b/community/images/oasis-logo.png index 846a9cd56cafb18f3648df217205552d9d50edfd..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 31110 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 CNR*ZU diff --git a/community/images/sumglobal-logo.png b/community/images/sumglobal-logo.png index 6736328dc0ef460528e69d1b33921a5b94afa339..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 12207 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 diff --git a/community/images/tweag-logo.png b/community/images/tweag-logo.png index 20210ed751b1542b9439010951a2dbe532fa2ba1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 35747 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 diff --git a/community/images/typedb.png b/community/images/typedb.png index 48ce1056b84d8a583ecf7d636ff811f58da03d88..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 37407 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 - -JetBrains is a leading provider of IDEs and developer tools. Since 2022, we’ve been active in the Bazel community, delivering robust polyglot support through plugins for CLion, GoLand, PyCharm, and IntelliJ IDEA. These plugins provide deep Bazel integration for large projects, enabling editing, navigation, testing, and debugging across multiple languages, including C++, Go, Python, Java, Kotlin, Scala, as well as Starlark and other configuration files. + +Tweag is one of Bazel's earliest adopters, an active contributor of new features and new open source extensions since early 2018. We have been helping companies and teams achieve near byte-for-byte reproducibility, fully traceable all the way to production and conveniently auditable builds that can be cached correctly and run fast. Besides our consulting work, we also have an array of tools and extensions. Skyscope to visualize and explore complex Bazel build graphs with hundreds of thousands of nodes in your web browser. Open source Bazel extensions to achieve fully reproducible builds with the power of Nix, manage shell tools in a principled way, and build Haskell projects with Bazel. Finally, our open source Gazelle extensions to automate your Bazel migration and build maintenance. - -Tweag is one of Bazel's earliest adopters, an active contributor of new features and new open source extensions since early 2018. We have been helping companies and teams achieve near byte-for-byte reproducibility, fully traceable all the way to production and conveniently auditable builds that can be cached correctly and run fast. Besides our consulting work, we also have an array of tools and extensions. Skyscope to visualize and explore complex Bazel build graphs with hundreds of thousands of nodes in your web browser. Open source Bazel extensions to achieve fully reproducible builds with the power of Nix, manage shell tools in a principled way, and build Haskell projects with Bazel. Finally, our open source Gazelle extensions to automate your Bazel migration and build maintenance. - - NativeLink is the 100% free, open source, and permissively licensed build and test acceleration project written in Rust. It is created by a team of open source maintainers and the company is funded by Wellington Management, an asset manager with over one trillion dollars under management. Whether deployed on your infrastructure or on NativeLink’s cloud, our global Bazel, Reclient, and compiler experts provide 24x7 coverage, support small and large teams, and SSO included. - - - VirtusLab specializes in managing monorepos and migrating codebases to Bazel. We offer a smooth transition that enhances your software’s creation, testing, and release processes. Our engineers will assist you in adopting industry-standard tooling and practices, including top-tier security measures. We believe that a seamless Developer Experience requires great tooling. By partnering with us, you will optimize build times, reduce costs, and empower your development teams to reach their peak performance. + + + Based in San Francisco and Sydney, Buildkite is a fast-growing software delivery provider that offers the industry’s first and only Scale-Out Delivery Platform. Buildkite's Scale-Out Delivery platform is the only solution that provides the flexibility and scale required by the world's most demanding companies for delivering software across a broad range of use cases, including AI/ML workloads and mobile application development. Global innovation leaders including Airbnb, Block, Canva, Cruise, Culture Amp, Elastic, Lyft, PagerDuty, Pinterest, PlanetScale, Rippling, Shopify, Slack, Tinder, Twilio, Uber, and Wayfair have standardized on Buildkite for software delivery. Buildkite delivers seamless Bazel integration, enabling teams to scale CI/CD for complex monorepos. Buildkite sponsors CI for the Bazel project as part of its commitment to developers, driving faster builds and broader adoption. diff --git a/community/users.mdx b/community/users.mdx index c90fefb27..ce0df6454 100644 --- a/community/users.mdx +++ b/community/users.mdx @@ -51,7 +51,7 @@ ASML is an innovation leader in the semiconductor industry. We provide chipmaker with everything they need – hardware, software and services – to mass produce patterns on silicon through lithography. -### [Augment Code](https://augmentcode.com) +### [Augment Code](https://augmentcode.com){: .external} Augment Code is the first Developer AI for teams. Every Augment feature is context aware. Every suggestion, completion, and @@ -223,6 +223,11 @@ creating huge simulations inhabited by millions of complex entities. InteraXon is a thought-controlled computing firm that creates hardware and software platforms to convert brainwaves into digital signals. +## [JetBrains](https://www.jetbrains.com/) + + +JetBrains is a leading provider of IDEs and developer tools. Since 2022, we’ve been active in the Bazel community, delivering robust polyglot support through plugins for CLion, GoLang, PyCharm, and IntelliJ IDEA. We also use Bazel internally to build these products from our own large-scale monorepo. + ### [Jupiter](https://jupiter.co/) Jupiter is a company that provides delivery of groceries and household @@ -747,4 +752,4 @@ architecture. ### [ZhihuDailyPurify](https://github.com/izzyleung/ZhihuDailyPurify) ZhihuDailyPurify is a light weight version of Zhihu Daily, a Chinese -question-and-answer webs. +question-and-answer webs. \ No newline at end of file diff --git a/concepts/build-files.mdx b/concepts/build-files.mdx new file mode 100644 index 000000000..33087dc45 --- /dev/null +++ b/concepts/build-files.mdx @@ -0,0 +1,152 @@ +--- +title: 'BUILD files' +--- + + + +The previous sections described packages, targets and labels, and the +build dependency graph abstractly. This section describes the concrete syntax +used to define a package. + +By definition, every package contains a `BUILD` file, which is a short +program. + +Note: The `BUILD` file can be named either `BUILD` or `BUILD.bazel`. If both +files exist, `BUILD.bazel` takes precedence over `BUILD`. +For simplicity's sake, the documentation refers to these files simply as `BUILD` +files. + +`BUILD` files are evaluated using an imperative language, +[Starlark](https://github.com/bazelbuild/starlark/){: .external}. + +They are interpreted as a sequential list of statements. + +In general, order does matter: variables must be defined before they are +used, for example. However, most `BUILD` files consist only of declarations of +build rules, and the relative order of these statements is immaterial; all +that matters is _which_ rules were declared, and with what values, by the +time package evaluation completes. + +When a build rule function, such as `cc_library`, is executed, it creates a +new target in the graph. This target can later be referred using a label. + +In simple `BUILD` files, rule declarations can be re-ordered freely without +changing the behavior. + +To encourage a clean separation between code and data, `BUILD` files cannot +contain function definitions, `for` statements or `if` statements (but list +comprehensions and `if` expressions are allowed). Functions can be declared in +`.bzl` files instead. Additionally, `*args` and `**kwargs` arguments are not +allowed in `BUILD` files; instead list all the arguments explicitly. + +Crucially, programs in Starlark can't perform arbitrary I/O. This invariant +makes the interpretation of `BUILD` files hermetic — dependent only on a known +set of inputs, which is essential for ensuring that builds are reproducible. +For more details, see [Hermeticity](/basics/hermeticity). + +Because `BUILD` files need to be updated whenever the dependencies of the +underlying code change, they are typically maintained by multiple people on a +team. `BUILD` file authors should comment liberally to document the role +of each build target, whether or not it is intended for public use, and to +document the role of the package itself. + +## Loading an extension + +Bazel extensions are files ending in `.bzl`. Use the `load` statement to import +a symbol from an extension. + +``` +load("//foo/bar:file.bzl", "some_library") +``` + +This code loads the file `foo/bar/file.bzl` and adds the `some_library` symbol +to the environment. This can be used to load new rules, functions, or constants +(for example, a string or a list). Multiple symbols can be imported by using +additional arguments to the call to `load`. Arguments must be string literals +(no variable) and `load` statements must appear at top-level — they cannot be +in a function body. + +The first argument of `load` is a [label](/concepts/labels) identifying a +`.bzl` file. If it's a relative label, it is resolved with respect to the +package (not directory) containing the current `bzl` file. Relative labels in +`load` statements should use a leading `:`. + +`load` also supports aliases, therefore, you can assign different names to the +imported symbols. + +``` +load("//foo/bar:file.bzl", library_alias = "some_library") +``` + +You can define multiple aliases within one `load` statement. Moreover, the +argument list can contain both aliases and regular symbol names. The following +example is perfectly legal (please note when to use quotation marks). + +``` +load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule") +``` + +In a `.bzl` file, symbols starting with `_` are not exported and cannot be +loaded from another file. + +You can use [load visibility](/concepts/visibility#load-visibility) to restrict +who may load a `.bzl` file. + +## Types of build rules + +The majority of build rules come in families, grouped together by +language. For example, `cc_binary`, `cc_library` +and `cc_test` are the build rules for C++ binaries, +libraries, and tests, respectively. Other languages use the same +naming scheme, with a different prefix, such as `java_*` for +Java. Some of these functions are documented in the +[Build Encyclopedia](/reference/be/overview), but it is possible +for anyone to create new rules. + +* `*_binary` rules build executable programs in a given language. After a + build, the executable will reside in the build tool's binary + output tree at the corresponding name for the rule's label, + so `//my:program` would appear at (for example) `$(BINDIR)/my/program`. + + In some languages, such rules also create a runfiles directory + containing all the files mentioned in a `data` + attribute belonging to the rule, or any rule in its transitive + closure of dependencies; this set of files is gathered together in + one place for ease of deployment to production. + +* `*_test` rules are a specialization of a `*_binary` rule, used for automated + testing. Tests are simply programs that return zero on success. + + Like binaries, tests also have runfiles trees, and the files + beneath it are the only files that a test may legitimately open + at runtime. For example, a program `cc_test(name='x', + data=['//foo:bar'])` may open and read `$TEST_SRCDIR/workspace/foo/bar` during execution. + (Each programming language has its own utility function for + accessing the value of `$TEST_SRCDIR`, but they are all + equivalent to using the environment variable directly.) + Failure to observe the rule will cause the test to fail when it is + executed on a remote testing host. + +* `*_library` rules specify separately-compiled modules in the given + programming language. Libraries can depend on other libraries, + and binaries and tests can depend on libraries, with the expected + separate-compilation behavior. + + + + + + +
    + Labels + + Dependencies +
    + +## File encoding + +`BUILD` and `.bzl` files should be encoded in UTF-8, of which ASCII is a valid +subset. Arbitrary byte sequences are currently allowed, but may stop being +supported in the future. diff --git a/concepts/dependencies.mdx b/concepts/dependencies.mdx new file mode 100644 index 000000000..d3fcb71e6 --- /dev/null +++ b/concepts/dependencies.mdx @@ -0,0 +1,375 @@ +--- +title: 'Dependencies' +--- + + + +A target `A` _depends upon_ a target `B` if `B` is needed by `A` at build or +execution time. The _depends upon_ relation induces a +[Directed Acyclic Graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph) +(DAG) over targets, and it is called a _dependency graph_. + +A target's _direct_ dependencies are those other targets reachable by a path +of length 1 in the dependency graph. A target's _transitive_ dependencies are +those targets upon which it depends via a path of any length through the graph. + +In fact, in the context of builds, there are two dependency graphs, the graph +of _actual dependencies_ and the graph of _declared dependencies_. Most of the +time, the two graphs are so similar that this distinction need not be made, but +it is useful for the discussion below. + +## Actual and declared dependencies + +A target `X` is _actually dependent_ on target `Y` if `Y` must be present, +built, and up-to-date in order for `X` to be built correctly. _Built_ could +mean generated, processed, compiled, linked, archived, compressed, executed, or +any of the other kinds of tasks that routinely occur during a build. + +A target `X` has a _declared dependency_ on target `Y` if there is a dependency +edge from `X` to `Y` in the package of `X`. + +For correct builds, the graph of actual dependencies _A_ must be a subgraph of +the graph of declared dependencies _D_. That is, every pair of +directly-connected nodes `x --> y` in _A_ must also be directly connected in +_D_. It can be said that _D_ is an _overapproximation_ of _A_. + +Important: _D_ should not be too much of an overapproximation of _A_ because +redundant declared dependencies can make builds slower and binaries larger. + +`BUILD` file writers must explicitly declare all of the actual direct +dependencies for every rule to the build system, and no more. + +Failure to observe this principle causes undefined behavior: the build may fail, +but worse, the build may depend on some prior operations, or upon transitive +declared dependencies the target happens to have. Bazel checks for missing +dependencies and report errors, but it's not possible for this checking to be +complete in all cases. + +You need not (and should not) attempt to list everything indirectly imported, +even if it is _needed_ by `A` at execution time. + +During a build of target `X`, the build tool inspects the entire transitive +closure of dependencies of `X` to ensure that any changes in those targets are +reflected in the final result, rebuilding intermediates as needed. + +The transitive nature of dependencies leads to a common mistake. Sometimes, +code in one file may use code provided by an _indirect_ dependency — a +transitive but not direct edge in the declared dependency graph. Indirect +dependencies don't appear in the `BUILD` file. Because the rule doesn't +directly depend on the provider, there is no way to track changes, as shown in +the following example timeline: + +### 1. Declared dependencies match actual dependencies + +At first, everything works. The code in package `a` uses code in package `b`. +The code in package `b` uses code in package `c`, and thus `a` transitively +depends on `c`. + + + + + + + + + + + + + + + + + + + + + + +
    a/BUILDb/BUILD
    +
    rule(
    +    name = "a",
    +    srcs = "a.in",
    +    deps = "//b:b",
    +)
    +      
    +
    +
    +rule(
    +    name = "b",
    +    srcs = "b.in",
    +    deps = "//c:c",
    +)
    +      
    +
    a / a.inb / b.in
    +import b;
    +b.foo();
    +    
    +
    +
    +import c;
    +function foo() {
    +  c.bar();
    +}
    +      
    +
    +
    + Declared dependency graph with arrows connecting a, b, and c +
    Declared dependency graph
    +
    +
    +
    + Actual dependency graph that matches the declared dependency
+                  graph with arrows connecting a, b, and c +
    Actual dependency graph
    +
    +
    + +The declared dependencies overapproximate the actual dependencies. All is well. + +### 2. Adding an undeclared dependency + +A latent hazard is introduced when someone adds code to `a` that creates a +direct _actual_ dependency on `c`, but forgets to declare it in the build file +`a/BUILD`. + + + + + + + + + + + + + + +
    a / a.in 
    +
    +        import b;
    +        import c;
    +        b.foo();
    +        c.garply();
    +      
    +
     
    +
    + Declared dependency graph with arrows connecting a, b, and c +
    Declared dependency graph
    +
    +
    +
    + Actual dependency graph with arrows connecting a, b, and c. An
+                  arrow now connects A to C as well. This does not match the
+                  declared dependency graph +
    Actual dependency graph
    +
    +
    + +The declared dependencies no longer overapproximate the actual dependencies. +This may build ok, because the transitive closures of the two graphs are equal, +but masks a problem: `a` has an actual but undeclared dependency on `c`. + +### 3. Divergence between declared and actual dependency graphs + +The hazard is revealed when someone refactors `b` so that it no longer depends on +`c`, inadvertently breaking `a` through no +fault of their own. + + + + + + + + + + + + + + + + + + + + + + +
     b/BUILD
      +
    rule(
    +    name = "b",
    +    srcs = "b.in",
    +    deps = "//d:d",
    +)
    +      
    +
     b / b.in
      +
    +      import d;
    +      function foo() {
    +        d.baz();
    +      }
    +      
    +
    +
    + Declared dependency graph with arrows connecting a and b.
+                  b no longer connects to c, which breaks a's connection to c +
    Declared dependency graph
    +
    +
    +
    + Actual dependency graph that shows a connecting to b and c,
+                  but b no longer connects to c +
    Actual dependency graph
    +
    +
    + +The declared dependency graph is now an underapproximation of the actual +dependencies, even when transitively closed; the build is likely to fail. + +The problem could have been averted by ensuring that the actual dependency from +`a` to `c` introduced in Step 2 was properly declared in the `BUILD` file. + +## Types of dependencies + +Most build rules have three attributes for specifying different kinds of +generic dependencies: `srcs`, `deps` and `data`. These are explained below. For +more details, see +[Attributes common to all rules](/reference/be/common-definitions). + +Many rules also have additional attributes for rule-specific kinds of +dependencies, for example, `compiler` or `resources`. These are detailed in the +[Build Encyclopedia](/reference/be/). + +### `srcs` dependencies + +Files consumed directly by the rule or rules that output source files. + +### `deps` dependencies + +Rule pointing to separately-compiled modules providing header files, +symbols, libraries, data, etc. + +### `data` dependencies + +A build target might need some data files to run correctly. These data files +aren't source code: they don't affect how the target is built. For example, a +unit test might compare a function's output to the contents of a file. When you +build the unit test you don't need the file, but you do need it when you run +the test. The same applies to tools that are launched during execution. + +The build system runs tests in an isolated directory where only files listed as +`data` are available. Thus, if a binary/library/test needs some files to run, +specify them (or a build rule containing them) in `data`. For example: + +``` +# I need a config file from a directory named env: +java_binary( + name = "setenv", + ... + data = [":env/default_env.txt"], +) + +# I need test data from another directory +sh_test( + name = "regtest", + srcs = ["regtest.sh"], + data = [ + "//data:file1.txt", + "//data:file2.txt", + ... + ], +) +``` + +These files are available using the relative path `path/to/data/file`. In tests, +you can refer to these files by joining the paths of the test's source +directory and the workspace-relative path, for example, +`${TEST_SRCDIR}/workspace/path/to/data/file`. + +## Using labels to reference directories + +As you look over our `BUILD` files, you might notice that some `data` labels +refer to directories. These labels end with `/.` or `/` like these examples, +which you should not use: + +

    Not recommended — + data = ["//data/regression:unittest/."] +

    + +

    Not recommended — + data = ["testdata/."] +

    + +

    Not recommended — + data = ["testdata/"] +

    + +This seems convenient, particularly for tests because it allows a test to +use all the data files in the directory. + +But try not to do this. In order to ensure correct incremental rebuilds (and +re-execution of tests) after a change, the build system must be aware of the +complete set of files that are inputs to the build (or test). When you specify +a directory, the build system performs a rebuild only when the directory itself +changes (due to addition or deletion of files), but won't be able to detect +edits to individual files as those changes don't affect the enclosing directory. +Rather than specifying directories as inputs to the build system, you should +enumerate the set of files contained within them, either explicitly or using the +[`glob()`](/reference/be/functions#glob) function. (Use `**` to force the +`glob()` to be recursive.) + +

    Recommended — + data = glob(["testdata/**"]) +

    + +Unfortunately, there are some scenarios where directory labels must be used. +For example, if the `testdata` directory contains files whose names don't +conform to the [label syntax](/concepts/labels#labels-lexical-specification), +then explicit enumeration of files, or use of the +[`glob()`](/reference/be/functions#glob) function produces an invalid labels +error. You must use directory labels in this case, but beware of the +associated risk of incorrect rebuilds described above. + +If you must use directory labels, keep in mind that you can't refer to the +parent package with a relative `../` path; instead, use an absolute path like +`//data/regression:unittest/.`. + +Note: Directory labels are only valid for data dependencies. If you try to use +a directory as a label in an argument other than `data`, it will fail and you +will get a (probably cryptic) error message. + +Any external rule, such as a test, that needs to use multiple files must +explicitly declare its dependence on all of them. You can use `filegroup()` to +group files together in the `BUILD` file: + +``` +filegroup( + name = 'my_data', + srcs = glob(['my_unittest_data/*']) +) +``` + +You can then reference the label `my_data` as the data dependency in your test. + + + + + + +
    + BUILD files + + Visibility +
    + diff --git a/concepts/labels.mdx b/concepts/labels.mdx new file mode 100644 index 000000000..caf82faf7 --- /dev/null +++ b/concepts/labels.mdx @@ -0,0 +1,256 @@ +--- +title: 'Labels' +--- + + + +A **label** is an identifier for a target. A typical label in its full canonical +form looks like: + +```none +@@myrepo//my/app/main:app_binary +``` + +The first part of the label is the repository name, `@@myrepo`. The double-`@` +syntax signifies that this is a [*canonical* repo +name](/external/overview#canonical-repo-name), which is unique within +the workspace. Labels with canonical repo names unambiguously identify a target +no matter which context they appear in. + +Often the canonical repo name is an arcane string that looks like +`@@rules_java++toolchains+local_jdk`. What is much more commonly seen is +labels with an [*apparent* repo name](/external/overview#apparent-repo-name), +which looks like: + +``` +@myrepo//my/app/main:app_binary +``` + +The only difference is the repo name being prefixed with one `@` instead of two. +This refers to a repo with the apparent name `myrepo`, which could be different +based on the context this label appears in. + +In the typical case that a label refers to the same repository from which +it is used, the repo name part may be omitted. So, inside `@@myrepo` the first +label is usually written as + +``` +//my/app/main:app_binary +``` + +The second part of the label is the un-qualified package name +`my/app/main`, the path to the package +relative to the repository root. Together, the repository name and the +un-qualified package name form the fully-qualified package name +`@@myrepo//my/app/main`. When the label refers to the same +package it is used in, the package name (and optionally, the colon) +may be omitted. So, inside `@@myrepo//my/app/main`, +this label may be written either of the following ways: + +``` +app_binary +:app_binary +``` + +It is a matter of convention that the colon is omitted for files, +but retained for rules, but it is not otherwise significant. + +The part of the label after the colon, `app_binary` is the un-qualified target +name. When it matches the last component of the package path, it, and the +colon, may be omitted. So, these two labels are equivalent: + +``` +//my/app/lib +//my/app/lib:lib +``` + +The name of a file target in a subdirectory of the package is the file's path +relative to the package root (the directory containing the `BUILD` file). So, +this file is in the `my/app/main/testdata` subdirectory of the repository: + +``` +//my/app/main:testdata/input.txt +``` + +Strings like `//my/app` and `@@some_repo//my/app` have two meanings depending on +the context in which they are used: when Bazel expects a label, they mean +`//my/app:app` and `@@some_repo//my/app:app`, respectively. But, when Bazel +expects a package (e.g. in `package_group` specifications), they reference the +package that contains that label. + +A common mistake in `BUILD` files is using `//my/app` to refer to a package, or +to *all* targets in a package--it does not. Remember, it is +equivalent to `//my/app:app`, so it names the `app` target in the `my/app` +package of the current repository. + +However, the use of `//my/app` to refer to a package is encouraged in the +specification of a `package_group` or in `.bzl` files, because it clearly +communicates that the package name is absolute and rooted in the top-level +directory of the workspace. + +Relative labels cannot be used to refer to targets in other packages; the +repository identifier and package name must always be specified in this case. +For example, if the source tree contains both the package `my/app` and the +package `my/app/testdata` (each of these two directories has its own +`BUILD` file), the latter package contains a file named `testdepot.zip`. Here +are two ways (one wrong, one correct) to refer to this file within +`//my/app:BUILD`: + +

    Wrongtestdata is a different package, so you can't use a relative path

    +
    testdata/testdepot.zip
    + +

    Correct — refer to testdata with its full path

    + +
    //my/app/testdata:testdepot.zip
    + + +Labels starting with `@@//` are references to the main +repository, which will still work even from external repositories. +Therefore `@@//a/b/c` is different from +`//a/b/c` when referenced from an external repository. +The former refers back to the main repository, while the latter +looks for `//a/b/c` in the external repository itself. +This is especially relevant when writing rules in the main +repository that refer to targets in the main repository, and will be +used from external repositories. + +For information about the different ways you can refer to targets, see +[target patterns](/run/build#specifying-build-targets). + +### Lexical specification of a label + +Label syntax discourages use of metacharacters that have special meaning to the +shell. This helps to avoid inadvertent quoting problems, and makes it easier to +construct tools and scripts that manipulate labels, such as the +[Bazel Query Language](/query/language). + +The precise details of allowed target names are below. + +### Target names — `{{ "" }}package-name{{ "" }}:target-name` + +`target-name` is the name of the target within the package. The name of a rule +is the value of the `name` attribute in the rule's declaration in a `BUILD` +file; the name of a file is its pathname relative to the directory containing +the `BUILD` file. + +Target names must be composed entirely of characters drawn from the set `a`–`z`, +`A`–`Z`, `0`–`9`, and the punctuation symbols `!%-@^_"#$&'()*-+,;<=>?[]{|}~/.`. + +Filenames must be relative pathnames in normal form, which means they must +neither start nor end with a slash (for example, `/foo` and `foo/` are +forbidden) nor contain multiple consecutive slashes as path separators +(for example, `foo//bar`). Similarly, up-level references (`..`) and +current-directory references (`./`) are forbidden. + +

    Wrong — Do not use .. to refer to files in other packages

    + +

    Correct — Use + //{{ "" }}package-name{{ "" }}:{{ "" }}filename{{ "" }}

    + +While it is common to use `/` in the name of a file target, avoid the use of +`/` in the names of rules. Especially when the shorthand form of a label is +used, it may confuse the reader. The label `//foo/bar/wiz` is always a shorthand +for `//foo/bar/wiz:wiz`, even if there is no such package `foo/bar/wiz`; it +never refers to `//foo:bar/wiz`, even if that target exists. + +However, there are some situations where use of a slash is convenient, or +sometimes even necessary. For example, the name of certain rules must match +their principal source file, which may reside in a subdirectory of the package. + +### Package names — `//package-name:{{ "" }}target-name{{ "" }}` + +The name of a package is the name of the directory containing its `BUILD` file, +relative to the top-level directory of the containing repository. +For example: `my/app`. + +On a technical level, Bazel enforces the following: + +* Allowed characters in package names are the lowercase letters `a` through `z`, + the uppercase letters `A` through `Z`, the digits `0` through `9`, the + characters ``! \"#$%&'()*+,-.;<=>?@[]^_`{|}`` (yes, there's a space character + in there!), and of course forward slash `/` (since it's the directory + separator). +* Package names may not start or end with a forward slash character `/`. +* Package names may not contain the substring `//`. This wouldn't make + sense---what would the corresponding directory path be? +* Package names may not contain the substring `/./` or `/../` or `/.../` etc. + This enforcement is done to avoid confusion when translating between a logical + package name and a physical directory name, given the semantic meaning of the + dot character in path strings. + +On a practical level: + +* For a language with a directory structure that is significant to its module + system (for example, Java), it's important to choose directory names that are + valid identifiers in the language. For example, don't start with a leading + digit and avoid special characters, especially underscores and hyphens. +* Although Bazel supports targets in the workspace's root package (for example, + `//:foo`), it's best to leave that package empty so all meaningful packages + have descriptive names. + +## Rules + +A rule specifies the relationship between inputs and outputs, and the +steps to build the outputs. Rules can be of one of many different +kinds (sometimes called the _rule class_), which produce compiled +executables and libraries, test executables and other supported +outputs as described in the [Build Encyclopedia](/reference/be/overview). + +`BUILD` files declare _targets_ by invoking _rules_. + +In the example below, we see the declaration of the target `my_app` +using the `cc_binary` rule. + +```python +cc_binary( + name = "my_app", + srcs = ["my_app.cc"], + deps = [ + "//absl/base", + "//absl/strings", + ], +) +``` + +Every rule invocation has a `name` attribute (which must be a valid +[target name](#target-names)), that declares a target within the package +of the `BUILD` file. + +Every rule has a set of _attributes_; the applicable attributes for a given +rule, and the significance and semantics of each attribute are a function of +the rule's kind; see the [Build Encyclopedia](/reference/be/overview) for a +list of rules and their corresponding attributes. Each attribute has a name and +a type. Some of the common types an attribute can have are integer, label, list +of labels, string, list of strings, output label, list of output labels. Not +all attributes need to be specified in every rule. Attributes thus form a +dictionary from keys (names) to optional, typed values. + +The `srcs` attribute present in many rules has type "list of labels"; its +value, if present, is a list of labels, each being the name of a target that is +an input to this rule. + +In some cases, the name of the rule kind is somewhat arbitrary, and more +interesting are the names of the files generated by the rule, and this is true +of genrules. For more information, see +[General Rules: genrule](/reference/be/general#genrule). + +In other cases, the name is significant: for `*_binary` and `*_test` rules, +for example, the rule name determines the name of the executable produced by +the build. + +This directed acyclic graph over targets is called the _target graph_ or +_build dependency graph_, and is the domain over which the +[Bazel Query tool](/query/guide) operates. + + + + + + +
    + Targets + + BUILD files +
    diff --git a/concepts/runfiles.mdx b/concepts/runfiles.mdx index 9d5449b41..298e4b172 100644 --- a/concepts/runfiles.mdx +++ b/concepts/runfiles.mdx @@ -2,15 +2,9 @@ title: 'Runfiles' --- +[Runfiles are a set of files used by a target at runtime (as opposed to build time)](/extending/rules#runfiles). - -[Runfiles are a set of files used by a target at runtime (as opposed to build -time)](/extending/rules#runfiles). - -Do not hardcode runfiles paths. Those contain the -[canonical repository name](/external/overview#canonical-repo-name), but -[the canonical repository name format is an implementation detail that may -change at any time](/external/module#repository_names_and_strict_deps). +Do not hardcode runfiles paths. Those contain the [canonical repository name](/external/overview#canonical-repo-name), but [the canonical repository name format is an implementation detail that may change at any time](/external/module#repository_names_and_strict_deps). Use one of the language-specific runfiles libraries to access them: @@ -19,24 +13,17 @@ Use one of the language-specific runfiles libraries to access them: - [rules_python](https://github.com/bazel-contrib/rules_python/blob/main/python/runfiles/runfiles.py) - [rules_shell](https://github.com/bazelbuild/rules_shell/blob/main/shell/runfiles/runfiles.bash) -Runfiles are generally referenced by an `rlocationpath` in the form of -`$REPO/package/file` where `$REPO` should be the -[apparent repository name](/external/overview#apparent-repo-name). -Most runfiles libraries (see below) support functionality to determine the -repository of the currently executed target which is useful to refer to other -files in the same repository. Many Bazel rules support -[Make Variables](/reference/be/make-variables#predefined_label_variables) -to translate from a target to an rlocationpath by using the -`$(rlocationpath //package:target)` notation. +Runfiles are generally referenced by an `rlocationpath` in the form of `$REPO/package/file` where `$REPO` should be the [apparent repository name](/external/overview#apparent-repo-name). +Most runfiles libraries (see below) support functionality to determine the repository of the currently executed target which is useful to refer to other files in the same repository. +Many Bazel rules support [Make Variables](/reference/be/make-variables#predefined_label_variables) to translate from a target to an rlocationpath by using the `$(rlocationpath //package:target)` notation. Examples: -
    - -
    -

    C++

    + - ``` + + +```python load("@rules_cc//cc:cc_binary.bzl", "cc_binary") cc_binary( @@ -47,11 +34,11 @@ cc_binary( ) ``` - ``` -#include <filesystem> -#include <fstream> -#include <iostream> -#include <string> +```cpp +#include +#include +#include +#include #include "rules_cc/cc/runfiles/runfiles.h" @@ -82,12 +69,11 @@ int main(int argc, char **argv) { return 0; } - ``` -
    -
    -

    Golang

    +``` + + - ``` +```python load("@rules_go//go:def.bzl", "go_binary") go_binary( @@ -98,7 +84,7 @@ go_binary( ) ``` - ``` + ```go package main import ( @@ -138,12 +124,10 @@ func main() { fmt.Print(string(data)) } ``` + + -
    -
    -

    Python

    - - ``` + ```python load("@rules_python//python:defs.bzl", "py_binary") py_binary( @@ -152,9 +136,9 @@ py_binary( data = ["//examples:runfile.txt"], deps = ["@rules_python//python/runfiles"], ) - ``` +``` - ``` +```python import pathlib from python.runfiles import runfiles @@ -171,12 +155,10 @@ print("The content of the runfile is:") with open(realPathToSomeFile, 'r') as f: print(f.read()) ``` + + -
    -
    -

    Shell

    - - ``` +```python load("@rules_shell//shell:sh_binary.bzl", "sh_binary") sh_binary( @@ -185,9 +167,9 @@ sh_binary( data = ["//examples:runfile.txt"], use_bash_launcher = True, ) - ``` + ``` - ``` +```bash #!/bin/bash SOME_FILE='examples/runfile.txt' @@ -200,8 +182,7 @@ real_path_to_some_file="$(rlocation "${root}/${SOME_FILE}")" echo "The content of the runfile is:" cat "${real_path_to_some_file}" - ``` + ``` + -
    -
    -
    + diff --git a/concepts/visibility.mdx b/concepts/visibility.mdx index 2f3980366..a4bc6c549 100644 --- a/concepts/visibility.mdx +++ b/concepts/visibility.mdx @@ -5,9 +5,8 @@ title: 'Visibility' This page covers Bazel's three visibility systems: -[target visibility](#target-visibility), -[transitive visibility](#transitive-visibility) and -[load visibility](#load-visibility). +[target visibility](#target-visibility),[transitive visibility](#transitive-visibility) +and [load visibility](#load-visibility). These types of visibility help other developers distinguish between your library's public API and its implementation details, and help enforce structure @@ -400,7 +399,7 @@ finalizer, the finalizer cannot see such a target. Note, however, that a `native.existing_rules()`-based legacy macro will also be unable to see such a target. -## Transitive visibility +## Transitive visibility {#transitive-visibility} **Transitive visibility** is a way of restricting who may depend on a target, including when the dependency is only indirect. It applies separately from the diff --git a/configure/coverage.mdx b/configure/coverage.mdx index 541e4b6fd..f8e3e7b6a 100644 --- a/configure/coverage.mdx +++ b/configure/coverage.mdx @@ -38,12 +38,10 @@ however the latter can be more difficult for complex projects. "Instrumentation" in this case refers to the coverage tools that are used for a specific target. Bazel allows turning this on for a specific subset of files using the -[`--instrumentation_filter`] -(/reference/command-line-reference#flag--instrumentation_filter) +[`--instrumentation_filter`](/reference/command-line-reference#flag--instrumentation_filter) flag, which specifies a filter for targets that are tested with the instrumentation enabled. To enable instrumentation for tests, the -[`--instrument_test_targets`] -(/reference/command-line-reference#flag--instrument_test_targets) +[`--instrument_test_targets`](/reference/command-line-reference#flag--instrument_test_targets) flag is required. By default, bazel tries to match the target package(s), and prints the @@ -81,7 +79,7 @@ Note that `genhtml` reads the source code as well, to annotate missing coverage in these files. For this to work, it is expected that `genhtml` is executed in the root of the bazel project. -To view the result, open the `index.html` file produced in the +To view the result, simply open the `index.html` file produced in the `genhtml` directory in any web browser. For further help and information around the `genhtml` tool, or the @@ -89,11 +87,11 @@ For further help and information around the `genhtml` tool, or the ## Remote execution -Running with remote test execution has a few caveats: +Running with remote test execution currently has a few caveats: - The report combination action cannot yet run remotely. This is because Bazel does not consider the coverage output files as part of - its graph (see [Bazel issue #4685][remote_report_issue]), and can therefore + its graph (see [this issue][remote_report_issue]), and can therefore not correctly treat them as inputs to the combination action. To work around this, use `--strategy=CoverageReport=local`. - Note: It may be necessary to specify something like @@ -101,7 +99,7 @@ Running with remote test execution has a few caveats: up to try `local,remote`, due to how Bazel resolves strategies. - `--remote_download_minimal` and similar flags can also not be used as a consequence of the former. -- Bazel will fail to create coverage information if tests +- Bazel will currently fail to create coverage information if tests have been cached previously. To work around this, `--nocache_test_results` can be set specifically for coverage runs, although this of course incurs a heavy cost in terms of test times. @@ -110,21 +108,18 @@ Running with remote test execution has a few caveats: - Usually coverage is run as part of the test action, and so by default, we don't get all coverage back as outputs of the remote execution by default. These flags override the default and obtain - the coverage data. See [Bazel issue #4685][split_coverage_issue] for more + the coverage data. See [this issue][split_coverage_issue] for more details. ## Language-specific configuration -The following sections detail language-specific considerations for setting up -code coverage with Bazel. - ### C++ #### Linux C++ coverage should work out-of-the-box with the default configuration. -#### macOS +#### MacOS The default value of `GCOV_PREFIX_STRIP` is almost certainly incorrect and needs adjusting manually because the correct value depends on your setup. diff --git a/configure/integrate-cpp.mdx b/configure/integrate-cpp.mdx index e285fa439..107ab8102 100644 --- a/configure/integrate-cpp.mdx +++ b/configure/integrate-cpp.mdx @@ -2,8 +2,6 @@ title: 'Integrating with C++ Rules' --- - - This page describes how to integrate with C++ rules on various levels. ## Accessing the C++ toolchain @@ -17,8 +15,7 @@ To depend on a C++ toolchain in your rule, set the `toolchains` parameter to `find_cpp_toolchain(ctx)` to get the [`CcToolchainInfo`](/rules/lib/providers/CcToolchainInfo). A complete working example can be found [in the rules_cc -examples](https://github.com/bazelbuild/rules_cc/blob/main/examples/write_cc_toolchain_cpu/write_cc_toolchain_cpu.bzl){: -.external}. +examples](https://github.com/bazelbuild/rules_cc/blob/main/examples/write_cc_toolchain_cpu/write_cc_toolchain_cpu.bzl). ## Generating command lines and environment variables using the C++ toolchain @@ -70,7 +67,6 @@ it should wrap it in, for example, `JavaCcInfo`. A complete working example can be found [in the rules_cc examples](https://github.com/bazelbuild/rules_cc/blob/main/examples/my_c_archive/my_c_archive.bzl). - ## Reusing logic and actions of C++ rules _Not stable yet; This section will be updated once the API stabilizes. Follow diff --git a/configure/windows.mdx b/configure/windows.mdx index b42458b3b..67a36c832 100644 --- a/configure/windows.mdx +++ b/configure/windows.mdx @@ -369,6 +369,7 @@ necessary for consistent behavior between WORKSPACE and Bzlmod setups in Bazel * Clang is not supported. + ### Build Java To build Java targets, you need: diff --git a/contribute/codebase.mdx b/contribute/codebase.mdx index 44e0150d3..98935ab8f 100644 --- a/contribute/codebase.mdx +++ b/contribute/codebase.mdx @@ -165,23 +165,32 @@ execute, the following sequence of events happens: ## Command line options -The command line options for a Bazel invocation are described in an -`OptionsParsingResult` object, which in turn contains a map from "option -classes" to the values of the options. An "option class" is a subclass of -`OptionsBase` and groups command line options together that are related to each -other. For example: - -1. Options related to a programming language (`CppOptions` or `JavaOptions`). - These should be a subclass of `FragmentOptions` and are eventually wrapped - into a `BuildOptions` object. -2. Options related to the way Bazel executes actions (`ExecutionOptions`) - -These options are designed to be consumed in the analysis phase and (either -through `RuleContext.getFragment()` in Java or `ctx.fragments` in Starlark). -Some of them (for example, whether to do C++ include scanning or not) are read -in the execution phase, but that always requires explicit plumbing since -`BuildConfiguration` is not available then. For more information, see the -section "Configurations". +The command line options for a Bazel invocation are parsed into an +`OptionsParsingResult` object, which holds instances of `OptionsBase` +subclasses populated with the parsed values. An "option class" is a subclass +of `OptionsBase` and groups related command line options together. + +There are two main kinds of option classes: + +1. **Configuration options:** These options affect how targets are built, + for example, defining the target platform or compilation mode. They are + defined in subclasses of `FragmentOptions` (e.g., `CppOptions`, + `JavaOptions`), which is itself a subclass of `OptionsBase`. + `FragmentOptions` instances are collected into a `BuildOptions` object, + which is used to create the `BuildConfiguration` for a configured target. + These options are available during the analysis phase via + `RuleContext.getFragment()` in Java or `ctx.fragments` in Starlark. +2. **Other command options:** These options affect other aspects of Bazel's + behavior. They are defined in classes that extend `OptionsBase` directly, + but are not `FragmentOptions`. Examples include `ExecutionOptions`, which + influences how actions are executed, and `CommonCommandOptions`, which + contains options applicable to many commands. These are not part of + `BuildOptions`. + +Some configuration options (for example, whether to do C++ include scanning with +`--cc_include_scanning`) are read in the execution phase. But that always +requires explicit plumbing since `BuildConfiguration` is not available then. For +more information, see the section "Configurations". **WARNING:** We like to pretend that `OptionsBase` instances are immutable and use them that way (such as a part of `SkyKeys`). This is not the case and @@ -193,15 +202,16 @@ called on it is okay.) Bazel learns about option classes in the following ways: -1. Some are hard-wired into Bazel (`CommonCommandOptions`) -2. From the `@Command` annotation on each Bazel command -3. From `ConfiguredRuleClassProvider` (these are command line options related - to individual programming languages) -4. Starlark rules can also define their own options (see - [here](/extending/config)) +1. Some are hard-wired into Bazel (`CommonCommandOptions`). +2. From the `@Command` annotation on each Bazel command, which + lists option classes applicable to that command. +3. From `ConfiguredRuleClassProvider` (these are `FragmentOptions` for + individual programming languages that become part of `BuildOptions`). +4. Starlark rules can also define their own options, known as build settings + (see [here](/extending/config)). -Each option (excluding Starlark-defined options) is a member variable of a -`FragmentOptions` subclass that has the `@Option` annotation, which specifies +Each option (excluding Starlark-defined options) is a member variable of an +`OptionsBase` subclass that has the `@Option` annotation, which specifies the name and the type of the command line option along with some help text. The Java type of the value of a command line option is usually something simple diff --git a/contribute/docs-style-guide.mdx b/contribute/docs-style-guide.mdx new file mode 100644 index 000000000..f50c9eb67 --- /dev/null +++ b/contribute/docs-style-guide.mdx @@ -0,0 +1,217 @@ +--- +title: 'Bazel docs style guide' +--- + + + +Thank you for contributing to Bazel's documentation. This serves as a quick +documentation style guide to get you started. For any style questions not +answered by this guide, follow the +[Google developer documentation style guide](https://developers.google.com/style). + +## Defining principles + +Bazel docs should uphold these principles: + +- **Concise.** Use as few words as possible. +- **Clear.** Use plain language. Write without jargon for a fifth-grade + reading level. +- **Consistent.** Use the same words or phrases for repeated concepts + throughout the docs. +- **Correct.** Write in a way where the content stays correct for as long as + possible by avoiding time-based information and promises for the future. + +## Writing + +This section contains basic writing tips. + +### Headings + +- Page-level headings start at H2. (H1 headings are used as page titles.) +- Make headers as short as is sensible. This way, they fit in the TOC + without wrapping. + + - Yes: Permissions + - No: A brief note on permissions + +- Use sentence case for headings + + - Yes: Set up your workspace + - No: Set Up Your Workspace + +- Try to make headings task-based or actionable. If headings are conceptual, + it may be based around understanding, but write to what the user does. + + - Yes: Preserving graph order + - No: On the preservation of graph order + +### Names + +- Capitalize proper nouns, such as Bazel and Starlark. + + - Yes: At the end of the build, Bazel prints the requested targets. + - No: At the end of the build, bazel prints the requested targets. + +- Keep it consistent. Don't introduce new names for existing concepts. Where + applicable, use the term defined in the + [Glossary](/reference/glossary). + + - For example, if you're writing about issuing commands on a + terminal, don't use both terminal and command line on the page. + +### Page scope + +- Each page should have one purpose and that should be defined at the + beginning. This helps readers find what they need quicker. + + - Yes: This page covers how to install Bazel on Windows. + - No: (No introductory sentence.) + +- At the end of the page, tell the reader what to do next. For pages where + there is no clear action, you can include links to similar concepts, + examples, or other avenues for exploration. + +### Subject + +In Bazel documentation, the audience should primarily be users—the people using +Bazel to build their software. + +- Address your reader as "you". (If for some reason you can't use "you", + use gender-neutral language, such as they.) + - Yes: To build Java code using Bazel, + you must install a JDK. + - **MAYBE:** For users to build Java code with Bazel, they must install a JDK. + - No: For a user to build Java code with + Bazel, he or she must install a JDK. + +- If your audience is NOT general Bazel users, define the audience at the + beginning of the page or in the section. Other audiences can include + maintainers, contributors, migrators, or other roles. +- Avoid "we". In user docs, there is no author; just tell people what's + possible. + - Yes: As Bazel evolves, you should update your code base to maintain + compatibility. + - No: Bazel is evolving, and we will make changes to Bazel that at + times will be incompatible and require some changes from Bazel users. + +### Temporal + +Where possible, avoid terms that orient things in time, such as referencing +specific dates (Q2 2022) or saying "now", "currently", or "soon." These go +stale quickly and could be incorrect if it's a future projection. Instead, +specify a version level instead, such as "Bazel X.x and higher supports +\ or a GitHub issue link. + +- Yes: Bazel 0.10.0 or later supports + remote caching. +- No: Bazel will soon support remote + caching, likely in October 2017. + +### Tense + +- Use present tense. Avoid past or future tense unless absolutely necessary + for clarity. + - Yes: Bazel issues an error when it + finds dependencies that don't conform to this rule. + - No: If Bazel finds a dependency that + does not conform to this rule, Bazel will issue an error. + +- Where possible, use active voice (where a subject acts upon an object) not + passive voice (where an object is acted upon by a subject). Generally, + active voice makes sentences clearer because it shows who is responsible. If + using active voice detracts from clarity, use passive voice. + - Yes: Bazel initiates X and uses the + output to build Y. + - No: X is initiated by Bazel and then + afterward Y will be built with the output. + +### Tone + +Write with a business friendly tone. + +- Avoid colloquial language. It's harder to translate phrases that are + specific to English. + - Yes: Good rulesets + - No: So what is a good ruleset? + +- Avoid overly formal language. Write as though you're explaining the + concept to someone who is curious about tech, but doesn't know the details. + +## Formatting + +### File type + +For readability, wrap lines at 80 characters. Long links or code snippets +may be longer, but should start on a new line. For example: + +Note: Where possible, use Markdown instead of HTML in your files. Follow the +[GitHub Markdown Syntax Guide](https://guides.github.com/features/mastering-markdown/#syntax) +for recommended Markdown style. + +### Links + +- Use descriptive link text instead of "here" or "below". This practice + makes it easier to scan a doc and is better for screen readers. + - Yes: For more details, see [Installing Bazel]. + - No: For more details, see [here]. + +- End the sentence with the link, if possible. + - Yes: For more details, see [link]. + - No: See [link] for more information. + +### Lists + +- Use an ordered list to describe how to accomplish a task with steps +- Use an unordered list to list things that aren't task based. (There should + still be an order of sorts, such as alphabetical, importance, etc.) +- Write with parallel structure. For example: + 1. Make all the list items sentences. + 1. Start with verbs that are the same tense. + 1. Use an ordered list if there are steps to follow. + +### Placeholders + +- Use angle brackets to denote a variable that users should change. + In Markdown, escape the angle brackets with a back slash: `\`. + - Yes: `bazel help `: Prints + help and options for `` + - No: bazel help _command_: Prints help + and options for "command" + +- Especially for complicated code samples, use placeholders that make sense + in context. + +### Table of contents + +Use the auto-generated TOC supported by the site. Don't add a manual TOC. + +## Code + +Code samples are developers' best friends. You probably know how to write these +already, but here are a few tips. + +If you're referencing a small snippet of code, you can embed it in a sentence. +If you want the reader to use the code, such as copying a command, use a code +block. + +### Code blocks + +- Keep it short. Eliminate all redundant or unnecessary text from a code + sample. +- In Markdown, specify the type of code block by adding the sample's language. + +``` +```shell +... +``` + +- Separate commands and output into different code blocks. + +### Inline code formatting + +- Use code style for filenames, directories, paths, and small bits of code. +- Use inline code styling instead of _italics_, "quotes," or **bolding**. + - Yes: `bazel help `: Prints + help and options for `` + - No: bazel help _command_: Prints help + and options for "command" diff --git a/contribute/search.mdx b/contribute/search.mdx new file mode 100644 index 000000000..c5b8cb844 --- /dev/null +++ b/contribute/search.mdx @@ -0,0 +1,276 @@ +--- +title: 'Searching the codebase' +--- + +## Product overview {:#product-overview} + +Bazel's [code search and source browsing interface](https://source.bazel.build) +is a web-based tool for browsing Bazel source code repositories. You can +use these features to navigate among different repositories, branches, and +files. You can also view history, diffs, and blame information. + +## Getting started {:#getting-started} + +Note: For the best experience, use the latest version of Chrome, Safari, or +Firefox. + +To access the code search and source browsing interface, open +[https://source.bazel.build](https://source.bazel.build) in your web browser. + +The main screen appears. This screen contains the following components: + +1. The Breadcrumb toolbar. This toolbar displays your current location in the +repository and allows you to move quickly to another location such as another +repository, or another location within a repository, such as a file, branch, or +commit. + +1. A list of repositories that you can browse. + +At the top of the screen is a search box. You can use this box to search for +specific files and code. + +## Working with repositories {:#working-with-repositories} + +### Opening a repository {:#opening-a-repository} + +To open a repository, click its name from the main screen. + +Alternatively, you can use the Breadcrumb toolbar to browse for a +specificrepository. This toolbar displays your current location in the +repository and allows you to move quickly to another location such as another +repository, or another location within a repository, such as a file, branch, or +commit. + +### Switch repositories {:#switch-repositories} + +To switch to a different repository, select the repository from the Breadcrumb toolbar. + +### View a repository at a specific commit {:#view-a-repository-at-a-specific-commit} + +To view a repository at a specific commit: + +1. From the view of the repository, select the file. +1. From the Breadcrumb toolbar, open the **Branch** menu. +1. In the submenu that appears, click **Commit**. +1. Select the commit you want to view. + +The interface now shows the repository as it existed at that commit. + +### Open a branch, commit, or tag {:#open-a-branch-commit-or-tag} + +By default, the code search and source browsing interface opens a repository to +the default branch. To open a different branch, from the Breadcrumb toolbar, +click the **Branch/Commit/Tag** menu. A submenu opens, allowing you to select a +branch using a branch name, a tag name, or through a search box. + +* To select a branch using a branch name, select **Branch** and then click the + name of the branch. +* To select a branch using a tag name, select **Tag** and + then click the tag name. +* To select a branch using a commit id, select **Commit** and then click the + commit id. +* To search for a branch, commit, or tag, select the corresponding item and + type a search term in the search box. + +## Working with files {:#working-with-files} + +When you select a repository from the main screen, the screen changes to display +a view of that repository. If a README file exists, its contents appear in the +file pane, located on the right side of the screen. Otherwise, a list of +repository's files and folders appear. On the left side of the screen is a tree +view of the repository's files and folders. You can use this tree to browse and +open specific files. + +Notice that, when you are viewing a repository, the Breadcrumb toolbar now has +three components: + +* A **Repository** menu, from which you can select different repositories +* A **Branch/Commit/Tag** menu, from which you can select specific branches, + tags, or commits +* A **File path** box, which displays the name of the current file or folder + and its corresponding path + +### Open a file {:#open-a-file} + +You can open a file by browsing to its directory and selecting it. The view of +the repository updates to show the contents of the file in the file pane, and +its location in the repository in the tree pane. + +### View file changes {:#view-file-changes} + +To view file changes: + +1. From the view of the repository, select the file. +1. Click **BLAME**, located in the upper-right corner. + +The file pane updates to display who made changes to the file and when. + +### View change history {:#view-change-history} + +To view the change history of a file: + +1. From the view of the repository, select the file. +1. Click **HISTORY**, located in the upper-right corner. + The **Change history** pane appears, showing the commits for this file. + +### View code reviews {:#view-code-reviews} + +For Gerrit code reviews, you can open the tool directly from the Change History pane. + +To view the code review for a file: + +1. From the view of the repository, select the file. +1. Click **HISTORY**, located in the upper-right corner. The Change History pane + appears, showing the commits for this file. +1. Hover over a commit. A **More** button (three vertical dots) appears. +1. Click the **More** button. +1. Select **View code review**. + +The Gerrit Code Review tool opens in a new browser window. + +### Open a file at a specific commit {:#open-a-file-at-a-specific-commit} + +To open a file at a specific commit: + +1. From the view of the repository, select the file. +1. Click **HISTORY**, located in the upper-right corner. The Change History pane + appears, showing the commits for this file. +1. Hover over a commit. A **VIEW** button appears. +1. Click the **VIEW** button. + +### Compare a file to a different commit {:#compare-a-file-to-a-different-commit} + +To compare a file at a different commit: + +1. From the view of the repository, select the file. To compare from two + different commits, first open the file at that commit. +1. Hover over a commit. A **DIFF** button appears. +1. Click the **DIFF** button. + +The file pane updates to display a side-by-side comparison between the two +files. The oldest of the two commits is always on the left. + +In the Change History pane, both commits are highlighted, and a label indicates +if the commit is displayed on the left or the right. + +To change either file, hover over the commit in the Change History pane. Then, +click either the **Left** or **Right** button to have the open the commit on the +left or right side of the diff. + +### Browsing cross references {:#browsing-cross-references} + +Another way to browse source repositories is through the use of cross +references. These references appear automatically as hyperlinks within a given +source file. + +To make cross references easier to identify, click **Cross References**, +located in the upper-right corner. This option displays an underline below all +cross references in a file. + +**Note:** If **Cross References** is grayed out, it indicates that +cross references are not available for that file. + +Click a cross reference to open the Cross Reference pane. This pane contains +two sections: + +* A **Definition** section, which lists the file or files that define the + reference +* A **References** section, which lists the files in which the reference also + appears + +Both sections display the name of the file, as well as the line or lines +that contains the reference. To open a file from the Cross Reference pane, +click the line number entry. The file appears in a new section of the pane, +allowing you to continue to browse the file while keeping the original file +in view. + +You can continue to browse cross references using the Cross Reference pane, just +as you can in the File pane. When you do, the pane displays a breadcrumb trail, +which you can use to navigate between different cross references. + +## Searching for code {:#search} + +You can search for specific files or code snippets using the search box located +at the top of the screen. Searches are always against the default branch. + +All searches use [RE2 regular expressions](https://github.com/google/re2/wiki/Syntax){: .external} +by default. If you do not want to use regular expressions, enclose your search +in double quotes ( " ). + +**Note:** To quickly search for a specific file, either add a backslash in front +of the period, or enclose the entire file name in quotes. + +``` +foo\.java +"foo.java" +``` + +You can refine your search using the following filters. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FilterOther optionsDescriptionExample
    lang:language:Perform an exact match by file language.lang:java test
    file:filepath:
    +path:
    +f:
    case:yesMake the search case sensitive. By default, searches are not case-sensitive.case:yes Hello World
    class:Search for a class name.class:MainClass
    function:func:Search for a function name.function:print
    -Negates the term from the search.hello -world
    \Escapes special characters, such as ., \, or (.run\(\)
    "[term]"Perform a literal search."class:main"
    + +## Additional Support {:#additional-support} + +To report an issue, click the **Feedback** button that appears in the top +right-hand corner of the screen and enter your feedback in the provided form. diff --git a/docs.json b/docs.json index 29101e430..ef2feea3a 100644 --- a/docs.json +++ b/docs.json @@ -170,7 +170,9 @@ }, { "group": "Query Language", - "pages": [] + "pages": [ + "query/quickstart" + ] }, { "group": "Glossary", diff --git a/docs/cc-toolchain-config-reference.mdx b/docs/cc-toolchain-config-reference.mdx new file mode 100644 index 000000000..8b6c26901 --- /dev/null +++ b/docs/cc-toolchain-config-reference.mdx @@ -0,0 +1,1150 @@ +--- +title: 'C++ Toolchain Configuration' +--- + +## Overview {:#overview} + +To invoke the compiler with the right options, Bazel needs some knowledge about +the compiler internals, such as include directories and important flags. +In other words, Bazel needs a simplified model of the compiler to understand its +workings. + +Bazel needs to know the following: + +* Whether the compiler supports thinLTO, modules, dynamic linking, or PIC + (position independent code). +* Paths to the required tools such as gcc, ld, ar, objcopy, and so on. +* The built-in system include directories. Bazel needs these to validate that + all headers that were included in the source file were properly declared in + the `BUILD` file. +* The default sysroot. +* Which flags to use for compilation, linking, archiving. +* Which flags to use for the supported compilation modes (opt, dbg, fastbuild). +* Make variables specifically required by the compiler. + +If the compiler has support for multiple architectures, Bazel needs to configure +them separately. + +[`CcToolchainConfigInfo`](/rules/lib/providers/CcToolchainConfigInfo) is a provider that provides the necessary level of +granularity for configuring the behavior of Bazel's C++ rules. By default, +Bazel automatically configures `CcToolchainConfigInfo` for your build, but you +have the option to configure it manually. For that, you need a Starlark rule +that provides the `CcToolchainConfigInfo` and you need to point the +[`toolchain_config`](/reference/be/c-cpp#cc_toolchain.toolchain_config) attribute of the +[`cc_toolchain`](/reference/be/c-cpp#cc_toolchain) to your rule. +You can create the `CcToolchainConfigInfo` by calling +[`cc_common.create_cc_toolchain_config_info()`](/rules/lib/toplevel/cc_common#create_cc_toolchain_config_info). +You can find Starlark constructors for all structs you'll need in the process in +[`@rules_cc//cc:cc_toolchain_config_lib.bzl`](https://github.com/bazelbuild/rules_cc/blob/master/cc/cc_toolchain_config_lib.bzl){: .external}. + +When a C++ target enters the analysis phase, Bazel selects the appropriate +`cc_toolchain` target based on the `BUILD` file, and obtains the +`CcToolchainConfigInfo` provider from the target specified in the +`cc_toolchain.toolchain_config` attribute. The `cc_toolchain` target +passes this information to the C++ target through a `CcToolchainProvider`. + +For example, a compile or link action, instantiated by a rule such as +`cc_binary` or `cc_library`, needs the following information: + +* The compiler or linker to use +* Command-line flags for the compiler/linker +* Configuration flags passed through the `--copt/--linkopt` options +* Environment variables +* Artifacts needed in the sandbox in which the action executes + +All of the above information except the artifacts required in the sandbox is +specified in the Starlark target that the `cc_toolchain` points to. + +The artifacts to be shipped to the sandbox are declared in the `cc_toolchain` +target. For example, with the `cc_toolchain.linker_files` attribute you can +specify the linker binary and toolchain libraries to ship into the sandbox. + +## Toolchain selection {:#toolchain-selection} + +The toolchain selection logic operates as follows: + +1. User specifies a `cc_toolchain_suite` target in the `BUILD` file and points + Bazel to the target using the + [`--crosstool_top` option](/docs/user-manual#flag--crosstool_top). + +2. The `cc_toolchain_suite` target references multiple toolchains. The + values of the `--cpu` and `--compiler` flags determine which of those + toolchains is selected, either based only on the `--cpu` flag value, or + based on a joint `--cpu | --compiler` value. The selection process is as + follows: + + * If the `--compiler` option is specified, Bazel selects the + corresponding entry from the `cc_toolchain_suite.toolchains` + attribute with `--cpu | --compiler`. If Bazel does not find + a corresponding entry, it throws an error. + + * If the `--compiler` option is not specified, Bazel selects + the corresponding entry from the `cc_toolchain_suite.toolchains` + attribute with just `--cpu`. + + * If no flags are specified, Bazel inspects the host system and selects a + `--cpu` value based on its findings. See the + [inspection mechanism code](https://source.bazel.build/bazel/+/1b73bc37e184e71651eb631223dcce321ba16211:src/main/java/com/google/devtools/build/lib/analysis/config/AutoCpuConverter.java). + +Once a toolchain has been selected, corresponding `feature` and `action_config` +objects in the Starlark rule govern the configuration of the build (that is, +items described later). These messages allow the implementation of +fully fledged C++ features in Bazel without modifying the +Bazel binary. C++ rules support multiple unique actions documented in detail +[in the Bazel source code](https://source.bazel.build/bazel/+/4f547a7ea86df80e4c76145ffdbb0c8b75ba3afa:tools/build_defs/cc/action_names.bzl). + +## Features {:#features} + +A feature is an entity that requires command-line flags, actions, +constraints on the execution environment, or dependency alterations. A feature +can be something as simple as allowing `BUILD` files to select configurations of +flags, such as `treat_warnings_as_errors`, or interact with the C++ rules and +include new compile actions and inputs to the compilation, such as +`header_modules` or `thin_lto`. + +Ideally, `CcToolchainConfigInfo` contains a list of features, where each +feature consists of one or more flag groups, each defining a list of flags +that apply to specific Bazel actions. + +A feature is specified by name, which allows full decoupling of the Starlark +rule configuration from Bazel releases. In other words, a Bazel release does not +affect the behavior of `CcToolchainConfigInfo` configurations as long as those +configurations do not require the use of new features. + +A feature is enabled in one of the following ways: + +* The feature's `enabled` field is set to `true`. +* Bazel or the rule owner explicitly enable it. +* The user enables it through the `--feature` Bazel option or `features` rule + attribute. + +Features can have interdependencies, depend on command line flags, `BUILD` file +settings, and other variables. + +### Feature relationships {:#feature-relationships} + +Dependencies are typically managed directly with Bazel, which simply enforces +the requirements and manages conflicts intrinsic to the nature of the features +defined in the build. The toolchain specification allows for more granular +constraints for use directly within the Starlark rule that govern feature +support and expansion. These are: + + + + + + + + + + + + + + + + + + + + + + + + +
    Constraint + Description +
    requires = [
    +   feature_set (features = [
    +       'feature-name-1',
    +       'feature-name-2'
    +   ]),
    +]
    +
    Feature-level. The feature is supported only if the specified required + features are enabled. For example, when a feature is only supported in + certain build modes (opt, dbg, or + fastbuild). If `requires` contains multiple `feature_set`s + the feature is supported if any of the `feature_set`s is satisfied + (when all specified features are enabled). +
    implies = ['feature']
    +

    Feature-level. This feature implies the specified feature(s). + Enabling a feature also implicitly enables all features implied by it + (that is, it functions recursively).

    +

    Also provides the ability to factor common subsets of functionality out of + a set of features, such as the common parts of sanitizers. Implied + features cannot be disabled.

    +
    provides = ['feature']
    +

    Feature-level. Indicates that this feature is one of several mutually + exclusive alternate features. For example, all of the sanitizers could + specify provides = ["sanitizer"].

    +

    This improves error handling by listing the alternatives if the user asks + for two or more mutually exclusive features at once.

    +
    with_features = [
    +  with_feature_set(
    +    features = ['feature-1'],
    +    not_features = ['feature-2'],
    +  ),
    +]
    +
    Flag set-level. A feature can specify multiple flag sets with multiple. + When with_features is specified, the flag set will only expand + to the build command if there is at least one with_feature_set + for which all of the features in the specified features set + are enabled, and all the features specified in not_features + set are disabled. + If with_features is not specified, the flag set will be + applied unconditionally for every action specified. +
    + +## Actions {:#actions} + +Actions provide the flexibility to modify the circumstances under +which an action executes without assuming how the action will be run. An +`action_config` specifies the tool binary that an action invokes, while a +`feature` specifies the configuration (flags) that determine how that tool +behaves when the action is invoked. + +[Features](#features) reference actions to signal which Bazel actions +they affect since actions can modify the Bazel action graph. The +`CcToolchainConfigInfo` provider contains actions that have flags and tools +associated with them, such as `c++-compile`. Flags are assigned to each action +by associating them with a feature. + +Each action name represents a single type of action performed by Bazel, such as +compiling or linking. There is, however, a many-to-one relationship between +actions and Bazel action types, where a Bazel action type refers to a Java class +that implements an action (such as `CppCompileAction`). In particular, the +"assembler actions" and "compiler actions" in the table below are +`CppCompileAction`, while the link actions are `CppLinkAction`. + +### Assembler actions {:#assembler-actions} + + + + + + + + + + + + + + + + +
    Action + Description +
    preprocess-assemble + Assemble with preprocessing. Typically for .S files. +
    assemble + Assemble without preprocessing. Typically for .s files. +
    + +### Compiler actions {:#compiler-actions} + + + + + + + + + + + + + + + + + + + + + + + + +
    Action + Description +
    cc-flags-make-variable + Propagates CC_FLAGS to genrules. +
    c-compile + Compile as C. +
    c++-compile + Compile as C++. +
    c++-header-parsing + Run the compiler's parser on a header file to ensure that the header is + self-contained, as it will otherwise produce compilation errors. Applies + only to toolchains that support modules. +
    + +### Link actions {:#link-actions} + + + + + + + + + + + + + + + + + + + + +
    Action + Description +
    c++-link-dynamic-library + Link a shared library containing all of its dependencies. +
    c++-link-nodeps-dynamic-library + Link a shared library only containing cc_library sources. +
    c++-link-executable + Link a final ready-to-run library. +
    + +### AR actions {:#ar-actions} + +AR actions assemble object files into archive libraries (`.a` files) via `ar` +and encode some semantics into the name. + + + + + + + + + + + + +
    Action + Description +
    c++-link-static-library + Create a static library (archive). +
    + +### LTO actions {:#lto-actions} + + + + + + + + + + + + + + + + +
    Action + Description +
    lto-backend + ThinLTO action compiling bitcodes into native objects. +
    lto-index + ThinLTO action generating global index. +
    + +## Using action_config {:#using-action-config} + +The `action_config` is a Starlark struct that describes a Bazel +action by specifying the tool (binary) to invoke during the action and sets of +flags, defined by features. These flags apply constraints to the action's +execution. + +The `action_config()` constructor has the following parameters: + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute + Description +
    action_name + The Bazel action to which this action corresponds. + Bazel uses this attribute to discover per-action tool and execution + requirements. +
    tools + The executable to invoke. The tool applied to the action will be the + first tool in the list with a feature set that matches the feature + configuration. Default value must be provided. +
    flag_sets + A list of flags that applies to a group of actions. Same as for a + feature. +
    env_sets + A list of environment constraints that applies to a group of actions. + Same as for a feature. +
    + +An `action_config` can require and imply other features and +action_configs as dictated by the +[feature relationships](#feature-relationships) described earlier. This behavior +is similar to that of a feature. + +The last two attributes are redundant against the corresponding attributes on +features and are included because some Bazel actions require certain flags or +environment variables and the goal is to avoid unnecessary `action_config`+`feature` +pairs. Typically, sharing a single feature across multiple `action_config`s is +preferred. + +You can not define more than one `action_config` with the same `action_name` +within the same toolchain. This prevents ambiguity in tool paths +and enforces the intention behind `action_config` - that an action's properties +are clearly described in a single place in the toolchain. + +### Using tool constructor {:#using-tool-constructor} + +An`action_config` can specify a set of tools via its `tools` parameter. +The `tool()` constructor takes in the following parameters: + + + + + + + + + + + + + + + + +
    Field + Description +
    path + Path to the tool in question (relative to the current location). +
    with_features + A list of feature sets out of which at least one must be satisfied + for this tool to apply. +
    + +For a given `action_config`, only a single `tool` applies +its tool path and execution requirements to the Bazel action. A tool is selected +by iterating through the `tools` attribute on an `action_config` until a tool +with a `with_feature` set matching the feature configuration is found +(see [Feature relationships](#feature-relationships) earlier on this page +for more information). You should end your tool lists with a default +tool that corresponds to an empty feature configuration. + +### Example usage {:#example-usage} + +Features and actions can be used together to implement Bazel actions +with diverse cross-platform semantics. For example, debug symbol generation on +macOS requires generating symbols in the compile action, then invoking a +specialized tool during the link action to create compressed dsym archive, and +then decompressing that archive to produce the application bundle and `.plist` +files consumable by Xcode. + +With Bazel, this process can instead be implemented as follows, with +`unbundle-debuginfo` being a Bazel action: + + load("@rules_cc//cc:defs.bzl", "ACTION_NAMES") + + action_configs = [ + action_config ( + action_name = ACTION_NAMES.cpp_link_executable, + tools = [ + tool( + with_features = [ + with_feature(features=["generate-debug-symbols"]), + ], + path = "toolchain/mac/ld-with-dsym-packaging", + ), + tool (path = "toolchain/mac/ld"), + ], + ), + ] + + features = [ + feature( + name = "generate-debug-symbols", + flag_sets = [ + flag_set ( + actions = [ + ACTION_NAMES.c_compile, + ACTION_NAMES.cpp_compile + ], + flag_groups = [ + flag_group( + flags = ["-g"], + ), + ], + ) + ], + implies = ["unbundle-debuginfo"], + ), + ] + +This same feature can be implemented entirely differently for Linux, which uses +`fission`, or for Windows, which produces `.pdb` files. For example, the +implementation for `fission`-based debug symbol generation might look as +follows: + + load("@rules_cc//cc:defs.bzl", "ACTION_NAMES") + + action_configs = [ + action_config ( + name = ACTION_NAMES.cpp_compile, + tools = [ + tool( + path = "toolchain/bin/gcc", + ), + ], + ), + ] + + features = [ + feature ( + name = "generate-debug-symbols", + requires = [with_feature_set(features = ["dbg"])], + flag_sets = [ + flag_set( + actions = [ACTION_NAMES.cpp_compile], + flag_groups = [ + flag_group( + flags = ["-gsplit-dwarf"], + ), + ], + ), + flag_set( + actions = [ACTION_NAMES.cpp_link_executable], + flag_groups = [ + flag_group( + flags = ["-Wl", "--gdb-index"], + ), + ], + ), + ], + ), + ] + +### Flag groups {:#flag-groups} + +`CcToolchainConfigInfo` allows you to bundle flags into groups that serve a +specific purpose. You can specify a flag within using pre-defined variables +within the flag value, which the compiler expands when adding the flag to the +build command. For example: + + flag_group ( + flags = ["%{output_execpath}"], + ) + +In this case, the contents of the flag will be replaced by the output file path +of the action. + +Flag groups are expanded to the build command in the order in which they appear +in the list, top-to-bottom, left-to-right. + +For flags that need to repeat with different values when added to the build +command, the flag group can iterate variables of type `list`. For example, the +variable `include_path` of type `list`: + + flag_group ( + iterate_over = "include_paths", + flags = ["-I%{include_paths}"], + ) + +expands to `-I` for each path element in the `include_paths` list. All +flags (or `flag_group`s) in the body of a flag group declaration are expanded as +a unit. For example: + + flag_group ( + iterate_over = "include_paths", + flags = ["-I", "%{include_paths}"], + ) + +expands to `-I ` for each path element in the `include_paths` list. + +A variable can repeat multiple times. For example: + + flag_group ( + iterate_over = "include_paths", + flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"], + ) + +expands to: + + -iprefix= -isystem= -iprefix= -isystem= + +Variables can correspond to structures accessible using dot-notation. For +example: + + flag_group ( + flags = ["-l%{libraries_to_link.name}"], + ) + +Structures can be nested and may also contain sequences. To prevent name clashes +and to be explicit, you must specify the full path through the fields. For +example: + + flag_group ( + iterate_over = "libraries_to_link", + flag_groups = [ + flag_group ( + iterate_over = "libraries_to_link.shared_libraries", + flags = ["-l%{libraries_to_link.shared_libraries.name}"], + ), + ], + ) + +### Conditional expansion {:#conditional-expansion} + +Flag groups support conditional expansion based on the presence of a particular +variable or its field using the `expand_if_available`, `expand_if_not_available`, +`expand_if_true`, `expand_if_false`, or `expand_if_equal` attributes. For example: + + flag_group ( + iterate_over = "libraries_to_link", + flag_groups = [ + flag_group ( + iterate_over = "libraries_to_link.shared_libraries", + flag_groups = [ + flag_group ( + expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive", + flags = ["--whole_archive"], + ), + flag_group ( + flags = ["-l%{libraries_to_link.shared_libraries.name}"], + ), + flag_group ( + expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive", + flags = ["--no_whole_archive"], + ), + ], + ), + ], + ) + +Note: The `--whole_archive` and `--no_whole_archive` options are added to +the build command only when a currently iterated library has an +`is_whole_archive` field. + +## CcToolchainConfigInfo reference {:#cctoolchainconfiginfo-reference} + +This section provides a reference of build variables, features, and other +information required to successfully configure C++ rules. + +### CcToolchainConfigInfo build variables {:#cctoolchainconfiginfo-build-variables} + +The following is a reference of `CcToolchainConfigInfo` build variables. + +Note: The **Action** column indicates the relevant action type, if applicable. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Variable + Action + Description +
    source_file + compileSource file to compile. +
    input_file + stripArtifact to strip. +
    output_file + compile, stripCompilation output. +
    output_assembly_file + compileEmitted assembly file. Applies only when the + compile action emits assembly text, typically when using the + --save_temps flag. The contents are the same as for + output_file. +
    output_preprocess_file + compilePreprocessed output. Applies only to compile + actions that only preprocess the source files, typically when using the + --save_temps flag. The contents are the same as for + output_file. +
    includes + compileSequence of files the compiler must + unconditionally include in the compiled source. +
    include_paths + compileSequence directories in which the compiler + searches for headers included using #include<foo.h> + and #include "foo.h". +
    quote_include_paths + compileSequence of -iquote includes - + directories in which the compiler searches for headers included using + #include "foo.h". +
    system_include_paths + compileSequence of -isystem includes - + directories in which the compiler searches for headers included using + #include <foo.h>. +
    dependency_file + compileThe .d dependency file generated by the compiler. +
    preprocessor_defines + compileSequence of defines, such as --DDEBUG. +
    pic + compileCompiles the output as position-independent code. +
    gcov_gcno_file + compileThe gcov coverage file. +
    per_object_debug_info_file + compileThe per-object debug info (.dwp) file. +
    stripopts + stripSequence of stripopts. +
    legacy_compile_flags + compileSequence of flags from legacy + CROSSTOOL fields such as compiler_flag, + optional_compiler_flag, cxx_flag, and + optional_cxx_flag. +
    user_compile_flags + compileSequence of flags from either the + copt rule attribute or the --copt, + --cxxopt, and --conlyopt flags. +
    unfiltered_compile_flags + compileSequence of flags from the + unfiltered_cxx_flag legacy CROSSTOOL field or the + unfiltered_compile_flags feature. These are not filtered by + the nocopts rule attribute. +
    sysroot + The sysroot. +
    runtime_library_search_directories + linkEntries in the linker runtime search path (usually + set with the -rpath flag). +
    library_search_directories + linkEntries in the linker search path (usually set with + the -L flag). +
    libraries_to_link + linkFlags providing files to link as inputs in the linker invocation. +
    def_file_path + linkLocation of def file used on Windows with MSVC. +
    linker_param_file + linkLocation of linker param file created by bazel to + overcome command line length limit. +
    output_execpath + linkExecpath of the output of the linker. +
    generate_interface_library + link"yes" or "no" depending on whether interface library should + be generated. +
    interface_library_builder_path + linkPath to the interface library builder tool. +
    interface_library_input_path + linkInput for the interface library ifso builder tool. +
    interface_library_output_path + linkPath where to generate interface library using the ifso builder tool. +
    legacy_link_flags + linkLinker flags coming from the legacy CROSSTOOL fields. +
    user_link_flags + linkLinker flags coming from the --linkopt + or linkopts attribute. +
    linkstamp_paths + linkA build variable giving linkstamp paths. +
    force_pic + linkPresence of this variable indicates that PIC/PIE code should + be generated (Bazel option `--force_pic` was passed). +
    strip_debug_symbols + linkPresence of this variable indicates that the debug + symbols should be stripped. +
    is_cc_test + linkTruthy when current action is a cc_test + linking action, false otherwise. +
    is_using_fission + compile, linkPresence of this variable indicates that fission (per-object debug info) + is activated. Debug info will be in .dwo files instead + of .o files and the compiler and linker need to know this. +
    fdo_instrument_path + compile, link Path to the directory that stores FDO instrumentation profile. +
    fdo_profile_path + compile Path to FDO profile. +
    fdo_prefetch_hints_path + compile Path to the cache prefetch profile. +
    cs_fdo_instrument_path + compile, link Path to the directory that stores context sensitive FDO + instrumentation profile. +
    + +### Well-known features {:#wellknown-features} + +The following is a reference of features and their activation +conditions. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Feature + Documentation +
    opt | dbg | fastbuild + Enabled by default based on compilation mode. +
    static_linking_mode | dynamic_linking_mode + Enabled by default based on linking mode. +
    per_object_debug_info + Enabled if the supports_fission feature is specified and + enabled and the current compilation mode is specified in the + --fission flag. +
    supports_start_end_lib + If enabled (and the option --start_end_lib is set), Bazel + will not link against static libraries but instead use the + --start-lib/--end-lib linker options to link against objects + directly. This speeds up the build since Bazel doesn't have to build + static libraries. +
    supports_interface_shared_libraries + If enabled (and the option --interface_shared_objects is + set), Bazel will link targets that have linkstatic set to + False (cc_tests by default) against interface shared + libraries. This makes incremental relinking faster. +
    supports_dynamic_linker + If enabled, C++ rules will know the toolchain can produce shared + libraries. +
    static_link_cpp_runtimes + If enabled, Bazel will link the C++ runtime statically in static linking + mode and dynamically in dynamic linking mode. Artifacts + specified in the cc_toolchain.static_runtime_lib or + cc_toolchain.dynamic_runtime_lib attribute (depending on the + linking mode) will be added to the linking actions. +
    supports_pic + If enabled, toolchain will know to use PIC objects for dynamic libraries. + The `pic` variable is present whenever PIC compilation is needed. If not enabled + by default, and `--force_pic` is passed, Bazel will request `supports_pic` and + validate that the feature is enabled. If the feature is missing, or couldn't + be enabled, `--force_pic` cannot be used. +
    + static_linking_mode | dynamic_linking_mode + Enabled by default based on linking mode.
    no_legacy_features + + Prevents Bazel from adding legacy features to + the C++ configuration when present. See the complete list of + features below. +
    shorten_virtual_includes + + If enabled, virtual include header files are linked under bin/_virtual_includes/<hash of target path> instead of bin/<target package path>/_virtual_includes/<target name>. Useful on Windows to avoid long path issue with MSVC. +
    + +#### Legacy features patching logic {:#legacy-features-patching-logic} + +

    + Bazel applies the following changes to the toolchain's features for backwards + compatibility: + +

      +
    • Moves legacy_compile_flags feature to the top of the toolchain
    • +
    • Moves default_compile_flags feature to the top of the toolchain
    • +
    • Adds dependency_file (if not present) feature to the top of the toolchain
    • +
    • Adds pic (if not present) feature to the top of the toolchain
    • +
    • Adds per_object_debug_info (if not present) feature to the top of the toolchain
    • +
    • Adds preprocessor_defines (if not present) feature to the top of the toolchain
    • +
    • Adds includes (if not present) feature to the top of the toolchain
    • +
    • Adds include_paths (if not present) feature to the top of the toolchain
    • +
    • Adds fdo_instrument (if not present) feature to the top of the toolchain
    • +
    • Adds fdo_optimize (if not present) feature to the top of the toolchain
    • +
    • Adds cs_fdo_instrument (if not present) feature to the top of the toolchain
    • +
    • Adds cs_fdo_optimize (if not present) feature to the top of the toolchain
    • +
    • Adds fdo_prefetch_hints (if not present) feature to the top of the toolchain
    • +
    • Adds autofdo (if not present) feature to the top of the toolchain
    • +
    • Adds build_interface_libraries (if not present) feature to the top of the toolchain
    • +
    • Adds dynamic_library_linker_tool (if not present) feature to the top of the toolchain
    • +
    • Adds shared_flag (if not present) feature to the top of the toolchain
    • +
    • Adds linkstamps (if not present) feature to the top of the toolchain
    • +
    • Adds output_execpath_flags (if not present) feature to the top of the toolchain
    • +
    • Adds runtime_library_search_directories (if not present) feature to the top of the toolchain
    • +
    • Adds library_search_directories (if not present) feature to the top of the toolchain
    • +
    • Adds archiver_flags (if not present) feature to the top of the toolchain
    • +
    • Adds libraries_to_link (if not present) feature to the top of the toolchain
    • +
    • Adds force_pic_flags (if not present) feature to the top of the toolchain
    • +
    • Adds user_link_flags (if not present) feature to the top of the toolchain
    • +
    • Adds legacy_link_flags (if not present) feature to the top of the toolchain
    • +
    • Adds static_libgcc (if not present) feature to the top of the toolchain
    • +
    • Adds fission_support (if not present) feature to the top of the toolchain
    • +
    • Adds strip_debug_symbols (if not present) feature to the top of the toolchain
    • +
    • Adds coverage (if not present) feature to the top of the toolchain
    • +
    • Adds llvm_coverage_map_format (if not present) feature to the top of the toolchain
    • +
    • Adds gcc_coverage_map_format (if not present) feature to the top of the toolchain
    • +
    • Adds fully_static_link (if not present) feature to the bottom of the toolchain
    • +
    • Adds user_compile_flags (if not present) feature to the bottom of the toolchain
    • +
    • Adds sysroot (if not present) feature to the bottom of the toolchain
    • +
    • Adds unfiltered_compile_flags (if not present) feature to the bottom of the toolchain
    • +
    • Adds linker_param_file (if not present) feature to the bottom of the toolchain
    • +
    • Adds compiler_input_flags (if not present) feature to the bottom of the toolchain
    • +
    • Adds compiler_output_flags (if not present) feature to the bottom of the toolchain
    • +
    +

    + +This is a long list of features. The plan is to get rid of them once +[Crosstool in Starlark](https://github.com/bazelbuild/bazel/issues/5380){: .external} is +done. For the curious reader see the implementation in +[CppActionConfigs](https://source.bazel.build/bazel/+/master:src/main/java/com/google/devtools/build/lib/rules/cpp/CppActionConfigs.java?q=cppactionconfigs&ss=bazel), +and for production toolchains consider adding `no_legacy_features` to make +the toolchain more standalone. + diff --git a/docs/user-manual.mdx b/docs/user-manual.mdx new file mode 100644 index 000000000..057991ac8 --- /dev/null +++ b/docs/user-manual.mdx @@ -0,0 +1,2497 @@ +--- +title: 'Commands and Options' +--- + +This page covers the options that are available with various Bazel commands, +such as `bazel build`, `bazel run`, and `bazel test`. This page is a companion +to the list of Bazel's commands in [Build with Bazel](/run/build). + +## Target syntax {:#target-syntax} + +Some commands, like `build` or `test`, can operate on a list of targets. They +use a syntax more flexible than labels, which is documented in +[Specifying targets to build](/run/build#specifying-build-targets). + +## Options {:#build-options} + +The following sections describe the options available during a +build. When `--long` is used on a help command, the on-line +help messages provide summary information about the meaning, type and +default value for each option. + +Most options can only be specified once. When specified multiple times, the +last instance wins. Options that can be specified multiple times are +identified in the on-line help with the text 'may be used multiple times'. + +### Package location {:#package-location} + +#### `--package_path` {:#package-path} + +**WARNING:** The `--package_path` option is deprecated. Bazel prefers packages +in the main repository to be under the workspace root. + +This option specifies the set of directories that are searched to +find the BUILD file for a given package. + +Bazel finds its packages by searching the package path. This is a colon +separated ordered list of bazel directories, each being the root of a +partial source tree. + +_To specify a custom package path_ using the `--package_path` option: + +
    +  % bazel build --package_path %workspace%:/some/other/root
    +
    + +Package path elements may be specified in three formats: + +1. If the first character is `/`, the path is absolute. +2. If the path starts with `%workspace%`, the path is taken relative + to the nearest enclosing bazel directory. + For instance, if your working directory + is `/home/bob/clients/bob_client/bazel/foo`, then the + string `%workspace%` in the package-path is expanded + to `/home/bob/clients/bob_client/bazel`. +3. Anything else is taken relative to the working directory. + This is usually not what you mean to do, + and may behave unexpectedly if you use Bazel from directories below the bazel workspace. + For instance, if you use the package-path element `.`, + and then cd into the directory + `/home/bob/clients/bob_client/bazel/foo`, packages + will be resolved from the + `/home/bob/clients/bob_client/bazel/foo` directory. + +If you use a non-default package path, specify it in your +[Bazel configuration file](/run/bazelrc) for convenience. + +_Bazel doesn't require any packages to be in the +current directory_, so you can do a build from an empty bazel +workspace if all the necessary packages can be found somewhere else +on the package path. + +Example: Building from an empty client + +
    +  % mkdir -p foo/bazel
    +  % cd foo/bazel
    +  % touch MODULE.bazel
    +  % bazel build --package_path /some/other/path //foo
    +
    + +#### `--deleted_packages` {:flag--deleted_packages} + +This option specifies a comma-separated list of packages which Bazel +should consider deleted, and not attempt to load from any directory +on the package path. This can be used to simulate the deletion of packages without +actually deleting them. This option can be passed multiple times, in which case +the individual lists are concatenated. + +### Error checking {:#error-checking} + +These options control Bazel's error-checking and/or warnings. + +#### `--[no]check_visibility` {:#check-visibility} + +If this option is set to false, visibility checks are demoted to warnings. +The default value of this option is true, so that by default, visibility +checking is done. + +#### `--output_filter={{ "" }}regex{{ "" }}` {:#output-filter} + +The `--output_filter` option will only show build and compilation +warnings for targets that match the regular expression. If a target does not +match the given regular expression and its execution succeeds, its standard +output and standard error are thrown away. + +Here are some typical values for this option: + + + + + + + + + + + + + + + + + + +
    `--output_filter='^//(first/project|second/project):'`Show the output for the specified packages.
    `--output_filter='^//((?!(first/bad_project|second/bad_project):).)*$'`Don't show output for the specified packages.
    `--output_filter=`Show everything. +
    `--output_filter=DONT_MATCH_ANYTHING`Show nothing. +
    + +### Tool flags {:#tool-flags} + +These options control which options Bazel will pass to other tools. + +#### `--copt={{ "" }}cc-option{{ "" }}` {:#copt} + +This option takes an argument which is to be passed to the compiler. +The argument will be passed to the compiler whenever it is invoked +for preprocessing, compiling, and/or assembling C, C++, or +assembler code. It will not be passed when linking. + +This option can be used multiple times. For example: + +
    +  % bazel build --copt="-g0" --copt="-fpic" //foo
    +
    + +will compile the `foo` library without debug tables, generating +position-independent code. + +Note: Changing `--copt` settings will force a recompilation +of all affected object files. Also note that copts values listed in specific +cc_library or cc_binary build rules will be placed on the compiler command line +_after_ these options. + +Warning: C++-specific options (such as `-fno-implicit-templates`) +should be specified in `--cxxopt`, not in +`--copt`. Likewise, C-specific options (such as -Wstrict-prototypes) +should be specified in `--conlyopt`, not in `copt`. +Similarly, compiler options that only have an +effect at link time (such as `-l`) should be specified in +`--linkopt`, not in `--copt`. + +#### `--host_copt={{ "" }}cc-option{{ "" }}` {:#host-copt} + +This option takes an argument which is to be passed to the compiler for source files +that are compiled in the exec configuration. This is analogous to +the [`--copt`](#copt) option, but applies only to the +exec configuration. + +#### `--host_conlyopt={{ "" }}cc-option{{ "" }}` {:#host-conlyopt} + +This option takes an argument which is to be passed to the compiler for C source files +that are compiled in the exec configuration. This is analogous to +the [`--conlyopt`](#cconlyopt) option, but applies only +to the exec configuration. + +#### `--host_cxxopt={{ "" }}cc-option{{ "" }}` {:#host-cxxopt} + +This option takes an argument which is to be passed to the compiler for C++ source files +that are compiled in the exec configuration. This is analogous to +the [`--cxxopt`](#cxxopt) option, but applies only to the +exec configuration. + +#### `--host_linkopt={{ "" }}linker-option{{ "" }}` {:#host-linkopt} + +This option takes an argument which is to be passed to the linker for source files +that are compiled in the exec configuration. This is analogous to +the [`--linkopt`](#linkopt) option, but applies only to +the exec configuration. + +#### `--conlyopt={{ "" }}cc-option{{ "" }}` {:#cconlyopt} + +This option takes an argument which is to be passed to the compiler when compiling C source files. + +This is similar to `--copt`, but only applies to C compilation, +not to C++ compilation or linking. So you can pass C-specific options +(such as `-Wno-pointer-sign`) using `--conlyopt`. + +Note: copts parameters listed in specific cc_library or cc_binary build rules +are placed on the compiler command line _after_ these options. + +#### `--cxxopt={{ "" }}cc-option{{ "" }}` {:#cxxopt} + +This option takes an argument which is to be passed to the compiler when +compiling C++ source files. + +This is similar to `--copt`, but only applies to C++ compilation, +not to C compilation or linking. So you can pass C++-specific options +(such as `-fpermissive` or `-fno-implicit-templates`) using `--cxxopt`. + +For example: + +
    +  % bazel build --cxxopt="-fpermissive" --cxxopt="-Wno-error" //foo/cruddy_code
    +
    + +Note: copts parameters listed in specific cc_library or cc_binary build rules +are placed on the compiler command line _after_ these options. + +#### `--linkopt={{ "" }}linker-option{{ "" }}` {:#linkopt} + +This option takes an argument which is to be passed to the compiler when linking. + +This is similar to `--copt`, but only applies to linking, +not to compilation. So you can pass compiler options that only make sense +at link time (such as `-lssp` or `-Wl,--wrap,abort`) +using `--linkopt`. For example: + +
    +  % bazel build --copt="-fmudflap" --linkopt="-lmudflap" //foo/buggy_code
    +
    + +Build rules can also specify link options in their attributes. This option's +settings always take precedence. Also see +[cc_library.linkopts](/reference/be/c-cpp#cc_library.linkopts). + +#### `--strip (always|never|sometimes)` {:#strip} + +This option determines whether Bazel will strip debugging information from +all binaries and shared libraries, by invoking the linker with the `-Wl,--strip-debug` option. +`--strip=always` means always strip debugging information. +`--strip=never` means never strip debugging information. +The default value of `--strip=sometimes` means strip if the `--compilation_mode` +is `fastbuild`. + +
    +  % bazel build --strip=always //foo:bar
    +
    + +will compile the target while stripping debugging information from all generated +binaries. + +Note: If you want debugging information, it's not enough to disable stripping; +you also need to make sure that the debugging information was generated by the +compiler, which you can do by using either `-c dbg` or `--copt -g`. + +Bazel's `--strip` option corresponds with ld's `--strip-debug` option: +it only strips debugging information. If for some reason you want to strip _all_ symbols, +not just _debug_ symbols, you would need to use ld's `--strip-all` option, +which you can do by passing `--linkopt=-Wl,--strip-all` to Bazel. Also be +aware that setting Bazel's `--strip` flag will override +`--linkopt=-Wl,--strip-all`, so you should only set one or the other. + +If you are only building a single binary and want all symbols stripped, you could also +pass `--stripopt=--strip-all` and explicitly build the +`//foo:bar.stripped` version of the target. As described in the section on +`--stripopt`, this applies a strip action after the final binary is +linked rather than including stripping in all of the build's link actions. + +#### `--stripopt={{ "" }}strip-option{{ "" }}` {:#stripopt} + +This is an additional option to pass to the `strip` command when generating +a [`*.stripped` binary](/reference/be/c-cpp#cc_binary_implicit_outputs). The default +is `-S -p`. This option can be used multiple times. + +Note: `--stripopt` does not apply to the stripping of the main +binary with `[--strip](#flag--strip)=(always|sometimes)`. + +#### `--fdo_instrument={{ "" }}profile-output-dir{{ "" }}` {:#fdo-instrument} + +The `--fdo_instrument` option enables the generation of +FDO (feedback directed optimization) profile output when the +built C/C++ binary is executed. For GCC, the argument provided is used as a +directory prefix for a per-object file directory tree of .gcda files +containing profile information for each .o file. + +Once the profile data tree has been generated, the profile tree +should be zipped up, and provided to the +`--fdo_optimize={{ "" }}profile-zip{{ "" }}` +Bazel option to enable the FDO-optimized compilation. + +For the LLVM compiler the argument is also the directory under which the raw LLVM profile +data file(s) is dumped. For example: +`--fdo_instrument={{ "" }}/path/to/rawprof/dir/{{ "" }}`. + +The options `--fdo_instrument` and `--fdo_optimize` cannot be used at the same time. + +#### `--fdo_optimize={{ "" }}profile-zip{{ "" }}` {:#fdo-optimize} + +The `--fdo_optimize` option enables the use of the +per-object file profile information to perform FDO (feedback +directed optimization) optimizations when compiling. For GCC, the argument +provided is the zip file containing the previously-generated file tree +of .gcda files containing profile information for each .o file. + +Alternatively, the argument provided can point to an auto profile +identified by the extension .afdo. + +Note: This option also accepts labels that resolve to source files. You +may need to add an `exports_files` directive to the corresponding package to +make the file visible to Bazel. + +For the LLVM compiler the argument provided should point to the indexed LLVM +profile output file prepared by the llvm-profdata tool, and should have a .profdata +extension. + +The options `--fdo_instrument` and `--fdo_optimize` cannot be used at the same time. + +#### `--java_language_version={{ "" }}version{{ "" }}` {:#java-language-version} + +This option specifies the version of Java sources. For example: + +
    +  % bazel build --java_language_version=8 java/com/example/common/foo:all
    +
    + +compiles and allows only constructs compatible with Java 8 specification. +Default value is 11. --> +Possible values are: 8, 9, 10, 11, 17, and 21 and may be extended by +registering custom Java toolchains using `default_java_toolchain`. + +#### `--tool_java_language_version={{ "" }}version{{ "" }}` {:#tool-java-language-version} + +The Java language version used to build tools that are executed during a build. +Default value is 11. + +#### `--java_runtime_version={{ "" }}version{{ "" }}` {:#java-runtime-version} + +This option specifies the version of JVM to use to execute the code and run the tests. For +example: + +
    +  % bazel run --java_runtime_version=remotejdk_11 java/com/example/common/foo:java_application
    +
    + +downloads JDK 11 from a remote repository and run the Java application using it. + +Default value is `local_jdk`. +Possible values are: `local_jdk`, `local_jdk_{{ "" }}version{{ "" }}`, +`remotejdk_11`, `remotejdk_17`, and `remotejdk_21`. +You can extend the values by registering custom JVM using either +`local_java_repository` or `remote_java_repository` repository rules. + +#### `--tool_java_runtime_version={{ "" }}version{{ "" }}` {:#tool-java-runtime-version} + +The version of JVM used to execute tools that are needed during a build. +Default value is `remotejdk_11`. + +#### `--jvmopt={{ "" }}jvm-option{{ "" }}` {:#jvmopt} + +This option allows option arguments to be passed to the Java VM. It can be used +with one big argument, or multiple times with individual arguments. For example: + +
    +  % bazel build --jvmopt="-server -Xms256m" java/com/example/common/foo:all
    +
    + +will use the server VM for launching all Java binaries and set the +startup heap size for the VM to 256 MB. + +#### `--javacopt={{ "" }}javac-option{{ "" }}` {:#javacopt} + +This option allows option arguments to be passed to javac. It can be used +with one big argument, or multiple times with individual arguments. For example: + +
    +  % bazel build --javacopt="-g:source,lines" //myprojects:prog
    +
    + +will rebuild a java_binary with the javac default debug info +(instead of the bazel default). + +The option is passed to javac after the Bazel built-in default options for +javac and before the per-rule options. The last specification of +any option to javac wins. The default options for javac are: + +
    +  -source 8 -target 8 -encoding UTF-8
    +
    + +Note: Changing `--javacopt` settings will force a recompilation +of all affected classes. Also note that javacopts parameters listed in +specific java_library or java_binary build rules will be placed on the javac +command line _after_ these options. + +#### `--strict_java_deps (default|strict|off|warn|error)` {:#strict-java-deps} + +This option controls whether javac checks for missing direct dependencies. +Java targets must explicitly declare all directly used targets as +dependencies. This flag instructs javac to determine the jars actually used +for type checking each java file, and warn/error if they are not the output +of a direct dependency of the current target. + +* `off` means checking is disabled. +* `warn` means javac will generate standard java warnings of + type `[strict]` for each missing direct dependency. +* `default`, `strict` and `error` all + mean javac will generate errors instead of warnings, causing the current + target to fail to build if any missing direct dependencies are found. + This is also the default behavior when the flag is unspecified. + +### Build semantics {:#build-semantics} + +These options affect the build commands and/or the output file contents. + +#### `--compilation_mode (fastbuild|opt|dbg)` (-c) {:#compilation-mode} + +The `--compilation_mode` option (often shortened to `-c`, +especially `-c opt`) takes an argument of `fastbuild`, `dbg` +or `opt`, and affects various C/C++ code-generation +options, such as the level of optimization and the completeness of +debug tables. Bazel uses a different output directory for each +different compilation mode, so you can switch between modes without +needing to do a full rebuild _every_ time. + +* `fastbuild` means build as fast as possible: + generate minimal debugging information (`-gmlt + -Wl,-S`), and don't optimize. This is the + default. Note: `-DNDEBUG` will **not** be set. +* `dbg` means build with debugging enabled (`-g`), + so that you can use gdb (or another debugger). +* `opt` means build with optimization enabled and + with `assert()` calls disabled (`-O2 -DNDEBUG`). + Debugging information will not be generated in `opt` mode + unless you also pass `--copt -g`. + +#### `--cpu={{ "" }}cpu{{ "" }}` {:#cpu} + +This option specifies the target CPU architecture to be used for +the compilation of binaries during the build. + +Note: A particular combination of crosstool version, compiler version, +and target CPU is allowed only if it has been specified in the currently +used CROSSTOOL file. + +#### `--action_env={{ "" }}VAR=VALUE{{ "" }}` {:#action-env} + +Specifies the set of environment variables available during the execution of all actions. +Variables can be either specified by name, in which case the value will be taken from the +invocation environment, or by the `name=value` pair which sets the value independent of the +invocation environment. + +This `--action_env` flag can be specified multiple times. If a value is assigned to the same +variable across multiple `--action_env` flags, the latest assignment wins. + +#### `--experimental_action_listener={{ "" }}label{{ "" }}` {:#experimental-action-listener} + +Warning: Extra actions are deprecated. Use +[aspects](/extending/aspects) +instead. + +The `experimental_action_listener` option instructs Bazel to use +details from the [`action_listener`](/reference/be/extra-actions#action_listener) rule specified by {{ "" }}label{{ "" }} to +insert [`extra_actions`](/reference/be/extra-actions#extra_action) into the build graph. + +#### `--[no]experimental_extra_action_top_level_only` {:experimental-extra-action-top-level-only} + +Warning: Extra actions are deprecated. Use +[aspects](/extending/aspects) instead. + +If this option is set to true, extra actions specified by the +[ `--experimental_action_listener`](#experimental-action-listener) command +line option will only be scheduled for top level targets. + +#### `--experimental_extra_action_filter={{ "" }}regex{{ "" }}` {:#experimental-extra-action-filter} + +Warning: Extra actions are deprecated. Use +[aspects](/extending/aspects) instead. + +The `experimental_extra_action_filter` option instructs Bazel to +filter the set of targets to schedule `extra_actions` for. + +This flag is only applicable in combination with the +[`--experimental_action_listener`](#experimental-action-listener) flag. + +By default all `extra_actions` in the transitive closure of the +requested targets-to-build get scheduled for execution. +`--experimental_extra_action_filter` will restrict scheduling to +`extra_actions` of which the owner's label matches the specified +regular expression. + +The following example will limit scheduling of `extra_actions` +to only apply to actions of which the owner's label contains '/bar/': + +
    % bazel build --experimental_action_listener=//test:al //foo/... \
    +  --experimental_extra_action_filter=.*/bar/.*
    +
    + +#### `--host_cpu={{ "" }}cpu{{ "" }}` {:#host-cpu} + +This option specifies the name of the CPU architecture that should be +used to build host tools. + +#### `--android_platforms={{ "" }}platform[,platform]*{{ "" }}` {:#android-platforms} + +The platforms to build the transitive `deps` of +`android_binary` rules (specifically for native dependencies like C++). For +example, if a `cc_library` appears in the transitive `deps` of an +`android_binary` rule it is be built once for each platform specified with +`--android_platforms` for the `android_binary` rule, and included in the final +output. + +There is no default value for this flag: a custom Android platform must be +defined and used. + +One `.so` file is created and packaged in the APK for each platform specified +with `--android_platforms`. The `.so` file's name prefixes the name of the +`android_binary` rule with "lib". For example, if the name of the +`android_binary` is "foo", then the file is `libfoo.so`. + +#### `--per_file_copt={{ "" }}[+-]regex[,[+-]regex]...@option[,option]...{{ "" }}` {:#per-file-copt} + +When present, any C++ file with a label or an execution path matching one of the inclusion regex +expressions and not matching any of the exclusion expressions will be built +with the given options. The label matching uses the canonical form of the label +(i.e //`package`:`label_name`). + +The execution path is the relative path to your workspace directory including the base name +(including extension) of the C++ file. It also includes any platform dependent prefixes. + +Note: If only one of the label or the execution path matches the options will be used. + +To match the generated files (such as genrule outputs) +Bazel can only use the execution path. In this case the regexp shouldn't start with '//' +since that doesn't match any execution paths. Package names can be used like this: +`--per_file_copt=base/.*\.pb\.cc@-g0`. This will match every +`.pb.cc` file under a directory called `base`. + +This option can be used multiple times. + +The option is applied regardless of the compilation mode used. For example, it is possible +to compile with `--compilation_mode=opt` and selectively compile some +files with stronger optimization turned on, or with optimization disabled. + +**Caveat**: If some files are selectively compiled with debug symbols the symbols +might be stripped during linking. This can be prevented by setting +`--strip=never`. + +**Syntax**: `[+-]regex[,[+-]regex]...@option[,option]...` Where +`regex` stands for a regular expression that can be prefixed with +a `+` to identify include patterns and with `-` to identify +exclude patterns. `option` stands for an arbitrary option that is passed +to the C++ compiler. If an option contains a `,` it has to be quoted like so +`\,`. Options can also contain `@`, since only the first +`@` is used to separate regular expressions from options. + +**Example**: +`--per_file_copt=//foo:.*\.cc,-//foo:file\.cc@-O0,-fprofile-arcs` +adds the `-O0` and the `-fprofile-arcs` options to the command +line of the C++ compiler for all `.cc` files in `//foo/` except `file.cc`. + +#### `--dynamic_mode={{ "" }}mode{{ "" }}` {:#dynamic-mode} + +Determines whether C++ binaries will be linked dynamically, interacting with +the [linkstatic attribute](/reference/be/c-cpp#cc_binary.linkstatic) on build rules. + +Modes: + +* `default`: Allows bazel to choose whether to link dynamically. + See [linkstatic](/reference/be/c-cpp#cc_binary.linkstatic) for more + information. +* `fully`: Links all targets dynamically. This will speed up + linking time, and reduce the size of the resulting binaries. +* `off`: Links all targets in + [mostly static](/reference/be/c-cpp#cc_binary.linkstatic) mode. + If `-static` is set in linkopts, targets will change to fully static. + +#### `--fission (yes|no|[dbg][,opt][,fastbuild])` {:#fission} + +Enables [Fission](https://gcc.gnu.org/wiki/DebugFission){: .external}, +which writes C++ debug information to dedicated .dwo files instead of .o files, where it would +otherwise go. This substantially reduces the input size to links and can reduce link times. + +When set to `[dbg][,opt][,fastbuild]` (example: +`--fission=dbg,fastbuild`), Fission is enabled +only for the specified set of compilation modes. This is useful for bazelrc +settings. When set to `yes`, Fission is enabled +universally. When set to `no`, Fission is disabled +universally. Default is no. + +#### `--force_ignore_dash_static` {:#force-ignore-dash-static} + +If this flag is set, any `-static` options in linkopts of +`cc_*` rules BUILD files are ignored. This is only intended as a +workaround for C++ hardening builds. + +#### `--[no]force_pic` {:#force-pic} + +If enabled, all C++ compilations produce position-independent code ("-fPIC"), +links prefer PIC pre-built libraries over non-PIC libraries, and links produce +position-independent executables ("-pie"). Default is disabled. + +Note: Dynamically linked binaries (for example `--dynamic_mode fully`) +generate PIC code regardless of this flag's setting. So this flag is for cases +where users want PIC code explicitly generated for static links. + +#### `--android_resource_shrinking` {:#flag--android_resource_shrinking} + +Selects whether to perform resource shrinking for android_binary rules. Sets the default for the +[shrink_resources attribute](/reference/be/android#android_binary.shrink_resources) on +android_binary rules; see the documentation for that rule for further details. Defaults to off. + +#### `--custom_malloc={{ "" }}malloc-library-target{{ "" }}` {:#custom-malloc} + +When specified, always use the given malloc implementation, overriding all +`malloc="target"` attributes, including in those targets that use the +default (by not specifying any `malloc`). + +#### `--crosstool_top={{ "" }}label{{ "" }}` {:#crosstool-top} + +This option specifies the location of the crosstool compiler suite +to be used for all C++ compilation during a build. Bazel will look in that +location for a CROSSTOOL file and uses that to automatically determine +settings for `--compiler`. + +#### `--host_crosstool_top={{ "" }}label{{ "" }}` {:#host-crosstool-top} + +If not specified, Bazel uses the value of `--crosstool_top` to compile +code in the exec configuration, such as tools run during the build. The main purpose of this flag +is to enable cross-compilation. + +#### `--apple_crosstool_top={{ "" }}label{{ "" }}` {:#apple-crosstool-top} + +The crosstool to use for compiling C/C++ rules in the transitive `deps` of +objc_*, ios__*, and apple_* rules. For those targets, this flag overwrites +`--crosstool_top`. + +#### `--compiler={{ "" }}version{{ "" }}` {:#compiler} + +This option specifies the C/C++ compiler version (such as `gcc-4.1.0`) +to be used for the compilation of binaries during the build. If you want to +build with a custom crosstool, you should use a CROSSTOOL file instead of +specifying this flag. + +Note: Only certain combinations of crosstool version, compiler version, +and target CPU are allowed. + +#### `--android_sdk={{ "" }}label{{ "" }}` {:#android-sdk} + +Deprecated. This shouldn't be directly specified. + +This option specifies the Android SDK/platform toolchain +and Android runtime library that will be used to build any Android-related +rule. + +The Android SDK will be automatically selected if an `android_sdk_repository` +rule is defined in the WORKSPACE file. + +#### `--java_toolchain={{ "" }}label{{ "" }}` {:#java-toolchain} + +No-op. Kept only for backwards compatibility. + +#### `--host_java_toolchain={{ "" }}label{{ "" }}` {:#host-java-toolchain} + +No-op. Kept only for backwards compatibility. + +#### `--javabase=({{ "" }}label{{ "" }})` {:#javabase} + +No-op. Kept only for backwards compatibility. + +#### `--host_javabase={{ "" }}label{{ "" }}` {:#host-javabase} + +No-op. Kept only for backwards compatibility. + +### Execution strategy {:#execution-strategy} + +These options affect how Bazel will execute the build. +They should not have any significant effect on the output files +generated by the build. Typically their main effect is on the +speed of the build. + +#### `--spawn_strategy={{ "" }}strategy{{ "" }}` {:#spawn-strategy} + +This option controls where and how commands are executed. + +* `standalone` causes commands to be executed as local subprocesses. This value is + deprecated. Please use `local` instead. +* `sandboxed` causes commands to be executed inside a sandbox on the local machine. + This requires that all input files, data dependencies and tools are listed as direct + dependencies in the `srcs`, `data` and `tools` attributes. + Bazel enables local sandboxing by default, on systems that support sandboxed execution. +* `local` causes commands to be executed as local subprocesses. +* `worker` causes commands to be executed using a persistent worker, if available. +* `docker` causes commands to be executed inside a docker sandbox on the local machine. + This requires that docker is installed. +* `remote` causes commands to be executed remotely; this is only available if a + remote executor has been configured separately. + +#### `--strategy {{ "" }}mnemonic{{ "" }}={{ "" }}strategy{{ "" }}` {:#strategy} + +This option controls where and how commands are executed, overriding the +[--spawn_strategy](#spawn-strategy) (and +[--genrule_strategy](#genrule-strategy) with mnemonic +Genrule) on a per-mnemonic basis. See +[--spawn_strategy](#spawn-strategy) for the supported +strategies and their effects. + +#### `--strategy_regexp={{ "" }}={{ "" }}` {:#strategy-regexp} + +This option specifies which strategy should be used to execute commands that have descriptions +matching a certain `regex_filter`. See +[--per_file_copt](#per-file-copt) for details on +regex_filter matching. See +[--spawn_strategy](#spawn-strategy) for the supported +strategies and their effects. + +The last `regex_filter` that matches the description is used. This option overrides +other flags for specifying strategy. + +* Example: `--strategy_regexp=//foo.*\\.cc,-//foo/bar=local` means to run actions using + `local` strategy if their descriptions match //foo.*.cc but not //foo/bar. +* Example: + `--strategy_regexp='Compiling.*/bar=local' --strategy_regexp=Compiling=sandboxed` + runs 'Compiling //foo/bar/baz' with the `sandboxed` strategy, but reversing + the order runs it with `local`. +* Example: `--strategy_regexp='Compiling.*/bar=local,sandboxed'` runs + 'Compiling //foo/bar/baz' with the `local` strategy and falls back to + `sandboxed` if it fails. + +#### `--genrule_strategy={{ "" }}strategy{{ "" }}` {:#genrule-strategy} + +This is a deprecated short-hand for `--strategy=Genrule={{ "" }}strategy{{ "" }}`. + +#### `--jobs={{ "" }}n{{ "" }}` (-j) {:#jobs} + +This option, which takes an integer argument, specifies a limit on +the number of jobs that should be executed concurrently during the +execution phase of the build. + +Note : The number of concurrent jobs that Bazel will run +is determined not only by the `--jobs` setting, but also +by Bazel's scheduler, which tries to avoid running concurrent jobs +that will use up more resources (RAM or CPU) than are available, +based on some (very crude) estimates of the resource consumption +of each job. The behavior of the scheduler can be controlled by +the `--local_resources` option. + +#### `--progress_report_interval={{ "" }}n{{ "" }}` {:progress-report-interval} + +Bazel periodically prints a progress report on jobs that are not +finished yet (such as long running tests). This option sets the +reporting frequency, progress will be printed every `n` +seconds. + +The default is 0, that means an incremental algorithm: the first +report will be printed after 10 seconds, then 30 seconds and after +that progress is reported once every minute. + +When bazel is using cursor control, as specified by +[`--curses`](#curses), progress is reported every second. + +#### `--local_resources {{ "" }}resources or resource expression{{ "" }}` {:#local-resources} + +These options specify the amount of local resources (RAM in MB and number of CPU logical cores) +that Bazel can take into consideration when scheduling build and test activities to run locally. They take +an float, or a keyword (HOST_RAM or HOST_CPUS) optionally followed by `[-|*`float`]` +(for example, `--local_resources=cpu=2`, `--local_resources=memory=HOST_RAM*.5`, +`--local_resources=cpu=HOST_CPUS-1`). +The flags are independent; one or both may be set. By default, Bazel estimates +the amount of RAM and number of CPU cores directly from the local system's configuration. + +#### `--[no]build_runfile_links` {:#build-runfile-links} + +This option, which is enabled by default, specifies whether the runfiles +symlinks for tests and binaries should be built in the output directory. +Using `--nobuild_runfile_links` can be useful +to validate if all targets compile without incurring the overhead +for building the runfiles trees. + +When tests (or applications) are executed, their run-time data +dependencies are gathered together in one place. Within Bazel's +output tree, this "runfiles" tree is typically rooted as a sibling of +the corresponding binary or test. +During test execution, runfiles may be accessed using paths of the form +`$TEST_SRCDIR/{{ "" }}canonical_repo_name{{ "" }}/{{ "" }}packagename{{ "" }}/{{ "" }}filename{{ "" }}`. +The runfiles tree ensures that tests have access to all the files +upon which they have a declared dependence, and nothing more. By +default, the runfiles tree is implemented by constructing a set of +symbolic links to the required files. As the set of links grows, so +does the cost of this operation, and for some large builds it can +contribute significantly to overall build time, particularly because +each individual test (or application) requires its own runfiles tree. + +#### `--[no]build_runfile_manifests` {:#build-runfile-manifests} + +This option, which is enabled by default, specifies whether runfiles manifests +should be written to the output tree. +Disabling it implies `--nobuild_runfile_links`. + +It can be disabled when executing tests remotely, as runfiles trees will +be created remotely from in-memory manifests. + +#### `--[no]discard_analysis_cache` {:#discard-analysis-cache} + +When this option is enabled, Bazel will discard the analysis cache +right before execution starts, thus freeing up additional memory +(around 10%) for the [execution phase](/run/build#execution). +The drawback is that further incremental builds will be slower. See also +[memory-saving mode](/configure/memory). + +#### `--[no]keep_going` (-k) {:#keep-going} + +As in GNU Make, the execution phase of a build stops when the first +error is encountered. Sometimes it is useful to try to build as +much as possible even in the face of errors. This option enables +that behavior, and when it is specified, the build will attempt to +build every target whose prerequisites were successfully built, but +will ignore errors. + +While this option is usually associated with the execution phase of +a build, it also affects the analysis phase: if several targets are +specified in a build command, but only some of them can be +successfully analyzed, the build will stop with an error +unless `--keep_going` is specified, in which case the +build will proceed to the execution phase, but only for the targets +that were successfully analyzed. + +#### `--[no]use_ijars` {:#use-ijars} + +This option changes the way `java_library` targets are +compiled by Bazel. Instead of using the output of a +`java_library` for compiling dependent +`java_library` targets, Bazel will create interface jars +that contain only the signatures of non-private members (public, +protected, and default (package) access methods and fields) and use +the interface jars to compile the dependent targets. This makes it +possible to avoid recompilation when changes are only made to +method bodies or private members of a class. + +Note: Using `--use_ijars` might give you a different +error message when you are accidentally referring to a non visible +member of another class: Instead of getting an error that the member +is not visible you will get an error that the member does not exist. +Changing the `--use_ijars` setting will force a recompilation of all affected +classes. + +#### `--[no]interface_shared_objects` {:#interface-shared-objects} + +This option enables _interface shared objects_, which makes binaries and +other shared libraries depend on the _interface_ of a shared object, +rather than its implementation. When only the implementation changes, Bazel +can avoid rebuilding targets that depend on the changed shared library +unnecessarily. + +### Output selection {:#output-selection} + +These options determine what to build or test. + +#### `--[no]build` {:#build} + +This option causes the execution phase of the build to occur; it is +on by default. When it is switched off, the execution phase is +skipped, and only the first two phases, loading and analysis, occur. + +This option can be useful for validating BUILD files and detecting +errors in the inputs, without actually building anything. + +#### `--[no]build_tests_only` {:#build-tests-only} + +If specified, Bazel will build only what is necessary to run the `*_test` +and `test_suite` rules that were not filtered due to their +[size](#test-size-filters), +[timeout](#test-timeout-filters), +[tag](#test-tag-filters), or +[language](#test-lang-filters). +If specified, Bazel will ignore other targets specified on the command line. +By default, this option is disabled and Bazel will build everything +requested, including `*_test` and `test_suite` rules that are filtered out from +testing. This is useful because running +`bazel test --build_tests_only foo/...` may not detect all build +breakages in the `foo` tree. + +#### `--[no]check_up_to_date` {:#check-up-to-date} + +This option causes Bazel not to perform a build, but merely check +whether all specified targets are up-to-date. If so, the build +completes successfully, as usual. However, if any files are out of +date, instead of being built, an error is reported and the build +fails. This option may be useful to determine whether a build has +been performed more recently than a source edit (for example, for pre-submit +checks) without incurring the cost of a build. + +See also [`--check_tests_up_to_date`](#check-tests-up-to-date). + +#### `--[no]compile_one_dependency` {:#compile-one-dependency} + +Compile a single dependency of the argument files. This is useful for +syntax checking source files in IDEs, for example, by rebuilding a single +target that depends on the source file to detect errors as early as +possible in the edit/build/test cycle. This argument affects the way all +non-flag arguments are interpreted: each argument must be a +file target label or a plain filename relative to the current working +directory, and one rule that depends on each source filename is built. For +C++ and Java +sources, rules in the same language space are preferentially chosen. For +multiple rules with the same preference, the one that appears first in the +BUILD file is chosen. An explicitly named target pattern which does not +reference a source file results in an error. + +#### `--save_temps` {:#save-temps} + +The `--save_temps` option causes temporary outputs from the compiler to be +saved. These include .s files (assembler code), .i (preprocessed C) and .ii +(preprocessed C++) files. These outputs are often useful for debugging. Temps will only be +generated for the set of targets specified on the command line. + +Note: The implementation of `--save_temps` does not use the compiler's +`-save-temps` flag. Instead, there are two passes, one with `-S` +and one with `-E`. A consequence of this is that if your build fails, +Bazel may not yet have produced the ".i" or ".ii" and ".s" files. +If you're trying to use `--save_temps` to debug a failed compilation, +you may need to also use `--keep_going` so that Bazel will still try to +produce the preprocessed files after the compilation fails. + +The `--save_temps` flag currently works only for cc_* rules. + +To ensure that Bazel prints the location of the additional output files, check that +your [`--show_result {{ "" }}n{{ "" }}`](#show-result) +setting is high enough. + +#### `--build_tag_filters={{ "" }}tag[,tag]*{{ "" }}` {:#build-tag-filters} + +If specified, Bazel will build only targets that have at least one required tag +(if any of them are specified) and does not have any excluded tags. Build tag +filter is specified as comma delimited list of tag keywords, optionally +preceded with '-' sign used to denote excluded tags. Required tags may also +have a preceding '+' sign. + +When running tests, Bazel ignores `--build_tag_filters` for test targets, +which are built and run even if they do not match this filter. To avoid building them, filter +test targets using `--test_tag_filters` or by explicitly excluding them. + +#### `--test_size_filters={{ "" }}size[,size]*{{ "" }}` {:#test-size-filters} + +If specified, Bazel will test (or build if `--build_tests_only` +is also specified) only test targets with the given size. Test size filter +is specified as comma delimited list of allowed test size values (small, +medium, large or enormous), optionally preceded with '-' sign used to denote +excluded test sizes. For example, + +
    +  % bazel test --test_size_filters=small,medium //foo:all
    +
    + +and + +
    +  % bazel test --test_size_filters=-large,-enormous //foo:all
    +
    + +will test only small and medium tests inside //foo. + +By default, test size filtering is not applied. + +#### `--test_timeout_filters={{ "" }}timeout[,timeout]*{{ "" }}` {:#test-timeout-filters} + +If specified, Bazel will test (or build if `--build_tests_only` +is also specified) only test targets with the given timeout. Test timeout filter +is specified as comma delimited list of allowed test timeout values (short, +moderate, long or eternal), optionally preceded with '-' sign used to denote +excluded test timeouts. See [--test_size_filters](#test-size-filters) +for example syntax. + +By default, test timeout filtering is not applied. + +#### `--test_tag_filters={{ "" }}tag[,tag]*{{ "" }}` {:#test-tag-filters} + +If specified, Bazel will test (or build if `--build_tests_only` +is also specified) only test targets that have at least one required tag +(if any of them are specified) and does not have any excluded tags. Test tag +filter is specified as comma delimited list of tag keywords, optionally +preceded with '-' sign used to denote excluded tags. Required tags may also +have a preceding '+' sign. + +For example, + +
    +  % bazel test --test_tag_filters=performance,stress,-flaky //myproject:all
    +
    + +will test targets that are tagged with either `performance` or +`stress` tag but are **not** tagged with the `flaky` tag. + +By default, test tag filtering is not applied. Note that you can also filter +on test's `size` and `local` tags in +this manner. + +#### `--test_lang_filters={{ "" }}string[,string]*{{ "" }}` {:#test-lang-filters} + +Specifies a comma-separated list of strings referring to names of test rule +classes. To refer to the rule class `foo_test`, use the string "foo". Bazel will +test (or build if `--build_tests_only` is also specified) only +targets of the referenced rule classes. To instead exclude those targets, use +the string "-foo". For example, + +

    +
    +  % bazel test --test_lang_filters=foo,bar //baz/...
    +
    +

    + will test only targets that are instances of `foo_test` or `bar_test` in + `//baz/...`, while +

    +
    +  % bazel test --test_lang_filters=-foo,-bar //baz/...
    +
    +

    + will test all the targets in `//baz/...` except for the `foo_test` and + `bar_test` instances. +

    + +Tip: You can use `bazel query --output=label_kind "//p:t"` to +learn the rule class name of the target `//p:t`. And you can +look at the pair of instantiation stacks in the output of +`bazel query --output=build "//p:t"` to learn why that target +is an instance of that rule class. + +Warning: The option name "--test_lang_filter" is vestigal and is therefore +unfortunately misleading; don't make assumptions about the semantics based on +the name. + +#### `--test_filter={{ "" }}filter-expression{{ "" }}` {:#test-filter} + +Specifies a filter that the test runner may use to pick a subset of tests for +running. All targets specified in the invocation are built, but depending on +the expression only some of them may be executed; in some cases, only certain +test methods are run. + +The particular interpretation of {{ "" }}filter-expression{{ "" }} is up to +the test framework responsible for running the test. It may be a glob, +substring, or regexp. `--test_filter` is a convenience +over passing different `--test_arg` filter arguments, +but not all frameworks support it. + +### Verbosity {:#verbosity} + +These options control the verbosity of Bazel's output, +either to the terminal, or to additional log files. + +#### `--explain={{ "" }}logfile{{ "" }}` {:#explain} + +This option, which requires a filename argument, causes the +dependency checker in `bazel build`'s execution phase to +explain, for each build step, either why it is being executed, or +that it is up-to-date. The explanation is written +to _logfile_. + +If you are encountering unexpected rebuilds, this option can help to +understand the reason. Add it to your `.bazelrc` so that +logging occurs for all subsequent builds, and then inspect the log +when you see an execution step executed unexpectedly. This option +may carry a small performance penalty, so you might want to remove +it when it is no longer needed. + +#### `--verbose_explanations` {:#verbose-explanations} + +This option increases the verbosity of the explanations generated +when the [--explain](#explain) option is enabled. + +In particular, if verbose explanations are enabled, +and an output file is rebuilt because the command used to +build it has changed, then the output in the explanation file will +include the full details of the new command (at least for most +commands). + +Using this option may significantly increase the length of the +generated explanation file and the performance penalty of using +`--explain`. + +If `--explain` is not enabled, then +`--verbose_explanations` has no effect. + +#### `--profile={{ "" }}file{{ "" }}` {:#profile} + +This option, which takes a filename argument, causes Bazel to write +profiling data into a file. The data then can be analyzed or parsed using the +`bazel analyze-profile` command. The Build profile can be useful in +understanding where Bazel's `build` command is spending its time. + +#### `--[no]show_loading_progress` {:#show-loading-progress} + +This option causes Bazel to output package-loading progress +messages. If it is disabled, the messages won't be shown. + +#### `--[no]show_progress` {:#show-progress} + +This option causes progress messages to be displayed; it is on by +default. When disabled, progress messages are suppressed. + +#### `--show_progress_rate_limit={{ "" }}n{{ "" }}` {:#show-progress-rate} + +This option causes bazel to display at most one progress message per `n` seconds, +where {{ "" }}n{{ "" }} is a real number. +The default value for this option is 0.02, meaning bazel will limit the progress +messages to one per every 0.02 seconds. + +#### `--show_result={{ "" }}n{{ "" }}` {:#show-result} + +This option controls the printing of result information at the end +of a `bazel build` command. By default, if a single +build target was specified, Bazel prints a message stating whether +or not the target was successfully brought up-to-date, and if so, +the list of output files that the target created. If multiple +targets were specified, result information is not displayed. + +While the result information may be useful for builds of a single +target or a few targets, for large builds (such as an entire top-level +project tree), this information can be overwhelming and distracting; +this option allows it to be controlled. `--show_result` +takes an integer argument, which is the maximum number of targets +for which full result information should be printed. By default, +the value is 1. Above this threshold, no result information is +shown for individual targets. Thus zero causes the result +information to be suppressed always, and a very large value causes +the result to be printed always. + +Users may wish to choose a value in-between if they regularly +alternate between building a small group of targets (for example, +during the compile-edit-test cycle) and a large group of targets +(for example, when establishing a new workspace or running +regression tests). In the former case, the result information is +very useful whereas in the latter case it is less so. As with all +options, this can be specified implicitly via +the [`.bazelrc`](/run/bazelrc) file. + +The files are printed so as to make it easy to copy and paste the +filename to the shell, to run built executables. The "up-to-date" +or "failed" messages for each target can be easily parsed by scripts +which drive a build. + +#### `--sandbox_debug` {:#sandbox-debug} + +This option causes Bazel to print extra debugging information when using sandboxing for action +execution. This option also preserves sandbox directories, so that the files visible to actions +during execution can be examined. + +#### `--subcommands` (`-s`) {:#subcommands} + +This option causes Bazel's execution phase to print the full command line +for each command prior to executing it. + +
    +  >>>>> # //examples/cpp:hello-world [action 'Linking examples/cpp/hello-world']
    +  (cd /home/johndoe/.cache/bazel/_bazel_johndoe/4c084335afceb392cfbe7c31afee3a9f/bazel && \
    +    exec env - \
    +    /usr/bin/gcc -o bazel-out/local-fastbuild/bin/examples/cpp/hello-world -B/usr/bin/ -Wl,-z,relro,-z,now -no-canonical-prefixes -pass-exit-codes -Wl,-S -Wl,@bazel-out/local_linux-fastbuild/bin/examples/cpp/hello-world-2.params)
    +
    + +Where possible, commands are printed in a Bourne shell compatible syntax, +so that they can be easily copied and pasted to a shell command prompt. +(The surrounding parentheses are provided to protect your shell from the +`cd` and `exec` calls; be sure to copy them!) +However some commands are implemented internally within Bazel, such as +creating symlink trees. For these there's no command line to display. + +`--subcommands=pretty_print` may be passed to print +the arguments of the command as a list rather than as a single line. This may +help make long command lines more readable. + +See also [--verbose_failures](#verbose-failures), below. + +For logging subcommands to a file in a tool-friendly format, see +[--execution_log_json_file](/reference/command-line-reference#flag--execution_log_json_file) +and +[--execution_log_binary_file](/reference/command-line-reference#flag--execution_log_binary_file). + +#### `--verbose_failures` {:#verbose-failures} + +This option causes Bazel's execution phase to print the full command line +for commands that failed. This can be invaluable for debugging a +failing build. + +Failing commands are printed in a Bourne shell compatible syntax, suitable +for copying and pasting to a shell prompt. + +### Workspace status {:#workspace-status} + +Use these options to "stamp" Bazel-built binaries: to embed additional information into the +binaries, such as the source control revision or other workspace-related information. You can use +this mechanism with rules that support the `stamp` attribute, such as +`genrule`, `cc_binary`, and more. + +#### `--workspace_status_command={{ "" }}program{{ "" }}` {:#workspace-status-command} + +This flag lets you specify a binary that Bazel runs before each build. The program can report +information about the status of the workspace, such as the current source control revision. + +The flag's value must be a path to a native program. On Linux/macOS this may be any executable. +On Windows this must be a native binary, typically an ".exe", ".bat", or a ".cmd" file. + +The program should print zero or more key/value pairs to standard output, one entry on each line, +then exit with zero (otherwise the build fails). The key names can be anything but they may only +use upper case letters and underscores. The first space after the key name separates it from the +value. The value is the rest of the line (including additional whitespaces). Neither the key nor +the value may span multiple lines. Keys must not be duplicated. + +Bazel partitions the keys into two buckets: "stable" and "volatile". (The names "stable" and +"volatile" are a bit counter-intuitive, so don't think much about them.) + +Bazel then writes the key-value pairs into two files: + +* `bazel-out/stable-status.txt` + contains all keys and values where the key's name starts with `STABLE_` +* `bazel-out/volatile-status.txt` + contains the rest of the keys and their values + +The contract is: + +* "stable" keys' values should change rarely, if possible. If the contents of + `bazel-out/stable-status.txt` + change, Bazel invalidates the actions that depend on them. In + other words, if a stable key's value changes, Bazel will rerun stamped actions. + Therefore the stable status should not contain things like timestamps, because they change all + the time, and would make Bazel rerun stamped actions with each build. + + Bazel always outputs the following stable keys: + * `BUILD_EMBED_LABEL`: value of `--embed_label` + * `BUILD_HOST`: the name of the host machine that Bazel is running on + * `BUILD_USER`: the name of the user that Bazel is running as +* "volatile" keys' values may change often. Bazel expects them to change all the time, like + timestamps do, and duly updates the + `bazel-out/volatile-status.txt` + file. In order to avoid + rerunning stamped actions all the time though, **Bazel pretends that the volatile file never + changes**. In other words, if the volatile status file is the only file whose contents has + changed, Bazel will not invalidate actions that depend on it. If other inputs of the actions + have changed, then Bazel reruns that action, and the action will see the updated volatile + status, but just the volatile status changing alone will not invalidate the action. + + Bazel always outputs the following volatile keys: + * `BUILD_TIMESTAMP`: time of the build in seconds since the Unix Epoch (the value + of `System.currentTimeMillis()` divided by a thousand) + * `FORMATTED_DATE`: time of the build Formatted as + `yyyy MMM d HH mm ss EEE`(for example 2023 Jun 2 01 44 29 Fri) in UTC. + +On Linux/macOS you can pass `--workspace_status_command=/bin/true` to +disable retrieving workspace status, because `true` does nothing, successfully (exits +with zero) and prints no output. On Windows you can pass the path of MSYS's `true.exe` +for the same effect. + +If the workspace status command fails (exits non-zero) for any reason, the build will fail. + +Example program on Linux using Git: + +
    +#!/bin/bash
    +echo "CURRENT_TIME $(date +%s)"
    +echo "RANDOM_HASH $(cat /proc/sys/kernel/random/uuid)"
    +echo "STABLE_GIT_COMMIT $(git rev-parse HEAD)"
    +echo "STABLE_USER_NAME $USER"
    +
    + +Pass this program's path with `--workspace_status_command`, and the stable status file +will include the STABLE lines and the volatile status file will include the rest of the lines. + +#### `--[no]stamp` {:#stamp} + +This option, in conjunction with the `stamp` rule attribute, controls whether to +embed build information in binaries. + +Stamping can be enabled or disabled explicitly on a per-rule basis using the +`stamp` attribute. Please refer to the Build Encyclopedia for details. When +a rule sets `stamp = -1` (the default for `*_binary` rules), this option +determines whether stamping is enabled. + +Bazel never stamps binaries that are built for the exec configuration, +regardless of this option or the `stamp` attribute. For rules that set `stamp = +0` (the default for `*_test` rules), stamping is disabled regardless of +`--[no]stamp`. Specifying `--stamp` does not force targets to be rebuilt if +their dependencies have not changed. + +Setting `--nostamp` is generally desireable for build performance, as it +reduces input volatility and maximizes build caching. + +### Platform {:#platform} + +Use these options to control the host and target platforms that configure how builds work, and to +control what execution platforms and toolchains are available to Bazel rules. + +Please see background information on [Platforms](/extending/platforms) and [Toolchains](/extending/toolchains). + +#### `--platforms={{ "" }}labels{{ "" }}` {:#platforms} + +The labels of the platform rules describing the target platforms for the +current command. + +#### `--host_platform={{ "" }}label{{ "" }}` {:#host-platform} + +The label of a platform rule that describes the host system. + +#### `--extra_execution_platforms={{ "" }}labels{{ "" }}` {:#extra-execution-platforms} + +The platforms that are available as execution platforms to run actions. +Platforms can be specified by exact target, or as a target pattern. These +platforms will be considered before those declared in MODULE.bazel files by +[register_execution_platforms()](/rules/lib/globals/module#register_execution_platforms). +This option accepts a comma-separated list of platforms in order of priority. +If the flag is passed multiple times, the most recent overrides. + +#### `--extra_toolchains={{ "" }}labels{{ "" }}` {:#extra-toolchains} + +The toolchain rules to be considered during toolchain resolution. Toolchains +can be specified by exact target, or as a target pattern. These toolchains will +be considered before those declared in MODULE.bazel files by +[register_toolchains()](/rules/lib/globals/module#register_toolchains). + +#### `--toolchain_resolution_debug={{ "" }}regex{{ "" }}` {:#toolchain-resolution-debug} + +Print debug information while finding toolchains if the toolchain type matches +the regex. Multiple regexes can be separated by commas. The regex can be +negated by using a `-` at the beginning. This might help developers +of Bazel or Starlark rules with debugging failures due to missing toolchains. + +### Miscellaneous {:#miscellaneous} + +#### `--flag_alias={{ "" }}alias_name=target_path{{ "" }}` {:#flag-alias} + +A convenience flag used to bind longer Starlark build settings to a shorter name. For more +details, see the +[Starlark Configurations](/extending/config#using-build-setting-aliases). + +#### `--symlink_prefix={{ "" }}string{{ "" }}` {:#symlink-prefix} + +Changes the prefix of the generated convenience symlinks. The +default value for the symlink prefix is `bazel-` which +will create the symlinks `bazel-bin`, `bazel-testlogs`, and +`bazel-genfiles`. + +If the symbolic links cannot be created for any reason, a warning is +issued but the build is still considered a success. In particular, +this allows you to build in a read-only directory or one that you have no +permission to write into. Any paths printed in informational +messages at the conclusion of a build will only use the +symlink-relative short form if the symlinks point to the expected +location; in other words, you can rely on the correctness of those +paths, even if you cannot rely on the symlinks being created. + +Some common values of this option: + +* **Suppress symlink creation:** + `--symlink_prefix=/` will cause Bazel to not + create or update any symlinks, including the `bazel-out` and + `bazel-` + symlinks. Use this option to suppress symlink creation entirely. + +* **Reduce clutter:** + `--symlink_prefix=.bazel/` will cause Bazel to create + symlinks called `bin` (etc) inside a hidden directory `.bazel`. + +#### `--platform_suffix={{ "" }}string{{ "" }}` {:#platform-suffix} + +Adds a suffix to the configuration short name, which is used to determine the +output directory. Setting this option to different values puts the files into +different directories, for example to improve cache hit rates for builds that +otherwise clobber each others output files, or to keep the output files around +for comparisons. + +#### `--default_visibility={{ "" }}(private|public){{ "" }}` {:#default-visibility} + +Temporary flag for testing bazel default visibility changes. Not intended for general use +but documented for completeness' sake. + +#### `--starlark_cpu_profile=_file_` {:#starlark-cpu-profile} + +This flag, whose value is the name of a file, causes Bazel to gather +statistics about CPU usage by all Starlark threads, +and write the profile, in [pprof](https://github.com/google/pprof){: .external} format, +to the named file. + +Use this option to help identify Starlark functions that +make loading and analysis slow due to excessive computation. For example: + +
    +$ bazel build --nobuild --starlark_cpu_profile=/tmp/pprof.gz my/project/...
    +$ pprof /tmp/pprof.gz
    +(pprof) top
    +Type: CPU
    +Time: Feb 6, 2020 at 12:06pm (PST)
    +Duration: 5.26s, Total samples = 3.34s (63.55%)
    +Showing nodes accounting for 3.34s, 100% of 3.34s total
    +      flat  flat%   sum%        cum   cum%
    +     1.86s 55.69% 55.69%      1.86s 55.69%  sort_source_files
    +     1.02s 30.54% 86.23%      1.02s 30.54%  expand_all_combinations
    +     0.44s 13.17% 99.40%      0.44s 13.17%  range
    +     0.02s   0.6%   100%      3.34s   100%  sorted
    +         0     0%   100%      1.38s 41.32%  my/project/main/BUILD
    +         0     0%   100%      1.96s 58.68%  my/project/library.bzl
    +         0     0%   100%      3.34s   100%  main
    +
    + +For different views of the same data, try the `pprof` commands `svg`, +`web`, and `list`. + +## Using Bazel for releases {:#bazel-for-releases} + +Bazel is used both by software engineers during the development +cycle, and by release engineers when preparing binaries for deployment +to production. This section provides a list of tips for release +engineers using Bazel. + +### Significant options {:#significant-options} + +When using Bazel for release builds, the same issues arise as for other scripts +that perform a build. For more details, see +[Call Bazel from scripts](/run/scripts). In particular, the following options +are strongly recommended: + +* [`--bazelrc=/dev/null`](/run/bazelrc) +* [`--nokeep_state_after_build`](/reference/command-line-reference#common_options-flag--keep_state_after_build) + +These options are also important: + +* [`--package_path`](#package-path) +* [`--symlink_prefix`](#symlink-prefix): + for managing builds for multiple configurations, + it may be convenient to distinguish each build + with a distinct identifier, such as "64bit" vs. "32bit". This option + differentiates the `bazel-bin` (etc.) symlinks. + +## Running tests {:#running-tests} + +To build and run tests with bazel, type `bazel test` followed by +the name of the test targets. + +By default, this command performs simultaneous build and test +activity, building all specified targets (including any non-test +targets specified on the command line) and testing +`*_test` and `test_suite` targets as soon as +their prerequisites are built, meaning that test execution is +interleaved with building. Doing so usually results in significant +speed gains. + +### Options for `bazel test` {:#bazel-test-options} + +#### `--cache_test_results=(yes|no|auto)` (`-t`) {:#cache-test-results} + +If this option is set to 'auto' (the default) then Bazel will only rerun a test if any of the +following conditions applies: + +* Bazel detects changes in the test or its dependencies +* the test is marked as `external` +* multiple test runs were requested with `--runs_per_test` +* the test failed. + +If 'no', all tests will be executed unconditionally. + +If 'yes', the caching behavior will be the same as auto +except that it may cache test failures and test runs with +`--runs_per_test`. + +Note: Test results are _always_ saved in Bazel's output tree, +regardless of whether this option is enabled, so +you needn't have used `--cache_test_results` on the +prior run(s) of `bazel test` in order to get cache hits. +The option only affects whether Bazel will _use_ previously +saved results, not whether it will save results of the current run. + +Users who have enabled this option by default in +their `.bazelrc` file may find the +abbreviations `-t` (on) or `-t-` (off) +convenient for overriding the default on a particular run. + +#### `--check_tests_up_to_date` {:#check-tests-up-to-date} + +This option tells Bazel not to run the tests, but to merely check and report +the cached test results. If there are any tests which have not been +previously built and run, or whose tests results are out-of-date (for example, because +the source code or the build options have changed), then Bazel will report +an error message ("test result is not up-to-date"), will record the test's +status as "NO STATUS" (in red, if color output is enabled), and will return +a non-zero exit code. + +This option also implies +[`--check_up_to_date`](#check-up-to-date) behavior. + +This option may be useful for pre-submit checks. + +#### `--test_verbose_timeout_warnings` {:#test-verbose-timeout-warnings} + +This option tells Bazel to explicitly warn the user if a test's timeout is +significantly longer than the test's actual execution time. While a test's +timeout should be set such that it is not flaky, a test that has a highly +over-generous timeout can hide real problems that crop up unexpectedly. + +For instance, a test that normally executes in a minute or two should not have +a timeout of ETERNAL or LONG as these are much, much too generous. + +This option is useful to help users decide on a good timeout value or +sanity check existing timeout values. + +Note: Each test shard is allotted the timeout of the entire +`XX_test` target. Using this option does not affect a test's timeout +value, merely warns if Bazel thinks the timeout could be restricted further. + +#### `--[no]test_keep_going` {:#test-keep-going} + +By default, all tests are run to completion. If this flag is disabled, +however, the build is aborted on any non-passing test. Subsequent build steps +and test invocations are not run, and in-flight invocations are canceled. +Do not specify both `--notest_keep_going` and `--keep_going`. + +#### `--flaky_test_attempts={{ "" }}attempts{{ "" }}` {:#flaky-test-attempts} + +This option specifies the maximum number of times a test should be attempted +if it fails for any reason. A test that initially fails but eventually +succeeds is reported as `FLAKY` on the test summary. It is, +however, considered to be passed when it comes to identifying Bazel exit code +or total number of passed tests. Tests that fail all allowed attempts are +considered to be failed. + +By default (when this option is not specified, or when it is set to +default), only a single attempt is allowed for regular tests, and +3 for test rules with the `flaky` attribute set. You can specify +an integer value to override the maximum limit of test attempts. Bazel allows +a maximum of 10 test attempts in order to prevent abuse of the system. + +#### `--runs_per_test={{ "" }}[regex@]number{{ "" }}` {:#runs-per-test} + +This option specifies the number of times each test should be executed. All +test executions are treated as separate tests (fallback functionality +will apply to each of them independently). + +The status of a target with failing runs depends on the value of the +`--runs_per_test_detects_flakes` flag: + +* If absent, any failing run causes the entire test to fail. +* If present and two runs from the same shard return PASS and FAIL, the test + will receive a status of flaky (unless other failing runs cause it to + fail). + +If a single number is specified, all tests will run that many times. +Alternatively, a regular expression may be specified using the syntax +regex@number. This constrains the effect of `--runs_per_test` to targets +which match the regex (`--runs_per_test=^//pizza:.*@4` runs all tests +under `//pizza/` 4 times). +This form of `--runs_per_test` may be specified more than once. + +#### `--[no]runs_per_test_detects_flakes` {:#run-per-test-detects-flakes} + +If this option is specified (by default it is not), Bazel will detect flaky +test shards through `--runs_per_test`. If one or more runs for a single shard +fail and one or more runs for the same shard pass, the target will be +considered flaky with the flag. If unspecified, the target will report a +failing status. + +#### `--test_summary={{ "" }}output_style{{ "" }}` {:#test-summary} + +Specifies how the test result summary should be displayed. + +* `short` prints the results of each test along with the name of + the file containing the test output if the test failed. This is the default + value. +* `terse` like `short`, but even shorter: only print + information about tests which did not pass. +* `detailed` prints each individual test case that failed, not + only each test. The names of test output files are omitted. +* `none` does not print test summary. + +#### `--test_output={{ "" }}output_style{{ "" }}` {:#test-output} + +Specifies how test output should be displayed: + +* `summary` shows a summary of whether each test passed or + failed. Also shows the output log file name for failed tests. The summary + will be printed at the end of the build (during the build, one would see + just simple progress messages when tests start, pass or fail). + This is the default behavior. +* `errors` sends combined stdout/stderr output from failed tests + only into the stdout immediately after test is completed, ensuring that + test output from simultaneous tests is not interleaved with each other. + Prints a summary at the build as per summary output above. +* `all` is similar to `errors` but prints output for + all tests, including those which passed. +* `streamed` streams stdout/stderr output from each test in + real-time. + +#### `--java_debug` {:#java-debug} + +This option causes the Java virtual machine of a java test to wait for a connection from a +JDWP-compliant debugger before starting the test. This option implies `--test_output=streamed`. + +#### `--[no]verbose_test_summary` {:#verbose-test-summary} + +By default this option is enabled, causing test times and other additional +information (such as test attempts) to be printed to the test summary. If +`--noverbose_test_summary` is specified, test summary will +include only test name, test status and cached test indicator and will +be formatted to stay within 80 characters when possible. + +#### `--test_tmpdir={{ "" }}path{{ "" }}` {:#test-tmpdir} + +Specifies temporary directory for tests executed locally. Each test will be +executed in a separate subdirectory inside this directory. The directory will +be cleaned at the beginning of the each `bazel test` command. +By default, bazel will place this directory under Bazel output base directory. + +Note: This is a directory for running tests, not storing test results +(those are always stored under the `bazel-out` directory). + +#### `--test_timeout={{ "" }}seconds{{ "" }}` OR `--test_timeout={{ "" }}seconds{{ "" }},{{ "" }}seconds{{ "" }},{{ "" }}seconds{{ "" }},{{ "" }}seconds{{ "" }}` {:#test-timeout} + +Overrides the timeout value for all tests by using specified number of +seconds as a new timeout value. If only one value is provided, then it will +be used for all test timeout categories. + +Alternatively, four comma-separated values may be provided, specifying +individual timeouts for short, moderate, long and eternal tests (in that +order). +In either form, zero or a negative value for any of the test sizes will +be substituted by the default timeout for the given timeout categories as +defined by the page [Writing Tests](/reference/test-encyclopedia). +By default, Bazel will use these timeouts for all tests by +inferring the timeout limit from the test's size whether the size is +implicitly or explicitly set. + +Tests which explicitly state their timeout category as distinct from their +size will receive the same value as if that timeout had been implicitly set by +the size tag. So a test of size 'small' which declares a 'long' timeout will +have the same effective timeout that a 'large' tests has with no explicit +timeout. + +#### `--test_arg={{ "" }}arg{{ "" }}` {:#test-arg} + +Passes command-line options/flags/arguments to each test process. This +option can be used multiple times to pass several arguments. For example, +`--test_arg=--logtostderr --test_arg=--v=3`. + +Note that, unlike the `bazel run` command, you can't pass test arguments +directly as in `bazel test -- target --logtostderr --v=3`. That's because +extraneous arguments passed to `bazel test` are interpreted as additional test +targets. That is, `--logtostderr` and `--v=3` would each be interpreted as a +test target. This ambiguity doesn't exist for a `bazel run` command, which only +accepts one target. + +`--test_arg` can be passed to a `bazel run` command, but it's ignored unless the +target being run is a test target. (As with any other flag, if it's passed in a +`bazel run` command after a `--` token, it's not processed by Bazel but +forwarded verbatim to the executed target.) + +#### `--test_env={{ "" }}variable{{ "" }}=_value_` OR `--test_env={{ "" }}variable{{ "" }}` {:#test-env} + +Specifies additional variables that must be injected into the test +environment for each test. If {{ "" }}value{{ "" }} is not specified it will be +inherited from the shell environment used to start the `bazel test` +command. + +The environment can be accessed from within a test by using +`System.getenv("var")` (Java), `getenv("var")` (C or C++), + +#### `--run_under={{ "" }}command-prefix{{ "" }}` {:#test-run-under} + +This specifies a prefix that the test runner will insert in front +of the test command before running it. The +{{ "" }}command-prefix{{ "" }} is split into words using Bourne shell +tokenization rules, and then the list of words is prepended to the +command that will be executed. + +If the first word is a fully-qualified label (starts with +`//`) it is built. Then the label is substituted by the +corresponding executable location that is prepended to the command +that will be executed along with the other words. + +Some caveats apply: + +* The PATH used for running tests may be different than the PATH in your environment, + so you may need to use an **absolute path** for the `--run_under` + command (the first word in {{ "" }}command-prefix{{ "" }}). +* **`stdin` is not connected**, so `--run_under` + can't be used for interactive commands. + +Examples: + +
    +        --run_under=/usr/bin/strace
    +        --run_under='/usr/bin/strace -c'
    +        --run_under=/usr/bin/valgrind
    +        --run_under='/usr/bin/valgrind --quiet --num-callers=20'
    +
    + +#### Test selection {:#test-selection} + +As documented under [Output selection options](#output-selection), +you can filter tests by [size](#test-size-filters), +[timeout](#test-timeout-filters), +[tag](#test-tag-filters), or +[language](#test-lang-filters). A convenience +[general name filter](#test-filter) can forward particular +filter args to the test runner. + +#### Other options for `bazel test` {:#bazel-test-other-options} + +The syntax and the remaining options are exactly like +[`bazel build`](/run/build). + +## Running executables {:#running-executables} + +The `bazel run` command is similar to `bazel build`, except +it is used to build _and run_ a single target. Here is a typical session +(`//java/myapp:myapp` says hello and prints out its args): + +
    +  % bazel run java/myapp:myapp -- --arg1 --arg2
    +  INFO: Analyzed target //java/myapp:myapp (13 packages loaded, 27 targets configured).
    +  INFO: Found 1 target...
    +  Target //java/myapp:myapp up-to-date:
    +    bazel-bin/java/myapp/myapp
    +  INFO: Elapsed time: 14.290s, Critical Path: 5.54s, ...
    +  INFO: Build completed successfully, 4 total actions
    +  INFO: Running command line: bazel-bin/java/myapp/myapp <args omitted>
    +  Hello there
    +  $EXEC_ROOT/java/myapp/myapp
    +  --arg1
    +  --arg2
    +
    + +Note: `--` is needed so that Bazel +does not interpret `--arg1` and `--arg2` as +Bazel options, but rather as part of the command line for running the binary. +Additionally, Bazel will avoid logging these arguments to the console in case +they contain sensitive information. + +`bazel run` is similar, but not identical, to directly invoking +the binary built by Bazel and its behavior is different depending on whether the +binary to be invoked is a test or not. + +When the binary is not a test, the current working directory will be the +runfiles tree of the binary. + +When the binary is a test, the current working directory will be the exec root +and a good-faith attempt is made to replicate the environment tests are usually +run in. The emulation is not perfect, though, and tests that have multiple +shards cannot be run this way (the +`--test_sharding_strategy=disabled` command line option can be used +to work around this) + +The following extra environment variables are also available to the binary: + +* `BUILD_WORKSPACE_DIRECTORY`: the root of the workspace where the + build was run. +* `BUILD_WORKING_DIRECTORY`: the current working directory where + Bazel was run from. +* `BUILD_ID`: the build ID of the `bazel run` invocation. This is usually + unique, except if Bazel was run with `--script_path` and the resulting + script is re-used. +* `BUILD_EXECROOT`: the execution root of the `bazel run` invocation. + +These can be used, for example, to interpret file names on the command line in +a user-friendly way. + +### Options for `bazel run` {:#bazel-run-options} + +#### `--run_under={{ "" }}command-prefix{{ "" }}` {:#run-run-under} + +This has the same effect as the `--run_under` option for +`bazel test` ([see above](#test-run-under)), +except that it applies to the command being run by `bazel +run` rather than to the tests being run by `bazel test` +and cannot run under label. + +#### Filtering logging outputs from Bazel + +When invoking a binary with `bazel run`, Bazel prints logging output from Bazel +itself and the binary under invocation. To make the logs less noisy, you can +suppress the outputs from Bazel itself with the `--ui_event_filters` and +`--noshow_progress` flags. + +For example: +`bazel run --ui_event_filters=-info,-stdout,-stderr --noshow_progress //java/myapp:myapp` + +### Executing tests {:#executing-tests} + +`bazel run` can also execute test binaries, which has the effect of +running the test in a close approximation of the environment described at +[Writing Tests](/reference/test-encyclopedia). Note that none of the +`--test_*` arguments have an effect when running a test in this manner except +`--test_arg` . + +## Cleaning build outputs {:#cleaning-build-outputs} + +### The `clean` command {:#clean} + +Bazel has a `clean` command, analogous to that of Make. +It deletes the output directories for all build configurations performed +by this Bazel instance, or the entire working tree created by this +Bazel instance, and resets internal caches. If executed without any +command-line options, then the output directory for all configurations +will be cleaned. + +Recall that each Bazel instance is associated with a single workspace, thus the +`clean` command will delete all outputs from all builds you've done +with that Bazel instance in that workspace. + +To completely remove the entire working tree created by a Bazel +instance, you can specify the `--expunge` option. When +executed with `--expunge`, the clean command simply +removes the entire output base tree which, in addition to the build +output, contains all temp files created by Bazel. It also +stops the Bazel server after the clean, equivalent to the [`shutdown`](#shutdown) command. For example, to +clean up all disk and memory traces of a Bazel instance, you could +specify: + +
    +  % bazel clean --expunge
    +
    + +Alternatively, you can expunge in the background by using +`--expunge_async`. It is safe to invoke a Bazel command +in the same client while the asynchronous expunge continues to run. + +Note: This may introduce IO contention. + +The `clean` command is provided primarily as a means of +reclaiming disk space for workspaces that are no longer needed. +Bazel's incremental rebuilds may not be +perfect so `clean` can be used to recover a consistent +state when problems arise. + +Bazel's design is such that these problems are fixable and +these bugs are a high priority to be fixed. If you +ever find an incorrect incremental build, file a bug report, and report bugs in the tools +rather than using `clean`. + +## Querying the dependency graph {:#querying-dependency-graph} + +Bazel includes a query language for asking questions about the +dependency graph used during the build. The query language is used +by two commands: query and cquery. The major difference between the +two commands is that query runs after the [loading phase](/run/build#loading) +and cquery runs after the [analysis phase](/run/build#analysis). These tools are an +invaluable aid to many software engineering tasks. + +The query language is based on the idea of +algebraic operations over graphs; it is documented in detail in + +[Bazel Query Reference](/query/language). +Please refer to that document for reference, for +examples, and for query-specific command-line options. + +The query tool accepts several command-line +option. `--output` selects the output format. +`--[no]keep_going` (disabled by default) causes the query +tool to continue to make progress upon errors; this behavior may be +disabled if an incomplete result is not acceptable in case of errors. + +The `--[no]tool_deps` option, +enabled by default, causes dependencies in non-target configurations to be included in the +dependency graph over which the query operates. + +The `--[no]implicit_deps` option, enabled by default, causes +implicit dependencies to be included in the dependency graph over which the query operates. An +implicit dependency is one that is not explicitly specified in the BUILD file +but added by bazel. + +Example: "Show the locations of the definitions (in BUILD files) of +all genrules required to build all the tests in the PEBL tree." + +
    +  bazel query --output location 'kind(genrule, deps(kind(".*_test rule", foo/bar/pebl/...)))'
    +
    + +## Querying the action graph {:#aquery} + +Caution: The aquery command is still experimental and its API will change. + +The `aquery` command allows you to query for actions in your build graph. +It operates on the post-analysis configured target graph and exposes +information about actions, artifacts and their relationships. + +The tool accepts several command-line options. +`--output` selects the output format. The default output format +(`text`) is human-readable, use `proto` or `textproto` for +machine-readable format. +Notably, the aquery command runs on top of a regular Bazel build and inherits +the set of options available during a build. + +It supports the same set of functions that is also available to traditional +`query` but `siblings`, `buildfiles` and +`tests`. + +For more details, see [Action Graph Query](/query/aquery). + +## Miscellaneous commands and options {:#misc-commands-options} + +### `help` {:#help} + +The `help` command provides on-line help. By default, it +shows a summary of available commands and help topics, as shown in +[Building with Bazel](/run/build#quickstart). +Specifying an argument displays detailed help for a particular +topic. Most topics are Bazel commands, such as `build` +or `query`, but there are some additional help topics +that do not correspond to commands. + +#### `--[no]long` (`-l`) {:#long} + +By default, `bazel help [{{ "" }}topic{{ "" }}]` prints only a +summary of the relevant options for a topic. If +the `--long` option is specified, the type, default value +and full description of each option is also printed. + +### `shutdown` {:#shutdown} + +Bazel server processes may be stopped by using the `shutdown` +command. This command causes the Bazel server to exit as soon as it +becomes idle (for example, after the completion of any builds or other +commands that are currently in progress). For more details, see +[Client/server implementation](/run/client-server). + +Bazel servers stop themselves after an idle timeout, so this command +is rarely necessary; however, it can be useful in scripts when it is +known that no further builds will occur in a given workspace. + +`shutdown` accepts one +option, `--iff_heap_size_greater_than _n_`, which +requires an integer argument (in MB). If specified, this makes the shutdown +conditional on the amount of memory already consumed. This is +useful for scripts that initiate a lot of builds, as any memory +leaks in the Bazel server could cause it to crash spuriously on +occasion; performing a conditional restart preempts this condition. + +### `info` {:#info} + +The `info` command prints various values associated with +the Bazel server instance, or with a specific build configuration. +(These may be used by scripts that drive a build.) + +The `info` command also permits a single (optional) +argument, which is the name of one of the keys in the list below. +In this case, `bazel info {{ "" }}key{{ "" }}` will print only +the value for that one key. (This is especially convenient when +scripting Bazel, as it avoids the need to pipe the result +through `sed -ne /key:/s/key://p`: + +#### Configuration-independent data {:#configuration-independent-data} + +* `release`: the release label for this Bazel + instance, or "development version" if this is not a released + binary. +* `workspace` the absolute path to the base workspace + directory. +* `install_base`: the absolute path to the installation + directory used by this Bazel instance for the current user. Bazel + installs its internally required executables below this directory. + +* `output_base`: the absolute path to the base output + directory used by this Bazel instance for the current user and + workspace combination. Bazel puts all of its scratch and build + output below this directory. +* `execution_root`: the absolute path to the execution + root directory under output_base. This directory is the root for all files + accessible to commands executed during the build, and is the working + directory for those commands. If the workspace directory is writable, a + symlink named `bazel-` + is placed there pointing to this directory. +* `output_path`: the absolute path to the output + directory beneath the execution root used for all files actually + generated as a result of build commands. If the workspace directory is + writable, a symlink named `bazel-out` is placed there pointing + to this directory. +* `server_pid`: the process ID of the Bazel server + process. +* `server_log`: the absolute path to the Bazel server's debug log file. + This file contains debugging information for all commands over the lifetime of the + Bazel server, and is intended for human consumption by Bazel developers and power users. +* `command_log`: the absolute path to the command log file; + this contains the interleaved stdout and stderr streams of the most recent + Bazel command. Note that running `bazel info` will overwrite the + contents of this file, since it then becomes the most recent Bazel command. + However, the location of the command log file will not change unless you + change the setting of the `--output_base` or + `--output_user_root` options. +* `used-heap-size`, + `committed-heap-size`, + `max-heap-size`: reports various JVM heap size + parameters. Respectively: memory currently used, memory currently + guaranteed to be available to the JVM from the system, maximum + possible allocation. +* `gc-count`, `gc-time`: The cumulative count of + garbage collections since the start of this Bazel server and the time spent + to perform them. Note that these values are not reset at the start of every + build. +* `package_path`: A colon-separated list of paths which would be + searched for packages by bazel. Has the same format as the + `--package_path` build command line argument. + +Example: the process ID of the Bazel server. + +
    % bazel info server_pid
    +1285
    +
    + +#### Configuration-specific data {:#configuration-specific-data} + +These data may be affected by the configuration options passed +to `bazel info`, for +example `--cpu`, `--compilation_mode`, +etc. The `info` command accepts all +the options that control dependency +analysis, since some of these determine the location of the +output directory of a build, the choice of compiler, etc. + +* `bazel-bin`, `bazel-testlogs`, + `bazel-genfiles`: reports the absolute path to + the `bazel-*` directories in which programs generated by the + build are located. This is usually, though not always, the same as + the `bazel-*` symlinks created in the base workspace directory after a + successful build. However, if the workspace directory is read-only, + no `bazel-*` symlinks can be created. Scripts that use + the value reported by `bazel info`, instead of assuming the + existence of the symlink, will be more robust. +* The complete + ["Make" environment](/reference/be/make-variables). If the `--show_make_env` flag is + specified, all variables in the current configuration's "Make" environment + are also displayed (such as `CC`, `GLIBC_VERSION`, etc). + These are the variables accessed using the `$(CC)` + or `varref("CC")` syntax inside BUILD files. + +Example: the C++ compiler for the current configuration. +This is the `$(CC)` variable in the "Make" environment, +so the `--show_make_env` flag is needed. + +
    +  % bazel info --show_make_env -c opt COMPILATION_MODE
    +  opt
    +
    + +Example: the `bazel-bin` output directory for the current +configuration. This is guaranteed to be correct even in cases where +the `bazel-bin` symlink cannot be created for some reason +(such as if you are building from a read-only directory). + +
    % bazel info --cpu=piii bazel-bin
    +/var/tmp/_bazel_johndoe/fbd0e8a34f61ce5d491e3da69d959fe6/execroot/io_bazel/bazel-out/piii-opt/bin
    +% bazel info --cpu=k8 bazel-bin
    +/var/tmp/_bazel_johndoe/fbd0e8a34f61ce5d491e3da69d959fe6/execroot/io_bazel/bazel-out/k8-opt/bin
    +
    + +### `version` and `--version` {:#version} + +The version command prints version details about the built Bazel +binary, including the changelist at which it was built and the date. +These are particularly useful in determining if you have the latest +Bazel, or if you are reporting bugs. Some of the interesting values +are: + +* `changelist`: the changelist at which this version of + Bazel was released. +* `label`: the release label for this Bazel + instance, or "development version" if this is not a released + binary. Very useful when reporting bugs. + +`bazel --version`, with no other args, will emit the same output as +`bazel version --gnu_format`, except without the side-effect of potentially starting +a Bazel server or unpacking the server archive. `bazel --version` can be run from +anywhere - it does not require a workspace directory. + +### `mobile-install` {:#mobile-install} + +The `mobile-install` command installs apps to mobile devices. +Currently only Android devices running ART are supported. + +See [bazel mobile-install](/docs/mobile-install) for more information. + +Note: This command does not install the same thing that +`bazel build` produces: Bazel tweaks the app so that it can be +built, installed and re-installed quickly. This should, however, be mostly +transparent to the app. + +The following options are supported: + +#### `--incremental` {:#incremental} + +If set, Bazel tries to install the app incrementally, that is, only those +parts that have changed since the last build. This cannot update resources +referenced from `AndroidManifest.xml`, native code or Java +resources (such as those referenced by `Class.getResource()`). If these +things change, this option must be omitted. Contrary to the spirit of Bazel +and due to limitations of the Android platform, it is the +**responsibility of the user** to know when this command is good enough and +when a full install is needed. + +If you are using a device with Marshmallow or later, consider the +[`--split_apks`](#split-apks) flag. + +#### `--split_apks` {:#split-apks} + +Whether to use split apks to install and update the application on the device. +Works only with devices with Marshmallow or later. Note that the +[`--incremental`](#incremental) flag +is not necessary when using `--split_apks`. + +#### `--start_app` {:#start-app} + +Starts the app in a clean state after installing. Equivalent to `--start=COLD`. + +#### `--debug_app` {:#debug-app} + +Waits for debugger to be attached before starting the app in a clean state after installing. +Equivalent to `--start=DEBUG`. + +#### `--start=_start_type_` {:#start} + +How the app should be started after installing it. Supported _start_type_s are: + +* `NO` Does not start the app. This is the default. +* `COLD` Starts the app from a clean state after install. +* `WARM` Preserves and restores the application state on incremental installs. +* `DEBUG` Waits for the debugger before starting the app in a clean state after + install. + +Note: If more than one of `--start=_start_type_`, `--start_app` or +`--debug_app` is set, the last value is used. + +#### `--adb={{ "" }}path{{ "" }}` {:#adb} + +Indicates the `adb` binary to be used. + +The default is to use the adb in the Android SDK specified by +[`--android_sdk`](#android-sdk). + +#### `--adb_arg={{ "" }}serial{{ "" }}` {:#adb-arg} + +Extra arguments to `adb`. These come before the subcommand in the +command line and are typically used to specify which device to install to. +For example, to select the Android device or emulator to use: + +
    % bazel mobile-install --adb_arg=-s --adb_arg=deadbeef
    +
    + +invokes `adb` as + +
    +adb -s deadbeef install ...
    +
    + +#### `--incremental_install_verbosity={{ "" }}number{{ "" }}` {:#incremental-install-verbosity} + +The verbosity for incremental install. Set to 1 for debug logging to be +printed to the console. + +### `dump` {:#dump} + +The `dump` command prints to stdout a dump of the +internal state of the Bazel server. This command is intended +primarily for use by Bazel developers, so the output of this command +is not specified, and is subject to change. + +By default, command will just print help message outlining possible +options to dump specific areas of the Bazel state. In order to dump +internal state, at least one of the options must be specified. + +Following options are supported: + +* `--action_cache` dumps action cache content. +* `--packages` dumps package cache content. +* `--skyframe` dumps state of internal Bazel dependency graph. +* `--rules` dumps rule summary for each rule and aspect class, + including counts and action counts. This includes both native and Starlark rules. + If memory tracking is enabled, then the rules' memory consumption is also printed. +* `--skylark_memory` dumps a + [pprof](https://github.com/google/pprof) compatible .gz file to the specified path. + You must enable memory tracking for this to work. + +#### Memory tracking {:#memory-tracking} + +Some `dump` commands require memory tracking. To turn this on, you have to pass +startup flags to Bazel: + +* `--host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar` +* `--host_jvm_args=-DRULE_MEMORY_TRACKER=1` + +The java-agent is checked into Bazel at +`third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar`, so +make sure you adjust `$BAZEL` for where you keep your Bazel repository. + +Do not forget to keep passing these options to Bazel for every command or the server will +restart. + +Example: + +
    +    % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar \
    +    --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \
    +    build --nobuild <targets>
    +
    +    # Dump rules
    +    % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar \
    +    --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \
    +    dump --rules
    +
    +    # Dump Starlark heap and analyze it with pprof
    +    % bazel --host_jvm_args=-javaagent:$BAZEL/third_party/allocation_instrumenter/java-allocation-instrumenter-3.3.4.jar \
    +    --host_jvm_args=-DRULE_MEMORY_TRACKER=1 \
    +    dump --skylark_memory=$HOME/prof.gz
    +    % pprof -flame $HOME/prof.gz
    +
    + +### `analyze-profile` {:#analyze-profile} + +The `analyze-profile` command analyzes a +[JSON trace profile](/advanced/performance/json-trace-profile) previously +gathered during a Bazel invocation. + +### `canonicalize-flags` {:#canonicalize-flags} + +The [`canonicalize-flags`](/reference/command-line-reference#canonicalize-flags-options) +command, which takes a list of options for a Bazel command and returns a list of +options that has the same effect. The new list of options is canonical. For example, +two lists of options with the same effect are canonicalized to the same new list. + +The `--for_command` option can be used to select between different +commands. At this time, only `build` and `test` are +supported. Options that the given command does not support cause an error. + +Note: A small number of options cannot be reordered, because Bazel cannot +ensure that the effect is identical. Also note that this command +_does not_ expand flags from `--config`. + +As an example: + +
    +  % bazel canonicalize-flags -- --config=any_name --test_tag_filters="-lint"
    +  --config=any_name
    +  --test_tag_filters=-lint
    +
    + +### Startup options {:#startup-options} + +The options described in this section affect the startup of the Java +virtual machine used by Bazel server process, and they apply to all +subsequent commands handled by that server. If there is an already +running Bazel server and the startup options do not match, it will +be restarted. + +All of the options described in this section must be specified using the +`--key=value` or `--key value` +syntax. Also, these options must appear _before_ the name of the Bazel +command. Use `startup --key=value` to list these in a `.bazelrc` file. + +#### `--output_base={{ "" }}dir{{ "" }}` {:#output-base} + +This option requires a path argument, which must specify a +writable directory. Bazel will use this location to write all its +output. The output base is also the key by which the client locates +the Bazel server. By changing the output base, you change the server +which will handle the command. + +By default, the output base is derived from the user's login name, +and the name of the workspace directory (actually, its MD5 digest), +so a typical value looks like: +`/var/tmp/google/_bazel_johndoe/d41d8cd98f00b204e9800998ecf8427e`. + +Note: The client uses the output base to find the Bazel server +instance, so if you specify a different output base in a Bazel +command, a different server will be found (or started) to handle the +request. It's possible to perform two concurrent builds in the same +workspace directory by varying the output base. + +For example: + +
    + OUTPUT_BASE=/var/tmp/google/_bazel_johndoe/custom_output_base
    +% bazel --output_base ${OUTPUT_BASE}1 build //foo  &  bazel --output_base ${OUTPUT_BASE}2 build //bar
    +
    + +In this command, the two Bazel commands run concurrently (because of +the shell `&` operator), each using a different Bazel +server instance (because of the different output bases). +In contrast, if the default output base was used in both commands, +then both requests would be sent to the same server, which would +handle them sequentially: building `//foo` first, followed +by an incremental build of `//bar`. + +Note: We recommend you do not use an NFS or similar networked file system for the root +directory, as the higher access latency will cause noticeably slower builds. + +#### `--output_user_root={{ "" }}dir{{ "" }}` {:#output-user-root} + +Points to the root directory where output and install bases are created. The directory +must either not exist or be owned by the calling user. In the past, +this was allowed to point to a directory shared among various users +but it's not allowed any longer. This may be allowed once +[issue #11100](https://github.com/bazelbuild/bazel/issues/11100){: .external} is addressed. + +If the `--output_base` option is specified, it overrides +using `--output_user_root` to calculate the output base. + +The install base location is calculated based on +`--output_user_root`, plus the MD5 identity of the Bazel embedded +binaries. + +You can use the `--output_user_root` option to choose an +alternate base location for all of Bazel's output (install base and output +base) if there is a better location in your filesystem layout. + +Note: We recommend you do not use an NFS or similar networked file system for the root +directory, as the higher access latency will cause noticeably slower builds. + +#### `--server_javabase={{ "" }}dir{{ "" }}` {:#server-javabase} + +Specifies the Java virtual machine in which _Bazel itself_ runs. The value must be a path to +the directory containing a JDK or JRE. It should not be a label. +This option should appear before any Bazel command, for example: + +
    +  % bazel --server_javabase=/usr/local/buildtools/java/jdk build //foo
    +
    + +This flag does _not_ affect the JVMs used by Bazel subprocesses such as applications, tests, +tools, and so on. Use build options [--javabase](#javabase) or +[--host_javabase](#host-javabase) instead. + +This flag was previously named `--host_javabase` (sometimes referred to as the +'left-hand side' `--host_javabase`), but was renamed to avoid confusion with the +build flag [--host_javabase](#host-javabase) (sometimes referred to as the +'right-hand side' `--host_javabase`). + +#### `--host_jvm_args={{ "" }}string{{ "" }}` {:#host-jvm-args} + +Specifies a startup option to be passed to the Java virtual machine in which _Bazel itself_ +runs. This can be used to set the stack size, for example: + +
    +  % bazel --host_jvm_args="-Xss256K" build //foo
    +
    + +This option can be used multiple times with individual arguments. Note that +setting this flag should rarely be needed. You can also pass a space-separated list of strings, +each of which will be interpreted as a separate JVM argument, but this feature will soon be +deprecated. + +That this does _not_ affect any JVMs used by +subprocesses of Bazel: applications, tests, tools, and so on. To pass +JVM options to executable Java programs, whether run by `bazel +run` or on the command-line, you should use +the `--jvm_flags` argument which +all `java_binary` and `java_test` programs +support. Alternatively for tests, use `bazel test --test_arg=--jvm_flags=foo ...`. + +#### `--host_jvm_debug` {:#host-java-debug} + +This option causes the Java virtual machine to wait for a connection +from a JDWP-compliant debugger before +calling the main method of _Bazel itself_. This is primarily +intended for use by Bazel developers. + +Note: This does _not_ affect any JVMs used by subprocesses of Bazel: +applications, tests, tools, etc. + +#### `--autodetect_server_javabase` {:#autodetect-server-javabase} + +This option causes Bazel to automatically search for an installed JDK on startup, +and to fall back to the installed JRE if the embedded JRE isn't available. +`--explicit_server_javabase` can be used to pick an explicit JRE to +run Bazel with. + +#### `--batch` {:#batch} + +Batch mode causes Bazel to not use the +[standard client/server mode](/run/client-server), but instead runs a bazel +java process for a single command, which has been used for more predictable +semantics with respect to signal handling, job control, and environment +variable inheritance, and is necessary for running bazel in a chroot jail. + +Batch mode retains proper queueing semantics within the same output_base. +That is, simultaneous invocations will be processed in order, without overlap. +If a batch mode Bazel is run on a client with a running server, it first +kills the server before processing the command. + +Bazel will run slower in batch mode, or with the alternatives described above. +This is because, among other things, the build file cache is memory-resident, so it is not +preserved between sequential batch invocations. +Therefore, using batch mode often makes more sense in cases where performance +is less critical, such as continuous builds. + +Warning: `--batch` is sufficiently slower than standard +client/server mode. Additionally it might not support all of the features and optimizations which +are made possible by a persistent Bazel server. If you're using `--batch` +for the purpose of build isolation, you should use the command option +`--nokeep_state_after_build`, which guarantees that no incremental +in-memory state is kept between builds. In order to restart the Bazel server and JVM after a +build, please explicitly do so using the "shutdown" command. + +#### `--max_idle_secs={{ "" }}n{{ "" }}` {:#max-idle-secs} + +This option specifies how long, in seconds, the Bazel server process +should wait after the last client request, before it exits. The +default value is 10800 (3 hours). `--max_idle_secs=0` will cause the +Bazel server process to persist indefinitely. + +Note: this flag is only read if Bazel needs +to start a new server. Changing this option will not cause the server to restart. + +Note: system sleep time where a build is not running is counted as idle time. + +This option may be used by scripts that invoke Bazel to ensure that +they do not leave Bazel server processes on a user's machine when they +would not be running otherwise. +For example, a presubmit script might wish to +invoke `bazel query` to ensure that a user's pending +change does not introduce unwanted dependencies. However, if the +user has not done a recent build in that workspace, it would be +undesirable for the presubmit script to start a Bazel server just +for it to remain idle for the rest of the day. +By specifying a small value of `--max_idle_secs` in the +query request, the script can ensure that _if_ it caused a new +server to start, that server will exit promptly, but if instead +there was already a server running, that server will continue to run +until it has been idle for the usual time. Of course, the existing +server's idle timer will be reset. + +#### `--[no]shutdown_on_low_sys_mem` {:#shutdown-on-low-sys-mem} + +If enabled and `--max_idle_secs` is set to a positive duration, +after the build server has been idle for a while, shut down the server when the system is +low on memory. Linux only. + +In addition to running an idle check corresponding to max_idle_secs, the build server will +starts monitoring available system memory after the server has been idle for some time. +If the available system memory becomes critically low, the server will exit. + +#### `--[no]block_for_lock` {:#block-for-lock} + +If enabled, Bazel will wait for other Bazel commands holding the +server lock to complete before progressing. If disabled, Bazel will +exit in error if it cannot immediately acquire the lock and +proceed. + +Developers might use this in presubmit checks to avoid long waits caused +by another Bazel command in the same client. + +#### `--io_nice_level={{ "" }}n{{ "" }}` {:#io-nice-level} + +Sets a level from 0-7 for best-effort IO scheduling. 0 is highest priority, +7 is lowest. The anticipatory scheduler may only honor up to priority 4. +Negative values are ignored. + +#### `--batch_cpu_scheduling` {:#batch-cpu-scheduling} + +Use `batch` CPU scheduling for Bazel. This policy is useful for +workloads that are non-interactive, but do not want to lower their nice value. +See 'man 2 sched_setscheduler'. This policy may provide for better system +interactivity at the expense of Bazel throughput. + +### Miscellaneous options {:#misc-options} + +#### `--[no]announce_rc` {:#announce-rc} + +Controls whether Bazel announces startup options and command options read from +the bazelrc files when starting up. + +#### `--color (yes|no|auto)` {:#color} + +This option determines whether Bazel will use colors to highlight +its output on the screen. + +If this option is set to `yes`, color output is enabled. +If this option is set to `auto`, Bazel will use color output only if +the output is being sent to a terminal and the TERM environment variable +is set to a value other than `dumb`, `emacs`, or `xterm-mono`. +If this option is set to `no`, color output is disabled, +regardless of whether the output is going to a terminal and regardless +of the setting of the TERM environment variable. + +#### `--config={{ "" }}name{{ "" }}` {:#config} + +Selects additional config section from +[the rc files](/run/bazelrc#bazelrc-file-locations); for the current `command`, +it also pulls in the options from `command:name` if such a section exists. Can be +specified multiple times to add flags from several config sections. Expansions can refer to other +definitions (for example, expansions can be chained). + +#### `--curses (yes|no|auto)` {:#curses} + +This option determines whether Bazel will use cursor controls +in its screen output. This results in less scrolling data, and a more +compact, easy-to-read stream of output from Bazel. This works well with +`--color`. + +If this option is set to `yes`, use of cursor controls is enabled. +If this option is set to `no`, use of cursor controls is disabled. +If this option is set to `auto`, use of cursor controls will be +enabled under the same conditions as for `--color=auto`. + +#### `--[no]show_timestamps` {:#show-timestamps} + +If specified, a timestamp is added to each message generated by +Bazel specifying the time at which the message was displayed. diff --git a/extending/config.mdx b/extending/config.mdx new file mode 100644 index 000000000..0e44c3448 --- /dev/null +++ b/extending/config.mdx @@ -0,0 +1,789 @@ +--- +title: 'Configurations' +--- + + + +This page covers the benefits and basic usage of Starlark configurations, +Bazel's API for customizing how your project builds. It includes how to define +build settings and provides examples. + +This makes it possible to: + +* define custom flags for your project, obsoleting the need for + [`--define`](/docs/configurable-attributes#custom-keys) +* write + [transitions](/rules/lib/builtins/transition#transition) to configure deps in + different configurations than their parents + (such as `--compilation_mode=opt` or `--cpu=arm`) +* bake better defaults into rules (such as automatically build `//my:android_app` + with a specified SDK) + +and more, all completely from .bzl files (no Bazel release required). See the +`bazelbuild/examples` repo for +[examples](https://github.com/bazelbuild/examples/tree/HEAD/configurations){: .external}. + +## User-defined build settings {:#user-defined-build-settings} + +A build setting is a single piece of +[configuration](/extending/rules#configurations) +information. Think of a configuration as a key/value map. Setting `--cpu=ppc` +and `--copt="-DFoo"` produces a configuration that looks like +`{cpu: ppc, copt: "-DFoo"}`. Each entry is a build setting. + +Traditional flags like `cpu` and `copt` are native settings — +their keys are defined and their values are set inside native bazel java code. +Bazel users can only read and write them via the command line +and other APIs maintained natively. Changing native flags, and the APIs +that expose them, requires a bazel release. User-defined build +settings are defined in `.bzl` files (and thus, don't need a bazel release to +register changes). They also can be set via the command line +(if they're designated as `flags`, see more below), but can also be +set via [user-defined transitions](#user-defined-transitions). + +### Defining build settings {:#defining-build-settings} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/basic_build_setting){: .external} + +#### The `build_setting` `rule()` parameter {:#rule-parameter} + +Build settings are rules like any other rule and are differentiated using the +Starlark `rule()` function's `build_setting` +[attribute](/rules/lib/globals/bzl#rule.build_setting). + +```python +# example/buildsettings/build_settings.bzl +string_flag = rule( + implementation = _impl, + build_setting = config.string(flag = True) +) +``` + +The `build_setting` attribute takes a function that designates the type of the +build setting. The type is limited to a set of basic Starlark types like +`bool` and `string`. See the `config` module +[documentation](/rules/lib/toplevel/config) for details. More complicated typing can be +done in the rule's implementation function. More on this below. + +The `config` module's functions takes an optional boolean parameter, `flag`, +which is set to false by default. if `flag` is set to true, the build setting +can be set on the command line by users as well as internally by rule writers +via default values and [transitions](/rules/lib/builtins/transition#transition). +Not all settings should be settable by users. For example, if you as a rule +writer have some debug mode that you'd like to turn on inside test rules, +you don't want to give users the ability to indiscriminately turn on that +feature inside other non-test rules. + +#### Using ctx.build_setting_value {:#ctx-build-setting-value} + +Like all rules, build setting rules have [implementation functions](/extending/rules#implementation-function). +The basic Starlark-type value of the build settings can be accessed via the +`ctx.build_setting_value` method. This method is only available to +[`ctx`](/rules/lib/builtins/ctx) objects of build setting rules. These implementation +methods can directly forward the build settings value or do additional work on +it, like type checking or more complex struct creation. Here's how you would +implement an `enum`-typed build setting: + +```python +# example/buildsettings/build_settings.bzl +TemperatureProvider = provider(fields = ['type']) + +temperatures = ["HOT", "LUKEWARM", "ICED"] + +def _impl(ctx): + raw_temperature = ctx.build_setting_value + if raw_temperature not in temperatures: + fail(str(ctx.label) + " build setting allowed to take values {" + + ", ".join(temperatures) + "} but was set to unallowed value " + + raw_temperature) + return TemperatureProvider(type = raw_temperature) + +temperature = rule( + implementation = _impl, + build_setting = config.string(flag = True) +) +``` + +Note: if a rule depends on a build setting, it will receive whatever providers +the build setting implementation function returns, like any other dependency. +But all other references to the value of the build setting (such as in transitions) +will see its basic Starlark-typed value, not this post implementation function +value. + +#### Defining multi-set string flags {:#multi-set-string-flags} + +String settings have an additional `allow_multiple` parameter which allows the +flag to be set multiple times on the command line or in bazelrcs. Their default +value is still set with a string-typed attribute: + +```python +# example/buildsettings/build_settings.bzl +allow_multiple_flag = rule( + implementation = _impl, + build_setting = config.string(flag = True, allow_multiple = True) +) +``` + +```python +# example/BUILD +load("//example/buildsettings:build_settings.bzl", "allow_multiple_flag") +allow_multiple_flag( + name = "roasts", + build_setting_default = "medium" +) +``` + +Each setting of the flag is treated as a single value: + +```shell +$ bazel build //my/target --//example:roasts=blonde \ + --//example:roasts=medium,dark +``` + +The above is parsed to `{"//example:roasts": ["blonde", "medium,dark"]}` and +`ctx.build_setting_value` returns the list `["blonde", "medium,dark"]`. + +#### Instantiating build settings {:#instantiating-build-settings} + +Rules defined with the `build_setting` parameter have an implicit mandatory +`build_setting_default` attribute. This attribute takes on the same type as +declared by the `build_setting` param. + +```python +# example/buildsettings/build_settings.bzl +FlavorProvider = provider(fields = ['type']) + +def _impl(ctx): + return FlavorProvider(type = ctx.build_setting_value) + +flavor = rule( + implementation = _impl, + build_setting = config.string(flag = True) +) +``` + +```python +# example/BUILD +load("//example/buildsettings:build_settings.bzl", "flavor") +flavor( + name = "favorite_flavor", + build_setting_default = "APPLE" +) +``` + +### Predefined settings {:#predefined-settings} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/use_skylib_build_setting){: .external} + +The +[Skylib](https://github.com/bazelbuild/bazel-skylib){: .external} +library includes a set of predefined settings you can instantiate without having +to write custom Starlark. + +For example, to define a setting that accepts a limited set of string values: + +```python +# example/BUILD +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +string_flag( + name = "myflag", + values = ["a", "b", "c"], + build_setting_default = "a", +) +``` + +For a complete list, see +[Common build setting rules](https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl){: .external}. + +### Using build settings {:#using-build-settings} + +#### Depending on build settings {:#depending-on-build-settings} + +If a target would like to read a piece of configuration information, it can +directly depend on the build setting via a regular attribute dependency. + +```python +# example/rules.bzl +load("//example/buildsettings:build_settings.bzl", "FlavorProvider") +def _rule_impl(ctx): + if ctx.attr.flavor[FlavorProvider].type == "ORANGE": + ... + +drink_rule = rule( + implementation = _rule_impl, + attrs = { + "flavor": attr.label() + } +) +``` + +```python +# example/BUILD +load("//example:rules.bzl", "drink_rule") +load("//example/buildsettings:build_settings.bzl", "flavor") +flavor( + name = "favorite_flavor", + build_setting_default = "APPLE" +) +drink_rule( + name = "my_drink", + flavor = ":favorite_flavor", +) +``` + +Languages may wish to create a canonical set of build settings which all rules +for that language depend on. Though the native concept of `fragments` no longer +exists as a hardcoded object in Starlark configuration world, one way to +translate this concept would be to use sets of common implicit attributes. For +example: + +```python +# kotlin/rules.bzl +_KOTLIN_CONFIG = { + "_compiler": attr.label(default = "//kotlin/config:compiler-flag"), + "_mode": attr.label(default = "//kotlin/config:mode-flag"), + ... +} + +... + +kotlin_library = rule( + implementation = _rule_impl, + attrs = dicts.add({ + "library-attr": attr.string() + }, _KOTLIN_CONFIG) +) + +kotlin_binary = rule( + implementation = _binary_impl, + attrs = dicts.add({ + "binary-attr": attr.label() + }, _KOTLIN_CONFIG) + +``` + +#### Using build settings on the command line {:#build-settings-command-line} + +Similar to most native flags, you can use the command line to set build settings +[that are marked as flags](#rule-parameter). The build +setting's name is its full target path using `name=value` syntax: + +```shell +$ bazel build //my/target --//example:string_flag=some-value # allowed +$ bazel build //my/target --//example:string_flag some-value # not allowed +``` + +Special boolean syntax is supported: + +```shell +$ bazel build //my/target --//example:boolean_flag +$ bazel build //my/target --no//example:boolean_flag +``` + +#### Using build setting aliases {:#using-build-setting-aliases} + +You can set an alias for your build setting target path to make it easier to read +on the command line. Aliases function similarly to native flags and also make use +of the double-dash option syntax. + +Set an alias by adding `--flag_alias=ALIAS_NAME=TARGET_PATH` +to your `.bazelrc` . For example, to set an alias to `coffee`: + +```shell +# .bazelrc +build --flag_alias=coffee=//experimental/user/starlark_configurations/basic_build_setting:coffee-temp +``` + +Best Practice: Setting an alias multiple times results in the most recent +one taking precedence. Use unique alias names to avoid unintended parsing results. + +To make use of the alias, type it in place of the build setting target path. +With the above example of `coffee` set in the user's `.bazelrc`: + +```shell +$ bazel build //my/target --coffee=ICED +``` + +instead of + +```shell +$ bazel build //my/target --//experimental/user/starlark_configurations/basic_build_setting:coffee-temp=ICED +``` +Best Practice: While it possible to set aliases on the command line, leaving them +in a `.bazelrc` reduces command line clutter. + +### Label-typed build settings {:#label-typed-build-settings} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/label_typed_build_setting){: .external} + +Unlike other build settings, label-typed settings cannot be defined using the +`build_setting` rule parameter. Instead, bazel has two built-in rules: +`label_flag` and `label_setting`. These rules forward the providers of the +actual target to which the build setting is set. `label_flag` and +`label_setting` can be read/written by transitions and `label_flag` can be set +by the user like other `build_setting` rules can. Their only difference is they +can't customely defined. + +Label-typed settings will eventually replace the functionality of late-bound +defaults. Late-bound default attributes are Label-typed attributes whose +final values can be affected by configuration. In Starlark, this will replace +the [`configuration_field`](/rules/lib/globals/bzl#configuration_field) + API. + +```python +# example/rules.bzl +MyProvider = provider(fields = ["my_field"]) + +def _dep_impl(ctx): + return MyProvider(my_field = "yeehaw") + +dep_rule = rule( + implementation = _dep_impl +) + +def _parent_impl(ctx): + if ctx.attr.my_field_provider[MyProvider].my_field == "cowabunga": + ... + +parent_rule = rule( + implementation = _parent_impl, + attrs = { "my_field_provider": attr.label() } +) + +``` + +```python +# example/BUILD +load("//example:rules.bzl", "dep_rule", "parent_rule") + +dep_rule(name = "dep") + +parent_rule(name = "parent", my_field_provider = ":my_field_provider") + +label_flag( + name = "my_field_provider", + build_setting_default = ":dep" +) +``` + +### Build settings and select() {:#build-settings-and-select} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/select_on_build_setting){: .external} + +Users can configure attributes on build settings by using + [`select()`](/reference/be/functions#select). Build setting targets can be passed to the `flag_values` attribute of +`config_setting`. The value to match to the configuration is passed as a +`String` then parsed to the type of the build setting for matching. + +```python +config_setting( + name = "my_config", + flag_values = { + "//example:favorite_flavor": "MANGO" + } +) +``` + +## User-defined transitions {:#user-defined-transitions} + +A configuration +[transition](/rules/lib/builtins/transition#transition) +maps the transformation from one configured target to another within the +build graph. + +Important: Transitions have [memory and performance impact](#memory-performance-considerations). + +### Defining {:#defining} + +Transitions define configuration changes between rules. For example, a request +like "compile my dependency for a different CPU than its parent" is handled by a +transition. + +Formally, a transition is a function from an input configuration to one or more +output configurations. Most transitions are 1:1 such as "override the input +configuration with `--cpu=ppc`". 1:2+ transitions can also exist but come +with special restrictions. + +In Starlark, transitions are defined much like rules, with a defining +`transition()` +[function](/rules/lib/builtins/transition#transition) +and an implementation function. + +```python +# example/transitions/transitions.bzl +def _impl(settings, attr): + _ignore = (settings, attr) + return {"//example:favorite_flavor" : "MINT"} + +hot_chocolate_transition = transition( + implementation = _impl, + inputs = [], + outputs = ["//example:favorite_flavor"] +) +``` +The `transition()` function takes in an implementation function, a set of +build settings to read(`inputs`), and a set of build settings to write +(`outputs`). The implementation function has two parameters, `settings` and +`attr`. `settings` is a dictionary {`String`:`Object`} of all settings declared +in the `inputs` parameter to `transition()`. + +`attr` is a dictionary of attributes and values of the rule to which the +transition is attached. When attached as an +[outgoing edge transition](#outgoing-edge-transitions), the values of these +attributes are all configured post-select() resolution. When attached as +an [incoming edge transition](#incoming-edge-transitions), `attr` does not +include any attributes that use a selector to resolve their value. If an +incoming edge transition on `--foo` reads attribute `bar` and then also +selects on `--foo` to set attribute `bar`, then there's a chance for the +incoming edge transition to read the wrong value of `bar` in the transition. + +Note: Since transitions are attached to rule definitions and `select()`s are +attached to rule instantiations (such as targets), errors related to `select()`s on +read attributes will pop up when users create targets rather than when rules are +written. It may be worth taking extra care to communicate to rule users which +attributes they should be wary of selecting on or taking other precautions. + +The implementation function must return a dictionary (or list of +dictionaries, in the case of +transitions with multiple output configurations) +of new build settings values to apply. The returned dictionary keyset(s) must +contain exactly the set of build settings passed to the `outputs` +parameter of the transition function. This is true even if a build setting is +not actually changed over the course of the transition - its original value must +be explicitly passed through in the returned dictionary. + +### Defining 1:2+ transitions {:#defining-1-2-transitions} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/multi_arch_binary){: .external} + +[Outgoing edge transition](#outgoing-edge-transitions) can map a single input +configuration to two or more output configurations. This is useful for defining +rules that bundle multi-architecture code. + +1:2+ transitions are defined by returning a list of dictionaries in the +transition implementation function. + +```python +# example/transitions/transitions.bzl +def _impl(settings, attr): + _ignore = (settings, attr) + return [ + {"//example:favorite_flavor" : "LATTE"}, + {"//example:favorite_flavor" : "MOCHA"}, + ] + +coffee_transition = transition( + implementation = _impl, + inputs = [], + outputs = ["//example:favorite_flavor"] +) +``` +They can also set custom keys that the rule implementation function can use to +read individual dependencies: + +```python +# example/transitions/transitions.bzl +def _impl(settings, attr): + _ignore = (settings, attr) + return { + "Apple deps": {"//command_line_option:cpu": "ppc"}, + "Linux deps": {"//command_line_option:cpu": "x86"}, + } + +multi_arch_transition = transition( + implementation = _impl, + inputs = [], + outputs = ["//command_line_option:cpu"] +) +``` + +### Attaching transitions {:#attaching-transitions} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/attaching_transitions_to_rules){: .external} + +Transitions can be attached in two places: incoming edges and outgoing edges. +Effectively this means rules can transition their own configuration (incoming +edge transition) and transition their dependencies' configurations (outgoing +edge transition). + +NOTE: There is currently no way to attach Starlark transitions to native rules. +If you need to do this, contact +bazel-discuss@googlegroups.com +for help with figuring out workarounds. + +### Incoming edge transitions {:#incoming-edge-transitions} + +Incoming edge transitions are activated by attaching a `transition` object +(created by `transition()`) to `rule()`'s `cfg` parameter: + +```python +# example/rules.bzl +load("example/transitions:transitions.bzl", "hot_chocolate_transition") +drink_rule = rule( + implementation = _impl, + cfg = hot_chocolate_transition, + ... +``` + +Incoming edge transitions must be 1:1 transitions. + +### Outgoing edge transitions {:#outgoing-edge-transitions} + +Outgoing edge transitions are activated by attaching a `transition` object +(created by `transition()`) to an attribute's `cfg` parameter: + +```python +# example/rules.bzl +load("example/transitions:transitions.bzl", "coffee_transition") +drink_rule = rule( + implementation = _impl, + attrs = { "dep": attr.label(cfg = coffee_transition)} + ... +``` +Outgoing edge transitions can be 1:1 or 1:2+. + +See [Accessing attributes with transitions](#accessing-attributes-with-transitions) +for how to read these keys. + +### Transitions on native options {:#transitions-native-options} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/transition_on_native_flag){: .external} + +Starlark transitions can also declare reads and writes on native build +configuration options via a special prefix to the option name. + +```python +# example/transitions/transitions.bzl +def _impl(settings, attr): + _ignore = (settings, attr) + return {"//command_line_option:cpu": "k8"} + +cpu_transition = transition( + implementation = _impl, + inputs = [], + outputs = ["//command_line_option:cpu"] +``` + +#### Unsupported native options {:#unsupported-native-options} + +Bazel doesn't support transitioning on `--define` with +`"//command_line_option:define"`. Instead, use a custom +[build setting](#user-defined-build-settings). In general, new usages of +`--define` are discouraged in favor of build settings. + +Bazel doesn't support transitioning on `--config`. This is because `--config` is +an "expansion" flag that expands to other flags. + +Crucially, `--config` may include flags that don't affect build configuration, +such as +[`--spawn_strategy`](/docs/user-manual#spawn-strategy) +. Bazel, by design, can't bind such flags to individual targets. This means +there's no coherent way to apply them in transitions. + +As a workaround, you can explicitly itemize the flags that *are* part of +the configuration in your transition. This requires maintaining the `--config`'s +expansion in two places, which is a known UI blemish. + +### Transitions on allow multiple build settings {:#transitions-multiple-build-settings} + +When setting build settings that +[allow multiple values](#defining-multi-set-string-flags), the value of the +setting must be set with a list. + +```python +# example/buildsettings/build_settings.bzl +string_flag = rule( + implementation = _impl, + build_setting = config.string(flag = True, allow_multiple = True) +) +``` + +```python +# example/BUILD +load("//example/buildsettings:build_settings.bzl", "string_flag") +string_flag(name = "roasts", build_setting_default = "medium") +``` + +```python +# example/transitions/rules.bzl +def _transition_impl(settings, attr): + # Using a value of just "dark" here will throw an error + return {"//example:roasts" : ["dark"]}, + +coffee_transition = transition( + implementation = _transition_impl, + inputs = [], + outputs = ["//example:roasts"] +) +``` + +### No-op transitions {:#no-op-transitions} + +If a transition returns `{}`, `[]`, or `None`, this is shorthand for keeping all +settings at their original values. This can be more convenient than explicitly +setting each output to itself. + +```python +# example/transitions/transitions.bzl +def _impl(settings, attr): + _ignore = (attr) + if settings["//example:already_chosen"] is True: + return {} + return { + "//example:favorite_flavor": "dark chocolate", + "//example:include_marshmallows": "yes", + "//example:desired_temperature": "38C", + } + +hot_chocolate_transition = transition( + implementation = _impl, + inputs = ["//example:already_chosen"], + outputs = [ + "//example:favorite_flavor", + "//example:include_marshmallows", + "//example:desired_temperature", + ] +) +``` + +### Accessing attributes with transitions {:#accessing-attributes-with-transitions} + +[End to end example](https://github.com/bazelbuild/examples/tree/HEAD/configurations/read_attr_in_transition){: .external} + +When [attaching a transition to an outgoing edge](#outgoing-edge-transitions) +(regardless of whether the transition is a 1:1 or 1:2+ transition), `ctx.attr` is forced to be a list +if it isn't already. The order of elements in this list is unspecified. + +```python +# example/transitions/rules.bzl +def _transition_impl(settings, attr): + return {"//example:favorite_flavor" : "LATTE"}, + +coffee_transition = transition( + implementation = _transition_impl, + inputs = [], + outputs = ["//example:favorite_flavor"] +) + +def _rule_impl(ctx): + # Note: List access even though "dep" is not declared as list + transitioned_dep = ctx.attr.dep[0] + + # Note: Access doesn't change, other_deps was already a list + for other_dep in ctx.attr.other_deps: + # ... + +coffee_rule = rule( + implementation = _rule_impl, + attrs = { + "dep": attr.label(cfg = coffee_transition) + "other_deps": attr.label_list(cfg = coffee_transition) + }) +``` + +If the transition is `1:2+` and sets custom keys, `ctx.split_attr` can be used +to read individual deps for each key: + +```python +# example/transitions/rules.bzl +def _impl(settings, attr): + _ignore = (settings, attr) + return { + "Apple deps": {"//command_line_option:cpu": "ppc"}, + "Linux deps": {"//command_line_option:cpu": "x86"}, + } + +multi_arch_transition = transition( + implementation = _impl, + inputs = [], + outputs = ["//command_line_option:cpu"] +) + +def _rule_impl(ctx): + apple_dep = ctx.split_attr.dep["Apple deps"] + linux_dep = ctx.split_attr.dep["Linux deps"] + # ctx.attr has a list of all deps for all keys. Order is not guaranteed. + all_deps = ctx.attr.dep + +multi_arch_rule = rule( + implementation = _rule_impl, + attrs = { + "dep": attr.label(cfg = multi_arch_transition) + }) +``` + +See [complete example](https://github.com/bazelbuild/examples/tree/main/configurations/multi_arch_binary) +here. + +## Integration with platforms and toolchains {:#integration-platforms-toolchains} + +Many native flags today, like `--cpu` and `--crosstool_top` are related to +toolchain resolution. In the future, explicit transitions on these types of +flags will likely be replaced by transitioning on the +[target platform](/extending/platforms). + +## Memory and performance considerations {:#memory-performance-considerations} + +Adding transitions, and therefore new configurations, to your build comes at a +cost: larger build graphs, less comprehensible build graphs, and slower +builds. It's worth considering these costs when considering +using transitions in your build rules. Below is an example of how a transition +might create exponential growth of your build graph. + +### Badly behaved builds: a case study {:#badly-behaved-builds} + +![Scalability graph](/rules/scalability-graph.png "Scalability graph") + +**Figure 1.** Scalability graph showing a top level target and its dependencies. + +This graph shows a top level target, `//pkg:app`, which depends on two targets, a +`//pkg:1_0` and `//pkg:1_1`. Both these targets depend on two targets, `//pkg:2_0` and +`//pkg:2_1`. Both these targets depend on two targets, `//pkg:3_0` and `//pkg:3_1`. +This continues on until `//pkg:n_0` and `//pkg:n_1`, which both depend on a single +target, `//pkg:dep`. + +Building `//pkg:app` requires \\(2n+2\\) targets: + +* `//pkg:app` +* `//pkg:dep` +* `//pkg:i_0` and `//pkg:i_1` for \\(i\\) in \\([1..n]\\) + +Imagine you [implement](#user-defined-build-settings) a flag +`--//foo:owner=` and `//pkg:i_b` applies + + depConfig = myConfig + depConfig.owner="$(myConfig.owner)$(b)" + +In other words, `//pkg:i_b` appends `b` to the old value of `--owner` for all +its deps. + +This produces the following [configured targets](/reference/glossary#configured-target): + +``` +//pkg:app //foo:owner="" +//pkg:1_0 //foo:owner="" +//pkg:1_1 //foo:owner="" +//pkg:2_0 (via //pkg:1_0) //foo:owner="0" +//pkg:2_0 (via //pkg:1_1) //foo:owner="1" +//pkg:2_1 (via //pkg:1_0) //foo:owner="0" +//pkg:2_1 (via //pkg:1_1) //foo:owner="1" +//pkg:3_0 (via //pkg:1_0 → //pkg:2_0) //foo:owner="00" +//pkg:3_0 (via //pkg:1_0 → //pkg:2_1) //foo:owner="01" +//pkg:3_0 (via //pkg:1_1 → //pkg:2_0) //foo:owner="10" +//pkg:3_0 (via //pkg:1_1 → //pkg:2_1) //foo:owner="11" +... +``` + +`//pkg:dep` produces \\(2^n\\) configured targets: `config.owner=` +"\\(b_0b_1...b_n\\)" for all \\(b_i\\) in \\(\{0,1\}\\). + +This makes the build graph exponentially larger than the target graph, with +corresponding memory and performance consequences. + +TODO: Add strategies for measurement and mitigation of these issues. + +## Further reading {:#further-reading} + +For more details on modifying build configurations, see: + + * [Starlark Build Configuration](https://docs.google.com/document/d/1vc8v-kXjvgZOdQdnxPTaV0rrLxtP2XwnD2tAZlYJOqw/edit?usp=sharing){: .external} + * Full [set](https://github.com/bazelbuild/examples/tree/HEAD/configurations){: .external} of end to end examples diff --git a/extending/exec-groups.mdx b/extending/exec-groups.mdx index f785db8cf..aa70cb1ec 100644 --- a/extending/exec-groups.mdx +++ b/extending/exec-groups.mdx @@ -111,7 +111,7 @@ problem. The following execution groups are predefined: * `test`: Test runner actions (for more details, see - the [execution platform section of the Test Encyclopedia](/reference/test-encyclopedia#execution-platform)). + the [execution platform section of the Test Encyclopedia](/reference/test-encyclopedia#execution-platform)). * `cpp_link`: C++ linking actions. ## Using execution groups to set execution properties diff --git a/extending/platforms.mdx b/extending/platforms.mdx index 9304d80bc..920328e71 100644 --- a/extending/platforms.mdx +++ b/extending/platforms.mdx @@ -72,18 +72,18 @@ builds target the same machine Bazel runs on. Build rules can [@platforms/cpu](https://github.com/bazelbuild/platforms/blob/main/cpu/BUILD) constraints. -## Generally useful constraints and platforms +## Generally useful constraints and platforms {:#useful-constraints-platforms} To keep the ecosystem consistent, Bazel team maintains a repository with constraint definitions for the most popular CPU architectures and operating systems. These are all defined in -[https://github.com/bazelbuild/platforms](https://github.com/bazelbuild/platforms). +[https://github.com/bazelbuild/platforms](https://github.com/bazelbuild/platforms){: .external}. Bazel ships with the following special platform definition: `@platforms//host` (aliased as `@bazel_tools//tools:host_platform`). This auto-detects the OS and CPU properties of the machine Bazel runs on. -## Defining constraints +## Defining constraints {:#constraints} Constraints are modeled with the [`constraint_setting`][constraint_setting] and [`constraint_value`][constraint_value] build rules. @@ -113,7 +113,7 @@ the `x86` constraint as `//cpus:x86`. If visibility allows, you can extend an existing `constraint_setting` by defining your own value for it. -## Defining platforms +## Defining platforms {:#platforms} The [`platform`](/reference/be/platforms-and-toolchains#platform) build rule defines a platform as a collection of `constraint_value`s: @@ -135,7 +135,7 @@ Platforms may only have one `constraint_value` for a given `constraint_setting`. This means, for example, a platform can't have two CPUs unless you create another `constraint_setting` type to model the second value. -## Skipping incompatible targets +## Skipping incompatible targets {:#skipping-incompatible-targets} When building for a specific target platform it is often desirable to skip targets that will never work on that platform. For example, your Windows device @@ -165,7 +165,7 @@ incompatible with all else. Incompatibility is transitive. Any targets that transitively depend on an incompatible target are themselves considered incompatible. -### When are targets skipped? +### When are targets skipped? {:#when-targets-skipped} Targets are skipped when they are considered incompatible and included in the build as part of a target pattern expansion. For example, the following two @@ -200,7 +200,7 @@ FAILED: Build did NOT complete successfully Incompatible explicit targets are silently skipped if `--skip_incompatible_explicit_targets` is enabled. -### More expressive constraints +### More expressive constraints {:#expressive-constraints} For more flexibility in expressing constraints, use the `@platforms//:incompatible` @@ -235,8 +235,8 @@ The above can be interpreted as follows: deemed incompatible. To make your constraints more readable, use -[skylib](https://github.com/bazelbuild/bazel-skylib)'s -[`selects.with_or()`](https://github.com/bazelbuild/bazel-skylib/blob/main/docs/selects_doc.md#selectswith_or). +[skylib](https://github.com/bazelbuild/bazel-skylib){: .external}'s +[`selects.with_or()`](https://github.com/bazelbuild/bazel-skylib/blob/main/docs/selects_doc.md#selectswith_or){: .external}. You can express inverse compatibility in a similar way. The following example describes a library that is compatible with everything _except_ for ARM. @@ -252,7 +252,7 @@ cc_library( ) ``` -### Detecting incompatible targets using `bazel cquery` +### Detecting incompatible targets using `bazel cquery` {:#cquery-incompatible-target-detection} You can use the [`IncompatiblePlatformProvider`](/rules/lib/providers/IncompatiblePlatformProvider) diff --git a/extending/toolchains.mdx b/extending/toolchains.mdx index 0d92d6e18..249eaf06c 100644 --- a/extending/toolchains.mdx +++ b/extending/toolchains.mdx @@ -409,21 +409,79 @@ bar_toolchain = rule( The use of [`attr.label`](/rules/lib/toplevel/attr#label) is the same as for a standard rule, but the meaning of the `cfg` parameter is slightly different. -The dependency from a target (called the "parent") to a toolchain via toolchain -resolution uses a special configuration transition called the "toolchain -transition". The toolchain transition keeps the configuration the same, except -that it forces the execution platform to be the same for the toolchain as for -the parent (otherwise, toolchain resolution for the toolchain could pick any -execution platform, and wouldn't necessarily be the same as for parent). This -allows any `exec` dependencies of the toolchain to also be executable for the -parent's build actions. Any of the toolchain's dependencies which use `cfg = -"target"` (or which don't specify `cfg`, since "target" is the default) are -built for the same target platform as the parent. This allows toolchain rules to -contribute both libraries (the `system_lib` attribute above) and tools (the -`compiler` attribute) to the build rules which need them. The system libraries -are linked into the final artifact, and so need to be built for the same -platform, whereas the compiler is a tool invoked during the build, and needs to -be able to run on the execution platform. +When a target (the "parent") depends on a toolchain via toolchain resolution, +Bazel applies a special configuration transition called the "toolchain transition". + +In this transition Bazel keeps the overall configuration identical, but forces +the toolchain to use the same execution platform as the parent. Without this, +toolchain resolution could pick a different execution platform for the +toolchain, and the tools it provides might not be runnable for the parent's +actions. + +This alignment of execution platforms guarantees that any dependencies of the +toolchain declared with `cfg = "exec"` are built so they can run where the +parent's actions run. + +Dependencies declared with `cfg = "target"` (or which omit `cfg`, since +"target" is the default) are built for the parent's target platform. This lets +the toolchain contribute both runtime libraries and build-time tools. + +In practice: + +- `cfg = "exec"`: build artifacts intended to run during the build (e.g. + the `compiler` tool) and therefore for the execution platform. +- `cfg = "target"`: build artifacts intended to be linked into or shipped with + the final output (e.g. the `system_lib`) and therefore for the target + platform. + +The system libraries must be built for the same target platform as the final +artifact, while the compiler must be runnable on the execution platform. + +### Selecting `exec` dependencies + +For toolchain config rules, adding a `select()` to an attribute with `cfg = "exec"` +does **not** make the `select()` use the exec configuration. +It will still be resolved under the **target** configuration. + +Assuming the target platform is not matching any of these constraints, the select for the compiler +will fail to analyze. + +```python +bar_toolchain( + name = "barc_omni", + compiler = select({ + "@platforms//os:linux": Label(":linux_compiler"), + "@platforms//os:windows": Label(":windows_compiler"), + "//some/exec:platform": Label(":special_compiler"), + }, + no_match_error = "No compiler for this execution platform", + }), + # <...> +) +``` + +A known workaround for this is to defer the evaluation behind another target, +e.g. [`alias()`](/reference/be/general#alias). +This analyzes the `select` inside the alias under the exec configuration. + +```python +alias( + name = "host_specific_compiler", + actual = select({ + "@platforms//os:linux": Label(":linux_compiler"), + "@platforms//os:windows": Label(":windows_compiler"), + "//some/exec:platform": Label(":special_compiler"), + }, + no_match_error = "No compiler for this execution platform", + ), +) + +bar_toolchain( + name = "barc_omni", + compiler = ":host_specific_compiler", + # <...> +) +``` ## Registering and building with toolchains @@ -568,6 +626,12 @@ If the rule uses [execution groups](/extending/exec-groups), each execution group performs toolchain resolution separately, and each has its own execution platform and toolchains. +**TIP:** For a toolchain to match a platform, the platform must define *all* of +the toolchain's constraints. But the reverse isn't true: the platform may define +additional constraints not specified by the toolchain. This lets developers +define arbitrarily precise platforms that don't lose toolchain compatibility +because of unrelated hardware variants. + ## Debugging toolchains If you are adding toolchain support to an existing rule, use the diff --git a/external/faq.mdx b/external/faq.mdx index 0d358f08b..480658fbc 100644 --- a/external/faq.mdx +++ b/external/faq.mdx @@ -365,3 +365,4 @@ fetched](https://github.com/bazelbuild/bazel/discussions/20464). [go_deps]: https://github.com/bazel-contrib/rules_go/blob/master/docs/go/core/bzlmod.md#specifying-external-dependencies [bazelisk-config]: https://github.com/bazelbuild/bazelisk?tab=readme-ov-file#where-does-bazelisk-get-bazel-from [bcr-disclaimer]: https://github.com/bazelbuild/bazel-central-registry?tab=readme-ov-file#disclaimer + diff --git a/external/migration_tool.mdx b/external/migration_tool.mdx new file mode 100644 index 000000000..522e9ee8f --- /dev/null +++ b/external/migration_tool.mdx @@ -0,0 +1,728 @@ +keywords: bzlmod + +{# disableFinding(LINE_OVER_80_LINK) #} +{# disableFinding(SNIPPET_NO_LANG) #} +{# disableFinding(LINK_MISSING_ID) #} +{# disableFinding("repo") #} + +--- +title: 'Bzlmod Migration Tool' +--- + +[migration_script]: https://github.com/bazelbuild/bazel-central-registry/blob/main/tools/migrate_to_bzlmod.py +[gemini_cli_setup]: https://github.com/bazelbuild/bazel-central-registry/tree/main/tools/code-agent + +To simplify the often complex process of moving from `WORKSPACE` to Bzlmod, it's +highly recommended to use the [migration script][migration_script]. This helper +tool automates many of the steps involved in migrating your external dependency +management system. + +**Note**: If you want to try out the AI driven Bzlmod migration, check [Bzlmod Migration Agent Setup][gemini_cli_setup]. + +## Core Functionality {:#migration-tool-core-functionality} + +The script's primary functions are: + +* **Collecting dependency information:** Analyzing your project's `WORKSPACE` + file to identify external repositories used by specified build targets, + using Bazel's + [experimental_repository_resolved_file](https://bazel.build/versions/8.2.0/reference/command-line-reference#flag--experimental_repository_resolved_file) + flag to generate a resolved dependencies file containing this information. +* **Identifying direct dependencies:** Using `bazel query` to determine which + repositories are direct dependencies for the specified targets. +* **Migrating to Bzlmod:** Translating relevant `WORKSPACE` dependencies into + their Bzlmod equivalents. This is a two-step process: + 1. Introduce all identified direct dependencies to the + `MODULE.bazel` file. + 2. Build specified targets with Bzlmod enabled, then + iteratively identify and fix recognizable errors. This step is + needed since some dependencies might be missing in the first step. +* **Generating a migration report:** Creating a `migration_info.md` file that + documents the migration process. This report includes a list of direct + dependencies, the generated Bzlmod declarations, and any manual steps that + may be required to complete the migration. + +The migration tool supports: + +* Dependencies available in the Bazel Central Registry +* User-defined custom repository rules +* Package manager dependencies + * Maven + * Go + * Python + +**Important Notes**: + +* The migration tool is a best-effort utility. Always double-check its +recommendations for correctness. +* Use the migration tool with Bazel 7 (not supported with Bazel 8). + +## How to Use the Migration Tool {:#migration-tool-how-to-use} + +Before you begin: + +* Upgrade to the latest Bazel 7 release, which provides robust support for + both WORKSPACE and Bzlmod. +* Verify the following command runs successfully for your project's main build + targets: + + ```shell + bazel build --nobuild --enable_workspace --noenable_bzlmod + ``` + +### Command for running the script {:#migration-script-command} + +Once the prerequisites are met, run the following commands to use the migration +tool: + +
    +# Clone the Bazel Central Registry repository
    +git clone https://github.com/bazelbuild/bazel-central-registry.git
    +cd bazel-central-registry
    +
    +# Build the migration tool
    +bazel build //tools:migrate_to_bzlmod
    +
    +# Create a convenient alias for the tool
    +alias migrate2bzlmod=$(realpath ./bazel-bin/tools/migrate_to_bzlmod)
    +
    +# Navigate to your project's root directory and run the tool
    +cd <your project root>
    +migrate2bzlmod -t <targets>
    +
    + +### Files generated by this script {:#migration-script-files} + +* `MODULE.bazel` - The central manifest file for Bzlmod, which declares the + project's metadata and its direct dependencies on other Bazel modules. +* `migration_info.md` - A file providing step-by-step instructions on how the + migration tool was executed, designed to assist in the manual completion of + the migration process, if necessary. +* `resolved_deps.py` - Contains a comprehensive list of the project's external + dependencies, generated by analyzing the project's `WORKSPACE` file, serving + as a reference during the transition. +* `query_direct_deps` - Contains migration-relevant information regarding the + utilized targets, obtained by invoking Bazel with `--output=build` on the + project's `WORKSPACE` file. This file is primarily consumed by the migration + script. +* `extension_for_XXX` - A file containing a module extension + definition. The migration tool generates these files for dependencies that + are not standard Bazel modules but can be managed using Bzlmod's [module + extensions](/external/extension). + +### Flags {:#migration-script-flags} + +Flags available in this migration scripts are: + +* `--t`/`--target`: Targets to migrate. This flag is repeatable, and the + targets are accumulated. +* `--i`/`--initial`: Deletes `MODULE.bazel`, `resolved_deps.py`, + `migration_info.md` files and starts from scratch - Detect direct + dependencies, introduce them in MODULE.bazel and rerun generation of + resolved dependencies. + +### Post-migration cleanup {:#post-migration-cleanup} + +* Delete `migration_info.md`, `resolved_deps.py` and `query_direct_deps`. +* Clean up comments from `MODULE.bazel` file which were used for the + migration, such as `# -- bazel_dep definitions -- #`. + +## Migration Example {:#migration-tool-example} + +To see the migration script in action, consider the following scenario when +Python, Maven and Go dependencies are declared in `WORKSPACE` file. + +
    + +Click here to see `WORKSPACE` file + + +```python +workspace(name="example") + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load(":my_custom_macro.bzl", "my_custom_macro") + +http_archive( + name = "rules_cc", + sha256 = "b8b918a85f9144c01f6cfe0f45e4f2838c7413961a8ff23bc0c6cdf8bb07a3b6", + strip_prefix = "rules_cc-0.1.5", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.1.5/rules_cc-0.1.5.tar.gz"], +) + +# Module dependency +# ------------------- +http_archive( + name = "rules_shell", + sha256 = "3e114424a5c7e4fd43e0133cc6ecdfe54e45ae8affa14fadd839f29901424043", + strip_prefix = "rules_shell-0.4.0", + url = "https://github.com/bazelbuild/rules_shell/releases/download/v0.4.0/rules_shell-v0.4.0.tar.gz", +) + +# Repo rule +# ------------------- +http_archive( + name = "com_github_cockroachdb_cockroach", + sha256 = "6c3568ef244ce6b874694eeeecb83ed4f5d5dff6cf037c952ecde76828a6c502", + strip_prefix = "cockroach-22.1.6", + url = "https://github.com/cockroachdb/cockroach/archive/v22.1.6.tar.gz", +) + +# Module extension +# ------------------- +# Macro which invokes repository_rule +my_custom_macro( + name = "my_custom_repo", +) + +# Go dependencies +# ------------------- +http_archive( + name = "io_bazel_rules_go", + integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip", + ], +) + +http_archive( + name = "bazel_gazelle", + integrity = "sha256-12v3pg/YsFBEQJDfooN6Tq+YKeEWVhjuNdzspcvfWNU=", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz", + ], +) + +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") + +go_rules_dependencies() +go_register_toolchains(version = "1.23.1") +gazelle_dependencies() + +go_repository( + name = "org_golang_x_net", + importpath = "golang.org/x/net", + sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=", + version = "v0.0.0-20190311183353-d8887717615a", + build_file_proto_mode = "disable", + build_naming_convention = "import", +) + +# Python dependencies +# ------------------- +http_archive( + name = "rules_python", + integrity = "sha256-qDdnnxOC8mlowe5vg5x9r5B5qlMSgGmh8oFd7KpjcwQ=", + strip_prefix = "rules_python-1.4.0", + url = "https://github.com/bazelbuild/rules_python/releases/download/1.4.0/rules_python-1.4.0.tar.gz", +) + +load("@rules_python//python:repositories.bzl", "py_repositories") +py_repositories() + +load("@rules_python//python:pip.bzl", "pip_parse") +pip_parse( + name = "my_python_deps", + requirements_lock = "@example//:requirements_lock.txt", +) + +load("@my_python_deps//:requirements.bzl", "install_deps") +install_deps() + +load("@rules_python//python:repositories.bzl", "python_register_toolchains") +python_register_toolchains( + name = "python_3_11", + python_version = "3.11", +) + +# Maven dependencies +# __________________ + +RULES_JVM_EXTERNAL_TAG = "4.5" +RULES_JVM_EXTERNAL_SHA = "b17d7388feb9bfa7f2fa09031b32707df529f26c91ab9e5d909eb1676badd9a6" + +http_archive( + name = "rules_jvm_external", + strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG, + sha256 = RULES_JVM_EXTERNAL_SHA, + url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG, +) + +load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps") +rules_jvm_external_deps() +load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup") +rules_jvm_external_setup() + +load("@rules_jvm_external//:defs.bzl", "maven_install") +maven_install( + name = "px_deps", + artifacts = [ + "org.antlr:antlr4:4.11.1", + ], + repositories = [ + "https://repo1.maven.org/maven2", + ], +) +``` +
    + +Moreover, to demonstrate usage of module extension, custom macro is invoked from +`WORKSPACE` and it is defined in `my_custom_macro.bzl`. + +
    + +Click here to see `my_custom_macro.bzl` file + + +```python +"""Repo rule and macro used for testing""" + +def _test_repo_rule_impl(repository_ctx): + repository_ctx.file( + "BUILD", + content = """ +genrule( + name = "foo", + outs = ["rule_name.out"], + cmd = "touch $@", + visibility = ["//visibility:public"], +) +""" + ) + +_test_repo_rule = repository_rule( + implementation = _test_repo_rule_impl, +) + +def my_custom_macro(name): + _test_repo_rule(name = name) +``` +
    + +The end goal is to have `MODULE.bazel` file and delete the `WORKSPACE` file, +without impacting the user experience. + +The first step is to follow [How to Use the Migration +Tool](#migration-tool-how-to-use), which mostly is checking the bazel version +(it must be Bazel 7) and adding an alias to the migration script. + +Then, running `migrate2bzlmod -t=//...` outputs: + +
    +  bazel 7.6.1
    +
    +  Generating ./resolved_deps.py file - It might take a while...
    +
    +  RESOLVED: rules_java has been introduced as a Bazel module.
    +  RESOLVED: bazel_gazelle has been introduced as a Bazel module.
    +  RESOLVED: io_bazel_rules_go has been introduced as a Bazel module.
    +  RESOLVED: rules_python has been introduced as a Bazel module.
    +  IMPORTANT: 3.11 is used as a default python version. If you need a different version, please change it manually and then rerun the migration tool.
    +  RESOLVED: my_python_deps has been introduced as python extension.
    +  RESOLVED: org_golang_x_net has been introduced as go extension.
    +  RESOLVED: rules_jvm_external has been introduced as a Bazel module.
    +  RESOLVED: org.antlr has been introduced as maven extension.
    +  RESOLVED: rules_shell has been introduced as a Bazel module.
    +
    +  Congratulations! All external repositories needed for building //... are available with Bzlmod!
    +  IMPORTANT: Fix potential build time issues by running the following command:
    +      bazel build --enable_bzlmod --noenable_workspace //...
    +
    +  IMPORTANT: For details about the migration process, check `migration_info.md` file.
    +
    + +which gives the following important information: + +* Generates `./resolved_deps.py` file, which contains info about all external + repositories declared and loaded using your `WORKSPACE` file. +* `RESOLVED` keyword describes all dependencies which are resolved by the tool + and added to the `MODULE.bazel` file. +* `IMPORTANT` keyword describes significant information worth investing time. +* All dependencies have been resolved in this example, at least with + `--nobuild` flag. +* It is important to run the full build (command specified) and manually fix + potential errors (e.g. toolchain not registered correctly). +* `migration_info.md` file contains details about the migration. Check details + [at this section](#migration-tool-report-generation). + +### Transformations {:#migration-tool-transformations} + +This section illustrates the migration of code from the `WORKSPACE` file to +`MODULE.bazel`. + +
    +
    +

    WORKSPACE - Bazel Module

    +
    +http_archive(
    +    name = "rules_shell",
    +    sha256 = "3e114424a5c7e4fd43e0133cc6ecdfe54e45ae8affa14fadd839f29901424043",
    +    strip_prefix = "rules_shell-0.4.0",
    +    url = "https://github.com/bazelbuild/rules_shell/releases/download/v0.4.0/rules_shell-v0.4.0.tar.gz",
    +)
    +
    +
    +
    +

    MODULE.bazel - Bazel Module

    +
    +bazel_dep(name = "rules_shell", version = "0.6.1")
    +
    +
    +
    + +
    + +
    +
    +

    WORKSPACE - Go Extension

    +
    +http_archive(
    +    name = "io_bazel_rules_go",
    +    integrity = "sha256-M6zErg9wUC20uJPJ/B3Xqb+ZjCPn/yxFF3QdQEmpdvg=",
    +    urls = [
    +        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip",
    +        "https://github.com/bazelbuild/rules_go/releases/download/v0.48.0/rules_go-v0.48.0.zip",
    +    ],
    +)
    +http_archive(
    +    name = "bazel_gazelle",
    +    integrity = "sha256-12v3pg/YsFBEQJDfooN6Tq+YKeEWVhjuNdzspcvfWNU=",
    +    urls = [
    +        "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz",
    +        "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.37.0/bazel-gazelle-v0.37.0.tar.gz",
    +    ],
    +)
    +
    +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
    +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
    +
    +go_rules_dependencies()
    +go_register_toolchains(version = "1.23.1")
    +gazelle_dependencies()
    +
    +go_repository(
    +    name = "org_golang_x_net",
    +    importpath = "golang.org/x/net",
    +    sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=",
    +    version = "v0.0.0-20190311183353-d8887717615a",
    +    build_file_proto_mode = "disable",
    +    build_naming_convention = "import",
    +)
    +
    +
    +
    +

    MODULE.bazel - Go Extension

    +
    +go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps")
    +go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk")
    +
    +go_deps.from_file(go_mod = "//:go.mod")
    +use_repo(go_deps, "org_golang_x_net")
    +go_sdk.from_file(go_mod = "//:go.mod")
    +
    +go_deps.gazelle_override(
    +    path = "golang.org/x/net",
    +    directives = [
    +        "gazelle:proto disable",
    +         "gazelle:go_naming_convention import",
    +    ],
    +)
    +
    +
    +
    + +
    + +
    +
    +

    WORKSPACE - Python Extension

    +
    +http_archive(
    +    name = "rules_python",
    +    integrity = "sha256-qDdnnxOC8mlowe5vg5x9r5B5qlMSgGmh8oFd7KpjcwQ=",
    +    strip_prefix = "rules_python-1.4.0",
    +    url = "https://github.com/bazelbuild/rules_python/releases/download/1.4.0/rules_python-1.4.0.tar.gz",
    +)
    +
    +load("@rules_python//python:repositories.bzl", "py_repositories")
    +py_repositories()
    +
    +load("@rules_python//python:pip.bzl", "pip_parse")
    +pip_parse(
    +   name = "my_python_deps",
    +   requirements_lock = "@example//:requirements_lock.txt",
    +)
    +
    +load("@my_python_deps//:requirements.bzl", "install_deps")
    +install_deps()
    +
    +load("@rules_python//python:repositories.bzl", "python_register_toolchains")
    +python_register_toolchains(
    +    name = "python_3_11",
    +    python_version = "3.11",
    +)
    +
    +
    +
    +

    MODULE.bazel - Python Extension

    +
    +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
    +pip.parse(
    +    hub_name = "my_python_deps",
    +    python_version = "3.11",
    +    requirements_lock = "//:requirements_lock.txt",
    +)
    +use_repo(pip, "my_python_deps")
    +
    +python = use_extension("@rules_python//python/extensions:python.bzl", "python")
    +python.defaults(python_version = "3.11")
    +python.toolchain(python_version = "3.11")
    +
    +
    +
    + +
    + +
    +
    +

    WORKSPACE - Maven Extension

    +
    +
    +RULES_JVM_EXTERNAL_TAG = "4.5"
    +RULES_JVM_EXTERNAL_SHA = "b17d7388feb9bfa7f2fa09031b32707df529f26c91ab9e5d909eb1676badd9a6"
    +
    +http_archive(
    +    name = "rules_jvm_external",
    +    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
    +    sha256 = RULES_JVM_EXTERNAL_SHA,
    +    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
    +)
    +
    +load("@rules_jvm_external//:repositories.bzl", "rules_jvm_external_deps")
    +rules_jvm_external_deps()
    +load("@rules_jvm_external//:setup.bzl", "rules_jvm_external_setup")
    +rules_jvm_external_setup()
    +
    +load("@rules_jvm_external//:defs.bzl", "maven_install")
    +maven_install(
    +    name = "px_deps",
    +    artifacts = [
    +        "org.antlr:antlr4:4.11.1",
    +    ],
    +    repositories = [
    +        "https://repo1.maven.org/maven2",
    +    ],
    +)
    +
    +
    +
    +

    MODULE.bazel - Maven Extension

    +
    +bazel_dep(name = "rules_jvm_external", version = "6.8")
    +
    +maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
    +use_repo(maven, "px_deps")
    +
    +maven.artifact(
    +    name = "px_deps",
    +    group = "org.antlr",
    +    artifact = "antlr4",
    +    version = "4.11.1"
    +)
    +
    +
    +
    + +
    + +
    +
    +

    WORKSPACE - Repo rule

    +
    +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    +
    +http_archive(
    +    name = "com_github_cockroachdb_cockroach",
    +    sha256 = "6c3568ef244ce6b874694eeeecb83ed4f5d5dff6cf037c952ecde76828a6c502",
    +    strip_prefix = "cockroach-22.1.6",
    +    url = "https://github.com/cockroachdb/cockroach/archive/v22.1.6.tar.gz",
    +)
    +
    +
    +
    +

    MODULE.bazel - Repo rule

    +
    +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    +
    +http_archive(
    +  name = "com_github_cockroachdb_cockroach",
    +  url = "https://github.com/cockroachdb/cockroach/archive/v22.1.6.tar.gz",
    +  sha256 = "6c3568ef244ce6b874694eeeecb83ed4f5d5dff6cf037c952ecde76828a6c502",
    +  strip_prefix = "cockroach-22.1.6",
    +)
    +
    +
    +
    + +
    + +
    +
    +

    WORKSPACE - Module extension

    +
    +load(":my_custom_macro.bzl", "my_custom_macro")
    +
    +my_custom_macro(
    +    name = "my_custom_repo",
    +)
    +
    +
    +
    +

    MODULE.bazel - Module extension

    +
    +extension_for_my_custom_macro = use_extension("//:extension_for_my_custom_macro.bzl", "extension_for_my_custom_macro")
    +use_repo(extension_for_my_custom_macro, "my_custom_repo")
    +
    +

    extension_for_my_custom_macro.bzl

    +
    +load("//:my_custom_macro.bzl", "my_custom_macro")
    +
    +def _extension_for_my_custom_macro_impl(ctx):
    +  my_custom_macro(
    +    name = "my_custom_repo",
    +  )
    +
    +extension_for_my_custom_macro = module_extension(implementation = _extension_for_my_custom_macro_impl)
    +
    +
    +
    + +
    + +## Tips with debugging {:#migration-tool-tips} + +This section provides useful commands and information to help debug issues that +may arise during the Bzlmod migration. + +### Useful tips {:#debugging-useful-tips} + +* Override version - Not rarely it happens that upgrading the version of a + dependency causes troubles. Bzlmod could change the version of the + dependency due to the [MVS algorithm](/external/module#version-selection). + In order to use the same or similar version as it was in the WORKSPACE, + override it with + [single_version_override](/rules/lib/globals/module#single_version_override). + Note that this is useful for debugging differences between WORKSPACE and + Bzlmod, but you shouldn't rely on this feature in the long term. + + `single_version_override(module_name = "{dep_name}", version = "{version}")` + +* Use [bazel mod](/external/mod-command#syntax) command. + * Check the version of a specified repo with `show_repo` + command. For example: + + `bazel mod show_repo @rules_python` + + * Check information about a module extension with the `show_extension` + command. For example: + + `bazel mod show_extension @rules_python//python/extensions:pip.bzl%pip` + +* Use [vendor mode](/external/vendor) to create a local copy of a repo when + you want to monitor or control the source of the repo. For example: + + `bazel vendor --enable_bzlmod --vendor_dir=vendor_src --repo=@protobuf` + +### Migration Report Generation {:#migration-tool-report-generation} + +This file is updated with each run of the migration script or it's generated +from scratch if it's the first run or if the [`--i` +flag](#migration-script-flags) is used. The report contains: + +* Command for local testing. +* List of direct dependencies (at least the ones which are directly used in + the project). +* For each dependency, a drop-down menu for checking where the repository was + declared in the `WORKSPACE` file, which is particularly useful for the + debugging. You can see it as: + +
    +    > Click here to see where and how the repo was declared in the WORKSPACE
    +    file
    +    
    + +* For each dependency, how it was implemented in `MODULE.bazel` file. From the + earlier [Migration Example](#migration-tool-example), that would look as: + 1. Bazel module Dependency - `Migration of rules_python` + +
    +        Found perfect name match in BCR: rules_python
    +        Found partially name matches in BCR: rules_python_gazelle_plugin
    +
    +        It has been introduced as a Bazel module:
    +            `bazel_dep(name = "rules_python", version = "1.6.1")`
    +        
    + + * The script will automatically use the `perfect name match` if it finds + it. In case of an error, you can double check if the name was correctly + added. + 2. Python extension - `Migration of my_python_deps` + +
    +        pip.parse(
    +            hub_name = "my_python_deps",
    +            requirements_lock = "//:requirements_lock.txt",
    +            python_version = "3.11",
    +        )
    +        use_repo(pip, "my_python_deps")
    +        
    + + 3. Maven extension - `Migration of org.antlr (px_deps):` + +
    +        maven.artifact(
    +            name = "px_deps",
    +            group = "org.antlr",
    +            artifact = "antlr4",
    +            version = "4.11.1"
    +        )
    +        
    + + 4. Go extension - `Migration of org_golang_x_net` + +
    +        go_deps.from_file(go_mod = "//:go.mod")
    +        go_sdk.from_file(go_mod = "//:go.mod")
    +
    +        go_deps.gazelle_override(
    +            path = "golang.org/x/net",
    +            directives = [
    +                "gazelle:proto disable",
    +                "gazelle:go_naming_convention import",
    +            ],
    +        )
    +        
    + + * It has been introduced as a go module with the help of `go.mod`. If + `go.mod` and `go.sum` are not available, go module is added directly + to the `MODULE.bazel` file. + * `gazelle_override` is used for adding specific directives. + +## Useful links {:#useful-links} + +* Official pages for the external extensions + * [rules_jvm_external](https://github.com/bazelbuild/rules_jvm_external/blob/master/docs/bzlmod.md) + * [rules_go](https://github.com/bazelbuild/rules_go/blob/master/docs/go/core/bzlmod.md) + * [rules_python](https://rules-python.readthedocs.io/en/latest/pypi/download.html) +* Community posts and videos + * [Migrating to Bazel Modules](https://blog.engflow.com/2025/01/16/migrating-to-bazel-modules-aka-bzlmod---module-extensions/index.html#migrating-to-bazel-modules-aka-bzlmod-module-extensions). + * [Moving to Bzlmod](https://www.youtube.com/watch?v=W9uXRYLVHUk). + * [How Uber Manages Go Dependencies with Bzlmod](https://www.youtube.com/watch?v=hIqzkUE_pSY). + +## Feedback {:#feedback} + +If you would like to contribute, do so by creating an Issue or PR at +[bazel-central-registry](https://github.com/bazelbuild/bazel-central-registry). diff --git a/external/mod-command.mdx b/external/mod-command.mdx new file mode 100644 index 000000000..0bf1a564f --- /dev/null +++ b/external/mod-command.mdx @@ -0,0 +1,583 @@ +keywords: Bzlmod + +--- +title: '`mod` Command' +--- + +The `mod` command provides a range of tools to help the user understand their +external dependency graph. It lets you visualize the dependency graph, find out +why a certain module or a version of a module is present in the graph, view the +repo definitions backing modules, inspect usages of module extensions and repos +they generate, among other functions. + +## Syntax {:#syntax} + +```sh +bazel mod [] [ [...]] +``` + +The available subcommands and their respective required arguments are: + +* `graph`: Displays the full dependency graph of the project, starting from + the root module. If one or more modules are specified in `--from`, these + modules are shown directly under the root, and the graph is only expanded + starting from them (see [example](#mod-example1)). + +* `deps ...`: Displays the resolved direct dependencies of each of the + specified modules, similarly to `graph`. + +* `all_paths ...`: Displays all dependency paths from the --from modules + to the target modules. To simplify the output, only the first shortest path + is shown when multiple paths share the same suffix. For example, A -> B -> X + would be shown, but the longer A -> C -> B -> X would be omitted. In other + words, for every module Y that directly depends on the target module X, the + output contains only the shortest path going through Y to reach X. + +* `path ...`: Has the same semantics as `all_paths`, but only display a + single path from one of the `--from` modules to one of the argument modules. + +* `explain ...`: Shows all the places where the specified modules appear + in the dependency graph, along with the modules that directly depend on + them. The output of the `explain` command is essentially a pruned version of + the `all_paths` command, containing 1) the root module; 2) the root module's + direct dependencies that lead to the argument modules; 3) the argument + modules' direct dependents; and + 4) the argument modules themselves (see [example](#mod-example5)). + +* `show_repo ...`: Displays the definition of the specified repos (see + [example](#mod-example6)). Use `--all_repos` to show definitions of all + repos in the entire dependency graph, or `--all_visible_repos` to show + definitions of all repos visible from the `--base_module`. + +* `show_extension ...`: Displays information about each of the + specified extensions: a list of the generated repos along with the modules + that import them using `use_repo`, and a list of the usages of that + extension in each of the modules where it is used, containing the specified + tags and the `use_repo` calls (see [example](#mod-example8)). + +`` refers to one or more modules or repos. It can be one of: + +* The literal string ``: The root module representing your current + project. + +* `@`: The module `` at version ``. For a module + with a non-registry override, use an underscore (`_`) as the ``. + +* ``: All present versions of the module ``. + +* `@`: The repo with the given [apparent + name](overview#apparent-repo-name) in the context of the `--base_module`. + +* `@@`: The repo with the given [canonical + name](overview#canonical-repo-name). + +In a context requiring specifying modules, ``s referring to repos that +correspond to modules (as opposed to extension-generated repos) can also be +used. Conversely, in a context requiring specifying repos, ``s referring to +modules can stand in for the corresponding repos. + +`` must be of the form `%`. +The `` part must be a repo-relative label (for example, +`//pkg/path:file.bzl`). + +### Graph command options + +The following options only affect the subcommands that print graphs (`graph`, +`deps`, `all_paths`, `path`, and `explain`): + +* `--from [,[,...]]` *default: ``*: The module(s) from which + the graph is expanded in `graph`, `all_paths`, `path`, and `explain`. Check + the subcommands' descriptions for more details. + +* `--verbose` *default: "false"*: Include in the output graph extra + information about the version resolution of each module. If the module + version changed during resolution, show either which version replaced it or + what was the original version, the reason it was replaced, and which modules + requested the new version if the reason was [Minimal Version + Selection](module#version-selection). + +* `--include_unused` *default: "false"*: Include in the output graph the + modules which were originally present in the dependency graph, but became + unused after module resolution. + +* `--extension_info `: Include information about the module extension + usages as part of the output graph (see [example](#mod-example7)). `` + can be one of: + + * `hidden` *(default)*: Don't show anything about extensions. + + * `usages`: Show extensions under each module where they are used. They + are printed in the form of `$`. + + * `repos`: In addition to `usages`, show the repo imported using + `use_repo` under each extension usage. + + * `all`: In addition to `usages` and `repos`, also show + extension-generated repos that are not imported by any module. These + extra repos are shown under the first occurrence of their generating + extension in the output, and are connected with a dotted edge. + +* `--extension_filter [,[,...]]`: If specified, the + output graph only includes modules that use the specified extensions, and + the paths that lead to those modules. Specifying an empty extension list (as + in `--extension_filter=`) is equivalent to specifying _all_ extensions used + by any module in the dependency graph. + +* `--depth `: The depth of the output graph. A depth of 1 only displays the + root and its direct dependencies. Defaults to 1 for `explain`, 2 for `deps` + and infinity for the others. + +* `--cycles` *default: "false"*: Include cycle edges in the output graph. + +* `--include_builtin` *default: "false"*: Include built-in modules (such as + `@bazel_tools`) in the output graph. This flag is disabled by default, as + built-in modules are implicitly depended on by every other module, which + greatly clutters the output. + +* `--charset ` *default: utf8*: Specify the charset to use for text + output. Valid values are `"utf8"` and `"ascii"`. The only significant + difference is in the special characters used to draw the graph in the + `"text"` output format, which don't exist in the `"ascii"` charset. + Therefore, the `"ascii"` charset is present to also support the usage on + legacy platforms which cannot use Unicode. + +* `--output `: Include information about the module extension usages as + part of the output graph. `' can be one of: + + * `text` *(default)*: A human-readable representation of the output graph + (flattened as a tree). + + * `json`: Outputs the graph in the form of a JSON object (flattened as a + tree). + + * `graph`: Outputs the graph in the Graphviz *dot* representation. + + Tip: Use the following command to pipe the output through the *dot* engine + and export the graph representation as an SVG image. + + ```sh + bazel mod graph --output graph | dot -Tsvg > /tmp/graph.svg + ``` + + ### show_repo options +`show_repo` supports a different set of output formats: +* `--output `: Change how repository definitions are displayed. + `` can be one of: + * `text` *(default)*: Display repo definitions in Starlark. + * `streamed_proto`: Prints a + [length-delimited](https://protobuf.dev/programming-guides/encoding/#size-limit) + stream of + [`Repository`](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/build.proto) + protocol buffers. + * `streamed_jsonproto`: Similar to `--output streamed_proto`, prints a + stream of [`Repository`](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/build.proto) + protocol buffers but in [NDJSON](https://github.com/ndjson/ndjson-spec) format. + + ### Other options + +Other options include: + +* `--base_module ` *default: ``*: Specify a module relative to + which apparent repo names in arguments are interpreted. Note that this + argument itself can be in the form of `@`; this is always + interpreted relative to the root module. + +* `--extension_usages [,[,...]]`: Filters `show_extension` to only + display extension usages from the specified modules. + +## Examples {:#examples} + +Some possible usages of the `mod` command on a real Bazel project are showcased +below to give you a general idea on how you can use it to inspect your project's +external dependencies. + +`MODULE.bazel` file: + +```python +module( + name = "my_project", + version = "1.0", +) + +bazel_dep(name = "bazel_skylib", version = "1.1.1", repo_name = "skylib1") +bazel_dep(name = "bazel_skylib", version = "1.2.0", repo_name = "skylib2") +multiple_version_override(module_name = "bazel_skylib", versions = ["1.1.1", "1.2.0"]) + +bazel_dep(name = "stardoc", version = "0.5.0") +bazel_dep(name = "rules_java", version = "5.0.0") + +toolchains = use_extension("@rules_java//java:extensions.bzl", "toolchains") +use_repo(toolchains, my_jdk="remotejdk17_linux") +``` + + + + + + +
    +
    + Graph Before Resolution +
    Graph Before Resolution
    +
    + +
    +
    + Graph After Resolution +
    Graph After Resolution
    +
    + +
    + +1. Display the whole dependency graph of your + project. + + ```sh + bazel mod graph + ``` + + ```none + (my_project@1.0) + ├───bazel_skylib@1.1.1 + │ └───platforms@0.0.4 + ├───bazel_skylib@1.2.0 + │ └───platforms@0.0.4 ... + ├───rules_java@5.0.0 + │ ├───platforms@0.0.4 ... + │ ├───rules_cc@0.0.1 + │ │ ├───bazel_skylib@1.1.1 ... + │ │ └───platforms@0.0.4 ... + │ └───rules_proto@4.0.0 + │ ├───bazel_skylib@1.1.1 ... + │ └───rules_cc@0.0.1 ... + └───stardoc@0.5.0 + ├───bazel_skylib@1.1.1 ... + └───rules_java@5.0.0 ... + ``` + + Note: The `...` symbol indicates that the node has already been expanded + somewhere else and was not expanded again to reduce noise. + +2. Display the whole dependency graph (including + unused modules and with extra information about version resolution). + + ```sh + bazel mod graph --include_unused --verbose + ``` + + ```none + (my_project@1.0) + ├───bazel_skylib@1.1.1 + │ └───platforms@0.0.4 + ├───bazel_skylib@1.2.0 + │ └───platforms@0.0.4 ... + ├───rules_java@5.0.0 + │ ├───platforms@0.0.4 ... + │ ├───rules_cc@0.0.1 + │ │ ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override) + │ │ ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + │ │ └───platforms@0.0.4 ... + │ └───rules_proto@4.0.0 + │ ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override) + │ ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + │ └───rules_cc@0.0.1 ... + └───stardoc@0.5.0 + ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + ├───rules_java@5.0.0 ... (was 4.0.0, cause , bazel_tools@_) + ├───bazel_skylib@1.0.3 (to 1.1.1, cause multiple_version_override) + │ └───platforms@0.0.4 ... + └───rules_java@4.0.0 (to 5.0.0, cause , bazel_tools@_) + ├───bazel_skylib@1.0.3 ... (to 1.1.1, cause multiple_version_override) + └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + ``` + +3. Display the dependency graph expanded from + some specific modules. + + ```sh + bazel mod graph --from rules_java --include_unused + ``` + + ```none + (my_project@1.0) + ├───rules_java@5.0.0 + │ ├───platforms@0.0.4 + │ ├───rules_cc@0.0.1 + │ │ ├───bazel_skylib@1.0.3 ... (unused) + │ │ ├───bazel_skylib@1.1.1 ... + │ │ └───platforms@0.0.4 ... + │ └───rules_proto@4.0.0 + │ ├───bazel_skylib@1.0.3 ... (unused) + │ ├───bazel_skylib@1.1.1 ... + │ └───rules_cc@0.0.1 ... + └╌╌rules_java@4.0.0 (unused) + ├───bazel_skylib@1.0.3 (unused) + │ └───platforms@0.0.4 ... + └───bazel_skylib@1.1.1 + └───platforms@0.0.4 ... + ``` + + Note: The dotted line is used to indicate an *indirect* (transitive) + dependency edge between two nodes. + +4. Display all paths between two of your + modules. + + ```sh + bazel mod all_paths bazel_skylib@1.1.1 --from rules_proto + ``` + + ```none + (my_project@1.0) + └╌╌rules_proto@4.0.0 + ├───bazel_skylib@1.1.1 + └───rules_cc@0.0.1 + └───bazel_skylib@1.1.1 ... + ``` + +5. See why and how your project depends on some + module(s). + + ```sh + bazel mod explain @skylib1 --verbose --include_unused + ``` + + ```none + (my_project@1.0) + ├───bazel_skylib@1.1.1 + ├───rules_java@5.0.0 + │ ├───rules_cc@0.0.1 + │ │ └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + │ └───rules_proto@4.0.0 + │ ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + │ └───rules_cc@0.0.1 ... + └───stardoc@0.5.0 + ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + ├╌╌rules_cc@0.0.1 + │ └───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + └╌╌rules_proto@4.0.0 + ├───bazel_skylib@1.1.1 ... (was 1.0.3, cause multiple_version_override) + └───rules_cc@0.0.1 ... + ``` + +6. See the underlying rule of some your modules' + repos. + + ```sh + bazel mod show_repo rules_cc stardoc + ``` + + `bazel mod show_repo` also works with repos imported by `use_repo` and repos + created with `use_repo_rule`. If `show_repo` is invoked with an apparent + repository name or `--all_visible_repos`, then the apparent repository name + is shown on a line prefixed with `##`. + + ```sh + bazel mod show_repo @jq_linux_arm64 + bazel mod show_repo --all_visible_repos + ``` + + ```none + ## rules_cc@0.0.1: + # + http_archive( + name = "rules_cc+", + urls = ["https://bcr.bazel.build/test-mirror/github.com/bazelbuild/rules_cc/releases/download/0.0.1/rules_cc-0.0.1.tar.gz", "https://github.com/bazelbuild/rules_cc/releases/download/0.0.1/rules_cc-0.0.1.tar.gz"], + integrity = "sha256-Tcy/0iwN7xZMj0dFi9UODHFI89kgAs20WcKpamhJgkE=", + strip_prefix = "", + remote_patches = {"https://bcr.bazel.build/modules/rules_cc/0.0.1/patches/add_module_extension.patch": "sha256-g3+zmGs0YT2HKOVevZpN0Jet89Ylw90Cp9XsIAY8QqU="}, + remote_patch_strip = 1, + ) + # Rule http_archive defined at (most recent call last): + # /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in + + ## stardoc: + # + http_archive( + name = "stardoc+", + urls = ["https://bcr.bazel.build/test-mirror/github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz", "https://github.com/bazelbuild/stardoc/releases/download/0.5.0/stardoc-0.5.0.tar.gz"], + integrity = "sha256-yXlNzIAmow/2fPfPkeviRcopSyCwcYRdEsGSr+JDrXI=", + strip_prefix = "", + remote_patches = {}, + remote_patch_strip = 0, + ) + # Rule http_archive defined at (most recent call last): + # /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in + ``` + + ```none + ## @jq_linux_arm64: + load("@@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") + http_file( + name = "+http_file+jq_linux_arm64", + executable = True, + integrity = "sha256-TdLYoGYd8LIvG7mh+YMPBrbzuPfZEhGh7118TwaotKU=", + urls = ["https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-arm64"], + ) + ``` + + ```sh + bazel mod graph --extension_info=usages + ``` + + ```none + (my_project@1.0) + ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains + ├───rules_java@5.0.0 # + │ ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains + │ ├───rules_cc@0.0.1 # + │ │ └───$@@rules_cc.0.0.1//bzlmod:extensions.bzl%cc_configure + │ └───rules_proto@4.0.0 + │ └───rules_cc@0.0.1 ... + └───stardoc@0.5.0 + └───rules_java@5.0.0 ... + ``` + +8. See what repositories are generated and + imported from some specific extension as part of the dependency graph. + + ```sh + bazel mod show_extension @@rules_java+5.0.0//java:extensions.bzl%toolchains + ``` + + ```none + (my_project@1.0) + ├───$@@rules_java.5.0.0//java:extensions.bzl%toolchains + │ ├───remotejdk17_linux + │ ├╌╌remotejdk11_linux + │ ├╌╌remotejdk11_linux_aarch64 + │ ├╌╌remotejdk11_linux_ppc64le + │ ├╌╌remotejdk11_linux_s390x + ...(some lines omitted)... + ├───rules_java@5.0.0 # + │ └───$@@rules_java.5.0.0//java:extensions.bzl%toolchains ... + │ ├───local_jdk + │ ├───remote_java_tools + │ ├───remote_java_tools_darwin + │ ├───remote_java_tools_linux + │ ├───remote_java_tools_windows + │ ├───remotejdk11_linux_aarch64_toolchain_config_repo + │ ├───remotejdk11_linux_ppc64le_toolchain_config_repo + ...(some lines omitted)... + └───stardoc@0.5.0 + └───rules_java@5.0.0 ... + ``` + +9. See the list of generated repositories of an + extension and how that extension is used in each module. + + ```sh + bazel mod graph --extension_info=all --extension_filter=@rules_java//java:extensions.bzl%toolchains + ``` + + ```none + ## @@rules_java.5.0.0//java:extensions.bzl%toolchains: + + Fetched repositories: + - local_jdk (imported by bazel_tools@_, rules_java@5.0.0) + - remote_java_tools (imported by bazel_tools@_, rules_java@5.0.0) + - remote_java_tools_darwin (imported by bazel_tools@_, rules_java@5.0.0) + - remote_java_tools_linux (imported by bazel_tools@_, rules_java@5.0.0) + - remote_java_tools_windows (imported by bazel_tools@_, rules_java@5.0.0) + - remotejdk11_linux_aarch64_toolchain_config_repo (imported by rules_java@5.0.0) + - remotejdk11_linux_ppc64le_toolchain_config_repo (imported by rules_java@5.0.0) + ...(some lines omitted)... + - remotejdk17_linux (imported by ) + - remotejdk11_linux + - remotejdk11_linux_aarch64 + - remotejdk11_linux_ppc64le + - remotejdk11_linux_s390x + - remotejdk11_macos + ...(some lines omitted)... + + # Usage in at /MODULE.bazel:14:27 with the specified attributes: + use_repo( + toolchains, + my_jdk="remotejdk17_linux", + ) + + # Usage in bazel_tools@_ at bazel_tools@_/MODULE.bazel:23:32 with the specified attributes: + use_repo( + toolchains, + "local_jdk", + "remote_java_tools", + "remote_java_tools_linux", + "remote_java_tools_windows", + "remote_java_tools_darwin", + ) + + # Usage in rules_java@5.0.0 at rules_java@5.0.0/MODULE.bazel:30:27 with the specified attributes: + use_repo( + toolchains, + "remote_java_tools", + "remote_java_tools_linux", + "remote_java_tools_windows", + "remote_java_tools_darwin", + "local_jdk", + "remotejdk11_linux_toolchain_config_repo", + "remotejdk11_macos_toolchain_config_repo", + "remotejdk11_macos_aarch64_toolchain_config_repo", + ...(some lines omitted)... + ) + ``` + +10. See the underlying rule of some + extension-generated repositories. + + ```sh + bazel mod show_repo --base_module=rules_java @remote_java_tools + ``` + + ```none + ## @remote_java_tools: + # + http_archive( + name = "rules_java++toolchains+remote_java_tools", + urls = ["https://mirror.bazel.build/bazel_java_tools/releases/java/v11.5/java_tools-v11.5.zip", "https://github.com/bazelbuild/java_tools/releases/download/java_v11.5/java_tools-v11.5.zip"], + sha256 = "b763ee80e5754e593fd6d5be6d7343f905bc8b73d661d36d842b024ca11b6793", + ) + # Rule http_archive defined at (most recent call last): + # /home/user/.cache/bazel/_bazel_user/6e893e0f5a92cc4cf5909a6e4b2770f9/external/bazel_tools/tools/build_defs/repo/http.bzl:355:31 in + ``` \ No newline at end of file diff --git a/external/registry.mdx b/external/registry.mdx new file mode 100644 index 000000000..2e9e26b76 --- /dev/null +++ b/external/registry.mdx @@ -0,0 +1,172 @@ +--- +title: 'Bazel registries' +--- + +Bazel discovers dependencies by requesting their information from Bazel +*registries*: databases of Bazel modules. Bazel only supports one type of +registries — [*index registries*](#index_registry) — local directories or static +HTTP servers following a specific format. + +## Index registry + +An index registry is a local directory or a static HTTP server containing +information about a list of modules — including their homepage, maintainers, the +`MODULE.bazel` file of each version, and how to fetch the source of each +version. Notably, it does *not* need to serve the source archives itself. + +An index registry must have the following format: + +* [`/bazel_registry.json`](#bazel-registry-json): An optional JSON file + containing metadata for the registry. +* `/modules`: A directory containing a subdirectory for each module in this + registry +* `/modules/$MODULE`: A directory containing a subdirectory for each version + of the module named `$MODULE`, as well as the [`metadata.json` + file](#metadata-json) containing metadata for this module. +* `/modules/$MODULE/$VERSION`: A directory containing the following files: + * `MODULE.bazel`: The `MODULE.bazel` file of this module version. Note + that this is the `MODULE.bazel` file read during Bazel's external + dependency resolution, _not_ the one from the source archive (unless + there's a [non-registry + override](/external/module#non-registry_overrides)). Also note that it's + best to use this file to set the version of a release and avoid doing so + in the source archive `MODULE.bazel` file. To learn more about module + versioning, [see the FAQ](faq.md#module-versioning-best-practices). + * [`source.json`](#source-json): A JSON file containing information on how + to fetch the source of this module version + * `patches/`: An optional directory containing patch files, only used when + `source.json` has "archive" type + * `overlay/`: An optional directory containing overlay files, only used + when `source.json` has "archive" type + +### `bazel_registry.json` {:#bazel-registry-json} + +`bazel_registry.json` is an optional file that specifies metadata applying to +the entire registry. It can contain the following fields: + +* `mirrors`: an array of strings, specifying the list of mirrors to use for + source archives. + * The mirrored URL is a concatenation of the mirror itself, and the + source URL of the module specified by its `source.json` file sans the + protocol. For example, if a module's source URL is + `https://foo.com/bar/baz`, and `mirrors` contains + `["https://mirror1.com/", "https://example.com/mirror2/"]`, then the + URLs Bazel will try in order are `https://mirror1.com/foo.com/bar/baz`, + `https://example.com/mirror2/foo.com/bar/baz`, and finally the original + source URL itself `https://foo.com/bar/baz`. +* `module_base_path`: a string, specifying the base path for modules with + `local_path` type in the `source.json` file + +### `metadata.json` {:#metadata-json} + +`metadata.json` is an optional JSON file containing information about the +module, with the following fields: + +* `versions`: An array of strings, each denoting a version of the module + available in this registry. This array should match the children of the + module directory. +* `yanked_versions`: A JSON object specifying the [*yanked* + versions](/external/module#yanked_versions) of this module. The keys + should be versions to yank, and the values should be descriptions of + why the version is yanked, ideally containing a link to more + information. + +Note that the BCR requires more information in the `metadata.json` file. + +### `source.json` {:#source-json} + +`source.json` is a required JSON file containing information about how to fetch +a specific version of a module. The schema of this file depends on its `type` +field, which defaults to `archive`. + +* If `type` is `archive` (the default), this module version is backed by an + [`http_archive`](/rules/lib/repo/http#http_archive) repo rule; it's fetched + by downloading an archive from a given URL and extracting its contents. It + supports the following fields: + * `url`: A string, the URL of the source archive + * `mirror_urls`: A list of string, the mirror URLs of the source archive. + The URLs are tried in order after `url` as backups. + * `integrity`: A string, the [Subresource + Integrity][subresource-integrity] checksum of the archive + * `strip_prefix`: A string, the directory prefix to strip when extracting + the source archive + * `overlay`: A JSON object containing overlay files to layer on top of the + extracted archive. The patch files are located under the + `/modules/$MODULE/$VERSION/overlay` directory. The keys are the + overlay file names, and the values are the integrity checksum of + the overlay files. The overlays are applied before the patch files. + * `patches`: A JSON object containing patch files to apply to the + extracted archive. The patch files are located under the + `/modules/$MODULE/$VERSION/patches` directory. The keys are the + patch file names, and the values are the integrity checksum of + the patch files. The patches are applied after the overlay files and in + the order they appear in `patches`. + * `patch_strip`: A number; the same as the `--strip` argument of Unix + `patch`. + * `archive_type`: A string, the archive type of the downloaded file (Same + as [`type` on `http_archive`](/rules/lib/repo/http#http_archive-type)). +* If `type` is `git_repository`, this module version is backed by a + [`git_repository`](/rules/lib/repo/git#git_repository) repo rule; it's + fetched by cloning a Git repository. + * The following fields are supported, and are directly forwarded to the + underlying `git_repository` repo rule: `remote`, `commit`, + `shallow_since`, `tag`, `init_submodules`, `verbose`, and + `strip_prefix`, `patch_strip`. + * `patches`: A JSON object containing patch files to apply to the + cloned repository. The patch files are located under the + `/modules/$MODULE/$VERSION/patches` directory. The keys are the + patch file names, and the values are the integrity checksum of + the patch files. The patches are applied in the order they appear in + `patches`. +* If `type` is `local_path`, this module version is backed by a + [`local_repository`](/rules/lib/repo/local#local_repository) repo rule; + it's symlinked to a directory on local disk. It supports the following + field: + * `path`: The local path to the repo, calculated as following: + * If `path` is an absolute path, it stays as it is + * If `path` is a relative path and `module_base_path` is an + absolute path, it resolves to `/` + * If `path` and `module_base_path` are both relative paths, it + resolves to `//`. + Registry must be hosted locally and used by + `--registry=file://`. Otherwise, Bazel will + throw an error + +## Bazel Central Registry {:#bazel-central-registry} + +The Bazel Central Registry (BCR) at is an index +registry with contents backed by the GitHub repo +[`bazelbuild/bazel-central-registry`][bcr-repo]. You can browse its contents +using the web frontend at . + +The Bazel community maintains the BCR, and contributors are welcome to submit +pull requests. See the [BCR contribution +guidelines][bcr-contribution-guidelines]. + +In addition to following the format of a normal index registry, the BCR requires +a `presubmit.yml` file for each module version +(`/modules/$MODULE/$VERSION/presubmit.yml`). This file specifies a few essential +build and test targets that you can use to check the validity of this module +version. The BCR's CI pipelines also uses this to ensure interoperability +between modules. + +## Selecting registries + +The repeatable Bazel flag `--registry` can be used to specify the list of +registries to request modules from, so you can set up your project to fetch +dependencies from a third-party or internal registry. Earlier registries take +precedence. For convenience, you can put a list of `--registry` flags in the +`.bazelrc` file of your project. + +If your registry is hosted on GitHub (for example, as a fork of +`bazelbuild/bazel-central-registry`) then your `--registry` value needs a raw +GitHub address under `raw.githubusercontent.com`. For example, on the `main` +branch of the `my-org` fork, you would set +`--registry=https://raw.githubusercontent.com/my-org/bazel-central-registry/main/`. + +Using the `--registry` flag stops the Bazel Central Registry from being used by +default, but you can add it back by adding `--registry=https://bcr.bazel.build`. + +[bcr-contribution-guidelines]: https://github.com/bazelbuild/bazel-central-registry/blob/main/docs/README.md +[bcr-repo]: https://github.com/bazelbuild/bazel-central-registry +[subresource-integrity]: https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description diff --git a/help.mdx b/help.mdx index 1878c6c72..9956d9287 100644 --- a/help.mdx +++ b/help.mdx @@ -24,13 +24,13 @@ There are recordings of Bazel talks at various conferences, such as: * Bazel’s annual conference, BazelCon: * [BazelCon 2025](https://www.youtube.com/playlist?list=PLak8-7eFSpowmNiR2lhvJEomLA140yban) * [BazelCon 2024](https://www.youtube.com/playlist?list=PLbzoR-pLrL6ptKfAQNZ5RS4HMdmeilBcw) - * [BazelCon 2023](https://www.youtube.com/playlist?list=PLbzoR-pLrL6rUiqylH-kumoZCWntG1vjp) - * [BazelCon 2022](https://www.youtube.com/playlist?list=PLbzoR-pLrL6rABfcAJO1VWeOUYL1kIn-p) - * [BazelCon 2021](https://www.youtube.com/playlist?list=PLbzoR-pLrL6pO6BaaQ1Ndos53gfRVLEoU) - * [BazelCon 2020](https://www.youtube.com/playlist?list=PLbzoR-pLrL6qZ5JRMtn20_s2uPz9vFYgU) - * [BazelCon 2019](https://www.youtube.com/playlist?list=PLbzoR-pLrL6ogKgytQXqUxJQ6nZlIWoTH) - * [BazelCon 2018](https://www.youtube.com/playlist?list=PLbzoR-pLrL6rBDwC0NMRPS8EJ0VRAW0QR) - * [BazelCon 2017](https://www.youtube.com/playlist?list=PLbzoR-pLrL6qvwchdtlSopLgUrz4J4zKP) + * [BazelCon 2023](https://www.youtube.com/playlist?list=PLxNYxgaZ8Rsefrwb_ySGRi_bvQejpO_Tj) + * [BazelCon 2022](https://youtube.com/playlist?list=PLxNYxgaZ8RsdH4GCIZ69dzxQCOPyuNlpF) + * [BazelCon 2021](https://www.youtube.com/playlist?list=PLxNYxgaZ8Rsc3auKhtfIB4qXAYf7whEux) + * [BazelCon 2020](https://www.youtube.com/playlist?list=PLxNYxgaZ8RseRybXNbopHRv6-wGmFr04n) + * [BazelCon 2019](https://youtu.be/eymphDN7No4?t=PLxNYxgaZ8Rsf-7g43Z8LyXct9ax6egdSj) + * [BazelCon 2018](https://youtu.be/DVYRg6b2UBo?t=PLxNYxgaZ8Rsd3Nmvl1W1B4I6nK1674ezp) + * [BazelCon 2017](https://youtu.be/3eFllvz8_0k?t=PLxNYxgaZ8RseY0KmkXQSt0StE71E7yizG) * Bazel day on [Google Open Source Live](https://opensourcelive.withgoogle.com/events/bazel) diff --git a/install/compile-source.mdx b/install/compile-source.mdx index 9f5905a47..7a05ce47c 100644 --- a/install/compile-source.mdx +++ b/install/compile-source.mdx @@ -34,7 +34,7 @@ To build Bazel from source, you can do one of the following: `bazel build //src:bazel-dev` (or `bazel build //src:bazel-dev.exe` on Windows). - **Note:** Many rulesets rely on the Bazel version for feature detection. + **Note:** Many rulesets rely on the Bazel version for feature detection. For this to work correctly, the version must be embedded in the binary. Build `bazel-dev` with: diff --git a/install/ide.mdx b/install/ide.mdx index aa6210b3a..abe1f8955 100644 --- a/install/ide.mdx +++ b/install/ide.mdx @@ -20,10 +20,14 @@ a discussion on [GitHub](https://github.com/bazelbuild/bazel/discussions). ### IntelliJ, Android Studio, and CLion -[Official plugin](http://ij.bazel.build) for IntelliJ, Android Studio, and -CLion. The plugin is [open source](https://github.com/bazelbuild/intellij). +Official Bazel plugins exist for many of the JetBrains-associated IDEs. +Full documentation is linked from the listings on the JetBrains Marketplace: -This is the open source version of the plugin used internally at Google. +* [IntelliJ + plugin](https://plugins.jetbrains.com/plugin/22977-bazel) +* [Android Studio + plugin](https://plugins.jetbrains.com/plugin/9185-android-studio-with-bazel) +* [CLion plugin](https://plugins.jetbrains.com/plugin/9554-clion-with-bazel) Features: @@ -37,14 +41,9 @@ Features: To install, go to the IDE's plugin browser and search for `Bazel`. -To manually install older versions, download the zip files from JetBrains' -Plugin Repository and install the zip file from the IDE's plugin browser: - -* [Android Studio - plugin](https://plugins.jetbrains.com/plugin/9185-android-studio-with-bazel) -* [IntelliJ - plugin](https://plugins.jetbrains.com/plugin/8609-intellij-with-bazel) -* [CLion plugin](https://plugins.jetbrains.com/plugin/9554-clion-with-bazel) +To manually install older versions, download the zip files from the JetBrains +Marketplace or from [GitHub Releases](https://github.com/bazelbuild/intellij/releases) +and install the zip file from the IDE's plugin browser. ### Xcode diff --git a/install/index.mdx b/install/index.mdx index 29b469728..84d9b1468 100644 --- a/install/index.mdx +++ b/install/index.mdx @@ -22,6 +22,7 @@ officially support them. Contact the package maintainers for support. * [Fedora](https://copr.fedorainfracloud.org/coprs/lihaohong/bazel) * [FreeBSD](https://www.freshports.org/devel/bazel) * [Homebrew](https://formulae.brew.sh/formula/bazel) +* [mise](install/mise) * [Nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/tools/build-managers/bazel) * [openSUSE](/install/suse) * [Scoop](https://github.com/scoopinstaller/scoop-main/blob/master/bucket/bazel.json) diff --git a/install/mise.mdx b/install/mise.mdx new file mode 100644 index 000000000..24aa517c6 --- /dev/null +++ b/install/mise.mdx @@ -0,0 +1,10 @@ +--- +title: 'Installing Bazel with mise' +--- + + +This page describes how to install Bazel using [mise](https://github.com/jdx/mise) the polyglot tools version manager. + +```shell +mise use -g bazel@latest +``` diff --git a/migrate/index.mdx b/migrate/index.mdx index 2a5740671..601d61031 100644 --- a/migrate/index.mdx +++ b/migrate/index.mdx @@ -2,8 +2,6 @@ title: 'Migrating to Bazel' --- - - This page links to migration guides for Bazel. * [Maven](/migrate/maven) diff --git a/migrate/maven.mdx b/migrate/maven.mdx index 38aaffc00..960867fde 100644 --- a/migrate/maven.mdx +++ b/migrate/maven.mdx @@ -2,8 +2,6 @@ title: 'Migrating from Maven to Bazel' --- - - This page describes how to migrate from Maven to Bazel, including the prerequisites and installation steps. It describes the differences between Maven and Bazel, and provides a migration example using the Guava project. @@ -14,18 +12,18 @@ system, and any other relevant systems. You can run Maven and Bazel in the same repository. Note: While Bazel supports downloading and publishing Maven artifacts with -[rules_jvm_external](https://github.com/bazelbuild/rules_jvm_external) +[rules_jvm_external](https://github.com/bazelbuild/rules_jvm_external){: .external} , it does not directly support Maven-based plugins. Maven plugins can't be directly run by Bazel since there's no Maven compatibility layer. -## Before you begin +## Before you begin {:#before-you-begin} * [Install Bazel](/install) if it's not yet installed. * If you're new to Bazel, go through the tutorial [Introduction to Bazel: Build Java](/start/java) before you start migrating. The tutorial explains Bazel's concepts, structure, and label syntax. -## Differences between Maven and Bazel +## Differences between Maven and Bazel {:#dif-maven-bazel} * Maven uses top-level `pom.xml` file(s). Bazel supports multiple build files and multiple targets per `BUILD` file, allowing for builds that are more @@ -37,7 +35,7 @@ directly run by Bazel since there's no Maven compatibility layer. `BUILD` files. Best practice is to add a `BUILD` file to each new Java package. -## Migrate from Maven to Bazel +## Migrate from Maven to Bazel {:#migrate-maven-bazel} The steps below describe how to migrate your project to Bazel: @@ -47,7 +45,7 @@ The steps below describe how to migrate your project to Bazel: 4. [Build using Bazel](#4-build) Examples below come from a migration of the [Guava -project](https://github.com/google/guava) from Maven to Bazel. The +project](https://github.com/google/guava){: .external} from Maven to Bazel. The Guava project used is release `v31.1`. The examples using Guava do not walk through each step in the migration, but they do show the files and contents that are generated or added manually for the migration. @@ -57,7 +55,7 @@ $ git clone https://github.com/google/guava.git && cd guava $ git checkout v31.1 ``` -### 1. Create the MODULE.bazel file +### 1. Create the MODULE.bazel file {:#1-build} Create a file named `MODULE.bazel` at the root of your project. If your project has no external dependencies, this file can be empty. @@ -66,14 +64,14 @@ If your project depends on files or packages that are not in one of the project's directories, specify these external dependencies in the MODULE.bazel file. You can use `rules_jvm_external` to manage dependencies from Maven. For instructions about using this ruleset, see [the -README](https://github.com/bazelbuild/rules_jvm_external/#rules_jvm_external) +README](https://github.com/bazelbuild/rules_jvm_external/#rules_jvm_external){: .external} . -#### Guava project example: external dependencies +#### Guava project example: external dependencies {:#guava-1} You can list the external dependencies of the [Guava -project](https://github.com/google/guava) with the -[`rules_jvm_external`](https://github.com/bazelbuild/rules_jvm_external) +project](https://github.com/google/guava){: .external} with the +[`rules_jvm_external`](https://github.com/bazelbuild/rules_jvm_external){: .external} ruleset. Add the following snippet to the `MODULE.bazel` file: @@ -96,7 +94,7 @@ maven.install( use_repo(maven, "maven") ``` -### 2. Create one BUILD file +### 2. Create one BUILD file {:#2-build} Now that you have your workspace defined and external dependencies (if applicable) listed, you need to create `BUILD` files to describe how your @@ -176,7 +174,7 @@ your build by adding more `BUILD` files with more granular targets. The project has now been successfully built with Bazel. You will need to add more `BUILD` files to allow incremental builds of the project. -#### Guava project example: start with one BUILD file +#### Guava project example: start with one BUILD file {:#guava-2} When migrating the Guava project to Bazel, initially one `BUILD` file is used to build the entire project. Here are the contents of this initial `BUILD` file in @@ -200,7 +198,7 @@ java_library( ) ``` -### 3. Create more BUILD files (optional) +### 3. Create more BUILD files (optional) {:#3-build} Bazel does work with just one `BUILD file`, as you saw after completing your first build. You should still consider breaking the build into smaller chunks by @@ -232,10 +230,10 @@ Tips for adding more `BUILD` files: that the project continues to build with Bazel as you add each build file. Run `bazel build //...` to ensure all of your targets still build. -### 4. Build using Bazel +### 4. Build using Bazel {:#4-build} You've been building using Bazel as you add `BUILD` files to validate the setup of the build. When you have `BUILD` files at the desired granularity, you can use Bazel to -produce all of your builds. +produce all of your builds. \ No newline at end of file diff --git a/migrate/xcode.mdx b/migrate/xcode.mdx index 986cd1158..a01a2c9f5 100644 --- a/migrate/xcode.mdx +++ b/migrate/xcode.mdx @@ -2,14 +2,12 @@ title: 'Migrating from Xcode to Bazel' --- - - This page describes how to build or test an Xcode project with Bazel. It describes the differences between Xcode and Bazel, and provides the steps for converting an Xcode project to a Bazel project. It also provides troubleshooting solutions to address common errors. -## Differences between Xcode and Bazel +## Differences between Xcode and Bazel {:#dif-xcode-bazel} * Bazel requires you to explicitly specify every build target and its dependencies, plus the corresponding build settings via build rules. @@ -21,14 +19,14 @@ solutions to address common errors. * When building Xcode projects with Bazel, the `BUILD` file(s) become the source of truth. If you work on the project in Xcode, you must generate a new version of the Xcode project that matches the `BUILD` files using - [rules_xcodeproj](https://github.com/buildbuddy-io/rules_xcodeproj/) + [rules_xcodeproj](https://github.com/buildbuddy-io/rules_xcodeproj/){: .external} whenever you update the `BUILD` files. Certain changes to the `BUILD` files such as adding dependencies to a target don't require regenerating the project which can speed up development. If you're not using Xcode, the `bazel build` and `bazel test` commands provide build and test capabilities with certain limitations described later in this guide. -## Before you begin +## Before you begin {:#before-you-begin} Before you begin, do the following: @@ -41,7 +39,7 @@ Before you begin, do the following: 3. Analyze and understand the project's dependencies. -### Analyze project dependencies +### Analyze project dependencies {:#analyze-project-dependencies} Unlike Xcode, Bazel requires you to explicitly declare all dependencies for every target in the `BUILD` file. @@ -49,7 +47,7 @@ every target in the `BUILD` file. For more information on external dependencies, see [Working with external dependencies](/docs/external). -## Build or test an Xcode project with Bazel +## Build or test an Xcode project with Bazel {:#build-xcode-project} To build or test an Xcode project with Bazel, do the following: @@ -71,7 +69,7 @@ To build or test an Xcode project with Bazel, do the following: 6. [Generate the Xcode project with rules_xcodeproj](#generate-the-xcode-project-with-rules_xcodeproj) -### Step 1: Create the `MODULE.bazel` file +### Step 1: Create the `MODULE.bazel` file {:#create-workspace} Create a `MODULE.bazel` file in a new directory. This directory becomes the Bazel workspace root. If the project uses no external dependencies, this file @@ -82,19 +80,19 @@ the project's directories, specify these external dependencies in the Note: Place the project source code within the directory tree containing the `MODULE.bazel` file. -### Step 2: (Experimental) Integrate SwiftPM dependencies +### Step 2: (Experimental) Integrate SwiftPM dependencies {:#integrate-swiftpm} To integrate SwiftPM dependencies into the Bazel workspace with -[swift_bazel](https://github.com/cgrindel/swift_bazel), you must +[swift_bazel](https://github.com/cgrindel/swift_bazel){: .external}, you must convert them into Bazel packages as described in the [following -tutorial](https://chuckgrindel.com/swift-packages-in-bazel-using-swift_bazel/) +tutorial](https://chuckgrindel.com/swift-packages-in-bazel-using-swift_bazel/){: .external} . Note: SwiftPM support is a manual process with many variables. SwiftPM integration with Bazel has not been fully verified and is not officially supported. -### Step 3: Create a `BUILD` file +### Step 3: Create a `BUILD` file {:#create-build-file} Once you have defined the workspace and external dependencies, you need to create a `BUILD` file that tells Bazel how the project is structured. Create the @@ -108,12 +106,12 @@ initial build of the project as follows: **Tip:** To learn more about packages and other Bazel concepts, see [Workspaces, packages, and targets](/concepts/build-ref). -#### Step 3a: Add the application target +#### Step 3a: Add the application target {:#add-app-target} Add a -[`macos_application`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-macos.md#macos_application) +[`macos_application`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-macos.md#macos_application){: .external} or an -[`ios_application`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-ios.md#ios_application) +[`ios_application`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-ios.md#ios_application){: .external} rule target. This target builds a macOS or iOS application bundle, respectively. In the target, specify the following at the minimum: @@ -132,26 +130,26 @@ In the target, specify the following at the minimum: application supports. This ensures Bazel builds the application with the correct API levels. -#### Step 3b: (Optional) Add the test target(s) +#### Step 3b: (Optional) Add the test target(s) {:#add-test-target} Bazel's [Apple build -rules](https://github.com/bazelbuild/rules_apple) support running +rules](https://github.com/bazelbuild/rules_apple){: .external} support running unit and UI tests on all Apple platforms. Add test targets as follows: -* [`macos_unit_test`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-macos.md#macos_unit_test) +* [`macos_unit_test`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-macos.md#macos_unit_test){: .external} to run library-based and application-based unit tests on a macOS. -* [`ios_unit_test`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-ios.md#ios_unit_test) +* [`ios_unit_test`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-ios.md#ios_unit_test){: .external} to build and run library-based unit tests on iOS. -* [`ios_ui_test`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-ios.md#ios_ui_test) +* [`ios_ui_test`](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-ios.md#ios_ui_test){: .external} to build and run user interface tests in the iOS simulator. * Similar test rules exist for - [tvOS](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-tvos.md), - [watchOS](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-watchos.md) + [tvOS](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-tvos.md){: .external}, + [watchOS](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-watchos.md){: .external} and - [visionOS](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-visionos.md). + [visionOS](https://github.com/bazelbuild/rules_apple/blob/master/doc/rules-visionos.md){: .external}. At the minimum, specify a value for the `minimum_os_version` attribute. While other packaging attributes, such as `bundle_identifier` and `infoplists`, @@ -160,11 +158,11 @@ with the project and adjust them as necessary. For tests that require the iOS simulator, also specify the `ios_application` target name as the value of the `test_host` attribute. -#### Step 3c: Add the library target(s) +#### Step 3c: Add the library target(s) {:#add-library-target} Add an [`objc_library`](/reference/be/objective-c#objc_library) target for each Objective-C library and a -[`swift_library`](https://github.com/bazelbuild/rules_swift/blob/master/doc/rules.md#swift_library) +[`swift_library`](https://github.com/bazelbuild/rules_swift/blob/master/doc/rules.md#swift_library){: .external} target for each Swift library on which the application and/or tests depend. Add the library targets as follows: @@ -187,20 +185,20 @@ the [rules_apple examples directory](https://github.com/bazelbuild/rules_apple/tree/master/examples/). For example: -* [macOS application targets](https://github.com/bazelbuild/rules_apple/tree/master/examples/macos) +* [macOS application targets](https://github.com/bazelbuild/rules_apple/tree/master/examples/macos){: .external} -* [iOS applications targets](https://github.com/bazelbuild/rules_apple/tree/master/examples/ios) +* [iOS applications targets](https://github.com/bazelbuild/rules_apple/tree/master/examples/ios){: .external} -* [Multi platform applications (macOS, iOS, watchOS, tvOS)](https://github.com/bazelbuild/rules_apple/tree/master/examples/multi_platform) +* [Multi platform applications (macOS, iOS, watchOS, tvOS)](https://github.com/bazelbuild/rules_apple/tree/master/examples/multi_platform){: .external} For more information on build rules, see [Apple Rules for -Bazel](https://github.com/bazelbuild/rules_apple). +Bazel](https://github.com/bazelbuild/rules_apple){: .external}. At this point, it is a good idea to test the build: `bazel build //:` -### Step 4: (Optional) Granularize the build +### Step 4: (Optional) Granularize the build {:#granularize-build} If the project is large, or as it grows, consider chunking it into multiple Bazel packages. This increased granularity provides: @@ -234,7 +232,7 @@ Tips for granularizing the project: * Build the project after each major change to the `BUILD` files and fix build errors as you encounter them. -### Step 5: Run the build +### Step 5: Run the build {:#run-build} Run the fully migrated build to ensure it completes with no errors or warnings. Run every application and test target individually to more easily find sources @@ -246,15 +244,15 @@ For example: bazel build //:my-target ``` -### Step 6: Generate the Xcode project with rules_xcodeproj +### Step 6: Generate the Xcode project with rules_xcodeproj {:#generate-the-xcode-project-with-rules_xcodeproj} When building with Bazel, the `MODULE.bazel` and `BUILD` files become the source of truth about the build. To make Xcode aware of this, you must generate a Bazel-compatible Xcode project using -[rules_xcodeproj](https://github.com/buildbuddy-io/rules_xcodeproj#features) +[rules_xcodeproj](https://github.com/buildbuddy-io/rules_xcodeproj#features){: .external} . -### Troubleshooting +### Troubleshooting {:#troubleshooting} Bazel errors can arise when it gets out of sync with the selected Xcode version, like when you apply an update. Here are some things to try if you're @@ -277,4 +275,4 @@ use an Apple CROSSTOOL". * If this does not work, you may also try running `bazel clean --expunge`. Note: If you've saved your Xcode to a different path, you can use `xcode-select --s` to point to that path. +-s` to point to that path. \ No newline at end of file diff --git a/query/cquery.mdx b/query/cquery.mdx index dc46c97dd..d35ea8298 100644 --- a/query/cquery.mdx +++ b/query/cquery.mdx @@ -164,14 +164,9 @@ The `config` operator attempts to find the configured target for the label denoted by the first argument and configuration specified by the second argument. -Valid values for the second argument are: - -* 'target': The 'top-level' configuration for a cquery -* 'anyexec': Identify any 'exec' configuration (always return first exec config, - in alphanumeric sorting of config hash. -* `null` used for source files while have no configuration. -* [custom configuration hash](#configurations). Hashes can be retrieved from - `$ blaze config` or a prevous `cquery`'s output. +Valid values for the second argument are `null` or a +[custom configuration hash](#configurations). Hashes can be retrieved from `$ +bazel config` or a previous `cquery`'s output. Examples: diff --git a/query/language.mdx b/query/language.mdx new file mode 100644 index 000000000..20a8f78a8 --- /dev/null +++ b/query/language.mdx @@ -0,0 +1,1551 @@ +--- +title: 'The Bazel Query Reference' +--- + +This page is the reference manual for the _Bazel Query Language_ used +when you use `bazel query` to analyze build dependencies. It also +describes the output formats `bazel query` supports. + +For practical use cases, see the [Bazel Query How-To](/query/guide). + +## Additional query reference + +In addition to `query`, which runs on the post-loading phase target graph, +Bazel includes *action graph query* and *configurable query*. + +### Action graph query {:#aquery} + +The action graph query (`aquery`) operates on the post-analysis Configured +Target Graph and exposes information about **Actions**, **Artifacts**, and +their relationships. `aquery` is useful when you are interested in the +properties of the Actions/Artifacts generated from the Configured Target Graph. +For example, the actual commands run and their inputs, outputs, and mnemonics. + +For more details, see the [aquery reference](/query/aquery). + +### Configurable query {:#cquery} + +Traditional Bazel query runs on the post-loading phase target graph and +therefore has no concept of configurations and their related concepts. Notably, +it doesn't correctly resolve [select statements](/reference/be/functions#select) +and instead returns all possible resolutions of selects. However, the +configurable query environment, `cquery`, properly handles configurations but +doesn't provide all of the functionality of this original query. + +For more details, see the [cquery reference](/query/cquery). + +## Examples {:#examples} + +How do people use `bazel query`? Here are typical examples: + +Why does the `//foo` tree depend on `//bar/baz`? +Show a path: + +``` +somepath(foo/..., //bar/baz:all) +``` + +What C++ libraries do all the `foo` tests depend on that +the `foo_bin` target does not? + +``` +kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo:foo_bin)) +``` + +## Tokens: The lexical syntax {:#tokens} + +Expressions in the query language are composed of the following +tokens: + +* **Keywords**, such as `let`. Keywords are the reserved words of the + language, and each of them is described below. The complete set + of keywords is: + + * [`except`](#set-operations) + + * [`in`](#variables) + + * [`intersect`](#set-operations) + + * [`let`](#variables) + + * [`set`](#set) + + * [`union`](#set-operations) + +* **Words**, such as "`foo/...`" or "`.*test rule`" or "`//bar/baz:all`". If a + character sequence is "quoted" (begins and ends with a single-quote ' or + begins and ends with a double-quote "), it is a word. If a character sequence + is not quoted, it may still be parsed as a word. Unquoted words are sequences + of characters drawn from the alphabet characters A-Za-z, the numerals 0-9, + and the special characters `*/@.-_:$~[]` (asterisk, forward slash, at, period, + hyphen, underscore, colon, dollar sign, tilde, left square brace, right square + brace). However, unquoted words may not start with a hyphen `-` or asterisk `*` + even though relative [target names](/concepts/labels#target-names) may start + with those characters. As a special rule meant to simplify the handling of + labels referring to external repositories, unquoted words that start with + `@@` may contain `+` characters. + + Unquoted words also may not include the characters plus sign `+` or equals + sign `=`, even though those characters are permitted in target names. When + writing code that generates query expressions, target names should be quoted. + + Quoting _is_ necessary when writing scripts that construct Bazel query + expressions from user-supplied values. + + ``` + //foo:bar+wiz # WRONG: scanned as //foo:bar + wiz. + //foo:bar=wiz # WRONG: scanned as //foo:bar = wiz. + "//foo:bar+wiz" # OK. + "//foo:bar=wiz" # OK. + ``` + + Note that this quoting is in addition to any quoting that may be required by + your shell, such as: + + ```posix-terminal + bazel query ' "//foo:bar=wiz" ' # single-quotes for shell, double-quotes for Bazel. + ``` + + Keywords and operators, when quoted, are treated as ordinary words. For example, `some` is a + keyword but "some" is a word. Both `foo` and "foo" are words. + + However, be careful when using single or double quotes in target names. When + quoting one or more target names, use only one type of quotes (either all + single or all double quotes). + + The following are examples of what the Java query string will be: + + ``` + 'a"'a' # WRONG: Error message: unclosed quotation. + "a'"a" # WRONG: Error message: unclosed quotation. + '"a" + 'a'' # WRONG: Error message: unexpected token 'a' after query expression '"a" + ' + "'a' + "a"" # WRONG: Error message: unexpected token 'a' after query expression ''a' + ' + "a'a" # OK. + 'a"a' # OK. + '"a" + "a"' # OK + "'a' + 'a'" # OK + ``` + + We chose this syntax so that quote marks aren't needed in most cases. The + (unusual) `".*test rule"` example needs quotes: it starts with a period and + contains a space. Quoting `"cc_library"` is unnecessary but harmless. + +* **Punctuation**, such as parens `()`, period `.` and comma `,`. Words + containing punctuation (other than the exceptions listed above) must be quoted. + +Whitespace characters outside of a quoted word are ignored. + +## Bazel query language concepts {:#language-concepts} + +The Bazel query language is a language of expressions. Every +expression evaluates to a **partially-ordered set** of targets, +or equivalently, a **graph** (DAG) of targets. This is the only +datatype. + +Set and graph refer to the same datatype, but emphasize different +aspects of it, for example: + +* **Set:** The partial order of the targets is not interesting. +* **Graph:** The partial order of targets is significant. + +### Cycles in the dependency graph {:#dependency-graph-cycles} + +Build dependency graphs should be acyclic. + +The algorithms used by the query language are robust against cycles, and will +not report cycles as errors. + +Note that the post-loading phase unconfigured target graph that `bazel query` +operates over may contain cycles that do not exist in the configured target +graph. Cycles in the configured target graph are detected and reported as errors +by [`bazel cquery`](/query/cquery) and [`bazel aquery`](/query/aquery). + +### Implicit dependencies {:#implicit-dependencies} + +In addition to build dependencies that are defined explicitly in `BUILD` files, +Bazel adds additional _implicit_ dependencies to rules. Implicit dependencies +may be defined by: + +- [Private attributes](/extending/rules#private_attributes_and_implicit_dependencies) +- [Toolchain requirements](/extending/toolchains#writing-rules-toolchains) + +By default, `bazel query` takes implicit dependencies into account +when computing the query result. This behavior can be changed with +the `--[no]implicit_deps` option. + +Note that, as query does not consider configurations, potential toolchain +**implementations** are not considered dependencies, only the +required toolchain types. See +[toolchain documentation](/extending/toolchains#writing-rules-toolchains). + +### Soundness {:#soundness} + +Bazel query language expressions operate over the build +dependency graph, which is the graph implicitly defined by all +rule declarations in all `BUILD` files. It is important to understand +that this graph is somewhat abstract, and does not constitute a +complete description of how to perform all the steps of a build. In +order to perform a build, a _configuration_ is required too; +see the [configurations](/docs/user-manual#configurations) +section of the User's Guide for more detail. + +The result of evaluating an expression in the Bazel query language +is true _for all configurations_, which means that it may be +a conservative over-approximation, and not exactly precise. If you +use the query tool to compute the set of all source files needed +during a build, it may report more than are actually necessary +because, for example, the query tool will include all the files +needed to support message translation, even though you don't intend +to use that feature in your build. + +### On the preservation of graph order {:#graph-order} + +Operations preserve any ordering +constraints inherited from their subexpressions. You can think of +this as "the law of conservation of partial order". Consider an +example: if you issue a query to determine the transitive closure of +dependencies of a particular target, the resulting set is ordered +according to the dependency graph. If you filter that set to +include only the targets of `file` kind, the same +_transitive_ partial ordering relation holds between every +pair of targets in the resulting subset - even though none of +these pairs is actually directly connected in the original graph. +(There are no file-file edges in the build dependency graph). + +However, while all operators _preserve_ order, some +operations, such as the [set operations](#set-operations) +don't _introduce_ any ordering constraints of their own. +Consider this expression: + +``` +deps(x) union y +``` + +The order of the final result set is guaranteed to preserve all the +ordering constraints of its subexpressions, namely, that all the +transitive dependencies of `x` are correctly ordered with +respect to each other. However, the query guarantees nothing about +the ordering of the targets in `y`, nor about the +ordering of the targets in `deps(x)` relative to those in +`y` (except for those targets in +`y` that also happen to be in `deps(x)`). + +Operators that introduce ordering constraints include: +`allpaths`, `deps`, `rdeps`, `somepath`, and the target pattern wildcards +`package:*`, `dir/...`, etc. + +### Sky query {:#sky-query} + +_Sky Query_ is a mode of query that operates over a specified _universe scope_. + +#### Special functions available only in SkyQuery + +Sky Query mode has the additional query functions `allrdeps` and +`rbuildfiles`. These functions operate over the entire +universe scope (which is why they don't make sense for normal Query). + +#### Specifying a universe scope + +Sky Query mode is activated by passing the following two flags: +(`--universe_scope` or `--infer_universe_scope`) and +`--order_output=no`. +`--universe_scope=,...,` tells query to +preload the transitive closure of the target pattern specified by the target patterns, which can +be both additive and subtractive. All queries are then evaluated in this "scope". In particular, +the [`allrdeps`](#allrdeps) and +[`rbuildfiles`](#rbuildfiles) operators only return results from this scope. +`--infer_universe_scope` tells Bazel to infer a value for `--universe_scope` +from the query expression. This inferred value is the list of unique target patterns in the +query expression, but this might not be what you want. For example: + +```posix-terminal +bazel query --infer_universe_scope --order_output=no "allrdeps(//my:target)" +``` + +The list of unique target patterns in this query expression is `["//my:target"]`, so +Bazel treats this the same as the invocation: + +```posix-terminal +bazel query --universe_scope=//my:target --order_output=no "allrdeps(//my:target)" +``` + +But the result of that query with `--universe_scope` is only `//my:target`; +none of the reverse dependencies of `//my:target` are in the universe, by +construction! On the other hand, consider: + +```posix-terminal +bazel query --infer_universe_scope --order_output=no "tests(//a/... + b/...) intersect allrdeps(siblings(rbuildfiles(my/starlark/file.bzl)))" +``` + +This is a meaningful query invocation that is trying to compute the test targets in the +[`tests`](#tests) expansion of the targets under some directories that +transitively depend on targets whose definition uses a certain `.bzl` file. Here, +`--infer_universe_scope` is a convenience, especially in the case where the choice of +`--universe_scope` would otherwise require you to parse the query expression yourself. + +So, for query expressions that use universe-scoped operators like +[`allrdeps`](#allrdeps) and +[`rbuildfiles`](#rbuildfiles) be sure to use +`--infer_universe_scope` only if its behavior is what you want. + +Sky Query has some advantages and disadvantages compared to the default query. The main +disadvantage is that it cannot order its output according to graph order, and thus certain +[output formats](#output-formats) are forbidden. Its advantages are that it provides +two operators ([`allrdeps`](#allrdeps) and +[`rbuildfiles`](#rbuildfiles)) that are not available in the default query. +As well, Sky Query does its work by introspecting the +[Skyframe](/reference/skyframe) graph, rather than creating a new +graph, which is what the default implementation does. Thus, there are some circumstances in which +it is faster and uses less memory. + +## Expressions: Syntax and semantics of the grammar {:#expressions} + +This is the grammar of the Bazel query language, expressed in EBNF notation: + +```none {:.devsite-disable-click-to-copy} +expr ::= {{ '' }}word{{ '' }} + | let {{ '' }}name{{ '' }} = {{ '' }}expr{{ '' }} in {{ '' }}expr{{ '' }} + | ({{ '' }}expr{{ '' }}) + | {{ '' }}expr{{ '' }} intersect {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} ^ {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} union {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} + {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} except {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} - {{ '' }}expr{{ '' }} + | set({{ '' }}word{{ '' }} *) + | {{ '' }}word{{ '' }} '(' {{ '' }}int{{ '' }} | {{ '' }}word{{ '' }} | {{ '' }}expr{{ '' }} ... ')' +``` + +The following sections describe each of the productions of this grammar in order. + +### Target patterns {:#target-patterns} + +``` +expr ::= {{ '' }}word{{ '' }} +``` + +Syntactically, a _target pattern_ is just a word. It's interpreted as an +(unordered) set of targets. The simplest target pattern is a label, which +identifies a single target (file or rule). For example, the target pattern +`//foo:bar` evaluates to a set containing one element, the target, the `bar` +rule. + +Target patterns generalize labels to include wildcards over packages and +targets. For example, `foo/...:all` (or just `foo/...`) is a target pattern +that evaluates to a set containing all _rules_ in every package recursively +beneath the `foo` directory; `bar/baz:all` is a target pattern that evaluates +to a set containing all the rules in the `bar/baz` package, but not its +subpackages. + +Similarly, `foo/...:*` is a target pattern that evaluates to a set containing +all _targets_ (rules _and_ files) in every package recursively beneath the +`foo` directory; `bar/baz:*` evaluates to a set containing all the targets in +the `bar/baz` package, but not its subpackages. + +Because the `:*` wildcard matches files as well as rules, it's often more +useful than `:all` for queries. Conversely, the `:all` wildcard (implicit in +target patterns like `foo/...`) is typically more useful for builds. + +`bazel query` target patterns work the same as `bazel build` build targets do. +For more details, see [Target Patterns](/docs/user-manual#target-patterns), or +type `bazel help target-syntax`. + +Target patterns may evaluate to a singleton set (in the case of a label), to a +set containing many elements (as in the case of `foo/...`, which has thousands +of elements) or to the empty set, if the target pattern matches no targets. + +All nodes in the result of a target pattern expression are correctly ordered +relative to each other according to the dependency relation. So, the result of +`foo:*` is not just the set of targets in package `foo`, it is also the +_graph_ over those targets. (No guarantees are made about the relative ordering +of the result nodes against other nodes.) For more details, see the +[graph order](#graph-order) section. + +### Variables {:#variables} + +```none {:.devsite-disable-click-to-copy} +expr ::= let {{ '' }}name{{ '' }} = {{ '' }}expr{{ '' }}{{ '' }}1{{ '' }} in {{ '' }}expr{{ '' }}{{ '' }}2{{ '' }} + | {{ '' }}$name{{ '' }} +``` + +The Bazel query language allows definitions of and references to +variables. The result of evaluation of a `let` expression is the same as +that of {{ '' }}expr{{ '' }}2, with all free occurrences +of variable {{ '' }}name{{ '' }} replaced by the value of +{{ '' }}expr{{ '' }}1. + +For example, `let v = foo/... in allpaths($v, //common) intersect $v` is +equivalent to the `allpaths(foo/...,//common) intersect foo/...`. + +An occurrence of a variable reference `name` other than in +an enclosing `let {{ '' }}name{{ '' }} = ...` expression is an +error. In other words, top-level query expressions cannot have free +variables. + +In the above grammar productions, `name` is like _word_, but with the +additional constraint that it be a legal identifier in the C programming +language. References to the variable must be prepended with the "$" character. + +Each `let` expression defines only a single variable, but you can nest them. + +Both [target patterns](#target-patterns) and variable references consist of +just a single token, a word, creating a syntactic ambiguity. However, there is +no semantic ambiguity, because the subset of words that are legal variable +names is disjoint from the subset of words that are legal target patterns. + +Technically speaking, `let` expressions do not increase +the expressiveness of the query language: any query expressible in +the language can also be expressed without them. However, they +improve the conciseness of many queries, and may also lead to more +efficient query evaluation. + +### Parenthesized expressions {:#parenthesized-expressions} + +```none {:.devsite-disable-click-to-copy} +expr ::= ({{ '' }}expr{{ '' }}) +``` + +Parentheses associate subexpressions to force an order of evaluation. +A parenthesized expression evaluates to the value of its argument. + +### Algebraic set operations: intersection, union, set difference {:#algebraic-set-operations} + +```none {:.devsite-disable-click-to-copy} +expr ::= {{ '' }}expr{{ '' }} intersect {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} ^ {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} union {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} + {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} except {{ '' }}expr{{ '' }} + | {{ '' }}expr{{ '' }} - {{ '' }}expr{{ '' }} +``` + +These three operators compute the usual set operations over their arguments. +Each operator has two forms, a nominal form, such as `intersect`, and a +symbolic form, such as `^`. Both forms are equivalent; the symbolic forms are +quicker to type. (For clarity, the rest of this page uses the nominal forms.) + +For example, + +``` +foo/... except foo/bar/... +``` + +evaluates to the set of targets that match `foo/...` but not `foo/bar/...`. + +You can write the same query as: + +``` +foo/... - foo/bar/... +``` + +The `intersect` (`^`) and `union` (`+`) operations are commutative (symmetric); +`except` (`-`) is asymmetric. The parser treats all three operators as +left-associative and of equal precedence, so you might want parentheses. For +example, the first two of these expressions are equivalent, but the third is not: + +``` +x intersect y union z +(x intersect y) union z +x intersect (y union z) +``` + +Important: Use parentheses where there is any danger of ambiguity in reading a +query expression. + +### Read targets from an external source: set {:#set} + +```none {:.devsite-disable-click-to-copy} +expr ::= set({{ '' }}word{{ '' }} *) +``` + +The `set({{ '' }}a{{ '' }} {{ '' }}b{{ '' }} {{ '' }}c{{ '' }} ...)` +operator computes the union of a set of zero or more +[target patterns](#target-patterns), separated by whitespace (no commas). + +In conjunction with the Bourne shell's `$(...)` feature, `set()` provides a +means of saving the results of one query in a regular text file, manipulating +that text file using other programs (such as standard UNIX shell tools), and then +introducing the result back into the query tool as a value for further +processing. For example: + +```posix-terminal +bazel query deps(//my:target) --output=label | grep ... | sed ... | awk ... > foo + +bazel query "kind(cc_binary, set($( foo + +bazel query "kind(cc_library, set($(' }}word{{ '' }} '(' {{ '' }}int{{ '' }} | {{ '' }}word{{ '' }} | {{ '' }}expr{{ '' }} ... ')' +``` + +The query language defines several functions. The name of the function +determines the number and type of arguments it requires. The following +functions are available: + +* [`allpaths`](#somepath-allpaths) +* [`attr`](#attr) +* [`buildfiles`](#buildfiles) +* [`rbuildfiles`](#rbuildfiles) +* [`deps`](#deps) +* [`executables`](#executables) +* [`filter`](#filter) +* [`kind`](#kind) +* [`labels`](#labels) +* [`loadfiles`](#loadfiles) +* [`rdeps`](#rdeps) +* [`allrdeps`](#allrdeps) +* [`same_pkg_direct_rdeps`](#same_pkg_direct_rdeps) +* [`siblings`](#siblings) +* [`some`](#some) +* [`somepath`](#somepath-allpaths) +* [`tests`](#tests) +* [`visible`](#visible) + + +### Transitive closure of dependencies: deps {:#deps} + +```none {:.devsite-disable-click-to-copy} +expr ::= deps({{ '' }}expr{{ '' }}) + | deps({{ '' }}expr{{ '' }}, {{ '' }}depth{{ '' }}) +``` + +The `deps({{ '' }}x{{ '' }})` operator evaluates to the graph formed +by the transitive closure of dependencies of its argument set +{{ '' }}x{{ '' }}. For example, the value of `deps(//foo)` is the +dependency graph rooted at the single node `foo`, including all its +dependencies. The value of `deps(foo/...)` is the dependency graphs whose roots +are all rules in every package beneath the `foo` directory. In this context, +'dependencies' means only rule and file targets, therefore the `BUILD` and +Starlark files needed to create these targets are not included here. For that +you should use the [`buildfiles`](#buildfiles) operator. + +The resulting graph is ordered according to the dependency relation. For more +details, see the section on [graph order](#graph-order). + +The `deps` operator accepts an optional second argument, which is an integer +literal specifying an upper bound on the depth of the search. So +`deps(foo:*, 0)` returns all targets in the `foo` package, while +`deps(foo:*, 1)` further includes the direct prerequisites of any target in the +`foo` package, and `deps(foo:*, 2)` further includes the nodes directly +reachable from the nodes in `deps(foo:*, 1)`, and so on. (These numbers +correspond to the ranks shown in the [`minrank`](#output-ranked) output format.) +If the {{ '' }}depth{{ '' }} parameter is omitted, the search is +unbounded: it computes the reflexive transitive closure of prerequisites. + +### Transitive closure of reverse dependencies: rdeps {:#rdeps} + +```none {:.devsite-disable-click-to-copy} +expr ::= rdeps({{ '' }}expr{{ '' }}, {{ '' }}expr{{ '' }}) + | rdeps({{ '' }}expr{{ '' }}, {{ '' }}expr{{ '' }}, {{ '' }}depth{{ '' }}) +``` + +The `rdeps({{ '' }}u{{ '' }}, {{ '' }}x{{ '' }})` +operator evaluates to the reverse dependencies of the argument set +{{ '' }}x{{ '' }} within the transitive closure of the universe set +{{ '' }}u{{ '' }}. + +The resulting graph is ordered according to the dependency relation. See the +section on [graph order](#graph-order) for more details. + +The `rdeps` operator accepts an optional third argument, which is an integer +literal specifying an upper bound on the depth of the search. The resulting +graph only includes nodes within a distance of the specified depth from any +node in the argument set. So `rdeps(//foo, //common, 1)` evaluates to all nodes +in the transitive closure of `//foo` that directly depend on `//common`. (These +numbers correspond to the ranks shown in the [`minrank`](#output-ranked) output +format.) If the {{ '' }}depth{{ '' }} parameter is omitted, the +search is unbounded. + +### Transitive closure of all reverse dependencies: allrdeps {:#allrdeps} + +``` +expr ::= allrdeps({{ '' }}expr{{ '' }}) + | allrdeps({{ '' }}expr{{ '' }}, {{ '' }}depth{{ '' }}) +``` + +Note: Only available with [Sky Query](#sky-query) + +The `allrdeps` operator behaves just like the [`rdeps`](#rdeps) +operator, except that the "universe set" is whatever the `--universe_scope` flag +evaluated to, instead of being separately specified. Thus, if +`--universe_scope=//foo/...` was passed, then `allrdeps(//bar)` is +equivalent to `rdeps(//foo/..., //bar)`. + +### Direct reverse dependencies in the same package: same_pkg_direct_rdeps {:#same_pkg_direct_rdeps} + +``` +expr ::= same_pkg_direct_rdeps({{ '' }}expr{{ '' }}) +``` + +The `same_pkg_direct_rdeps({{ '' }}x{{ '' }})` operator evaluates to the full set of targets +that are in the same package as a target in the argument set, and which directly depend on it. + +### Dealing with a target's package: siblings {:#siblings} + +``` +expr ::= siblings({{ '' }}expr{{ '' }}) +``` + +The `siblings({{ '' }}x{{ '' }})` operator evaluates to the full set of targets that are in +the same package as a target in the argument set. + +### Arbitrary choice: some {:#some} + +``` +expr ::= some({{ '' }}expr{{ '' }}) + | some({{ '' }}expr{{ '' }}, {{ '' }}count{{ ' '}}) +``` + +The `some({{ '' }}x{{ '' }}, {{ '' }}k{{ '' }})` operator +selects at most {{ '' }}k{{ '' }} targets arbitrarily from its +argument set {{ '' }}x{{ '' }}, and evaluates to a set containing +only those targets. Parameter {{ '' }}k{{ '' }} is optional; if +missing, the result will be a singleton set containing only one target +arbitrarily selected. If the size of argument set {{ '' }}x{{ '' }} is +smaller than {{ '' }}k{{ '' }}, the whole argument set +{{ '' }}x{{ '' }} will be returned. + +For example, the expression `some(//foo:main union //bar:baz)` evaluates to a +singleton set containing either `//foo:main` or `//bar:baz`—though which +one is not defined. The expression `some(//foo:main union //bar:baz, 2)` or +`some(//foo:main union //bar:baz, 3)` returns both `//foo:main` and +`//bar:baz`. + +If the argument is a singleton, then `some` +computes the identity function: `some(//foo:main)` is +equivalent to `//foo:main`. + +It is an error if the specified argument set is empty, as in the +expression `some(//foo:main intersect //bar:baz)`. + +### Path operators: somepath, allpaths {:#somepath-allpaths} + +``` +expr ::= somepath({{ '' }}expr{{ '' }}, {{ '' }}expr{{ '' }}) + | allpaths({{ '' }}expr{{ '' }}, {{ '' }}expr{{ '' }}) +``` + +The `somepath({{ '' }}S{{ '' }}, {{ '' }}E{{ '' }})` and +`allpaths({{ '' }}S{{ '' }}, {{ '' }}E{{ '' }})` operators compute +paths between two sets of targets. Both queries accept two +arguments, a set {{ '' }}S{{ '' }} of starting points and a set +{{ '' }}E{{ '' }} of ending points. `somepath` returns the +graph of nodes on _some_ arbitrary path from a target in +{{ '' }}S{{ '' }} to a target in {{ '' }}E{{ '' }}; `allpaths` +returns the graph of nodes on _all_ paths from any target in +{{ '' }}S{{ '' }} to any target in {{ '' }}E{{ '' }}. + +The resulting graphs are ordered according to the dependency relation. +See the section on [graph order](#graph-order) for more details. + + + + + + + +
    +
    + Somepath +
    somepath(S1 + S2, E), one possible result.
    +
    + +
    +
    + Somepath +
    somepath(S1 + S2, E), another possible result.
    +
    + +
    +
    + Allpaths +
    allpaths(S1 + S2, E)
    +
    + +
    + +### Target kind filtering: kind {:#kind} + +``` +expr ::= kind({{ '' }}word{{ '' }}, {{ '' }}expr{{ '' }}) +``` + +The `kind({{ '' }}pattern{{ '' }}, {{ '' }}input{{ '' }})` +operator applies a filter to a set of targets, and discards those targets +that are not of the expected kind. The {{ '' }}pattern{{ '' }} +parameter specifies what kind of target to match. + +For example, the kinds for the four targets defined by the `BUILD` file +(for package `p`) shown below are illustrated in the table: + + + + + + + + + + + + + + + + + + + + + + + + +
    CodeTargetKind
    +
    +        genrule(
    +            name = "a",
    +            srcs = ["a.in"],
    +            outs = ["a.out"],
    +            cmd = "...",
    +        )
    +      
    +
    //p:agenrule rule
    //p:a.insource file
    //p:a.outgenerated file
    //p:BUILDsource file
    + +Thus, `kind("cc_.* rule", foo/...)` evaluates to the set +of all `cc_library`, `cc_binary`, etc, +rule targets beneath `foo`, and `kind("source file", deps(//foo))` +evaluates to the set of all source files in the transitive closure +of dependencies of the `//foo` target. + +Quotation of the {{ '' }}pattern{{ '' }} argument is often required +because without it, many [regular expressions](#regex), such as `source +file` and `.*_test`, are not considered words by the parser. + +When matching for `package group`, targets ending in +`:all` may not yield any results. Use `:all-targets` instead. + +### Target name filtering: filter {:#filter} + +``` +expr ::= filter({{ '' }}word{{ '' }}, {{ '' }}expr{{ '' }}) +``` + +The `filter({{ '' }}pattern{{ '' }}, {{ '' }}input{{ '' }})` +operator applies a filter to a set of targets, and discards targets whose +labels (in absolute form) do not match the pattern; it +evaluates to a subset of its input. + +The first argument, {{ '' }}pattern{{ '' }} is a word containing a +[regular expression](#regex) over target names. A `filter` expression +evaluates to the set containing all targets {{ '' }}x{{ '' }} such that +{{ '' }}x{{ '' }} is a member of the set {{ '' }}input{{ '' }} and the +label (in absolute form, such as `//foo:bar`) +of {{ '' }}x{{ '' }} contains an (unanchored) match +for the regular expression {{ '' }}pattern{{ '' }}. Since all +target names start with `//`, it may be used as an alternative +to the `^` regular expression anchor. + +This operator often provides a much faster and more robust alternative to the +`intersect` operator. For example, in order to see all +`bar` dependencies of the `//foo:foo` target, one could +evaluate + +``` +deps(//foo) intersect //bar/... +``` + +This statement, however, will require parsing of all `BUILD` files in the +`bar` tree, which will be slow and prone to errors in +irrelevant `BUILD` files. An alternative would be: + +``` +filter(//bar, deps(//foo)) +``` + +which would first calculate the set of `//foo` dependencies and +then would filter only targets matching the provided pattern—in other +words, targets with names containing `//bar` as a substring. + +Another common use of the `filter({{ '' }}pattern{{ '' }}, +{{ '' }}expr{{ '' }})` operator is to filter specific files by their +name or extension. For example, + +``` +filter("\.cc$", deps(//foo)) +``` + +will provide a list of all `.cc` files used to build `//foo`. + +### Rule attribute filtering: attr {:#attr} + +``` +expr ::= attr({{ '' }}word{{ '' }}, {{ '' }}word{{ '' }}, {{ '' }}expr{{ '' }}) +``` + +The +`attr({{ '' }}name{{ '' }}, {{ '' }}pattern{{ '' }}, {{ '' }}input{{ '' }})` +operator applies a filter to a set of targets, and discards targets that aren't +rules, rule targets that do not have attribute {{ '' }}name{{ '' }} +defined or rule targets where the attribute value does not match the provided +[regular expression](#regex) {{ '' }}pattern{{ '' }}; it evaluates +to a subset of its input. + +The first argument, {{ '' }}name{{ '' }} is the name of the rule +attribute that should be matched against the provided +[regular expression](#regex) pattern. The second argument, +{{ '' }}pattern{{ '' }} is a regular expression over the attribute +values. An `attr` expression evaluates to the set containing all targets +{{ '' }}x{{ '' }} such that {{ '' }}x{{ '' }} is a +member of the set {{ '' }}input{{ '' }}, is a rule with the defined +attribute {{ '' }}name{{ '' }} and the attribute value contains an +(unanchored) match for the regular expression +{{ '' }}pattern{{ '' }}. If {{ '' }}name{{ '' }} is an +optional attribute and rule does not specify it explicitly then default +attribute value will be used for comparison. For example, + +``` +attr(linkshared, 0, deps(//foo)) +``` + +will select all `//foo` dependencies that are allowed to have a +linkshared attribute (such as, `cc_binary` rule) and have it either +explicitly set to 0 or do not set it at all but default value is 0 (such as for +`cc_binary` rules). + +List-type attributes (such as `srcs`, `data`, etc) are +converted to strings of the form `[value1, ..., valuen]`, +starting with a `[` bracket, ending with a `]` bracket +and using "`, `" (comma, space) to delimit multiple values. +Labels are converted to strings by using the absolute form of the +label. For example, an attribute `deps=[":foo", +"//otherpkg:bar", "wiz"]` would be converted to the +string `[//thispkg:foo, //otherpkg:bar, //thispkg:wiz]`. +Brackets are always present, so the empty list would use string value `[]` +for matching purposes. For example, + +``` +attr("srcs", "\[\]", deps(//foo)) +``` + +will select all rules among `//foo` dependencies that have an +empty `srcs` attribute, while + +``` +attr("data", ".{3,}", deps(//foo)) +``` + +will select all rules among `//foo` dependencies that specify at +least one value in the `data` attribute (every label is at least +3 characters long due to the `//` and `:`). + +To select all rules among `//foo` dependencies with a particular `value` in a +list-type attribute, use + +``` +attr("tags", "[\[ ]value[,\]]", deps(//foo)) +``` + +This works because the character before `value` will be `[` or a space and the +character after `value` will be a comma or `]`. + +To select all rules among `//foo` dependencies with a particular `key` and +`value` in a dict-type attribute, use + +``` +attr("some_dict_attribute", "[\{ ]key=value[,\}]", deps(//foo)) +``` + +This would select `//foo` if `//foo` is defined as + +``` +some_rule( + name = "foo", + some_dict_attribute = { + "key": "value", + }, +) +``` + +This works because the character before `key=value` will be `{` or a space and +the character after `key=value` will be a comma or `}`. + +### Rule visibility filtering: visible {:#visible} + +``` +expr ::= visible({{ '' }}expr{{ '' }}, {{ '' }}expr{{ '' }}) +``` + +The `visible({{ '' }}predicate{{ '' }}, {{ '' }}input{{ '' }})` operator +applies a filter to a set of targets, and discards targets without the +required visibility. + +The first argument, {{ '' }}predicate{{ '' }}, is a set of targets that all targets +in the output must be visible to. A {{ '' }}visible{{ '' }} expression +evaluates to the set containing all targets {{ '' }}x{{ '' }} such that {{ '' }}x{{ '' }} +is a member of the set {{ '' }}input{{ '' }}, and for all targets {{ '' }}y{{ '' }} in +{{ '' }}predicate{{ '' }} {{ '' }}x{{ '' }} is visible to {{ '' }}y{{ '' }}. For example: + +``` +visible(//foo, //bar:*) +``` + +will select all targets in the package `//bar` that `//foo` +can depend on without violating visibility restrictions. + +### Evaluation of rule attributes of type label: labels {:#labels} + +``` +expr ::= labels({{ '' }}word{{ '' }}, {{ '' }}expr{{ '' }}) +``` + +The `labels({{ '' }}attr_name{{ '' }}, {{ '' }}inputs{{ '' }})` +operator returns the set of targets specified in the +attribute {{ '' }}attr_name{{ '' }} of type "label" or "list of label" in +some rule in set {{ '' }}inputs{{ '' }}. + +For example, `labels(srcs, //foo)` returns the set of +targets appearing in the `srcs` attribute of +the `//foo` rule. If there are multiple rules +with `srcs` attributes in the {{ '' }}inputs{{ '' }} set, the +union of their `srcs` is returned. + +### Expand and filter test_suites: tests {:#tests} + +``` +expr ::= tests({{ '' }}expr{{ '' }}) +``` + +The `tests({{ '' }}x{{ '' }})` operator returns the set of all test +rules in set {{ '' }}x{{ '' }}, expanding any `test_suite` rules into +the set of individual tests that they refer to, and applying filtering by +`tag` and `size`. + +By default, query evaluation +ignores any non-test targets in all `test_suite` rules. This can be +changed to errors with the `--strict_test_suite` option. + +For example, the query `kind(test, foo:*)` lists all +the `*_test` and `test_suite` rules +in the `foo` package. All the results are (by +definition) members of the `foo` package. In contrast, +the query `tests(foo:*)` will return all of the +individual tests that would be executed by `bazel test +foo:*`: this may include tests belonging to other packages, +that are referenced directly or indirectly +via `test_suite` rules. + +### Executable targets: executables {:#executables} + +``` +expr ::= executables({{ '' }}expr{{ '' }}) +``` + +The `executables({{ '' }}x{{ '' }})` operator returns the set of all +executable targets in set {{ '' }}x{{ '' }}. These targets +are of rule types that can be run with `bazel run`, such as `cc_binary`, +or any other rule that sets `executable = True` in its definition. + +This doesn't include test targets, which can be added to the result with +the [`tests`](#tests) operator. + +### Package definition files: buildfiles {:#buildfiles} + +``` +expr ::= buildfiles({{ '' }}expr{{ '' }}) +``` + +The `buildfiles({{ '' }}x{{ '' }})` operator returns the set +of files that define the packages of each target in +set {{ '' }}x{{ '' }}; in other words, for each package, its `BUILD` file, +plus any .bzl files it references via `load`. Note that this +also returns the `BUILD` files of the packages containing these +`load`ed files. + +This operator is typically used when determining what files or +packages are required to build a specified target, often in conjunction with +the [`--output package`](#output-package) option, below). For example, + +```posix-terminal +bazel query 'buildfiles(deps(//foo))' --output package +``` + +returns the set of all packages on which `//foo` transitively depends. + +Note: A naive attempt at the above query would omit +the `buildfiles` operator and use only `deps`, +but this yields an incorrect result: while the result contains the +majority of needed packages, those packages that contain only files +that are `load()`'ed will be missing. + +Warning: Bazel pretends each `.bzl` file produced by +`buildfiles` has a corresponding target (for example, file `a/b.bzl` => +target `//a:b.bzl`), but this isn't necessarily the case. Therefore, +`buildfiles` doesn't compose well with other query operators and its results can be +misleading when formatted in a structured way, such as +[`--output=xml`](#xml). + +### Package definition files: rbuildfiles {:#rbuildfiles} + +``` +expr ::= rbuildfiles({{ '' }}word{{ '' }}, ...) +``` + +Note: Only available with [Sky Query](#sky-query). + +The `rbuildfiles` operator takes a comma-separated list of path fragments and returns +the set of `BUILD` files that transitively depend on these path fragments. For instance, if +`//foo` is a package, then `rbuildfiles(foo/BUILD)` will return the +`//foo:BUILD` target. If the `foo/BUILD` file has +`load('//bar:file.bzl'...` in it, then `rbuildfiles(bar/file.bzl)` will +return the `//foo:BUILD` target, as well as the targets for any other `BUILD` files that +load `//bar:file.bzl` + +The scope of the rbuildfiles operator is the universe specified by the +`--universe_scope` flag. Files that do not correspond directly to `BUILD` files and `.bzl` +files do not affect the results. For instance, source files (like `foo.cc`) are ignored, +even if they are explicitly mentioned in the `BUILD` file. Symlinks, however, are respected, so that +if `foo/BUILD` is a symlink to `bar/BUILD`, then +`rbuildfiles(bar/BUILD)` will include `//foo:BUILD` in its results. + +The `rbuildfiles` operator is almost morally the inverse of the +[`buildfiles`](#buildfiles) operator. However, this moral inversion +holds more strongly in one direction: the outputs of `rbuildfiles` are just like the +inputs of `buildfiles`; the former will only contain `BUILD` file targets in packages, +and the latter may contain such targets. In the other direction, the correspondence is weaker. The +outputs of the `buildfiles` operator are targets corresponding to all packages and .`bzl` +files needed by a given input. However, the inputs of the `rbuildfiles` operator are +not those targets, but rather the path fragments that correspond to those targets. + +### Package definition files: loadfiles {:#loadfiles} + +``` +expr ::= loadfiles({{ '' }}expr{{ '' }}) +``` + +The `loadfiles({{ '' }}x{{ '' }})` operator returns the set of +Starlark files that are needed to load the packages of each target in +set {{ '' }}x{{ '' }}. In other words, for each package, it returns the +.bzl files that are referenced from its `BUILD` files. + +Warning: Bazel pretends each of these .bzl files has a corresponding target +(for example, file `a/b.bzl` => target `//a:b.bzl`), but this isn't +necessarily the case. Therefore, `loadfiles` doesn't compose well with other query +operators and its results can be misleading when formatted in a structured way, such as +[`--output=xml`](#xml). + +## Output formats {:#output-formats} + +`bazel query` generates a graph. +You specify the content, format, and ordering by which +`bazel query` presents this graph +by means of the `--output` command-line option. + +When running with [Sky Query](#sky-query), only output formats that are compatible with +unordered output are allowed. Specifically, `graph`, `minrank`, and +`maxrank` output formats are forbidden. + +Some of the output formats accept additional options. The name of +each output option is prefixed with the output format to which it +applies, so `--graph:factored` applies only +when `--output=graph` is being used; it has no effect if +an output format other than `graph` is used. Similarly, +`--xml:line_numbers` applies only when `--output=xml` +is being used. + +### On the ordering of results {:#results-ordering} + +Although query expressions always follow the "[law of +conservation of graph order](#graph-order)", _presenting_ the results may be done +in either a dependency-ordered or unordered manner. This does **not** +influence the targets in the result set or how the query is computed. It only +affects how the results are printed to stdout. Moreover, nodes that are +equivalent in the dependency order may or may not be ordered alphabetically. +The `--order_output` flag can be used to control this behavior. +(The `--[no]order_results` flag has a subset of the functionality +of the `--order_output` flag and is deprecated.) + +The default value of this flag is `auto`, which prints results in **lexicographical +order**. However, when `somepath(a,b)` is used, the results will be printed in +`deps` order instead. + +When this flag is `no` and `--output` is one of +`build`, `label`, `label_kind`, `location`, `package`, `proto`, or +`xml`, the outputs will be printed in arbitrary order. **This is +generally the fastest option**. It is not supported though when +`--output` is one of `graph`, `minrank` or +`maxrank`: with these formats, Bazel always prints results +ordered by the dependency order or rank. + +When this flag is `deps`, Bazel prints results in some topological order—that is, +dependents first and dependencies after. However, nodes that are unordered by the +dependency order (because there is no path from either one to the other) may be +printed in any order. + +When this flag is `full`, Bazel prints nodes in a fully deterministic (total) order. +First, all nodes are sorted alphabetically. Then, each node in the list is used as the start of a +post-order depth-first search in which outgoing edges to unvisited nodes are traversed in +alphabetical order of the successor nodes. Finally, nodes are printed in the reverse of the order +in which they were visited. + +Printing nodes in this order may be slower, so it should be used only when determinism is +important. + +### Print the source form of targets as they would appear in BUILD {:#target-source-form} + +``` +--output build +``` + +With this option, the representation of each target is as if it were +hand-written in the BUILD language. All variables and function calls +(such as glob, macros) are expanded, which is useful for seeing the effect +of Starlark macros. Additionally, each effective rule reports a +`generator_name` and/or `generator_function`) value, +giving the name of the macro that was evaluated to produce the effective rule. + +Although the output uses the same syntax as `BUILD` files, it is not +guaranteed to produce a valid `BUILD` file. + +### Print the label of each target {:#print-label-target} + +``` +--output label +``` + +With this option, the set of names (or _labels_) of each target +in the resulting graph is printed, one label per line, in +topological order (unless `--noorder_results` is specified, see +[notes on the ordering of results](#result-order)). +(A topological ordering is one in which a graph +node appears earlier than all of its successors.) Of course there +are many possible topological orderings of a graph (_reverse +postorder_ is just one); which one is chosen is not specified. + +When printing the output of a `somepath` query, the order +in which the nodes are printed is the order of the path. + +Caveat: in some corner cases, there may be two distinct targets with +the same label; for example, a `sh_binary` rule and its +sole (implicit) `srcs` file may both be called +`foo.sh`. If the result of a query contains both of +these targets, the output (in `label` format) will appear +to contain a duplicate. When using the `label_kind` (see +below) format, the distinction becomes clear: the two targets have +the same name, but one has kind `sh_binary rule` and the +other kind `source file`. + +### Print the label and kind of each target {:#print-target-label} + +``` +--output label_kind +``` + +Like `label`, this output format prints the labels of +each target in the resulting graph, in topological order, but it +additionally precedes the label by the [_kind_](#kind) of the target. + +### Print targets in protocol buffer format {:#print-target-proto} + +``` +--output proto +``` + +Prints the query output as a +[`QueryResult`](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/build.proto) +protocol buffer. + +### Print targets in length-delimited protocol buffer format {:#print-target-length-delimited-proto} + +``` +--output streamed_proto +``` + +Prints a +[length-delimited](https://protobuf.dev/programming-guides/encoding/#size-limit) +stream of +[`Target`](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/build.proto) +protocol buffers. This is useful to _(i)_ get around +[size limitations](https://protobuf.dev/programming-guides/encoding/#size-limit) +of protocol buffers when there are too many targets to fit in a single +`QueryResult` or _(ii)_ to start processing while Bazel is still outputting. + +### Print targets in text proto format {:#print-target-textproto} + +``` +--output textproto +``` + +Similar to `--output proto`, prints the +[`QueryResult`](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/build.proto) +protocol buffer but in +[text format](https://protobuf.dev/reference/protobuf/textformat-spec/). + +### Print targets in ndjson format {:#print-target-streamed-jsonproto} + +``` +--output streamed_jsonproto +``` + +Similar to `--output streamed_proto`, prints a stream of +[`Target`](https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/build.proto) +protocol buffers but in [ndjson](https://github.com/ndjson/ndjson-spec) format. + +### Print the label of each target, in rank order {:#print-target-label-rank-order} + +``` +--output minrank --output maxrank +``` + +Like `label`, the `minrank` +and `maxrank` output formats print the labels of each +target in the resulting graph, but instead of appearing in +topological order, they appear in rank order, preceded by their +rank number. These are unaffected by the result ordering +`--[no]order_results` flag (see [notes on +the ordering of results](#result-order)). + +There are two variants of this format: `minrank` ranks +each node by the length of the shortest path from a root node to it. +"Root" nodes (those which have no incoming edges) are of rank 0, +their successors are of rank 1, etc. (As always, edges point from a +target to its prerequisites: the targets it depends upon.) + +`maxrank` ranks each node by the length of the longest +path from a root node to it. Again, "roots" have rank 0, all other +nodes have a rank which is one greater than the maximum rank of all +their predecessors. + +All nodes in a cycle are considered of equal rank. (Most graphs are +acyclic, but cycles do occur +simply because `BUILD` files contain erroneous cycles.) + +These output formats are useful for discovering how deep a graph is. +If used for the result of a `deps(x)`, `rdeps(x)`, +or `allpaths` query, then the rank number is equal to the +length of the shortest (with `minrank`) or longest +(with `maxrank`) path from `x` to a node in +that rank. `maxrank` can be used to determine the +longest sequence of build steps required to build a target. + +Note: The ranked output of a `somepath` query is +basically meaningless because `somepath` doesn't +guarantee to return either a shortest or a longest path, and it may +include "transitive" edges from one path node to another that are +not direct edges in original graph. + +For example, the graph on the left yields the outputs on the right +when `--output minrank` and `--output maxrank` +are specified, respectively. + + + + + + + +
    Out ranked + +
    +      minrank
    +
    +      0 //c:c
    +      1 //b:b
    +      1 //a:a
    +      2 //b:b.cc
    +      2 //a:a.cc
    +      
    +
    +
    +      maxrank
    +
    +      0 //c:c
    +      1 //b:b
    +      2 //a:a
    +      2 //b:b.cc
    +      3 //a:a.cc
    +      
    +
    + +### Print the location of each target {:#print-target-location} + +``` +--output location +``` + +Like `label_kind`, this option prints out, for each +target in the result, the target's kind and label, but it is +prefixed by a string describing the location of that target, as a +filename and line number. The format resembles the output of +`grep`. Thus, tools that can parse the latter (such as Emacs +or vi) can also use the query output to step through a series of +matches, allowing the Bazel query tool to be used as a +dependency-graph-aware "grep for BUILD files". + +The location information varies by target kind (see the [kind](#kind) operator). For rules, the +location of the rule's declaration within the `BUILD` file is printed. +For source files, the location of line 1 of the actual file is +printed. For a generated file, the location of the rule that +generates it is printed. (The query tool does not have sufficient +information to find the actual location of the generated file, and +in any case, it might not exist if a build has not yet been performed.) + +### Print the set of packages {:#print-package-set} + +```--output package``` + +This option prints the name of all packages to which +some target in the result set belongs. The names are printed in +lexicographical order; duplicates are excluded. Formally, this +is a _projection_ from the set of labels (package, target) onto +packages. + +Packages in external repositories are formatted as +`@repo//foo/bar` while packages in the main repository are +formatted as `foo/bar`. + +In conjunction with the `deps(...)` query, this output +option can be used to find the set of packages that must be checked +out in order to build a given set of targets. + +### Display a graph of the result {:#display-result-graph} + +```--output graph``` + +This option causes the query result to be printed as a directed +graph in the popular AT&T GraphViz format. Typically the +result is saved to a file, such as `.png` or `.svg`. +(If the `dot` program is not installed on your workstation, you +can install it using the command `sudo apt-get install graphviz`.) +See the example section below for a sample invocation. + +This output format is particularly useful for `allpaths`, +`deps`, or `rdeps` queries, where the result +includes a _set of paths_ that cannot be easily visualized when +rendered in a linear form, such as with `--output label`. + +By default, the graph is rendered in a _factored_ form. That is, +topologically-equivalent nodes are merged together into a single +node with multiple labels. This makes the graph more compact +and readable, because typical result graphs contain highly +repetitive patterns. For example, a `java_library` rule +may depend on hundreds of Java source files all generated by the +same `genrule`; in the factored graph, all these files +are represented by a single node. This behavior may be disabled +with the `--nograph:factored` option. + +#### `--graph:node_limit {{ '' }}n{{ '' }}` {:#graph-nodelimit} + +The option specifies the maximum length of the label string for a +graph node in the output. Longer labels will be truncated; -1 +disables truncation. Due to the factored form in which graphs are +usually printed, the node labels may be very long. GraphViz cannot +handle labels exceeding 1024 characters, which is the default value +of this option. This option has no effect unless +`--output=graph` is being used. + +#### `--[no]graph:factored` {:#graph-factored} + +By default, graphs are displayed in factored form, as explained +[above](#output-graph). +When `--nograph:factored` is specified, graphs are +printed without factoring. This makes visualization using GraphViz +impractical, but the simpler format may ease processing by other +tools (such as grep). This option has no effect +unless `--output=graph` is being used. + +### XML {:#xml} + +```--output xml``` + +This option causes the resulting targets to be printed in an XML +form. The output starts with an XML header such as this + +``` + + +``` + + + +and then continues with an XML element for each target +in the result graph, in topological order (unless +[unordered results](#result-order) are requested), +and then finishes with a terminating + +``` + +``` + +Simple entries are emitted for targets of `file` kind: + +``` + + +``` + +But for rules, the XML is structured and contains definitions of all +the attributes of the rule, including those whose value was not +explicitly specified in the rule's `BUILD` file. + +Additionally, the result includes `rule-input` and +`rule-output` elements so that the topology of the +dependency graph can be reconstructed without having to know that, +for example, the elements of the `srcs` attribute are +forward dependencies (prerequisites) and the contents of the +`outs` attribute are backward dependencies (consumers). + +`rule-input` elements for [implicit dependencies](#implicit_deps) are suppressed if +`--noimplicit_deps` is specified. + +``` + + + + + + + ... + + + + + + + + + + + + ... + +``` + +Every XML element for a target contains a `name` +attribute, whose value is the target's label, and +a `location` attribute, whose value is the target's +location as printed by the [`--output location`](#print-target-location). + +#### `--[no]xml:line_numbers` {:#xml-linenumbers} + +By default, the locations displayed in the XML output contain line numbers. +When `--noxml:line_numbers` is specified, line numbers are not printed. + +#### `--[no]xml:default_values` {:#xml-defaultvalues} + +By default, XML output does not include rule attribute whose value +is the default value for that kind of attribute (for example, if it +were not specified in the `BUILD` file, or the default value was +provided explicitly). This option causes such attribute values to +be included in the XML output. + +### Regular expressions {:#regular-expressions} + +Regular expressions in the query language use the Java regex library, so you can use the +full syntax for +[`java.util.regex.Pattern`](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html){: .external}. + +### Querying with external repositories {:#querying-external-repositories} + +If the build depends on rules from [external repositories](/external/overview) +then query results will include these dependencies. For +example, if `//foo:bar` depends on `@other-repo//baz:lib`, then +`bazel query 'deps(//foo:bar)'` will list `@other-repo//baz:lib` as a +dependency. diff --git a/query/quickstart.mdx b/query/quickstart.mdx index 2e95dc941..eebcec986 100644 --- a/query/quickstart.mdx +++ b/query/quickstart.mdx @@ -2,8 +2,6 @@ title: 'Query quickstart' --- - - This tutorial covers how to work with Bazel to trace dependencies in your code using a premade Bazel project. For language and `--output` flag details, see the [Bazel query reference](/query/language) and [Bazel cquery reference](/query/cquery) manuals. Get help in your IDE by typing `bazel help query` or `bazel help cquery` on the command line. @@ -12,7 +10,6 @@ For language and `--output` flag details, see the [Bazel query reference](/query This guide runs you through a set of basic queries you can use to learn more about your project's file dependencies. It is intended for new Bazel developers with a basic knowledge of how Bazel and `BUILD` files work. - ## Prerequisites Start by installing [Bazel](https://bazel.build/install), if you haven’t already. This tutorial uses Git for source control, so for best results, install [Git](https://github.com/git-guides/install-git) as well. @@ -259,13 +256,9 @@ This query returns all of the targets in the 'customers' package that have a tag Use this query to learn what Jenny wants to order. -
    - -

    Answer

    -

    Mac and Cheese

    -
    -
    - + + Mac and Cheese + ## Adding a new dependency @@ -306,7 +299,6 @@ public class Smoothie { } ``` - Lastly, add these files as rules in the appropriate `BUILD` files. Create a new java library for each new ingredient, including its name, public visibility, and its newly created 'src' file. You should wind up with this updated `BUILD` file: **`src/main/java/com/example/ingredients/BUILD`** @@ -421,7 +413,6 @@ Build `cafe` again to confirm that there are no errors. If it builds successfull Now, visualize the new dependency graph with the addition of the `Smoothie` to compare with the previous one. For clarity, name the graph input as `graph2.in` and `graph2.png`. - ```posix-terminal bazel query --noimplicit_deps 'deps(:runner)' --output graph > graph2.in ``` @@ -492,24 +483,17 @@ bazel-bin/src/main/java/com/example/reviews/review Going off Bazel queries only, try to find out who wrote the review, and what dish they were describing. -
    - -

    Hint

    -

    Check the tags and dependencies for useful information.

    -
    -
    - -
    - -

    Answer

    -

    This review was describing the Pizza and Amir was the reviewer. If you look at what dependencies that this rule had using

    - bazel query --noimplicit_deps 'deps(//src/main/java/com/example/reviews:review)' + + Check the tags and dependencies for useful information. + + + + This review was describing the Pizza and Amir was the reviewer. If you look at what dependencies that this rule had using + bazel query --noimplicit\_deps 'deps(//src/main/java/com/example/reviews:review)' The result of this command reveals that Amir is the reviewer! Next, since you know the reviewer is Amir, you can use the query function to seek which tag Amir has in the `BUILD` file to see what dish is there. The command bazel query 'attr(tags, "pizza", //src/main/java/com/example/customers/...)' output that Amir is the only customer that ordered a pizza and is the reviewer which gives us the answer. -

    -
    -
    + ## Wrapping up diff --git a/reference/be/be-nav.mdx b/reference/be/be-nav.mdx index fbf211d1d..cdf688c19 100644 --- a/reference/be/be-nav.mdx +++ b/reference/be/be-nav.mdx @@ -1,27 +1,30 @@ \*\*Build Encyclopedia\*\* -- [Overview](/reference/be/overview.html) -- [Concepts](#be-menu) - [Common Definitions](/reference/be/common-definitions.html) - - ["Make" variables](/reference/be/make-variables.html) -- [Rules](#be-rules) - [Functions](/reference/be/functions.html) - - [C / C++](/reference/be/c-cpp.html) - - [Java](/reference/be/java.html) - - [Objective-C](/reference/be/objective-c.html) - - [Protocol Buffer](/reference/be/protocol-buffer.html) - - [Python](/reference/be/python.html) - - [Shell](/reference/be/shell.html) - - [Extra Actions](/reference/be/extra-actions.html) - - [General](/reference/be/general.html) - - [Platforms and Toolchains](/reference/be/platforms-and-toolchains.html) - - [AppEngine](https://github.com/bazelbuild/rules_appengine) - - [Apple (Swift, iOS, macOS, tvOS, visionOS, watchOS)](https://github.com/bazelbuild/rules_apple) - - [C#](https://github.com/bazelbuild/rules_dotnet) - - [D](https://github.com/bazelbuild/rules_d) - - [Docker](https://github.com/bazelbuild/rules_docker) - - [Groovy](https://github.com/bazelbuild/rules_groovy) - - [Go](https://github.com/bazelbuild/rules_go) - - [JavaScript (Closure)](https://github.com/bazelbuild/rules_closure) - - [Jsonnet](https://github.com/bazelbuild/rules_jsonnet) - - [Packaging](/reference/be/pkg.html) - - [Rust](https://github.com/bazelbuild/rules_rust) - - [Sass](https://github.com/bazelbuild/rules_sass) - - [Scala](https://github.com/bazelbuild/rules_scala) + +* [Overview](/reference/be/overview) +* [Concepts](#be-menu) + + [Common Definitions](/reference/be/common-definitions) + + ["Make" variables](/reference/be/make-variables) +* [Rules](#be-rules) + + [Functions](/reference/be/functions) + + [C / C++](/reference/be/c-cpp) + + [Java](/reference/be/java) + + [Objective-C](/reference/be/objective-c) + + [Protocol Buffer](/reference/be/protocol-buffer) + + [Python](/reference/be/python) + + [Shell](/reference/be/shell) + + [Extra Actions](/reference/be/extra-actions) + + [General](/reference/be/general) + + [Platforms and Toolchains](/reference/be/platforms-and-toolchains) + + [AppEngine](https://github.com/bazelbuild/rules_appengine) + + [Apple (Swift, iOS, macOS, tvOS, visionOS, watchOS)](https://github.com/bazelbuild/rules_apple) + + [C#](https://github.com/bazelbuild/rules_dotnet) + + [D](https://github.com/bazelbuild/rules_d) + + [Docker](https://github.com/bazelbuild/rules_docker) + + [Groovy](https://github.com/bazelbuild/rules_groovy) + + [Go](https://github.com/bazelbuild/rules_go) + + [JavaScript (Closure)](https://github.com/bazelbuild/rules_closure) + + [Jsonnet](https://github.com/bazelbuild/rules_jsonnet) + + [Packaging](/reference/be/pkg) + + [Rust](https://github.com/bazelbuild/rules_rust) + + [Sass](https://github.com/bazelbuild/rules_sass) + + [Scala](https://github.com/bazelbuild/rules_scala) \ No newline at end of file diff --git a/reference/be/c-cpp.mdx b/reference/be/c-cpp.mdx index a6e8453d5..214f06b41 100644 --- a/reference/be/c-cpp.mdx +++ b/reference/be/c-cpp.mdx @@ -2,21 +2,19 @@ title: 'C / C++ Rules' --- - - ## Rules -- [cc\_binary](#cc_binary) -- [cc\_import](#cc_import) -- [cc\_library](#cc_library) -- [cc\_shared\_library](#cc_shared_library) -- [cc\_static\_library](#cc_static_library) -- [cc\_test](#cc_test) -- [cc\_toolchain](#cc_toolchain) -- [fdo\_prefetch\_hints](#fdo_prefetch_hints) -- [fdo\_profile](#fdo_profile) -- [memprof\_profile](#memprof_profile) -- [propeller\_optimize](#propeller_optimize) +* [cc\_binary](#cc_binary) +* [cc\_import](#cc_import) +* [cc\_library](#cc_library) +* [cc\_shared\_library](#cc_shared_library) +* [cc\_static\_library](#cc_static_library) +* [cc\_test](#cc_test) +* [cc\_toolchain](#cc_toolchain) +* [fdo\_prefetch\_hints](#fdo_prefetch_hints) +* [fdo\_profile](#fdo_profile) +* [memprof\_profile](#memprof_profile) +* [propeller\_optimize](#propeller_optimize) ## cc\_binary @@ -28,6 +26,7 @@ cc_binary(name, deps, srcs, data, additional_compiler_inputs, additional_linker_ It produces an executable binary. + The `name` of the target should be the same as the name of the source file that is the main entry point of the application (minus the extension). For example, if your entry point is in `main.cc`, then your name should @@ -35,415 +34,43 @@ be `main`. #### Implicit output targets -- `name.stripped` (only built if explicitly requested): A stripped - version of the binary. `strip -g` is run on the binary to remove debug - symbols. Additional strip options can be provided on the command line using - `--stripopt=-foo`. -- `name.dwp` (only built if explicitly requested): If - [Fission](https://gcc.gnu.org/wiki/DebugFission) is enabled: a debug - information package file suitable for debugging remotely deployed binaries. Else: an - empty file. +* `name.stripped` (only built if explicitly requested): A stripped + version of the binary. `strip -g` is run on the binary to remove debug + symbols. Additional strip options can be provided on the command line using + `--stripopt=-foo`. +* `name.dwp` (only built if explicitly requested): If + [Fission](https://gcc.gnu.org/wiki/DebugFission) is enabled: a debug + information package file suitable for debugging remotely deployed binaries. Else: an + empty file. ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`deps` - -List of [labels](/concepts/labels); default is `[]` - - The list of other libraries to be linked in to the binary target. - -These can be `cc_library` or `objc_library` -targets. - -It is also allowed to -put linker scripts (.lds) into deps, and reference them in -[`linkopts`](#cc_binary.linkopts), -but please consider -[`additional_linker_inputs`](#cc_binary.additional_linker_inputs) -for that use case. - `srcs` - -List of [labels](/concepts/labels); default is `[]` - - The list of C and C++ files that are processed to create the library target. -These are C/C++ source and header files, either non-generated (normal source -code) or generated. - -All `.cc`, `.c`, and `.cpp` files will -be compiled. These might be generated files: if a named file is in -the `outs` of some other rule, this `cc_library` -will automatically depend on that other rule. - -Pure assembler files (.s, .asm) are not preprocessed and are typically built using -the assembler. Preprocessed assembly files (.S) are preprocessed and are typically built -using the C/C++ compiler. - -A `.h` file will not be compiled, but will be available for -inclusion by sources in this rule. Both `.cc` and -`.h` files can directly include headers listed in -these `srcs` or in the `hdrs` of this rule or any -rule listed in the `deps` argument. - -All `#include` d files must be mentioned in the -`hdrs` attribute of this or referenced `cc_library` -rules, or they should be listed in `srcs` if they are private -to this library. See ["Header inclusion checking"](#hdrs) for -a more detailed description. - -`.so`, `.lo`, and `.a` files are -pre-compiled files. Your library might have these as -`srcs` if it uses third-party code for which we don't -have source code. - -If the `srcs` attribute includes the label of another rule, -`cc_library` will use the output files of that rule as source files to -compile. This is useful for one-off generation of source code (for more than occasional -use, it's better to implement a Starlark rule class and use the `cc_common` -API) - -Permitted `srcs` file types: - -- C and C++ source files: `.c`, `.cc`, `.cpp`, - `.cxx`, `.c++`, `.C` -- C and C++ header files: `.h`, `.hh`, `.hpp`, - `.hxx`, `.inc`, `.inl`, `.H` -- Assembler with C preprocessor: `.S` -- Archive: `.a`, `.pic.a` -- "Always link" library: `.lo`, `.pic.lo` -- Shared library, versioned or unversioned: `.so`, - `.so.version` -- Object file: `.o`, `.pic.o` - -... and any rules that produce those files (e.g. `cc_embed_data`). -Different extensions denote different programming languages in -accordance with gcc convention. - -`data` - -List of [labels](/concepts/labels); default is `[]` - - The list of files needed by this library at runtime. - -See general comments about `data` -at [Typical attributes defined by\ -most build rules](/reference/be/common-definitions#typical-attributes). - -If a `data` is the name of a generated file, then this -`cc_library` rule automatically depends on the generating -rule. - -If a `data` is a rule name, then this -`cc_library` rule automatically depends on that rule, -and that rule's `outs` are automatically added to -this `cc_library`'s data files. - -Your C++ code can access these data files like so: - -```lang-starlark - - const std::string path = devtools_build::GetDataDependencyFilepath( - "my/test/data/file"); - -``` - -`additional_compiler_inputs` - -List of [labels](/concepts/labels); default is `[]` - - Any additional files you might want to pass to the compiler command line, such as sanitizer -ignorelists, for example. Files specified here can then be used in copts with the -$(location) function. - `additional_linker_inputs` - -List of [labels](/concepts/labels); default is `[]` - - Dependencies that are only made available to the C++ linker command. - -Unlike `deps`, which is conceptually made for both compilation and -linking dependencies, `additional_linker_inputs` is specifically -made for only the latter, and signals a dependency that is required only for -linking (for example, files that are referenced in `linkopts`). - -For example, compiled Windows .res files can be provided here to be embedded in -the binary target. - -`conlyopts` - -List of strings; default is `[]` - - Add these options to the C compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - `copts` - -List of strings; default is `[]` - - Add these options to the C/C++ compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - -Each string in this attribute is added in the given order to `COPTS` before -compiling the binary target. The flags take effect only for compiling this target, not -its dependencies, so be careful about header files included elsewhere. -All paths should be relative to the workspace, not to the current package. -This attribute should not be needed outside of `third_party`. - -If the package declares the [feature](/reference/be/functions.html#package.features) `no_copts_tokenization`, Bourne shell tokenization applies only to strings -that consist of a single "Make" variable. - -`cxxopts` - -List of strings; default is `[]` - - Add these options to the C++ compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - `defines` - -List of strings; default is `[]` - - List of defines to add to the compile line of this and all dependent targets. -Subject to ["Make" variable](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). -Each string, which must consist of a single Bourne shell token, -is prepended with `-D` and added to the compile command line to this target, -as well as to every rule that depends on it. Be very careful, since this may have -far-reaching effects -- the defines are added to every target that depends on -this target. When in doubt, add define values to -[`local_defines`](#cc_binary.local_defines) instead. - `dynamic_deps` - -List of [labels](/concepts/labels); default is `[]` - - These are other `cc_shared_library` dependencies the current target depends on. - -The `cc_shared_library` implementation will use the list of -`dynamic_deps` (transitively, i.e. also the `dynamic_deps` of the -current target's `dynamic_deps`) to decide which `cc_libraries` in -the transitive `deps` should not be linked in because they are already provided -by a different `cc_shared_library`. - - -`hdrs_check` - -String; default is `""` - - Deprecated, no-op. - `includes` - -List of strings; default is `[]` - - List of include dirs to be added to the compile line. -Subject to ["Make variable"](/reference/be/make-variables) substitution. -Each string is prepended with the package path and passed to the C++ toolchain for -expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system -with typical feature definitions will produce -`-isystem path_to_package/include_entry`. -This should only be used for third-party libraries that -do not conform to the Google style of writing #include statements. -Unlike [COPTS](#cc_binary.copts), these flags are added for this rule -and every rule that depends on it. (Note: not the rules it depends upon!) Be -very careful, since this may have far-reaching effects. When in doubt, add -"-I" flags to [COPTS](#cc_binary.copts) instead. - -The added `include` paths will include generated files as well as -files in the source tree. - -`link_extra_lib` - -[Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:link_extra_lib"` - - Control linking of extra libraries. - -By default, C++ binaries are linked against `@bazel_tools//tools/cpp:link_extra_lib`, -which by default depends on the label flag `@bazel_tools//tools/cpp:link_extra_libs`. -Without setting the flag, this library is empty by default. Setting the label flag -allows linking optional dependencies, such as overrides for weak symbols, interceptors -for shared library functions, or special runtime libraries (for malloc replacements, -prefer `malloc` or `--custom_malloc`). Setting this attribute to -`None` disables this behaviour. - -`linkopts` - -List of strings; default is `[]` - - Add these flags to the C++ linker command. -Subject to ["Make" variable](make-variables.html) substitution, -[Bourne shell tokenization](common-definitions.html#sh-tokenization) and -[label expansion](common-definitions.html#label-expansion). -Each string in this attribute is added to `LINKOPTS` before -linking the binary target. - -Each element of this list that does not start with `$` or `-` is -assumed to be the label of a target in `deps`. The -list of files generated by that target is appended to the linker -options. An error is reported if the label is invalid, or is -not declared in `deps`. - -`linkshared` - -Boolean; default is `False` - - Create a shared library. -To enable this attribute, include `linkshared=True` in your rule. By default -this option is off. - -The presence of this flag means that linking occurs with the `-shared` flag -to `gcc`, and the resulting shared library is suitable for loading into for -example a Java program. However, for build purposes it will never be linked into the -dependent binary, as it is assumed that shared libraries built with a -[cc\_binary](#cc_binary) rule are only loaded manually by other programs, so -it should not be considered a substitute for the [cc\_library](#cc_library) -rule. For sake of scalability we recommend avoiding this approach altogether and -simply letting `java_library` depend on `cc_library` rules -instead. - -If you specify both `linkopts=['-static']` and `linkshared=True`, -you get a single completely self-contained unit. If you specify both -`linkstatic=True` and `linkshared=True`, you get a single, mostly -self-contained unit. - -`linkstatic` - -Boolean; default is `True` - - For [`cc_binary`](/reference/be/c-cpp.html#cc_binary) and -[`cc_test`](/reference/be/c-cpp.html#cc_test): link the binary in static -mode. For `cc_library.link_static`: see below. - -By default this option is on for `cc_binary` and off for the rest. - -If enabled and this is a binary or test, this option tells the build tool to link in -`.a`'s instead of `.so`'s for user libraries whenever possible. -System libraries such as libc (but _not_ the C/C++ runtime libraries, -see below) are still linked dynamically, as are libraries for which -there is no static library. So the resulting executable will still be dynamically -linked, hence only _mostly_ static. - -There are really three different ways to link an executable: - -- STATIC with fully\_static\_link feature, in which everything is linked statically; - e.g. " `gcc -static foo.o libbar.a libbaz.a -lm`". - - - This mode is enabled by specifying `fully_static_link` in the - [`features`](/reference/be/common-definitions#features) attribute. -- STATIC, in which all user libraries are linked statically (if a static - version is available), but where system libraries (excluding C/C++ runtime libraries) - are linked dynamically, e.g. " `gcc foo.o libfoo.a libbaz.a -lm`". - - - This mode is enabled by specifying `linkstatic=True`. -- DYNAMIC, in which all libraries are linked dynamically (if a dynamic version is - available), e.g. " `gcc foo.o libfoo.so libbaz.so -lm`". - - - This mode is enabled by specifying `linkstatic=False`. - -If the `linkstatic` attribute or `fully_static_link` in -`features` is used outside of `//third_party` -please include a comment near the rule to explain why. - -The `linkstatic` attribute has a different meaning if used on a -[`cc_library()`](/reference/be/c-cpp.html#cc_library) rule. -For a C++ library, `linkstatic=True` indicates that only -static linking is allowed, so no `.so` will be produced. linkstatic=False does -not prevent static libraries from being created. The attribute is meant to control the -creation of dynamic libraries. - -There should be very little code built with `linkstatic=False` in production. -If `linkstatic=False`, then the build tool will create symlinks to -depended-upon shared libraries in the `*.runfiles` area. - -`local_defines` - -List of strings; default is `[]` - - List of defines to add to the compile line. -Subject to ["Make" variable](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). -Each string, which must consist of a single Bourne shell token, -is prepended with `-D` and added to the compile command line for this target, -but not to its dependents. Unlike `defines`, the defines are only added to the -compile command line for this target. - `malloc` - -[Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:malloc"` - - Override the default dependency on malloc. - -By default, C++ binaries are linked against `//tools/cpp:malloc`, -which is an empty library so the binary ends up using libc malloc. -This label must refer to a `cc_library`. If compilation is for a non-C++ -rule, this option has no effect. The value of this attribute is ignored if -`linkshared=True` is specified. - -`module_interfaces` - -List of [labels](/concepts/labels); default is `[]` - - The list of files are regarded as C++20 Modules Interface. - -C++ Standard has no restriction about module interface file extension - -- Clang use cppm -- GCC can use any source file extension -- MSVC use ixx - -The use is guarded by the flag -`--experimental_cpp_modules`. - -`nocopts` - -String; default is `""` - - Remove matching options from the C++ compilation command. -Subject to ["Make" variable](/reference/be/make-variables) substitution. -The value of this attribute is interpreted as a regular expression. -Any preexisting `COPTS` that match this regular expression -(including values explicitly specified in the rule's [copts](#cc_binary.copts) attribute) -will be removed from `COPTS` for purposes of compiling this rule. -This attribute should not be needed or used -outside of `third_party`. The values are not preprocessed -in any way other than the "Make" variable substitution. - `reexport_deps` - -List of [labels](/concepts/labels); default is `[]` - -`stamp` - -Integer; default is `-1` - - Whether to encode build information into the binary. Possible values: - -- `stamp = 1`: Always stamp the build information into the binary, even in - [`--nostamp`](/docs/user-manual#flag--stamp) builds. **This** - **setting should be avoided**, since it potentially kills remote caching for the - binary and any downstream actions that depend on it. - -- `stamp = 0`: Always replace build information by constant values. This - gives good build result caching. - -- `stamp = -1`: Embedding of build information is controlled by the - [`--[no]stamp`](/docs/user-manual#flag--stamp) flag. - - -Stamped binaries are _not_ rebuilt unless their dependencies change. - -`win_def_file` - -[Label](/concepts/labels); default is `None` - - The Windows DEF file to be passed to linker. - -This attribute should only be used when Windows is the target platform. -It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `deps` | List of [labels](/concepts/labels); default is `[]` The list of other libraries to be linked in to the binary target. These can be `cc_library` or `objc_library` targets. It is also allowed to put linker scripts (.lds) into deps, and reference them in [`linkopts`](#cc_binary.linkopts), but please consider [`additional_linker_inputs`](#cc_binary.additional_linker_inputs) for that use case. | +| `srcs` | List of [labels](/concepts/labels); default is `[]` The list of C and C++ files that are processed to create the library target. These are C/C++ source and header files, either non-generated (normal source code) or generated. All `.cc`, `.c`, and `.cpp` files will be compiled. These might be generated files: if a named file is in the `outs` of some other rule, this `cc_library` will automatically depend on that other rule. Pure assembler files (.s, .asm) are not preprocessed and are typically built using the assembler. Preprocessed assembly files (.S) are preprocessed and are typically built using the C/C++ compiler. A `.h` file will not be compiled, but will be available for inclusion by sources in this rule. Both `.cc` and `.h` files can directly include headers listed in these `srcs` or in the `hdrs` of this rule or any rule listed in the `deps` argument. All `#include`d files must be mentioned in the `hdrs` attribute of this or referenced `cc_library` rules, or they should be listed in `srcs` if they are private to this library. See ["Header inclusion checking"](#hdrs) for a more detailed description. `.so`, `.lo`, and `.a` files are pre-compiled files. Your library might have these as `srcs` if it uses third-party code for which we don't have source code. If the `srcs` attribute includes the label of another rule, `cc_library` will use the output files of that rule as source files to compile. This is useful for one-off generation of source code (for more than occasional use, it's better to implement a Starlark rule class and use the `cc_common` API) Permitted `srcs` file types: * C and C++ source files: `.c`, `.cc`, `.cpp`, `.cxx`, `.c++`, `.C` * C and C++ header files: `.h`, `.hh`, `.hpp`, `.hxx`, `.inc`, `.inl`, `.H` * Assembler with C preprocessor: `.S` * Archive: `.a`, `.pic.a` * "Always link" library: `.lo`, `.pic.lo` * Shared library, versioned or unversioned: `.so`, `.so.version` * Object file: `.o`, `.pic.o` ... and any rules that produce those files (e.g. `cc_embed_data`). Different extensions denote different programming languages in accordance with gcc convention. | +| `data` | List of [labels](/concepts/labels); default is `[]` The list of files needed by this library at runtime. See general comments about `data` at [Typical attributes defined by most build rules](/reference/be/common-definitions#typical-attributes). If a `data` is the name of a generated file, then this `cc_library` rule automatically depends on the generating rule. If a `data` is a rule name, then this `cc_library` rule automatically depends on that rule, and that rule's `outs` are automatically added to this `cc_library`'s data files. Your C++ code can access these data files like so: ``` const std::string path = devtools_build::GetDataDependencyFilepath( "my/test/data/file"); ``` | +| `additional_compiler_inputs` | List of [labels](/concepts/labels); default is `[]` Any additional files you might want to pass to the compiler command line, such as sanitizer ignorelists, for example. Files specified here can then be used in copts with the $(location) function. | +| `additional_linker_inputs` | List of [labels](/concepts/labels); default is `[]` Dependencies that are only made available to the C++ linker command. Unlike `deps`, which is conceptually made for both compilation and linking dependencies, `additional_linker_inputs` is specifically made for only the latter, and signals a dependency that is required only for linking (for example, files that are referenced in `linkopts`). For example, compiled Windows .res files can be provided here to be embedded in the binary target. | +| `conlyopts` | List of strings; default is `[]` Add these options to the C compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). | +| `copts` | List of strings; default is `[]` Add these options to the C/C++ compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string in this attribute is added in the given order to `COPTS` before compiling the binary target. The flags take effect only for compiling this target, not its dependencies, so be careful about header files included elsewhere. All paths should be relative to the workspace, not to the current package. This attribute should not be needed outside of `third_party`. If the package declares the [feature](/reference/be/functions#package.features) `no_copts_tokenization`, Bourne shell tokenization applies only to strings that consist of a single "Make" variable. | +| `cxxopts` | List of strings; default is `[]` Add these options to the C++ compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). | +| `defines` | List of strings; default is `[]` List of defines to add to the compile line of this and all dependent targets. Subject to ["Make" variable](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string, which must consist of a single Bourne shell token, is prepended with `-D` and added to the compile command line to this target, as well as to every rule that depends on it. Be very careful, since this may have far-reaching effects -- the defines are added to every target that depends on this target. When in doubt, add define values to [`local_defines`](#cc_binary.local_defines) instead. | +| `dynamic_deps` | List of [labels](/concepts/labels); default is `[]` These are other `cc_shared_library` dependencies the current target depends on. The `cc_shared_library` implementation will use the list of `dynamic_deps` (transitively, i.e. also the `dynamic_deps` of the current target's `dynamic_deps`) to decide which `cc_libraries` in the transitive `deps` should not be linked in because they are already provided by a different `cc_shared_library`. | +| `hdrs_check` | String; default is `""` Deprecated, no-op. | +| `includes` | List of strings; default is `[]` List of include dirs to be added to the compile line. Subject to ["Make variable"](/reference/be/make-variables) substitution. Each string is prepended with the package path and passed to the C++ toolchain for expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system with typical feature definitions will produce `-isystem path_to_package/include_entry`. This should only be used for third-party libraries that do not conform to the Google style of writing #include statements. Unlike [COPTS](#cc_binary.copts), these flags are added for this rule and every rule that depends on it. (Note: not the rules it depends upon!) Be very careful, since this may have far-reaching effects. When in doubt, add "-I" flags to [COPTS](#cc_binary.copts) instead. The added `include` paths will include generated files as well as files in the source tree. | +| `link_extra_lib` | [Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:link_extra_lib"` Control linking of extra libraries. By default, C++ binaries are linked against `@bazel_tools//tools/cpp:link_extra_lib`, which by default depends on the label flag `@bazel_tools//tools/cpp:link_extra_libs`. Without setting the flag, this library is empty by default. Setting the label flag allows linking optional dependencies, such as overrides for weak symbols, interceptors for shared library functions, or special runtime libraries (for malloc replacements, prefer `malloc` or `--custom_malloc`). Setting this attribute to `None` disables this behaviour. | +| `linkopts` | List of strings; default is `[]` Add these flags to the C++ linker command. Subject to ["Make" variable](make-variables) substitution, [Bourne shell tokenization](common-definitions#sh-tokenization) and [label expansion](common-definitions#label-expansion). Each string in this attribute is added to `LINKOPTS` before linking the binary target. Each element of this list that does not start with `$` or `-` is assumed to be the label of a target in `deps`. The list of files generated by that target is appended to the linker options. An error is reported if the label is invalid, or is not declared in `deps`. | +| `linkshared` | Boolean; default is `False` Create a shared library. To enable this attribute, include `linkshared=True` in your rule. By default this option is off. The presence of this flag means that linking occurs with the `-shared` flag to `gcc`, and the resulting shared library is suitable for loading into for example a Java program. However, for build purposes it will never be linked into the dependent binary, as it is assumed that shared libraries built with a [cc\_binary](#cc_binary) rule are only loaded manually by other programs, so it should not be considered a substitute for the [cc\_library](#cc_library) rule. For sake of scalability we recommend avoiding this approach altogether and simply letting `java_library` depend on `cc_library` rules instead. If you specify both `linkopts=['-static']` and `linkshared=True`, you get a single completely self-contained unit. If you specify both `linkstatic=True` and `linkshared=True`, you get a single, mostly self-contained unit. | +| `linkstatic` | Boolean; default is `True` For [`cc_binary`](/reference/be/c-cpp#cc_binary) and [`cc_test`](/reference/be/c-cpp#cc_test): link the binary in static mode. For `cc_library.link_static`: see below. By default this option is on for `cc_binary` and off for the rest. If enabled and this is a binary or test, this option tells the build tool to link in `.a`'s instead of `.so`'s for user libraries whenever possible. System libraries such as libc (but *not* the C/C++ runtime libraries, see below) are still linked dynamically, as are libraries for which there is no static library. So the resulting executable will still be dynamically linked, hence only *mostly* static. There are really three different ways to link an executable: * STATIC with fully\_static\_link feature, in which everything is linked statically; e.g. "`gcc -static foo.o libbar.a libbaz.a -lm`". This mode is enabled by specifying `fully_static_link` in the [`features`](/reference/be/common-definitions#features) attribute. * STATIC, in which all user libraries are linked statically (if a static version is available), but where system libraries (excluding C/C++ runtime libraries) are linked dynamically, e.g. "`gcc foo.o libfoo.a libbaz.a -lm`". This mode is enabled by specifying `linkstatic=True`. * DYNAMIC, in which all libraries are linked dynamically (if a dynamic version is available), e.g. "`gcc foo.o libfoo.so libbaz.so -lm`". This mode is enabled by specifying `linkstatic=False`. If the `linkstatic` attribute or `fully_static_link` in `features` is used outside of `//third_party` please include a comment near the rule to explain why. The `linkstatic` attribute has a different meaning if used on a [`cc_library()`](/reference/be/c-cpp#cc_library) rule. For a C++ library, `linkstatic=True` indicates that only static linking is allowed, so no `.so` will be produced. linkstatic=False does not prevent static libraries from being created. The attribute is meant to control the creation of dynamic libraries. There should be very little code built with `linkstatic=False` in production. If `linkstatic=False`, then the build tool will create symlinks to depended-upon shared libraries in the `*.runfiles` area. | +| `local_defines` | List of strings; default is `[]` List of defines to add to the compile line. Subject to ["Make" variable](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string, which must consist of a single Bourne shell token, is prepended with `-D` and added to the compile command line for this target, but not to its dependents. Unlike `defines`, the defines are only added to the compile command line for this target. | +| `malloc` | [Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:malloc"` Override the default dependency on malloc. By default, C++ binaries are linked against `//tools/cpp:malloc`, which is an empty library so the binary ends up using libc malloc. This label must refer to a `cc_library`. If compilation is for a non-C++ rule, this option has no effect. The value of this attribute is ignored if `linkshared=True` is specified. | +| `module_interfaces` | List of [labels](/concepts/labels); default is `[]` The list of files are regarded as C++20 Modules Interface. C++ Standard has no restriction about module interface file extension * Clang use cppm * GCC can use any source file extension * MSVC use ixx The use is guarded by the flag `--experimental_cpp_modules`. | +| `nocopts` | String; default is `""` Remove matching options from the C++ compilation command. Subject to ["Make" variable](/reference/be/make-variables) substitution. The value of this attribute is interpreted as a regular expression. Any preexisting `COPTS` that match this regular expression (including values explicitly specified in the rule's [copts](#cc_binary.copts) attribute) will be removed from `COPTS` for purposes of compiling this rule. This attribute should not be needed or used outside of `third_party`. The values are not preprocessed in any way other than the "Make" variable substitution. | +| `reexport_deps` | List of [labels](/concepts/labels); default is `[]` | +| `stamp` | Integer; default is `-1` Whether to encode build information into the binary. Possible values: * `stamp = 1`: Always stamp the build information into the binary, even in [`--nostamp`](/docs/user-manual#flag--stamp) builds. **This setting should be avoided**, since it potentially kills remote caching for the binary and any downstream actions that depend on it. * `stamp = 0`: Always replace build information by constant values. This gives good build result caching. * `stamp = -1`: Embedding of build information is controlled by the [`--[no]stamp`](/docs/user-manual#flag--stamp) flag. Stamped binaries are *not* rebuilt unless their dependencies change. | +| `win_def_file` | [Label](/concepts/labels); default is `None` The Windows DEF file to be passed to linker. This attribute should only be used when Windows is the target platform. It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. | ## cc\_import @@ -456,11 +83,9 @@ cc_import(name, deps, data, hdrs, alwayslink, aspect_hints, compatible_with, def `cc_import` rules allows users to import precompiled C/C++ libraries. The following are the typical use cases: +1. Linking a static library -1\. Linking a static library - -```lang-starlark - +``` cc_import( name = "mylib", hdrs = ["mylib.h"], @@ -469,27 +94,23 @@ cc_import( # libmylib.a will be forcely linked into any binary that depends on it. # alwayslink = True, ) - ``` -2\. Linking a shared library (Unix) - -```lang-starlark +2. Linking a shared library (Unix) +``` cc_import( name = "mylib", hdrs = ["mylib.h"], shared_library = "libmylib.so", ) - ``` -3\. Linking a shared library with interface library +3. Linking a shared library with interface library On Unix: -```lang-starlark - +``` cc_import( name = "mylib", hdrs = ["mylib.h"], @@ -498,13 +119,11 @@ cc_import( # libmylib.so will be available for runtime shared_library = "libmylib.so", ) - ``` On Windows: -```lang-starlark - +``` cc_import( name = "mylib", hdrs = ["mylib.h"], @@ -513,15 +132,13 @@ cc_import( # mylib.dll will be available for runtime shared_library = "mylib.dll", ) - ``` -4\. Linking a shared library with `system_provided=True` +4. Linking a shared library with `system_provided=True` On Unix: -```lang-starlark - +``` cc_import( name = "mylib", hdrs = ["mylib.h"], @@ -530,13 +147,11 @@ cc_import( # This indicates that Bazel is not responsible for making libmylib.so available. system_provided = True, ) - ``` On Windows: -```lang-starlark - +``` cc_import( name = "mylib", hdrs = ["mylib.h"], @@ -546,28 +161,24 @@ cc_import( # This indicates that Bazel is not responsible for making mylib.dll available. system_provided = True, ) - ``` -5\. Linking to static or shared library +5. Linking to static or shared library On Unix: -```lang-starlark - +``` cc_import( name = "mylib", hdrs = ["mylib.h"], static_library = "libmylib.a", shared_library = "libmylib.so", ) - ``` On Windows: -```lang-starlark - +``` cc_import( name = "mylib", hdrs = ["mylib.h"], @@ -575,13 +186,11 @@ cc_import( interface_library = "mylib.lib", # An import library for mylib.dll shared_library = "mylib.dll", ) - ``` The remaining is the same on Unix and Windows: -```lang-starlark - +``` # first will link to libmylib.a (or libmylib.lib) cc_binary( name = "first", @@ -597,183 +206,38 @@ cc_binary( deps = [":mylib"], linkstatic = False, ) - ``` `cc_import` supports an include attribute. For example: -```lang-starlark - +``` cc_import( name = "curl_lib", hdrs = glob(["vendor/curl/include/curl/*.h"]), includes = ["vendor/curl/include"], shared_library = "vendor/curl/lib/.libs/libcurl.dylib", ) - ``` ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`deps` - -List of [labels](/concepts/labels); default is `[]` - - The list of other libraries that the target depends upon. -See general comments about `deps` -at [Typical attributes defined by\ -most build rules](/reference/be/common-definitions#typical-attributes). - `hdrs` - -List of [labels](/concepts/labels); default is `[]` - - The list of header files published by -this precompiled library to be directly included by sources in dependent rules. - `alwayslink` - -Boolean; default is `False` - - If enabled, any binary that depends (directly or indirectly) on this C++ -precompiled library will link in all the object files archived in the static library, -even if some contain no symbols referenced by the binary. -This is useful if your code isn't explicitly called by code in -the binary, e.g., if your code registers to receive some callback -provided by some service. - -If `alwayslink` doesn't work with VS 2017 on Windows, that is due to a -[known issue](https://github.com/bazelbuild/bazel/issues/3949), -please upgrade your VS 2017 to the latest version. - -`defines` - -List of strings; default is `[]` - - List of defines to add to the compile line of this and all dependent targets. -Subject to ["Make" variable](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). -Each string, which must consist of a single Bourne shell token, -is prepended with `-D` and added to the compile command line to this target, -as well as to every rule that depends on it. Be very careful, since this may have -far-reaching effects -- the defines are added to every target that depends on -this target. - `includes` - -List of strings; default is `[]` - - List of include dirs to be added to the compile line. -Subject to ["Make variable"](/reference/be/make-variables) substitution. -Each string is prepended with the package path and passed to the C++ toolchain for -expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system -with typical feature definitions will produce -`-isystem path_to_package/include_entry`. -This should only be used for third-party libraries that -do not conform to the Google style of writing #include statements. -Unlike [COPTS](#cc_binary.copts), these flags are added for this rule -and every rule that depends on it. (Note: not the rules it depends upon!) Be -very careful, since this may have far-reaching effects. When in doubt, add -"-I" flags to [COPTS](#cc_binary.copts) instead. - -The default `include` path doesn't include generated -files. If you need to `#include` a generated header -file, list it in the `srcs`. - -`interface_library` - -[Label](/concepts/labels); default is `None` - - A single interface library for linking the shared library. - -Permitted file types: -`.ifso`, -`.tbd`, -`.lib`, -`.so` -or `.dylib` - -`linkopts` - -List of strings; default is `[]` - - Add these flags to the C++ linker command. -Subject to ["Make" variable](make-variables.html) substitution, -[Bourne shell tokenization](common-definitions.html#sh-tokenization) and -[label expansion](common-definitions.html#label-expansion). -Each string in this attribute is added to `LINKOPTS` before -linking the binary target. - -Each element of this list that does not start with `$` or `-` is -assumed to be the label of a target in `deps`. The -list of files generated by that target is appended to the linker -options. An error is reported if the label is invalid, or is -not declared in `deps`. - -`objects` - -List of [labels](/concepts/labels); default is `[]` - -`pic_objects` - -List of [labels](/concepts/labels); default is `[]` - -`pic_static_library` - -[Label](/concepts/labels); default is `None` - -`shared_library` - -[Label](/concepts/labels); default is `None` - - A single precompiled shared library. Bazel ensures it is available to the -binary that depends on it during runtime. - -Permitted file types: -`.so`, -`.dll` `.dylib`, -or `.pyd` - -`static_library` - -[Label](/concepts/labels); default is `None` - - A single precompiled static library. - -Permitted file types: -`.a`, -`.pic.a` -or `.lib` - -`strip_include_prefix` - -String; default is `""` - - The prefix to strip from the paths of the headers of this rule. - -When set, the headers in the `hdrs` attribute of this rule are accessible -at their path with this prefix cut off. - -If it's a relative path, it's taken as a package-relative one. If it's an absolute one, -it's understood as a repository-relative path. - -The prefix in the `include_prefix` attribute is added after this prefix is -stripped. - -This attribute is only legal under `third_party`. - - -`system_provided` - -Boolean; default is `False` - - If enabled, it indicates the shared library required at runtime is provided by the system. In -this case, `interface_library` should be specified and -`shared_library` should be empty. - +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `deps` | List of [labels](/concepts/labels); default is `[]` The list of other libraries that the target depends upon. See general comments about `deps` at [Typical attributes defined by most build rules](/reference/be/common-definitions#typical-attributes). | +| `hdrs` | List of [labels](/concepts/labels); default is `[]` The list of header files published by this precompiled library to be directly included by sources in dependent rules. | +| `alwayslink` | Boolean; default is `False` If enabled, any binary that depends (directly or indirectly) on this C++ precompiled library will link in all the object files archived in the static library, even if some contain no symbols referenced by the binary. This is useful if your code isn't explicitly called by code in the binary, e.g., if your code registers to receive some callback provided by some service. If `alwayslink` doesn't work with VS 2017 on Windows, that is due to a [known issue](https://github.com/bazelbuild/bazel/issues/3949), please upgrade your VS 2017 to the latest version. | +| `defines` | List of strings; default is `[]` List of defines to add to the compile line of this and all dependent targets. Subject to ["Make" variable](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string, which must consist of a single Bourne shell token, is prepended with `-D` and added to the compile command line to this target, as well as to every rule that depends on it. Be very careful, since this may have far-reaching effects -- the defines are added to every target that depends on this target. | +| `includes` | List of strings; default is `[]` List of include dirs to be added to the compile line. Subject to ["Make variable"](/reference/be/make-variables) substitution. Each string is prepended with the package path and passed to the C++ toolchain for expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system with typical feature definitions will produce `-isystem path_to_package/include_entry`. This should only be used for third-party libraries that do not conform to the Google style of writing #include statements. Unlike [COPTS](#cc_binary.copts), these flags are added for this rule and every rule that depends on it. (Note: not the rules it depends upon!) Be very careful, since this may have far-reaching effects. When in doubt, add "-I" flags to [COPTS](#cc_binary.copts) instead. The default `include` path doesn't include generated files. If you need to `#include` a generated header file, list it in the `srcs`. | +| `interface_library` | [Label](/concepts/labels); default is `None` A single interface library for linking the shared library. Permitted file types: `.ifso`, `.tbd`, `.lib`, `.so` or `.dylib` | +| `linkopts` | List of strings; default is `[]` Add these flags to the C++ linker command. Subject to ["Make" variable](make-variables) substitution, [Bourne shell tokenization](common-definitions#sh-tokenization) and [label expansion](common-definitions#label-expansion). Each string in this attribute is added to `LINKOPTS` before linking the binary target. Each element of this list that does not start with `$` or `-` is assumed to be the label of a target in `deps`. The list of files generated by that target is appended to the linker options. An error is reported if the label is invalid, or is not declared in `deps`. | +| `objects` | List of [labels](/concepts/labels); default is `[]` | +| `pic_objects` | List of [labels](/concepts/labels); default is `[]` | +| `pic_static_library` | [Label](/concepts/labels); default is `None` | +| `shared_library` | [Label](/concepts/labels); default is `None` A single precompiled shared library. Bazel ensures it is available to the binary that depends on it during runtime. Permitted file types: `.so`, `.dll` `.dylib`, or `.pyd` | +| `static_library` | [Label](/concepts/labels); default is `None` A single precompiled static library. Permitted file types: `.a`, `.pic.a` or `.lib` | +| `strip_include_prefix` | String; default is `""` The prefix to strip from the paths of the headers of this rule. When set, the headers in the `hdrs` attribute of this rule are accessible at their path with this prefix cut off. If it's a relative path, it's taken as a package-relative one. If it's an absolute one, it's understood as a repository-relative path. The prefix in the `include_prefix` attribute is added after this prefix is stripped. This attribute is only legal under `third_party`. | +| `system_provided` | Boolean; default is `False` If enabled, it indicates the shared library required at runtime is provided by the system. In this case, `interface_library` should be specified and `shared_library` should be empty. | ## cc\_library @@ -793,7 +257,7 @@ is the `.a` file. If you specify `alwayslink=True`, you get the `.lo` file. The actual output file name is `libfoo.so` for -the shared library, where _foo_ is the name of the rule. The +the shared library, where *foo* is the name of the rule. The other kinds of libraries end with `.lo` and `.a`, respectively. If you need a specific shared library name, for example, to define a Python module, use a genrule to copy the library @@ -824,8 +288,7 @@ the `srcs`. To illustrate these rules, look at the following example. -```lang-starlark - +``` cc_binary( name = "foo", srcs = [ @@ -853,16 +316,24 @@ cc_library( ], hdrs = ["baz.h"], ) - ``` The allowed direct inclusions in this example are listed in the table below. For example `foo.cc` is allowed to directly include `foo.h` and `bar.h`, but not `baz.h`. -Including fileAllowed inclusionsfoo.hbar.hfoo.ccfoo.h bar.hbar.hbar-impl.h baz.hbar-impl.hbar.h baz.hbar.ccbar.h bar-impl.h baz.hbaz.hbaz-impl.hbaz-impl.hbaz.hbaz.ccbaz.h baz-impl.h - -The inclusion checking rules only apply to _direct_ +| Including file | Allowed inclusions | +| --- | --- | +| foo.h | bar.h | +| foo.cc | foo.h bar.h | +| bar.h | bar-impl.h baz.h | +| bar-impl.h | bar.h baz.h | +| bar.cc | bar.h bar-impl.h baz.h | +| baz.h | baz-impl.h | +| baz-impl.h | baz.h | +| baz.cc | baz.h baz-impl.h | + +The inclusion checking rules only apply to *direct* inclusions. In the example above `foo.cc` is allowed to include `bar.h`, which may include `baz.h`, which in turn is allowed to include `baz-impl.h`. Technically, the @@ -880,7 +351,7 @@ The `layering_check` feature has to be supported by the toolchain and requested explicitly, for example via the `--features=layering_check` command-line flag or the `features` parameter of the -[`package`](/reference/be/functions.html#package) function. The toolchains +[`package`](/reference/be/functions#package) function. The toolchains provided by Bazel only support this feature with clang on Unix and macOS. #### Examples @@ -888,8 +359,7 @@ provided by Bazel only support this feature with clang on Unix and macOS. We use the `alwayslink` flag to force the linker to link in this code although the main binary code doesn't reference it. -```lang-starlark - +``` cc_library( name = "ast_inspector_lib", srcs = ["ast_inspector_lib.cc"], @@ -900,7 +370,6 @@ cc_library( # debug time, even if they aren't used anywhere in the code. alwayslink = True, ) - ``` The following example comes from @@ -910,8 +379,7 @@ another, dynamic library), so this rule specifies the `-ldl` link option to link the `dl` library. -```lang-starlark - +``` cc_library( name = "python2_4_3", linkopts = [ @@ -920,15 +388,13 @@ cc_library( ], deps = ["//third_party/expat"], ) - ``` The following example comes from `third_party/kde/BUILD`. We keep pre-built `.so` files in the depot. The header files live in a subdirectory named `include`. -```lang-starlark - +``` cc_library( name = "kde", srcs = [ @@ -941,15 +407,13 @@ cc_library( includes = ["include"], deps = ["//third_party/X11"], ) - ``` The following example comes from `third_party/gles/BUILD`. Third-party code often needs some `defines` and `linkopts`. -```lang-starlark - +``` cc_library( name = "gles", srcs = [ @@ -969,451 +433,68 @@ cc_library( "//third_party/X11", ], ) - ``` ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`deps` - -List of [labels](/concepts/labels); default is `[]` - - The list of other libraries that the library target depends upon. - -These can be `cc_library` or `objc_library` targets. - -See general comments about `deps` -at [Typical attributes defined by\ -most build rules](/reference/be/common-definitions#typical-attributes). - -These should be names of C++ library rules. -When you build a binary that links this rule's library, -you will also link the libraries in `deps`. - -Despite the "deps" name, not all of this library's clients -belong here. Run-time data dependencies belong in `data`. -Source files generated by other rules belong in `srcs`. +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `deps` | List of [labels](/concepts/labels); default is `[]` The list of other libraries that the library target depends upon. These can be `cc_library` or `objc_library` targets. See general comments about `deps` at [Typical attributes defined by most build rules](/reference/be/common-definitions#typical-attributes). These should be names of C++ library rules. When you build a binary that links this rule's library, you will also link the libraries in `deps`. Despite the "deps" name, not all of this library's clients belong here. Run-time data dependencies belong in `data`. Source files generated by other rules belong in `srcs`. To link in a pre-compiled third-party library, add its name to the `srcs` instead. To depend on something without linking it to this library, add its name to the `data` instead. | +| `srcs` | List of [labels](/concepts/labels); default is `[]` The list of C and C++ files that are processed to create the library target. These are C/C++ source and header files, either non-generated (normal source code) or generated. All `.cc`, `.c`, and `.cpp` files will be compiled. These might be generated files: if a named file is in the `outs` of some other rule, this `cc_library` will automatically depend on that other rule. Pure assembler files (.s, .asm) are not preprocessed and are typically built using the assembler. Preprocessed assembly files (.S) are preprocessed and are typically built using the C/C++ compiler. A `.h` file will not be compiled, but will be available for inclusion by sources in this rule. Both `.cc` and `.h` files can directly include headers listed in these `srcs` or in the `hdrs` of this rule or any rule listed in the `deps` argument. All `#include`d files must be mentioned in the `hdrs` attribute of this or referenced `cc_library` rules, or they should be listed in `srcs` if they are private to this library. See ["Header inclusion checking"](#hdrs) for a more detailed description. `.so`, `.lo`, and `.a` files are pre-compiled files. Your library might have these as `srcs` if it uses third-party code for which we don't have source code. If the `srcs` attribute includes the label of another rule, `cc_library` will use the output files of that rule as source files to compile. This is useful for one-off generation of source code (for more than occasional use, it's better to implement a Starlark rule class and use the `cc_common` API) Permitted `srcs` file types: * C and C++ source files: `.c`, `.cc`, `.cpp`, `.cxx`, `.c++`, `.C` * C and C++ header files: `.h`, `.hh`, `.hpp`, `.hxx`, `.inc`, `.inl`, `.H` * Assembler with C preprocessor: `.S` * Archive: `.a`, `.pic.a` * "Always link" library: `.lo`, `.pic.lo` * Shared library, versioned or unversioned: `.so`, `.so.version` * Object file: `.o`, `.pic.o` ... and any rules that produce those files (e.g. `cc_embed_data`). Different extensions denote different programming languages in accordance with gcc convention. | +| `data` | List of [labels](/concepts/labels); default is `[]` The list of files needed by this library at runtime. See general comments about `data` at [Typical attributes defined by most build rules](/reference/be/common-definitions#typical-attributes). If a `data` is the name of a generated file, then this `cc_library` rule automatically depends on the generating rule. If a `data` is a rule name, then this `cc_library` rule automatically depends on that rule, and that rule's `outs` are automatically added to this `cc_library`'s data files. Your C++ code can access these data files like so: ``` const std::string path = devtools_build::GetDataDependencyFilepath( "my/test/data/file"); ``` | +| `hdrs` | List of [labels](/concepts/labels); default is `[]` The list of header files published by this library to be directly included by sources in dependent rules. This is the strongly preferred location for declaring header files that describe the interface for the library. These headers will be made available for inclusion by sources in this rule or in dependent rules. Headers not meant to be included by a client of this library should be listed in the `srcs` attribute instead, even if they are included by a published header. See ["Header inclusion checking"](#hdrs) for a more detailed description. Permitted `headers` file types: `.h`, `.hh`, `.hpp`, `.hxx`. | +| `additional_compiler_inputs` | List of [labels](/concepts/labels); default is `[]` Any additional files you might want to pass to the compiler command line, such as sanitizer ignorelists, for example. Files specified here can then be used in copts with the $(location) function. | +| `additional_linker_inputs` | List of [labels](/concepts/labels); default is `[]` Dependencies that are only made available to the C++ linker command. Unlike `deps`, which is conceptually made for both compilation and linking dependencies, `additional_linker_inputs` is specifically made for only the latter, and signals a dependency that is required only for linking (for example, files that are referenced in `linkopts`). For example, compiled Windows .res files can be provided here to be embedded in the binary target. | +| `alwayslink` | Boolean; default is `False` If 1, any binary that depends (directly or indirectly) on this C++ library will link in all the object files for the files listed in `srcs`, even if some contain no symbols referenced by the binary. This is useful if your code isn't explicitly called by code in the binary, e.g., if your code registers to receive some callback provided by some service. If alwayslink doesn't work with VS 2017 on Windows, that is due to a [known issue](https://github.com/bazelbuild/bazel/issues/3949), please upgrade your VS 2017 to the latest version. | +| `conlyopts` | List of strings; default is `[]` Add these options to the C compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). | +| `copts` | List of strings; default is `[]` Add these options to the C/C++ compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string in this attribute is added in the given order to `COPTS` before compiling the binary target. The flags take effect only for compiling this target, not its dependencies, so be careful about header files included elsewhere. All paths should be relative to the workspace, not to the current package. This attribute should not be needed outside of `third_party`. If the package declares the [feature](/reference/be/functions#package.features) `no_copts_tokenization`, Bourne shell tokenization applies only to strings that consist of a single "Make" variable. | +| `cxxopts` | List of strings; default is `[]` Add these options to the C++ compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). | +| `defines` | List of strings; default is `[]` List of defines to add to the compile line of this and all dependent targets. Subject to ["Make" variable](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string, which must consist of a single Bourne shell token, is prepended with `-D` and added to the compile command line to this target, as well as to every rule that depends on it. Be very careful, since this may have far-reaching effects -- the defines are added to every target that depends on this target. When in doubt, add define values to [`local_defines`](#cc_binary.local_defines) instead. | +| `hdrs_check` | String; default is `""` Deprecated, no-op. | +| `implementation_deps` | List of [labels](/concepts/labels); default is `[]` The list of other libraries that the library target depends on. Unlike with `deps`, the headers and include paths of these libraries (and all their transitive deps) are only used for compilation of this library, and not libraries that depend on it. Libraries specified with `implementation_deps` are still linked in binary targets that depend on this library. | +| `include_prefix` | String; default is `""` The prefix to add to the paths of the headers of this rule. When set, the headers in the `hdrs` attribute of this rule are accessible at is the value of this attribute prepended to their repository-relative path. The prefix in the `strip_include_prefix` attribute is removed before this prefix is added. This attribute is only legal under `third_party`. | +| `includes` | List of strings; default is `[]` List of include dirs to be added to the compile line. Subject to ["Make variable"](/reference/be/make-variables) substitution. Each string is prepended with the package path and passed to the C++ toolchain for expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system with typical feature definitions will produce `-isystem path_to_package/include_entry`. This should only be used for third-party libraries that do not conform to the Google style of writing #include statements. Unlike [COPTS](#cc_binary.copts), these flags are added for this rule and every rule that depends on it. (Note: not the rules it depends upon!) Be very careful, since this may have far-reaching effects. When in doubt, add "-I" flags to [COPTS](#cc_binary.copts) instead. The added `include` paths will include generated files as well as files in the source tree. | +| `linkopts` | List of strings; default is `[]` See [`cc_binary.linkopts`](/reference/be/c-cpp#cc_binary.linkopts). The `linkopts` attribute is also applied to any target that depends, directly or indirectly, on this library via `deps` attributes (or via other attributes that are treated similarly: the [`malloc`](/reference/be/c-cpp#cc_binary.malloc) attribute of [`cc_binary`](/reference/be/c-cpp#cc_binary)). Dependency linkopts take precedence over dependent linkopts (i.e. dependency linkopts appear later in the command line). Linkopts specified in [`--linkopt`](../user-manual#flag--linkopt) take precedence over rule linkopts. | -To link in a pre-compiled third-party library, add its name to -the `srcs` instead. - -To depend on something without linking it to this library, add its -name to the `data` instead. - -`srcs` - -List of [labels](/concepts/labels); default is `[]` - - The list of C and C++ files that are processed to create the library target. -These are C/C++ source and header files, either non-generated (normal source -code) or generated. - -All `.cc`, `.c`, and `.cpp` files will -be compiled. These might be generated files: if a named file is in -the `outs` of some other rule, this `cc_library` -will automatically depend on that other rule. - -Pure assembler files (.s, .asm) are not preprocessed and are typically built using -the assembler. Preprocessed assembly files (.S) are preprocessed and are typically built -using the C/C++ compiler. - -A `.h` file will not be compiled, but will be available for -inclusion by sources in this rule. Both `.cc` and -`.h` files can directly include headers listed in -these `srcs` or in the `hdrs` of this rule or any -rule listed in the `deps` argument. - -All `#include` d files must be mentioned in the -`hdrs` attribute of this or referenced `cc_library` -rules, or they should be listed in `srcs` if they are private -to this library. See ["Header inclusion checking"](#hdrs) for -a more detailed description. - -`.so`, `.lo`, and `.a` files are -pre-compiled files. Your library might have these as -`srcs` if it uses third-party code for which we don't -have source code. - -If the `srcs` attribute includes the label of another rule, -`cc_library` will use the output files of that rule as source files to -compile. This is useful for one-off generation of source code (for more than occasional -use, it's better to implement a Starlark rule class and use the `cc_common` -API) +Note that the `linkopts` attribute only applies +when creating `.so` files or executables, not +when creating `.a` or `.lo` files. +So if the `linkstatic=True` attribute is set, the +`linkopts` attribute has no effect on the creation of +this library, only on other targets which depend on this library. -Permitted `srcs` file types: +Also, it is important to note that "-Wl,-soname" or "-Xlinker -soname" +options are not supported and should never be specified in this attribute. -- C and C++ source files: `.c`, `.cc`, `.cpp`, - `.cxx`, `.c++`, `.C` -- C and C++ header files: `.h`, `.hh`, `.hpp`, - `.hxx`, `.inc`, `.inl`, `.H` -- Assembler with C preprocessor: `.S` -- Archive: `.a`, `.pic.a` -- "Always link" library: `.lo`, `.pic.lo` -- Shared library, versioned or unversioned: `.so`, - `.so.version` -- Object file: `.o`, `.pic.o` +The `.so` files produced by `cc_library` +rules are not linked against the libraries that they depend +on. If you're trying to create a shared library for use +outside of the main repository, e.g. for manual use +with `dlopen()` or `LD_PRELOAD`, +it may be better to use a `cc_binary` rule +with the `linkshared=True` attribute. +See [`cc_binary.linkshared`](/reference/be/c-cpp#cc_binary.linkshared). -... and any rules that produce those files (e.g. `cc_embed_data`). -Different extensions denote different programming languages in -accordance with gcc convention. +| `linkstamp` | [Label](/concepts/labels); default is `None` Simultaneously compiles and links the specified C++ source file into the final binary. This trickery is required to introduce timestamp information into binaries; if we compiled the source file to an object file in the usual way, the timestamp would be incorrect. A linkstamp compilation may not include any particular set of compiler flags and so should not depend on any particular header, compiler option, or other build variable. *This option should only be needed in the `base` package.* | +| `linkstatic` | Boolean; default is `False` For [`cc_binary`](/reference/be/c-cpp#cc_binary) and [`cc_test`](/reference/be/c-cpp#cc_test): link the binary in static mode. For `cc_library.link_static`: see below. By default this option is on for `cc_binary` and off for the rest. If enabled and this is a binary or test, this option tells the build tool to link in `.a`'s instead of `.so`'s for user libraries whenever possible. System libraries such as libc (but *not* the C/C++ runtime libraries, see below) are still linked dynamically, as are libraries for which there is no static library. So the resulting executable will still be dynamically linked, hence only *mostly* static. There are really three different ways to link an executable: * STATIC with fully\_static\_link feature, in which everything is linked statically; e.g. "`gcc -static foo.o libbar.a libbaz.a -lm`". This mode is enabled by specifying `fully_static_link` in the [`features`](/reference/be/common-definitions#features) attribute. * STATIC, in which all user libraries are linked statically (if a static version is available), but where system libraries (excluding C/C++ runtime libraries) are linked dynamically, e.g. "`gcc foo.o libfoo.a libbaz.a -lm`". This mode is enabled by specifying `linkstatic=True`. * DYNAMIC, in which all libraries are linked dynamically (if a dynamic version is available), e.g. "`gcc foo.o libfoo.so libbaz.so -lm`". This mode is enabled by specifying `linkstatic=False`. If the `linkstatic` attribute or `fully_static_link` in `features` is used outside of `//third_party` please include a comment near the rule to explain why. The `linkstatic` attribute has a different meaning if used on a [`cc_library()`](/reference/be/c-cpp#cc_library) rule. For a C++ library, `linkstatic=True` indicates that only static linking is allowed, so no `.so` will be produced. linkstatic=False does not prevent static libraries from being created. The attribute is meant to control the creation of dynamic libraries. There should be very little code built with `linkstatic=False` in production. If `linkstatic=False`, then the build tool will create symlinks to depended-upon shared libraries in the `*.runfiles` area. | +| `local_defines` | List of strings; default is `[]` List of defines to add to the compile line. Subject to ["Make" variable](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string, which must consist of a single Bourne shell token, is prepended with `-D` and added to the compile command line for this target, but not to its dependents. Unlike `defines`, the defines are only added to the compile command line for this target. | +| `module_interfaces` | List of [labels](/concepts/labels); default is `[]` The list of files are regarded as C++20 Modules Interface. C++ Standard has no restriction about module interface file extension * Clang use cppm * GCC can use any source file extension * MSVC use ixx The use is guarded by the flag `--experimental_cpp_modules`. | +| `strip_include_prefix` | String; default is `""` The prefix to strip from the paths of the headers of this rule. When set, the headers in the `hdrs` attribute of this rule are accessible at their path with this prefix cut off. If it's a relative path, it's taken as a package-relative one. If it's an absolute one, it's understood as a repository-relative path. The prefix in the `include_prefix` attribute is added after this prefix is stripped. This attribute is only legal under `third_party`. | +| `textual_hdrs` | List of [labels](/concepts/labels); default is `[]` The list of header files published by this library to be textually included by sources in dependent rules. This is the location for declaring header files that cannot be compiled on their own; that is, they always need to be textually included by other source files to build valid code. | +| `win_def_file` | [Label](/concepts/labels); default is `None` The Windows DEF file to be passed to linker. This attribute should only be used when Windows is the target platform. It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. | -`data` +## cc\_shared\_library -List of [labels](/concepts/labels); default is `[]` +[View rule sourceopen\_in\_new](https://github.com/bazelbuild/rules_cc/blob/master/cc/private/rules_impl/cc_shared_library.bzl) - The list of files needed by this library at runtime. +``` +cc_shared_library(name, deps, additional_linker_inputs, aspect_hints, compatible_with, deprecation, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file) +``` -See general comments about `data` -at [Typical attributes defined by\ -most build rules](/reference/be/common-definitions#typical-attributes). +It produces a shared library. -If a `data` is the name of a generated file, then this -`cc_library` rule automatically depends on the generating -rule. - -If a `data` is a rule name, then this -`cc_library` rule automatically depends on that rule, -and that rule's `outs` are automatically added to -this `cc_library`'s data files. - -Your C++ code can access these data files like so: - -```lang-starlark - - const std::string path = devtools_build::GetDataDependencyFilepath( - "my/test/data/file"); - -``` - -`hdrs` - -List of [labels](/concepts/labels); default is `[]` - - The list of header files published by -this library to be directly included by sources in dependent rules. - -This is the strongly preferred location for declaring header files that -describe the interface for the library. These headers will be made -available for inclusion by sources in this rule or in dependent rules. -Headers not meant to be included by a client of this library should be -listed in the `srcs` attribute instead, even if they are -included by a published header. See ["Header inclusion\ -checking"](#hdrs) for a more detailed description. - -Permitted `headers` file types: -`.h`, -`.hh`, -`.hpp`, -`.hxx`. - -`additional_compiler_inputs` - -List of [labels](/concepts/labels); default is `[]` - - Any additional files you might want to pass to the compiler command line, such as sanitizer -ignorelists, for example. Files specified here can then be used in copts with the -$(location) function. - `additional_linker_inputs` - -List of [labels](/concepts/labels); default is `[]` - - Dependencies that are only made available to the C++ linker command. - -Unlike `deps`, which is conceptually made for both compilation and -linking dependencies, `additional_linker_inputs` is specifically -made for only the latter, and signals a dependency that is required only for -linking (for example, files that are referenced in `linkopts`). - -For example, compiled Windows .res files can be provided here to be embedded in -the binary target. - -`alwayslink` - -Boolean; default is `False` - - If 1, any binary that depends (directly or indirectly) on this C++ -library will link in all the object files for the files listed in -`srcs`, even if some contain no symbols referenced by the binary. -This is useful if your code isn't explicitly called by code in -the binary, e.g., if your code registers to receive some callback -provided by some service. - -If alwayslink doesn't work with VS 2017 on Windows, that is due to a -[known issue](https://github.com/bazelbuild/bazel/issues/3949), -please upgrade your VS 2017 to the latest version. - -`conlyopts` - -List of strings; default is `[]` - - Add these options to the C compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - `copts` - -List of strings; default is `[]` - - Add these options to the C/C++ compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - -Each string in this attribute is added in the given order to `COPTS` before -compiling the binary target. The flags take effect only for compiling this target, not -its dependencies, so be careful about header files included elsewhere. -All paths should be relative to the workspace, not to the current package. -This attribute should not be needed outside of `third_party`. - -If the package declares the [feature](/reference/be/functions.html#package.features) `no_copts_tokenization`, Bourne shell tokenization applies only to strings -that consist of a single "Make" variable. - -`cxxopts` - -List of strings; default is `[]` - - Add these options to the C++ compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - `defines` - -List of strings; default is `[]` - - List of defines to add to the compile line of this and all dependent targets. -Subject to ["Make" variable](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). -Each string, which must consist of a single Bourne shell token, -is prepended with `-D` and added to the compile command line to this target, -as well as to every rule that depends on it. Be very careful, since this may have -far-reaching effects -- the defines are added to every target that depends on -this target. When in doubt, add define values to -[`local_defines`](#cc_binary.local_defines) instead. - `hdrs_check` - -String; default is `""` - - Deprecated, no-op. - `implementation_deps` - -List of [labels](/concepts/labels); default is `[]` - - The list of other libraries that the library target depends on. Unlike with -`deps`, the headers and include paths of these libraries (and all their -transitive deps) are only used for compilation of this library, and not libraries that -depend on it. Libraries specified with `implementation_deps` are still linked in -binary targets that depend on this library. - `include_prefix` - -String; default is `""` - - The prefix to add to the paths of the headers of this rule. - -When set, the headers in the `hdrs` attribute of this rule are accessible -at is the value of this attribute prepended to their repository-relative path. - -The prefix in the `strip_include_prefix` attribute is removed before this -prefix is added. - -This attribute is only legal under `third_party`. - - -`includes` - -List of strings; default is `[]` - - List of include dirs to be added to the compile line. -Subject to ["Make variable"](/reference/be/make-variables) substitution. -Each string is prepended with the package path and passed to the C++ toolchain for -expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system -with typical feature definitions will produce -`-isystem path_to_package/include_entry`. -This should only be used for third-party libraries that -do not conform to the Google style of writing #include statements. -Unlike [COPTS](#cc_binary.copts), these flags are added for this rule -and every rule that depends on it. (Note: not the rules it depends upon!) Be -very careful, since this may have far-reaching effects. When in doubt, add -"-I" flags to [COPTS](#cc_binary.copts) instead. - -The added `include` paths will include generated files as well as -files in the source tree. - -`linkopts` - -List of strings; default is `[]` - - See [`cc_binary.linkopts`](/reference/be/c-cpp.html#cc_binary.linkopts). -The `linkopts` attribute is also applied to any target that -depends, directly or indirectly, on this library via `deps` -attributes (or via other attributes that are treated similarly: -the [`malloc`](/reference/be/c-cpp.html#cc_binary.malloc) -attribute of [`cc_binary`](/reference/be/c-cpp.html#cc_binary)). Dependency -linkopts take precedence over dependent linkopts (i.e. dependency linkopts -appear later in the command line). Linkopts specified in -[`--linkopt`](../user-manual.html#flag--linkopt) -take precedence over rule linkopts. - -Note that the `linkopts` attribute only applies -when creating `.so` files or executables, not -when creating `.a` or `.lo` files. -So if the `linkstatic=True` attribute is set, the -`linkopts` attribute has no effect on the creation of -this library, only on other targets which depend on this library. - -Also, it is important to note that "-Wl,-soname" or "-Xlinker -soname" -options are not supported and should never be specified in this attribute. - -The `.so` files produced by `cc_library` -rules are not linked against the libraries that they depend -on. If you're trying to create a shared library for use -outside of the main repository, e.g. for manual use -with `dlopen()` or `LD_PRELOAD`, -it may be better to use a `cc_binary` rule -with the `linkshared=True` attribute. -See [`cc_binary.linkshared`](/reference/be/c-cpp.html#cc_binary.linkshared). - -`linkstamp` - -[Label](/concepts/labels); default is `None` - - Simultaneously compiles and links the specified C++ source file into the final -binary. This trickery is required to introduce timestamp -information into binaries; if we compiled the source file to an -object file in the usual way, the timestamp would be incorrect. -A linkstamp compilation may not include any particular set of -compiler flags and so should not depend on any particular -header, compiler option, or other build variable. -_This option should only be needed in the_ -_`base` package._`linkstatic` - -Boolean; default is `False` - - For [`cc_binary`](/reference/be/c-cpp.html#cc_binary) and -[`cc_test`](/reference/be/c-cpp.html#cc_test): link the binary in static -mode. For `cc_library.link_static`: see below. - -By default this option is on for `cc_binary` and off for the rest. - -If enabled and this is a binary or test, this option tells the build tool to link in -`.a`'s instead of `.so`'s for user libraries whenever possible. -System libraries such as libc (but _not_ the C/C++ runtime libraries, -see below) are still linked dynamically, as are libraries for which -there is no static library. So the resulting executable will still be dynamically -linked, hence only _mostly_ static. - -There are really three different ways to link an executable: - -- STATIC with fully\_static\_link feature, in which everything is linked statically; - e.g. " `gcc -static foo.o libbar.a libbaz.a -lm`". - - - This mode is enabled by specifying `fully_static_link` in the - [`features`](/reference/be/common-definitions#features) attribute. -- STATIC, in which all user libraries are linked statically (if a static - version is available), but where system libraries (excluding C/C++ runtime libraries) - are linked dynamically, e.g. " `gcc foo.o libfoo.a libbaz.a -lm`". - - - This mode is enabled by specifying `linkstatic=True`. -- DYNAMIC, in which all libraries are linked dynamically (if a dynamic version is - available), e.g. " `gcc foo.o libfoo.so libbaz.so -lm`". - - - This mode is enabled by specifying `linkstatic=False`. - -If the `linkstatic` attribute or `fully_static_link` in -`features` is used outside of `//third_party` -please include a comment near the rule to explain why. - -The `linkstatic` attribute has a different meaning if used on a -[`cc_library()`](/reference/be/c-cpp.html#cc_library) rule. -For a C++ library, `linkstatic=True` indicates that only -static linking is allowed, so no `.so` will be produced. linkstatic=False does -not prevent static libraries from being created. The attribute is meant to control the -creation of dynamic libraries. - -There should be very little code built with `linkstatic=False` in production. -If `linkstatic=False`, then the build tool will create symlinks to -depended-upon shared libraries in the `*.runfiles` area. - -`local_defines` - -List of strings; default is `[]` - - List of defines to add to the compile line. -Subject to ["Make" variable](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). -Each string, which must consist of a single Bourne shell token, -is prepended with `-D` and added to the compile command line for this target, -but not to its dependents. Unlike `defines`, the defines are only added to the -compile command line for this target. - `module_interfaces` - -List of [labels](/concepts/labels); default is `[]` - - The list of files are regarded as C++20 Modules Interface. - -C++ Standard has no restriction about module interface file extension - -- Clang use cppm -- GCC can use any source file extension -- MSVC use ixx - -The use is guarded by the flag -`--experimental_cpp_modules`. - -`strip_include_prefix` - -String; default is `""` - - The prefix to strip from the paths of the headers of this rule. - -When set, the headers in the `hdrs` attribute of this rule are accessible -at their path with this prefix cut off. - -If it's a relative path, it's taken as a package-relative one. If it's an absolute one, -it's understood as a repository-relative path. - -The prefix in the `include_prefix` attribute is added after this prefix is -stripped. - -This attribute is only legal under `third_party`. - - -`textual_hdrs` - -List of [labels](/concepts/labels); default is `[]` - - The list of header files published by -this library to be textually included by sources in dependent rules. - -This is the location for declaring header files that cannot be compiled on their own; -that is, they always need to be textually included by other source files to build valid -code. - -`win_def_file` - -[Label](/concepts/labels); default is `None` - - The Windows DEF file to be passed to linker. - -This attribute should only be used when Windows is the target platform. -It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. - -## cc\_shared\_library - -[View rule sourceopen\_in\_new](https://github.com/bazelbuild/rules_cc/blob/master/cc/private/rules_impl/cc_shared_library.bzl) - -``` -cc_shared_library(name, deps, additional_linker_inputs, aspect_hints, compatible_with, deprecation, dynamic_deps, exec_compatible_with, exec_group_compatible_with, exec_properties, exports_filter, features, package_metadata, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file) -``` - -It produces a shared library. - -#### Example +#### Example ``` cc_shared_library( @@ -1455,7 +536,6 @@ cc_library( srcs = ["baz.cc"], hdrs = ["baz.h"], ) - ``` In the example `foo_shared` statically links `foo` @@ -1507,7 +587,7 @@ A third way is to tag the culprit `cc_library` with `LINKABLE_MORE_THAN_ONCE` but this fix should be rare and you should absolutely make sure that the `cc_library` is indeed safe to link more than once. -##### ``'//foo:foo' is already linked statically in '//bar:bar' but not exported` `` +##### `` '//foo:foo' is already linked statically in '//bar:bar' but not exported` `` This means that a library in the transitive closure of your `deps` is reachable without going through one of the `cc_shared_library` dependencies but is already @@ -1517,7 +597,7 @@ exported. The solution is to export it from the `cc_shared_library` dependency or pull out a third `cc_shared_library` that exports it. -##### `Do not place libraries which only contain a precompiled dynamic library in deps. ` +##### `Do not place libraries which only contain a precompiled dynamic library in deps.` If you have a precompiled dynamic library, this doesn't need to and cannot be linked statically into the current `cc_shared_library` target that you are @@ -1536,135 +616,18 @@ dependency or make sure that the `exports_filter` doesn't catch this target. ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`deps` - -List of [labels](/concepts/labels); default is `[]` - - Top level libraries that will unconditionally be statically linked into the shared library -after being whole-archived. - -Any transitive library dependency of these direct deps will be linked into this shared -library as long as they have not already been linked by a `cc_shared_library` -in `dynamic_deps`. - -During analysis, the rule implementation will consider any target listed in -`deps` as being exported by the shared library in order to give errors when -multiple `cc_shared_libraries` export the same targets. The rule implementation -does not take care of informing the linker about which symbols should be exported by the -shared object. The user should take care of this via linker scripts or visibility -declarations in the source code. - -The implementation will also trigger errors whenever the same library is linked statically -into more than one `cc_shared_library`. This can be avoided by adding -`"LINKABLE_MORE_THAN_ONCE"` to the `cc_library.tags` or by listing -the \`cc\_library\` as an export of one of the shared libraries so that one can be made a -`dynamic_dep` of the other. - -`additional_linker_inputs` - -List of [labels](/concepts/labels); default is `[]` - - Any additional files that you may want to pass to the linker, for example, linker scripts. -You have to separately pass any linker flags that the linker needs in order to be aware -of this file. You can do so via the `user_link_flags` attribute. - `dynamic_deps` - -List of [labels](/concepts/labels); default is `[]` - - These are other `cc_shared_library` dependencies the current target depends on. - -The `cc_shared_library` implementation will use the list of -`dynamic_deps` (transitively, i.e. also the `dynamic_deps` of the -current target's `dynamic_deps`) to decide which `cc_libraries` in -the transitive `deps` should not be linked in because they are already provided -by a different `cc_shared_library`. - -`exports_filter` - -List of strings; default is `[]` - - This attribute contains a list of targets that are claimed to be exported by the current -shared library. - -Any target `deps` is already understood to be exported by the shared library. -This attribute should be used to list any targets that are exported by the shared library -but are transitive dependencies of `deps`. - -Note that this attribute is not actually adding a dependency edge to those targets, the -dependency edge should instead be created by `deps`.The entries in this -attribute are just strings. Keep in mind that when placing a target in this attribute, -this is considered a claim that the shared library exports the symbols from that target. -The `cc_shared_library` logic doesn't actually handle telling the linker which -symbols should be exported. - -The following syntax is allowed: - -`//foo:__pkg__` to account for any target in foo/BUILD - -`//foo:__subpackages__` to account for any target in foo/BUILD or any other -package below foo/ like foo/bar/BUILD - -`roots` - -List of [labels](/concepts/labels); default is `[]` - -`shared_lib_name` - -String; default is `""` - - By default cc\_shared\_library will use a name for the shared library output file based on -the target's name and the platform. This includes an extension and sometimes a prefix. -Sometimes you may not want the default name, for example, when loading C++ shared libraries -for Python the default lib\* prefix is often not desired, in which case you can use this -attribute to choose a custom name. - `static_deps` - -List of strings; default is `[]` - -`user_link_flags` - -List of strings; default is `[]` - - Any additional flags that you may want to pass to the linker. For example, to make the -linker aware of a linker script passed via additional\_linker\_inputs you can use the -following: - -```lang-starlark - - cc_shared_library( - name = "foo_shared", - additional_linker_inputs = select({ - "//src/conditions:linux": [ - ":foo.lds", - ":additional_script.txt", - ], - "//conditions:default": []}), - user_link_flags = select({ - "//src/conditions:linux": [ - "-Wl,-rpath,kittens", - "-Wl,--version-script=$(location :foo.lds)", - "-Wl,--script=$(location :additional_script.txt)", - ], - "//conditions:default": []}), - ... - ) - -``` - -`win_def_file` - -[Label](/concepts/labels); default is `None` - - The Windows DEF file to be passed to linker. - -This attribute should only be used when Windows is the target platform. -It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `deps` | List of [labels](/concepts/labels); default is `[]` Top level libraries that will unconditionally be statically linked into the shared library after being whole-archived. Any transitive library dependency of these direct deps will be linked into this shared library as long as they have not already been linked by a `cc_shared_library` in `dynamic_deps`. During analysis, the rule implementation will consider any target listed in `deps` as being exported by the shared library in order to give errors when multiple `cc_shared_libraries` export the same targets. The rule implementation does not take care of informing the linker about which symbols should be exported by the shared object. The user should take care of this via linker scripts or visibility declarations in the source code. The implementation will also trigger errors whenever the same library is linked statically into more than one `cc_shared_library`. This can be avoided by adding `"LINKABLE_MORE_THAN_ONCE"` to the `cc_library.tags` or by listing the `cc\_library` as an export of one of the shared libraries so that one can be made a `dynamic_dep` of the other. | +| `additional_linker_inputs` | List of [labels](/concepts/labels); default is `[]` Any additional files that you may want to pass to the linker, for example, linker scripts. You have to separately pass any linker flags that the linker needs in order to be aware of this file. You can do so via the `user_link_flags` attribute. | +| `dynamic_deps` | List of [labels](/concepts/labels); default is `[]` These are other `cc_shared_library` dependencies the current target depends on. The `cc_shared_library` implementation will use the list of `dynamic_deps` (transitively, i.e. also the `dynamic_deps` of the current target's `dynamic_deps`) to decide which `cc_libraries` in the transitive `deps` should not be linked in because they are already provided by a different `cc_shared_library`. | +| `exports_filter` | List of strings; default is `[]` This attribute contains a list of targets that are claimed to be exported by the current shared library. Any target `deps` is already understood to be exported by the shared library. This attribute should be used to list any targets that are exported by the shared library but are transitive dependencies of `deps`. Note that this attribute is not actually adding a dependency edge to those targets, the dependency edge should instead be created by `deps`.The entries in this attribute are just strings. Keep in mind that when placing a target in this attribute, this is considered a claim that the shared library exports the symbols from that target. The `cc_shared_library` logic doesn't actually handle telling the linker which symbols should be exported. The following syntax is allowed: `//foo:__pkg__` to account for any target in foo/BUILD `//foo:__subpackages__` to account for any target in foo/BUILD or any other package below foo/ like foo/bar/BUILD | +| `roots` | List of [labels](/concepts/labels); default is `[]` | +| `shared_lib_name` | String; default is `""` By default cc\_shared\_library will use a name for the shared library output file based on the target's name and the platform. This includes an extension and sometimes a prefix. Sometimes you may not want the default name, for example, when loading C++ shared libraries for Python the default lib\* prefix is often not desired, in which case you can use this attribute to choose a custom name. | +| `static_deps` | List of strings; default is `[]` | +| `user_link_flags` | List of strings; default is `[]` Any additional flags that you may want to pass to the linker. For example, to make the linker aware of a linker script passed via additional\_linker\_inputs you can use the following: ``` cc_shared_library( name = "foo_shared", additional_linker_inputs = select({ "//src/conditions:linux": [ ":foo.lds", ":additional_script.txt", ], "//conditions:default": []}), user_link_flags = select({ "//src/conditions:linux": [ "-Wl,-rpath,kittens", "-Wl,--version-script=$(location :foo.lds)", "-Wl,--script=$(location :additional_script.txt)", ], "//conditions:default": []}), ... ) ``` | +| `win_def_file` | [Label](/concepts/labels); default is `None` The Windows DEF file to be passed to linker. This attribute should only be used when Windows is the target platform. It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. | ## cc\_static\_library @@ -1674,7 +637,7 @@ It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k cc_static_library(name, deps, aspect_hints, compatible_with, deprecation, exec_compatible_with, exec_group_compatible_with, exec_properties, features, package_metadata, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility) ``` - Produces a static library from a list of targets and their transitive dependencies. +Produces a static library from a list of targets and their transitive dependencies. The resulting static library contains the object files of the targets listed in `deps` as well as their transitive dependencies, with preference given to @@ -1710,31 +673,19 @@ The auto-configured C++ toolchains shipped with Bazel support the `symbol_check` feature on all platforms. Custom toolchains can add support for it in one of two ways: -- Implementing the `ACTION_NAMES.validate_static_library` action and - enabling it with the `symbol_check` feature. The tool set in the action is - invoked with two arguments, the static library to check for duplicate symbols and the - path of a file that must be created if the check passes. -- Having the `symbol_check` feature add archiver flags that cause the - action creating the static library to fail on duplicate symbols. +* Implementing the `ACTION_NAMES.validate_static_library` action and + enabling it with the `symbol_check` feature. The tool set in the action is + invoked with two arguments, the static library to check for duplicate symbols and the + path of a file that must be created if the check passes. +* Having the `symbol_check` feature add archiver flags that cause the + action creating the static library to fail on duplicate symbols. ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`deps` - -List of [labels](/concepts/labels); default is `[]` - - The list of targets to combine into a static library, including all their transitive -dependencies. - -Dependencies that do not provide any object files are not included in the static -library, but their labels are collected in the file provided by the -`linkdeps` output group. +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `deps` | List of [labels](/concepts/labels); default is `[]` The list of targets to combine into a static library, including all their transitive dependencies. Dependencies that do not provide any object files are not included in the static library, but their labels are collected in the file provided by the `linkdeps` output group. | ## cc\_test @@ -1747,428 +698,55 @@ cc_test(name, deps, srcs, data, additional_compiler_inputs, additional_linker_in A `cc_test()` rule compiles a test. Here, a test is a binary wrapper around some testing code. -_By default, C++ tests are dynamically linked._ - +*By default, C++ tests are dynamically linked.* To statically link a unit test, specify -[`linkstatic=True`](/reference/be/c-cpp.html#cc_binary.linkstatic). +[`linkstatic=True`](/reference/be/c-cpp#cc_binary.linkstatic). It would probably be good to comment why your test needs `linkstatic`; this is probably not obvious. #### Implicit output targets -- `name.stripped` (only built if explicitly requested): A stripped - version of the binary. `strip -g` is run on the binary to remove debug - symbols. Additional strip options can be provided on the command line using - `--stripopt=-foo`. -- `name.dwp` (only built if explicitly requested): If - [Fission](https://gcc.gnu.org/wiki/DebugFission) is enabled: a debug - information package file suitable for debugging remotely deployed binaries. Else: an - empty file. +* `name.stripped` (only built if explicitly requested): A stripped + version of the binary. `strip -g` is run on the binary to remove debug + symbols. Additional strip options can be provided on the command line using + `--stripopt=-foo`. +* `name.dwp` (only built if explicitly requested): If + [Fission](https://gcc.gnu.org/wiki/DebugFission) is enabled: a debug + information package file suitable for debugging remotely deployed binaries. Else: an + empty file. -See the [cc\_binary()](/reference/be/c-cpp.html#cc_binary_args) arguments, except that +See the [cc\_binary()](/reference/be/c-cpp#cc_binary_args) arguments, except that the `stamp` argument is set to 0 by default for tests and that `cc_test` has extra [attributes common to all test rules (\*\_test)](/reference/be/common-definitions#common-attributes-tests). ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`deps` - -List of [labels](/concepts/labels); default is `[]` - - The list of other libraries to be linked in to the binary target. - -These can be `cc_library` or `objc_library` -targets. - -It is also allowed to -put linker scripts (.lds) into deps, and reference them in -[`linkopts`](#cc_binary.linkopts), -but please consider -[`additional_linker_inputs`](#cc_binary.additional_linker_inputs) -for that use case. - `srcs` - -List of [labels](/concepts/labels); default is `[]` - - The list of C and C++ files that are processed to create the library target. -These are C/C++ source and header files, either non-generated (normal source -code) or generated. - -All `.cc`, `.c`, and `.cpp` files will -be compiled. These might be generated files: if a named file is in -the `outs` of some other rule, this `cc_library` -will automatically depend on that other rule. - -Pure assembler files (.s, .asm) are not preprocessed and are typically built using -the assembler. Preprocessed assembly files (.S) are preprocessed and are typically built -using the C/C++ compiler. - -A `.h` file will not be compiled, but will be available for -inclusion by sources in this rule. Both `.cc` and -`.h` files can directly include headers listed in -these `srcs` or in the `hdrs` of this rule or any -rule listed in the `deps` argument. - -All `#include` d files must be mentioned in the -`hdrs` attribute of this or referenced `cc_library` -rules, or they should be listed in `srcs` if they are private -to this library. See ["Header inclusion checking"](#hdrs) for -a more detailed description. - -`.so`, `.lo`, and `.a` files are -pre-compiled files. Your library might have these as -`srcs` if it uses third-party code for which we don't -have source code. - -If the `srcs` attribute includes the label of another rule, -`cc_library` will use the output files of that rule as source files to -compile. This is useful for one-off generation of source code (for more than occasional -use, it's better to implement a Starlark rule class and use the `cc_common` -API) - -Permitted `srcs` file types: - -- C and C++ source files: `.c`, `.cc`, `.cpp`, - `.cxx`, `.c++`, `.C` -- C and C++ header files: `.h`, `.hh`, `.hpp`, - `.hxx`, `.inc`, `.inl`, `.H` -- Assembler with C preprocessor: `.S` -- Archive: `.a`, `.pic.a` -- "Always link" library: `.lo`, `.pic.lo` -- Shared library, versioned or unversioned: `.so`, - `.so.version` -- Object file: `.o`, `.pic.o` - -... and any rules that produce those files (e.g. `cc_embed_data`). -Different extensions denote different programming languages in -accordance with gcc convention. - -`data` - -List of [labels](/concepts/labels); default is `[]` - - The list of files needed by this library at runtime. - -See general comments about `data` -at [Typical attributes defined by\ -most build rules](/reference/be/common-definitions#typical-attributes). - -If a `data` is the name of a generated file, then this -`cc_library` rule automatically depends on the generating -rule. - -If a `data` is a rule name, then this -`cc_library` rule automatically depends on that rule, -and that rule's `outs` are automatically added to -this `cc_library`'s data files. - -Your C++ code can access these data files like so: - -```lang-starlark - - const std::string path = devtools_build::GetDataDependencyFilepath( - "my/test/data/file"); - -``` - -`additional_compiler_inputs` - -List of [labels](/concepts/labels); default is `[]` - - Any additional files you might want to pass to the compiler command line, such as sanitizer -ignorelists, for example. Files specified here can then be used in copts with the -$(location) function. - `additional_linker_inputs` - -List of [labels](/concepts/labels); default is `[]` - - Dependencies that are only made available to the C++ linker command. - -Unlike `deps`, which is conceptually made for both compilation and -linking dependencies, `additional_linker_inputs` is specifically -made for only the latter, and signals a dependency that is required only for -linking (for example, files that are referenced in `linkopts`). - -For example, compiled Windows .res files can be provided here to be embedded in -the binary target. - -`conlyopts` - -List of strings; default is `[]` - - Add these options to the C compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - `copts` - -List of strings; default is `[]` - - Add these options to the C/C++ compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - -Each string in this attribute is added in the given order to `COPTS` before -compiling the binary target. The flags take effect only for compiling this target, not -its dependencies, so be careful about header files included elsewhere. -All paths should be relative to the workspace, not to the current package. -This attribute should not be needed outside of `third_party`. - -If the package declares the [feature](/reference/be/functions.html#package.features) `no_copts_tokenization`, Bourne shell tokenization applies only to strings -that consist of a single "Make" variable. - -`cxxopts` - -List of strings; default is `[]` - - Add these options to the C++ compilation command. -Subject to ["Make variable"](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). - `defines` - -List of strings; default is `[]` - - List of defines to add to the compile line of this and all dependent targets. -Subject to ["Make" variable](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). -Each string, which must consist of a single Bourne shell token, -is prepended with `-D` and added to the compile command line to this target, -as well as to every rule that depends on it. Be very careful, since this may have -far-reaching effects -- the defines are added to every target that depends on -this target. When in doubt, add define values to -[`local_defines`](#cc_binary.local_defines) instead. - `dynamic_deps` - -List of [labels](/concepts/labels); default is `[]` - - These are other `cc_shared_library` dependencies the current target depends on. - -The `cc_shared_library` implementation will use the list of -`dynamic_deps` (transitively, i.e. also the `dynamic_deps` of the -current target's `dynamic_deps`) to decide which `cc_libraries` in -the transitive `deps` should not be linked in because they are already provided -by a different `cc_shared_library`. - - -`hdrs_check` - -String; default is `""` - - Deprecated, no-op. - `includes` - -List of strings; default is `[]` - - List of include dirs to be added to the compile line. -Subject to ["Make variable"](/reference/be/make-variables) substitution. -Each string is prepended with the package path and passed to the C++ toolchain for -expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system -with typical feature definitions will produce -`-isystem path_to_package/include_entry`. -This should only be used for third-party libraries that -do not conform to the Google style of writing #include statements. -Unlike [COPTS](#cc_binary.copts), these flags are added for this rule -and every rule that depends on it. (Note: not the rules it depends upon!) Be -very careful, since this may have far-reaching effects. When in doubt, add -"-I" flags to [COPTS](#cc_binary.copts) instead. - -The added `include` paths will include generated files as well as -files in the source tree. - -`link_extra_lib` - -[Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:link_extra_lib"` - - Control linking of extra libraries. - -By default, C++ binaries are linked against `@bazel_tools//tools/cpp:link_extra_lib`, -which by default depends on the label flag `@bazel_tools//tools/cpp:link_extra_libs`. -Without setting the flag, this library is empty by default. Setting the label flag -allows linking optional dependencies, such as overrides for weak symbols, interceptors -for shared library functions, or special runtime libraries (for malloc replacements, -prefer `malloc` or `--custom_malloc`). Setting this attribute to -`None` disables this behaviour. - -`linkopts` - -List of strings; default is `[]` - - Add these flags to the C++ linker command. -Subject to ["Make" variable](make-variables.html) substitution, -[Bourne shell tokenization](common-definitions.html#sh-tokenization) and -[label expansion](common-definitions.html#label-expansion). -Each string in this attribute is added to `LINKOPTS` before -linking the binary target. - -Each element of this list that does not start with `$` or `-` is -assumed to be the label of a target in `deps`. The -list of files generated by that target is appended to the linker -options. An error is reported if the label is invalid, or is -not declared in `deps`. - -`linkshared` - -Boolean; default is `False` - - Create a shared library. -To enable this attribute, include `linkshared=True` in your rule. By default -this option is off. - -The presence of this flag means that linking occurs with the `-shared` flag -to `gcc`, and the resulting shared library is suitable for loading into for -example a Java program. However, for build purposes it will never be linked into the -dependent binary, as it is assumed that shared libraries built with a -[cc\_binary](#cc_binary) rule are only loaded manually by other programs, so -it should not be considered a substitute for the [cc\_library](#cc_library) -rule. For sake of scalability we recommend avoiding this approach altogether and -simply letting `java_library` depend on `cc_library` rules -instead. - -If you specify both `linkopts=['-static']` and `linkshared=True`, -you get a single completely self-contained unit. If you specify both -`linkstatic=True` and `linkshared=True`, you get a single, mostly -self-contained unit. - -`linkstatic` - -Boolean; default is `False` - - For [`cc_binary`](/reference/be/c-cpp.html#cc_binary) and -[`cc_test`](/reference/be/c-cpp.html#cc_test): link the binary in static -mode. For `cc_library.link_static`: see below. - -By default this option is on for `cc_binary` and off for the rest. - -If enabled and this is a binary or test, this option tells the build tool to link in -`.a`'s instead of `.so`'s for user libraries whenever possible. -System libraries such as libc (but _not_ the C/C++ runtime libraries, -see below) are still linked dynamically, as are libraries for which -there is no static library. So the resulting executable will still be dynamically -linked, hence only _mostly_ static. - -There are really three different ways to link an executable: - -- STATIC with fully\_static\_link feature, in which everything is linked statically; - e.g. " `gcc -static foo.o libbar.a libbaz.a -lm`". - - - This mode is enabled by specifying `fully_static_link` in the - [`features`](/reference/be/common-definitions#features) attribute. -- STATIC, in which all user libraries are linked statically (if a static - version is available), but where system libraries (excluding C/C++ runtime libraries) - are linked dynamically, e.g. " `gcc foo.o libfoo.a libbaz.a -lm`". - - - This mode is enabled by specifying `linkstatic=True`. -- DYNAMIC, in which all libraries are linked dynamically (if a dynamic version is - available), e.g. " `gcc foo.o libfoo.so libbaz.so -lm`". - - - This mode is enabled by specifying `linkstatic=False`. - -If the `linkstatic` attribute or `fully_static_link` in -`features` is used outside of `//third_party` -please include a comment near the rule to explain why. - -The `linkstatic` attribute has a different meaning if used on a -[`cc_library()`](/reference/be/c-cpp.html#cc_library) rule. -For a C++ library, `linkstatic=True` indicates that only -static linking is allowed, so no `.so` will be produced. linkstatic=False does -not prevent static libraries from being created. The attribute is meant to control the -creation of dynamic libraries. - -There should be very little code built with `linkstatic=False` in production. -If `linkstatic=False`, then the build tool will create symlinks to -depended-upon shared libraries in the `*.runfiles` area. - -`local_defines` - -List of strings; default is `[]` - - List of defines to add to the compile line. -Subject to ["Make" variable](/reference/be/make-variables) substitution and -[Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). -Each string, which must consist of a single Bourne shell token, -is prepended with `-D` and added to the compile command line for this target, -but not to its dependents. Unlike `defines`, the defines are only added to the -compile command line for this target. - `malloc` - -[Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:malloc"` - - Override the default dependency on malloc. - -By default, C++ binaries are linked against `//tools/cpp:malloc`, -which is an empty library so the binary ends up using libc malloc. -This label must refer to a `cc_library`. If compilation is for a non-C++ -rule, this option has no effect. The value of this attribute is ignored if -`linkshared=True` is specified. - -`module_interfaces` - -List of [labels](/concepts/labels); default is `[]` - - The list of files are regarded as C++20 Modules Interface. - -C++ Standard has no restriction about module interface file extension - -- Clang use cppm -- GCC can use any source file extension -- MSVC use ixx - -The use is guarded by the flag -`--experimental_cpp_modules`. - -`nocopts` - -String; default is `""` - - Remove matching options from the C++ compilation command. -Subject to ["Make" variable](/reference/be/make-variables) substitution. -The value of this attribute is interpreted as a regular expression. -Any preexisting `COPTS` that match this regular expression -(including values explicitly specified in the rule's [copts](#cc_binary.copts) attribute) -will be removed from `COPTS` for purposes of compiling this rule. -This attribute should not be needed or used -outside of `third_party`. The values are not preprocessed -in any way other than the "Make" variable substitution. - `reexport_deps` - -List of [labels](/concepts/labels); default is `[]` - -`stamp` - -Integer; default is `0` - - Whether to encode build information into the binary. Possible values: - -- `stamp = 1`: Always stamp the build information into the binary, even in - [`--nostamp`](/docs/user-manual#flag--stamp) builds. **This** - **setting should be avoided**, since it potentially kills remote caching for the - binary and any downstream actions that depend on it. - -- `stamp = 0`: Always replace build information by constant values. This - gives good build result caching. - -- `stamp = -1`: Embedding of build information is controlled by the - [`--[no]stamp`](/docs/user-manual#flag--stamp) flag. - - -Stamped binaries are _not_ rebuilt unless their dependencies change. - -`win_def_file` - -[Label](/concepts/labels); default is `None` - - The Windows DEF file to be passed to linker. - -This attribute should only be used when Windows is the target platform. -It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `deps` | List of [labels](/concepts/labels); default is `[]` The list of other libraries to be linked in to the binary target. These can be `cc_library` or `objc_library` targets. It is also allowed to put linker scripts (.lds) into deps, and reference them in [`linkopts`](#cc_binary.linkopts), but please consider [`additional_linker_inputs`](#cc_binary.additional_linker_inputs) for that use case. | +| `srcs` | List of [labels](/concepts/labels); default is `[]` The list of C and C++ files that are processed to create the library target. These are C/C++ source and header files, either non-generated (normal source code) or generated. All `.cc`, `.c`, and `.cpp` files will be compiled. These might be generated files: if a named file is in the `outs` of some other rule, this `cc_library` will automatically depend on that other rule. Pure assembler files (.s, .asm) are not preprocessed and are typically built using the assembler. Preprocessed assembly files (.S) are preprocessed and are typically built using the C/C++ compiler. A `.h` file will not be compiled, but will be available for inclusion by sources in this rule. Both `.cc` and `.h` files can directly include headers listed in these `srcs` or in the `hdrs` of this rule or any rule listed in the `deps` argument. All `#include`d files must be mentioned in the `hdrs` attribute of this or referenced `cc_library` rules, or they should be listed in `srcs` if they are private to this library. See ["Header inclusion checking"](#hdrs) for a more detailed description. `.so`, `.lo`, and `.a` files are pre-compiled files. Your library might have these as `srcs` if it uses third-party code for which we don't have source code. If the `srcs` attribute includes the label of another rule, `cc_library` will use the output files of that rule as source files to compile. This is useful for one-off generation of source code (for more than occasional use, it's better to implement a Starlark rule class and use the `cc_common` API) Permitted `srcs` file types: * C and C++ source files: `.c`, `.cc`, `.cpp`, `.cxx`, `.c++`, `.C` * C and C++ header files: `.h`, `.hh`, `.hpp`, `.hxx`, `.inc`, `.inl`, `.H` * Assembler with C preprocessor: `.S` * Archive: `.a`, `.pic.a` * "Always link" library: `.lo`, `.pic.lo` * Shared library, versioned or unversioned: `.so`, `.so.version` * Object file: `.o`, `.pic.o` ... and any rules that produce those files (e.g. `cc_embed_data`). Different extensions denote different programming languages in accordance with gcc convention. | +| `data` | List of [labels](/concepts/labels); default is `[]` The list of files needed by this library at runtime. See general comments about `data` at [Typical attributes defined by most build rules](/reference/be/common-definitions#typical-attributes). If a `data` is the name of a generated file, then this `cc_library` rule automatically depends on the generating rule. If a `data` is a rule name, then this `cc_library` rule automatically depends on that rule, and that rule's `outs` are automatically added to this `cc_library`'s data files. Your C++ code can access these data files like so: ``` const std::string path = devtools_build::GetDataDependencyFilepath( "my/test/data/file"); ``` | +| `additional_compiler_inputs` | List of [labels](/concepts/labels); default is `[]` Any additional files you might want to pass to the compiler command line, such as sanitizer ignorelists, for example. Files specified here can then be used in copts with the $(location) function. | +| `additional_linker_inputs` | List of [labels](/concepts/labels); default is `[]` Dependencies that are only made available to the C++ linker command. Unlike `deps`, which is conceptually made for both compilation and linking dependencies, `additional_linker_inputs` is specifically made for only the latter, and signals a dependency that is required only for linking (for example, files that are referenced in `linkopts`). For example, compiled Windows .res files can be provided here to be embedded in the binary target. | +| `conlyopts` | List of strings; default is `[]` Add these options to the C compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). | +| `copts` | List of strings; default is `[]` Add these options to the C/C++ compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string in this attribute is added in the given order to `COPTS` before compiling the binary target. The flags take effect only for compiling this target, not its dependencies, so be careful about header files included elsewhere. All paths should be relative to the workspace, not to the current package. This attribute should not be needed outside of `third_party`. If the package declares the [feature](/reference/be/functions#package.features) `no_copts_tokenization`, Bourne shell tokenization applies only to strings that consist of a single "Make" variable. | +| `cxxopts` | List of strings; default is `[]` Add these options to the C++ compilation command. Subject to ["Make variable"](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). | +| `defines` | List of strings; default is `[]` List of defines to add to the compile line of this and all dependent targets. Subject to ["Make" variable](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string, which must consist of a single Bourne shell token, is prepended with `-D` and added to the compile command line to this target, as well as to every rule that depends on it. Be very careful, since this may have far-reaching effects -- the defines are added to every target that depends on this target. When in doubt, add define values to [`local_defines`](#cc_binary.local_defines) instead. | +| `dynamic_deps` | List of [labels](/concepts/labels); default is `[]` These are other `cc_shared_library` dependencies the current target depends on. The `cc_shared_library` implementation will use the list of `dynamic_deps` (transitively, i.e. also the `dynamic_deps` of the current target's `dynamic_deps`) to decide which `cc_libraries` in the transitive `deps` should not be linked in because they are already provided by a different `cc_shared_library`. | +| `hdrs_check` | String; default is `""` Deprecated, no-op. | +| `includes` | List of strings; default is `[]` List of include dirs to be added to the compile line. Subject to ["Make variable"](/reference/be/make-variables) substitution. Each string is prepended with the package path and passed to the C++ toolchain for expansion via the "include\_paths" CROSSTOOL feature. A toolchain running on a POSIX system with typical feature definitions will produce `-isystem path_to_package/include_entry`. This should only be used for third-party libraries that do not conform to the Google style of writing #include statements. Unlike [COPTS](#cc_binary.copts), these flags are added for this rule and every rule that depends on it. (Note: not the rules it depends upon!) Be very careful, since this may have far-reaching effects. When in doubt, add "-I" flags to [COPTS](#cc_binary.copts) instead. The added `include` paths will include generated files as well as files in the source tree. | +| `link_extra_lib` | [Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:link_extra_lib"` Control linking of extra libraries. By default, C++ binaries are linked against `@bazel_tools//tools/cpp:link_extra_lib`, which by default depends on the label flag `@bazel_tools//tools/cpp:link_extra_libs`. Without setting the flag, this library is empty by default. Setting the label flag allows linking optional dependencies, such as overrides for weak symbols, interceptors for shared library functions, or special runtime libraries (for malloc replacements, prefer `malloc` or `--custom_malloc`). Setting this attribute to `None` disables this behaviour. | +| `linkopts` | List of strings; default is `[]` Add these flags to the C++ linker command. Subject to ["Make" variable](make-variables) substitution, [Bourne shell tokenization](common-definitions#sh-tokenization) and [label expansion](common-definitions#label-expansion). Each string in this attribute is added to `LINKOPTS` before linking the binary target. Each element of this list that does not start with `$` or `-` is assumed to be the label of a target in `deps`. The list of files generated by that target is appended to the linker options. An error is reported if the label is invalid, or is not declared in `deps`. | +| `linkshared` | Boolean; default is `False` Create a shared library. To enable this attribute, include `linkshared=True` in your rule. By default this option is off. The presence of this flag means that linking occurs with the `-shared` flag to `gcc`, and the resulting shared library is suitable for loading into for example a Java program. However, for build purposes it will never be linked into the dependent binary, as it is assumed that shared libraries built with a [cc\_binary](#cc_binary) rule are only loaded manually by other programs, so it should not be considered a substitute for the [cc\_library](#cc_library) rule. For sake of scalability we recommend avoiding this approach altogether and simply letting `java_library` depend on `cc_library` rules instead. If you specify both `linkopts=['-static']` and `linkshared=True`, you get a single completely self-contained unit. If you specify both `linkstatic=True` and `linkshared=True`, you get a single, mostly self-contained unit. | +| `linkstatic` | Boolean; default is `False` For [`cc_binary`](/reference/be/c-cpp#cc_binary) and [`cc_test`](/reference/be/c-cpp#cc_test): link the binary in static mode. For `cc_library.link_static`: see below. By default this option is on for `cc_binary` and off for the rest. If enabled and this is a binary or test, this option tells the build tool to link in `.a`'s instead of `.so`'s for user libraries whenever possible. System libraries such as libc (but *not* the C/C++ runtime libraries, see below) are still linked dynamically, as are libraries for which there is no static library. So the resulting executable will still be dynamically linked, hence only *mostly* static. There are really three different ways to link an executable: * STATIC with fully\_static\_link feature, in which everything is linked statically; e.g. "`gcc -static foo.o libbar.a libbaz.a -lm`". This mode is enabled by specifying `fully_static_link` in the [`features`](/reference/be/common-definitions#features) attribute. * STATIC, in which all user libraries are linked statically (if a static version is available), but where system libraries (excluding C/C++ runtime libraries) are linked dynamically, e.g. "`gcc foo.o libfoo.a libbaz.a -lm`". This mode is enabled by specifying `linkstatic=True`. * DYNAMIC, in which all libraries are linked dynamically (if a dynamic version is available), e.g. "`gcc foo.o libfoo.so libbaz.so -lm`". This mode is enabled by specifying `linkstatic=False`. If the `linkstatic` attribute or `fully_static_link` in `features` is used outside of `//third_party` please include a comment near the rule to explain why. The `linkstatic` attribute has a different meaning if used on a [`cc_library()`](/reference/be/c-cpp#cc_library) rule. For a C++ library, `linkstatic=True` indicates that only static linking is allowed, so no `.so` will be produced. linkstatic=False does not prevent static libraries from being created. The attribute is meant to control the creation of dynamic libraries. There should be very little code built with `linkstatic=False` in production. If `linkstatic=False`, then the build tool will create symlinks to depended-upon shared libraries in the `*.runfiles` area. | +| `local_defines` | List of strings; default is `[]` List of defines to add to the compile line. Subject to ["Make" variable](/reference/be/make-variables) substitution and [Bourne shell tokenization](/reference/be/common-definitions#sh-tokenization). Each string, which must consist of a single Bourne shell token, is prepended with `-D` and added to the compile command line for this target, but not to its dependents. Unlike `defines`, the defines are only added to the compile command line for this target. | +| `malloc` | [Label](/concepts/labels); default is `"@bazel_tools//tools/cpp:malloc"` Override the default dependency on malloc. By default, C++ binaries are linked against `//tools/cpp:malloc`, which is an empty library so the binary ends up using libc malloc. This label must refer to a `cc_library`. If compilation is for a non-C++ rule, this option has no effect. The value of this attribute is ignored if `linkshared=True` is specified. | +| `module_interfaces` | List of [labels](/concepts/labels); default is `[]` The list of files are regarded as C++20 Modules Interface. C++ Standard has no restriction about module interface file extension * Clang use cppm * GCC can use any source file extension * MSVC use ixx The use is guarded by the flag `--experimental_cpp_modules`. | +| `nocopts` | String; default is `""` Remove matching options from the C++ compilation command. Subject to ["Make" variable](/reference/be/make-variables) substitution. The value of this attribute is interpreted as a regular expression. Any preexisting `COPTS` that match this regular expression (including values explicitly specified in the rule's [copts](#cc_binary.copts) attribute) will be removed from `COPTS` for purposes of compiling this rule. This attribute should not be needed or used outside of `third_party`. The values are not preprocessed in any way other than the "Make" variable substitution. | +| `reexport_deps` | List of [labels](/concepts/labels); default is `[]` | +| `stamp` | Integer; default is `0` Whether to encode build information into the binary. Possible values: * `stamp = 1`: Always stamp the build information into the binary, even in [`--nostamp`](/docs/user-manual#flag--stamp) builds. **This setting should be avoided**, since it potentially kills remote caching for the binary and any downstream actions that depend on it. * `stamp = 0`: Always replace build information by constant values. This gives good build result caching. * `stamp = -1`: Embedding of build information is controlled by the [`--[no]stamp`](/docs/user-manual#flag--stamp) flag. Stamped binaries are *not* rebuilt unless their dependencies change. | +| `win_def_file` | [Label](/concepts/labels); default is `None` The Windows DEF file to be passed to linker. This attribute should only be used when Windows is the target platform. It can be used to [export symbols](https://msdn.microsoft.com/en-us/library/d91k01sh.aspx) during linking a shared library. | ## cc\_toolchain @@ -2182,16 +760,12 @@ Represents a C++ toolchain. This rule is responsible for: - - -- Collecting all artifacts needed for C++ actions to run. This is done by - attributes such as `all_files`, `compiler_files`, - `linker_files`, or other attributes ending with `_files`). These are - most commonly filegroups globbing all required files. - -- Generating correct command lines for C++ actions. This is done using - `CcToolchainConfigInfo` provider (details below). - +* Collecting all artifacts needed for C++ actions to run. This is done by + attributes such as `all_files`, `compiler_files`, + `linker_files`, or other attributes ending with `_files`). These are + most commonly filegroups globbing all required files. +* Generating correct command lines for C++ actions. This is done using + `CcToolchainConfigInfo` provider (details below). Use `toolchain_config` attribute to configure the C++ toolchain. See also this @@ -2202,135 +776,29 @@ unnecessarily when invoking `bazel build //...` ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`all_files` - -[Label](/concepts/labels); required - - Collection of all cc\_toolchain artifacts. These artifacts will be added as inputs to all -rules\_cc related actions (with the exception of actions that are using more precise sets of -artifacts from attributes below). Bazel assumes that `all_files` is a superset -of all other artifact-providing attributes (e.g. linkstamp compilation needs both compile -and link files, so it takes `all_files`). - -This is what `cc_toolchain.files` contains, and this is used by all Starlark -rules using C++ toolchain. - -`ar_files` - -[Label](/concepts/labels); default is `None` - - Collection of all cc\_toolchain artifacts required for archiving actions. - `as_files` - -[Label](/concepts/labels); default is `None` - - Collection of all cc\_toolchain artifacts required for assembly actions. - `compiler_files` - -[Label](/concepts/labels); required - - Collection of all cc\_toolchain artifacts required for compile actions. - `compiler_files_without_includes` - -[Label](/concepts/labels); default is `None` - - Collection of all cc\_toolchain artifacts required for compile actions in case when -input discovery is supported (currently Google-only). - `coverage_files` - -[Label](/concepts/labels); default is `None` - - Collection of all cc\_toolchain artifacts required for coverage actions. If not specified, -all\_files are used. - `dwp_files` - -[Label](/concepts/labels); required - - Collection of all cc\_toolchain artifacts required for dwp actions. - `dynamic_runtime_lib` - -[Label](/concepts/labels); default is `None` - - Dynamic library artifact for the C++ runtime library (e.g. libstdc++.so). - -This will be used when 'static\_link\_cpp\_runtimes' feature is enabled, and we're linking -dependencies dynamically. - -`exec_transition_for_inputs` - -Boolean; default is `False` - - Deprecated. No-op. - `libc_top` - -[Label](/concepts/labels); default is `None` - - A collection of artifacts for libc passed as inputs to compile/linking actions. - `linker_files` - -[Label](/concepts/labels); required - - Collection of all cc\_toolchain artifacts required for linking actions. - `module_map` - -[Label](/concepts/labels); default is `None` - - Module map artifact to be used for modular builds. - `objcopy_files` - -[Label](/concepts/labels); required - - Collection of all cc\_toolchain artifacts required for objcopy actions. - `output_licenses` - -List of strings; default is `[]` - -`static_runtime_lib` - -[Label](/concepts/labels); default is `None` - - Static library artifact for the C++ runtime library (e.g. libstdc++.a). - -This will be used when 'static\_link\_cpp\_runtimes' feature is enabled, and we're linking -dependencies statically. - -`strip_files` - -[Label](/concepts/labels); required - - Collection of all cc\_toolchain artifacts required for strip actions. - `supports_header_parsing` - -Boolean; default is `False` - - Set to True when cc\_toolchain supports header parsing actions. - `supports_param_files` - -Boolean; default is `True` - - Set to True when cc\_toolchain supports using param files for linking actions. - `toolchain_config` - -[Label](/concepts/labels); required - - The label of the rule providing `cc_toolchain_config_info`. - `toolchain_identifier` - -String; default is `""` - - The identifier used to match this cc\_toolchain with the corresponding -crosstool\_config.toolchain. - -Until issue [#5380](https://github.com/bazelbuild/bazel/issues/5380) is fixed -this is the recommended way of associating `cc_toolchain` with -`CROSSTOOL.toolchain`. It will be replaced by the `toolchain_config` -attribute ( [#5380](https://github.com/bazelbuild/bazel/issues/5380)). +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `all_files` | [Label](/concepts/labels); required Collection of all cc\_toolchain artifacts. These artifacts will be added as inputs to all rules\_cc related actions (with the exception of actions that are using more precise sets of artifacts from attributes below). Bazel assumes that `all_files` is a superset of all other artifact-providing attributes (e.g. linkstamp compilation needs both compile and link files, so it takes `all_files`). This is what `cc_toolchain.files` contains, and this is used by all Starlark rules using C++ toolchain. | +| `ar_files` | [Label](/concepts/labels); default is `None` Collection of all cc\_toolchain artifacts required for archiving actions. | +| `as_files` | [Label](/concepts/labels); default is `None` Collection of all cc\_toolchain artifacts required for assembly actions. | +| `compiler_files` | [Label](/concepts/labels); required Collection of all cc\_toolchain artifacts required for compile actions. | +| `compiler_files_without_includes` | [Label](/concepts/labels); default is `None` Collection of all cc\_toolchain artifacts required for compile actions in case when input discovery is supported (currently Google-only). | +| `coverage_files` | [Label](/concepts/labels); default is `None` Collection of all cc\_toolchain artifacts required for coverage actions. If not specified, all\_files are used. | +| `dwp_files` | [Label](/concepts/labels); required Collection of all cc\_toolchain artifacts required for dwp actions. | +| `dynamic_runtime_lib` | [Label](/concepts/labels); default is `None` Dynamic library artifact for the C++ runtime library (e.g. libstdc++.so). This will be used when 'static\_link\_cpp\_runtimes' feature is enabled, and we're linking dependencies dynamically. | +| `exec_transition_for_inputs` | Boolean; default is `False` Deprecated. No-op. | +| `libc_top` | [Label](/concepts/labels); default is `None` A collection of artifacts for libc passed as inputs to compile/linking actions. | +| `linker_files` | [Label](/concepts/labels); required Collection of all cc\_toolchain artifacts required for linking actions. | +| `module_map` | [Label](/concepts/labels); default is `None` Module map artifact to be used for modular builds. | +| `objcopy_files` | [Label](/concepts/labels); required Collection of all cc\_toolchain artifacts required for objcopy actions. | +| `output_licenses` | List of strings; default is `[]` | +| `static_runtime_lib` | [Label](/concepts/labels); default is `None` Static library artifact for the C++ runtime library (e.g. libstdc++.a). This will be used when 'static\_link\_cpp\_runtimes' feature is enabled, and we're linking dependencies statically. | +| `strip_files` | [Label](/concepts/labels); required Collection of all cc\_toolchain artifacts required for strip actions. | +| `supports_header_parsing` | Boolean; default is `False` Set to True when cc\_toolchain supports header parsing actions. | +| `supports_param_files` | Boolean; default is `True` Set to True when cc\_toolchain supports using param files for linking actions. | +| `toolchain_config` | [Label](/concepts/labels); required The label of the rule providing `cc_toolchain_config_info`. | +| `toolchain_identifier` | String; default is `""` The identifier used to match this cc\_toolchain with the corresponding crosstool\_config.toolchain. Until issue [#5380](https://github.com/bazelbuild/bazel/issues/5380) is fixed this is the recommended way of associating `cc_toolchain` with `CROSSTOOL.toolchain`. It will be replaced by the `toolchain_config` attribute ([#5380](https://github.com/bazelbuild/bazel/issues/5380)). | ## fdo\_prefetch\_hints @@ -2343,30 +811,19 @@ fdo_prefetch_hints(name, aspect_hints, compatible_with, deprecation, exec_compat Represents an FDO prefetch hints profile that is either in the workspace. Examples: -```lang-starlark - +``` fdo_prefetch_hints( name = "hints", profile = "//path/to/hints:profile.afdo", ) - ``` ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`profile` - -[Label](/concepts/labels); required - - Label of the hints profile. The hints file has the .afdo extension -The label can also point to an fdo\_absolute\_path\_profile rule. - +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `profile` | [Label](/concepts/labels); required Label of the hints profile. The hints file has the .afdo extension The label can also point to an fdo\_absolute\_path\_profile rule. | ## fdo\_profile @@ -2379,45 +836,21 @@ fdo_profile(name, aspect_hints, compatible_with, deprecation, exec_compatible_wi Represents an FDO profile that is in the workspace. Example: -```lang-starlark - +``` fdo_profile( name = "fdo", profile = "//path/to/fdo:profile.zip", ) - ``` ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`memprof_profile` - -[Label](/concepts/labels); default is `None` - - Label of the MemProf profile. The profile is expected to have -either a .profdata extension (for an indexed/symbolized memprof -profile), or a .zip extension for a zipfile containing a memprof.profdata -file. - `profile` - -[Label](/concepts/labels); required - - Label of the FDO profile or a rule which generates it. The FDO file can have one of the -following extensions: .profraw for unindexed LLVM profile, .profdata for indexed LLVM -profile, .zip that holds an LLVM profraw profile, .afdo for AutoFDO profile, .xfdo for -XBinary profile. The label can also point to an fdo\_absolute\_path\_profile rule. - `proto_profile` - -[Label](/concepts/labels); default is `None` - - Label of the protobuf profile. - +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `memprof_profile` | [Label](/concepts/labels); default is `None` Label of the MemProf profile. The profile is expected to have either a .profdata extension (for an indexed/symbolized memprof profile), or a .zip extension for a zipfile containing a memprof.profdata file. | +| `profile` | [Label](/concepts/labels); required Label of the FDO profile or a rule which generates it. The FDO file can have one of the following extensions: .profraw for unindexed LLVM profile, .profdata for indexed LLVM profile, .zip that holds an LLVM profraw profile, .afdo for AutoFDO profile, .xfdo for XBinary profile. The label can also point to an fdo\_absolute\_path\_profile rule. | +| `proto_profile` | [Label](/concepts/labels); default is `None` Label of the protobuf profile. | ## memprof\_profile @@ -2430,33 +863,19 @@ memprof_profile(name, aspect_hints, compatible_with, deprecation, exec_compatibl Represents a MEMPROF profile that is in the workspace. Example: -```lang-starlark - +``` memprof_profile( name = "memprof", profile = "//path/to/memprof:profile.afdo", ) - ``` ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`profile` - -[Label](/concepts/labels); required - - Label of the MEMPROF profile. The profile is expected to have -either a .profdata extension (for an indexed/symbolized memprof -profile), or a .zip extension for a zipfile containing a memprof.profdata -file. -The label can also point to an fdo\_absolute\_path\_profile rule. - +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `profile` | [Label](/concepts/labels); required Label of the MEMPROF profile. The profile is expected to have either a .profdata extension (for an indexed/symbolized memprof profile), or a .zip extension for a zipfile containing a memprof.profdata file. The label can also point to an fdo\_absolute\_path\_profile rule. | ## propeller\_optimize @@ -2469,33 +888,18 @@ propeller_optimize(name, aspect_hints, cc_profile, compatible_with, deprecation, Represents a Propeller optimization profile in the workspace. Example: -```lang-starlark - +``` propeller_optimize( name = "layout", cc_profile = "//path:cc_profile.txt", ld_profile = "//path:ld_profile.txt" ) - ``` ### Arguments -Attributes`name` - -[Name](/concepts/labels#target-names); required - -A unique name for this target. - -`cc_profile` - -[Label](/concepts/labels); required - - Label of the profile passed to the various compile actions. This file has -the .txt extension. - `ld_profile` - -[Label](/concepts/labels); required - - Label of the profile passed to the link action. This file has -the .txt extension. +| Attributes | | +| --- | --- | +| `name` | [Name](/concepts/labels#target-names); required A unique name for this target. | +| `cc_profile` | [Label](/concepts/labels); required Label of the profile passed to the various compile actions. This file has the .txt extension. | +| `ld_profile` | [Label](/concepts/labels); required Label of the profile passed to the link action. This file has the .txt extension. | \ No newline at end of file diff --git a/reference/be/common-definitions.mdx b/reference/be/common-definitions.mdx index 4c9db5eaf..6cab2c1f0 100644 --- a/reference/be/common-definitions.mdx +++ b/reference/be/common-definitions.mdx @@ -2,21 +2,19 @@ title: 'Common definitions' --- - - This section defines various terms and concepts that are common to many functions or build rules. ## Contents -- [Bourne shell tokenization](#sh-tokenization) -- [Label Expansion](#label-expansion) -- [Typical attributes defined by most build rules](#typical-attributes) -- [Attributes common to all build rules](#common-attributes) -- [Attributes common to all test rules (\*\_test)](#common-attributes-tests) -- [Attributes common to all binary rules (\*\_binary)](#common-attributes-binaries) -- [Configurable attributes](#configurable-attributes) -- [Implicit output targets](#implicit-outputs) +* [Bourne shell tokenization](#sh-tokenization) +* [Label Expansion](#label-expansion) +* [Typical attributes defined by most build rules](#typical-attributes) +* [Attributes common to all build rules](#common-attributes) +* [Attributes common to all test rules (\*\_test)](#common-attributes-tests) +* [Attributes common to all binary rules (\*\_binary)](#common-attributes-binaries) +* [Configurable attributes](#configurable-attributes) +* [Implicit output targets](#implicit-outputs) ## Bourne shell tokenization @@ -44,7 +42,8 @@ expansion: if those strings contain a valid label as a substring, such as `//mypkg:target`, and that label is a declared prerequisite of the current rule, it is expanded into the pathname of the file represented by the -[target](https://bazel.build/reference/glossary#target) `//mypkg:target`. +[target](https://bazel.build/reference/glossary#target) +`//mypkg:target`. Example attributes include `genrule.cmd` and `cc_binary.linkopts`. The details may vary significantly in @@ -58,639 +57,59 @@ specifics. This section describes attributes that are defined by many build rules, but not all. -AttributeDescription`data` - -List of [labels](/concepts/labels); default is `[]` - -Files needed by this rule at runtime. May list file or rule targets. Generally -allows any target. - -The default outputs and runfiles of targets in the `data` attribute -should appear in the `*.runfiles` area of any executable which is -output by or has a runtime dependency on this target. This may include data -files or binaries used when this target's -[`srcs`](#typical.srcs) are executed. See the -[data dependencies](/concepts/dependencies#data-dependencies) -section for more information about how to depend on and use data files. - -New rules should define a `data` attribute if they process -inputs which might use other inputs at runtime. Rules' implementation functions -must also [populate the target's\ -runfiles](https://bazel.build/rules/rules#runfiles) from the outputs and runfiles of any `data` attribute, -as well as runfiles from any dependency attribute which provides either -source code or runtime dependencies. - -`deps` - -List of [labels](/concepts/labels); default is `[]` - -Dependencies for this target. Generally should only list rule targets. (Though -some rules permit files to be listed directly in `deps`, this -should be avoided when possible.) - -Language-specific rules generally limit the listed targets to those with -specific [providers](https://bazel.build/extending/rules#providers). - -The precise semantics of what it means for a target to depend on another using -`deps` are specific to the kind of rule, and the rule-specific -documentation goes into more detail. For rules which process source code, -`deps` generally specifies code dependencies used by the code in -[`srcs`](#typical.srcs). - -Most often, a `deps` dependency is used to allow one module to use -symbols defined in another module written in the same programming language and -separately compiled. Cross-language dependencies are also permitted in many -cases: For example, a `java_library` target may depend on C++ code -in a `cc_library` target, by listing the latter in the -`deps` attribute. See the definition of -[dependencies](/concepts/build-ref#deps) -for more information. - -`licenses` - -List of strings; [nonconfigurable](#configurable-attributes); -default is `["none"]` - -A list of license-type strings to be used for this particular target. - -This is part of a deprecated licensing API that Bazel no longer uses. Don't -use this. - -`srcs` - -List of [labels](/concepts/labels); default is `[]` - -Files processed or included by this rule. Generally lists files directly, but -may list rule targets (like `filegroup` or `genrule`) to -include their default outputs. - -Language-specific rules often require that the listed files have particular -file extensions. +| Attribute | Description | +| --- | --- | +| `data` | List of [labels](/concepts/labels); default is `[]` Files needed by this rule at runtime. May list file or rule targets. Generally allows any target. The default outputs and runfiles of targets in the `data` attribute should appear in the `*.runfiles` area of any executable which is output by or has a runtime dependency on this target. This may include data files or binaries used when this target's [`srcs`](#typical.srcs) are executed. See the [data dependencies](/concepts/dependencies#data-dependencies) section for more information about how to depend on and use data files. New rules should define a `data` attribute if they process inputs which might use other inputs at runtime. Rules' implementation functions must also [populate the target's runfiles](https://bazel.build/rules/rules#runfiles) from the outputs and runfiles of any `data` attribute, as well as runfiles from any dependency attribute which provides either source code or runtime dependencies. | +| `deps` | List of [labels](/concepts/labels); default is `[]` Dependencies for this target. Generally should only list rule targets. (Though some rules permit files to be listed directly in `deps`, this should be avoided when possible.) Language-specific rules generally limit the listed targets to those with specific [providers](https://bazel.build/extending/rules#providers). The precise semantics of what it means for a target to depend on another using `deps` are specific to the kind of rule, and the rule-specific documentation goes into more detail. For rules which process source code, `deps` generally specifies code dependencies used by the code in [`srcs`](#typical.srcs). Most often, a `deps` dependency is used to allow one module to use symbols defined in another module written in the same programming language and separately compiled. Cross-language dependencies are also permitted in many cases: For example, a `java_library` target may depend on C++ code in a `cc_library` target, by listing the latter in the `deps` attribute. See the definition of [dependencies](/concepts/build-ref#deps) for more information. | +| `licenses` | List of strings; [nonconfigurable](#configurable-attributes); default is `["none"]` A list of license-type strings to be used for this particular target. This is part of a deprecated licensing API that Bazel no longer uses. Don't use this. | +| `srcs` | List of [labels](/concepts/labels); default is `[]` Files processed or included by this rule. Generally lists files directly, but may list rule targets (like `filegroup` or `genrule`) to include their default outputs. Language-specific rules often require that the listed files have particular file extensions. | ## Attributes common to all build rules This section describes attributes that are implicitly added to all build rules. -AttributeDescription`aspect_hints` - -List of [labels](/concepts/labels); default is `[]` - -A list of arbitrary labels which is exposed to [aspects](/extending/aspects) (in -particular - aspects invoked by this rule's reverse dependencies), but isn't exposed to this rule's -own implementation. Consult documentation for language-specific rule sets for details about what -effect a particular aspect hint would have. - -You could think of an aspect hint as a richer alternative to a [tag](#common.tags): -while a tag conveys only a boolean state (the tag is either present or absent in the -`tags` list), an aspect hint can convey arbitrary structured information in its -[providers](/extending/rules#providers). - -In practice, aspect hints are used for interoperability between different language-specific -rule sets. For example, imagine you have a `mylang_binary` target which needs to depend -on an `otherlang_library` target. The MyLang-specific logic needs some additional -information about the OtherLang target in order to use it, but `otherlang_library` -doesn't provide this information because it knows nothing about MyLang. One solution might be for -the MyLang rule set to define a `mylang_hint` rule which can be used to encode that -additional information; the user can add the hint to their `otherlang_library`'s -`aspect_hints`, and `mylang_binary` can use an aspect to collect the -additional information from a MyLang-specific provider in the `mylang_hint`. - -For a concrete example, see -[`swift_interop_hint`](https://github.com/bazelbuild/rules_swift/blob/master/doc/rules.md#swift_interop_hint) -and [`swift_overlay`](https://github.com/bazelbuild/rules_swift/blob/master/doc/rules.md#swift_overlay) -in `rules_swift`. - -Best practices: - -- Targets listed in `aspect_hints` should be lightweight and minimal. -- Language-specific logic should consider only aspect hints having providers relevant to that - language, and should ignore any other aspect hints. - -`compatible_with` - -List of [labels](/concepts/labels); -[nonconfigurable](#configurable-attributes); default is `[]` - -The list of environments this target can be built for, in addition to -default-supported environments. - -This is part of Bazel's constraint system, which lets users declare which -targets can and cannot depend on each other. For example, externally deployable -binaries shouldn't depend on libraries with company-secret code. See -[ConstraintSemantics](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java#L46) for details. - -`deprecation` - -String; [nonconfigurable](#configurable-attributes); default is `None` - -An explanatory warning message associated with this target. -Typically this is used to notify users that a target has become obsolete, -or has become superseded by another rule, is private to a package, or is -perhaps considered harmful for some reason. It is a good idea to include -some reference (like a webpage, a bug number or example migration CLs) so -that one can easily find out what changes are required to avoid the message. -If there is a new target that can be used as a drop in replacement, it is a -good idea to just migrate all users of the old target. - -This attribute has no effect on the way things are built, but it -may affect a build tool's diagnostic output. The build tool issues a -warning when a rule with a `deprecation` attribute is -depended upon by a target in another package. - -Intra-package dependencies are exempt from this warning, so that, -for example, building the tests of a deprecated rule does not -encounter a warning. - -If a deprecated target depends on another deprecated target, no warning -message is issued. - -Once people have stopped using it, the target can be removed. - -`exec_compatible_with` - -List of [labels](/concepts/labels); -[nonconfigurable](#configurable-attributes); default is `[]` - -A list of -`constraint_values` -that must be present in the execution platform of this target's default exec -group. This is in addition to any constraints already set by the rule type. -Constraints are used to restrict the list of available execution platforms. - -For more details, see -the description of -[toolchain resolution](/docs/toolchains#toolchain-resolution). -and -[exec groups](/extending/exec-groups) - -`exec_group_compatible_with` - -Dictionary of strings to lists of [labels](/concepts/labels); -[nonconfigurable](#configurable-attributes); default is `{}` - -A dictionary of exec group names to lists of -`constraint_values` -that must be present in the execution platform for the given exec group. This -is in addition to any constraints already set on the exec group's definition. -Constraints are used to restrict the list of available execution platforms. - -For more details, see -the description of -[toolchain resolution](/docs/toolchains#toolchain-resolution). -and -[exec groups](/extending/exec-groups) - -`exec_properties` - -Dictionary of strings; default is `{}` - -A dictionary of strings that will be added to the `exec_properties` of a platform selected for this target. See `exec_properties` of the [platform](platforms-and-toolchains.html#platform) rule. - -If a key is present in both the platform and target-level properties, the value will be taken from the target. - -Keys can be prefixed with the name of an execution group followed by a `.` to apply them only to that particular exec group. - -`features` - -List of _feature_ strings; default is `[]` - -A feature is string tag that can be enabled or disabled on a target. The -meaning of a feature depends on the rule itself. - -This `features` attribute is combined with the [package](/reference/be/functions.html#package) level `features` attribute. For example, if -the features \["a", "b"\] are enabled on the package level, and a target's -`features` attribute contains \["-a", "c"\], the features enabled for the -rule will be "b" and "c". -[See example](https://github.com/bazelbuild/examples/blob/main/rules/features/BUILD). - -`package_metadata` - -List of [labels](/concepts/labels); -[nonconfigurable](#configurable-attributes); default is the package's -`default_package_metadata` - -A list of labels that are associated metadata about this target. -Typically, the labels are simple rules that return a provider of -constant values. Rules and aspects may use these labels to perform some -additional analysis on the build graph. - -The canonical use case is that of -[rules\_license](https://github.com/bazelbuild/rules_license). -For that use case, `package_metadata` and -`default_package_metadata` is used to attach information -about a package's licence or version to targets. An aspect applied -to a top-level binary can be used to gather those and produce -compliance reports. - -`restricted_to` - -List of [labels](/concepts/labels); -[nonconfigurable](#configurable-attributes); default is `[]` - -The list of environments this target can be built for, _instead_ of -default-supported environments. - -This is part of Bazel's constraint system. See -`compatible_with` -for details. - -`tags` - -List of strings; [nonconfigurable](#configurable-attributes); -default is `[]` - -_Tags_ can be used on any rule. _Tags_ on test and -`test_suite` rules are useful for categorizing the tests. -_Tags_ on non-test targets are used to control sandboxed execution of -`genrule` s and - -[Starlark](/rules/concepts) -actions, and for parsing by humans and/or external tools. - -Bazel modifies the behavior of its sandboxing code if it finds the following -keywords in the `tags` attribute of any test or `genrule` -target, or the keys of `execution_requirements` for any Starlark -action. - -- `no-sandbox` keyword results in the action or test never being - sandboxed; it can still be cached or run remotely - use `no-cache` - or `no-remote` to prevent either or both of those. - -- `no-cache` keyword results in the action or test never being - cached (locally or remotely). Note: for the purposes of this tag, the disk cache - is considered a local cache, whereas the HTTP and gRPC caches are considered - remote. Other caches, such as Skyframe or the persistent action cache, are not - affected. - -- `no-remote-cache` keyword results in the action or test never being - cached remotely (but it may be cached locally; it may also be executed remotely). - Note: for the purposes of this tag, the disk cache is considered a local cache, - whereas the HTTP and gRPC caches are considered remote. Other caches, such as - Skyframe or the persistent action cache, are not affected. - If a combination of local disk cache and remote cache are used (combined cache), - it's treated as a remote cache and disabled entirely unless `--incompatible_remote_results_ignore_disk` - is set in which case the local components will be used. - -- `no-remote-exec` keyword results in the action or test never being - executed remotely (but it may be cached remotely). - -- `no-remote` keyword prevents the action or test from being executed remotely or - cached remotely. This is equivalent to using both - `no-remote-cache` and `no-remote-exec`. - -- `no-remote-cache-upload` keyword disables upload part of remote caching of a spawn. - it does not disable remote execution. - -- `local` keyword precludes the action or test from being remotely cached, - remotely executed, or run inside the sandbox. - For genrules and tests, marking the rule with the `local = True` - attribute has the same effect. - -- `requires-network` keyword allows access to the external - network from inside the sandbox. This tag only has an effect if sandboxing - is enabled. - -- `block-network` keyword blocks access to the external - network from inside the sandbox. In this case, only communication - with localhost is allowed. This tag only has an effect if sandboxing is - enabled. - -- `requires-fakeroot` runs the test or action as uid and gid 0 (i.e., the root - user). This is only supported on Linux. This tag takes precedence over the - `--sandbox_fake_username` command-line option. - - -_Tags_ on tests are generally used to annotate a test's role in your -debug and release process. Typically, tags are most useful for C++ and Python -tests, which lack any runtime annotation ability. The use of tags and size -elements gives flexibility in assembling suites of tests based around codebase -check-in policy. - -Bazel modifies test running behavior if it finds the following keywords in the -`tags` attribute of the test rule: - -- `exclusive` will force the test to be run in the - "exclusive" mode, ensuring that no other tests are running at the - same time. Such tests will be executed in serial fashion after all build - activity and non-exclusive tests have been completed. Remote execution is - disabled for such tests because Bazel doesn't have control over what's - running on a remote machine. - -- `exclusive-if-local` will force the test to be run in the - "exclusive" mode if it is executed locally, but will run the test in parallel if it's - executed remotely. - -- `manual` keyword will exclude the target from expansion of target pattern wildcards - ( `...`, `:*`, `:all`, etc.) and `test_suite` rules - which do not list the test explicitly when computing the set of top-level targets to build/run - for the `build`, `test`, and `coverage` commands. It does not - affect target wildcard or test suite expansion in other contexts, including the - `query` command. Note that `manual` does not imply that a target should - not be built/run automatically by continuous build/test systems. For example, it may be - desirable to exclude a target from `bazel test ...` because it requires specific - Bazel flags, but still have it included in properly-configured presubmit or continuous test - runs. - - -- `external` keyword will force test to be unconditionally - executed (regardless of `--cache_test_results` - value). - - -See -[Tag Conventions](/reference/test-encyclopedia#tag-conventions) - in the Test Encyclopedia for more conventions on tags attached to test targets. -`target_compatible_with` - -List of [labels](/concepts/labels); default is `[]` - -A list of -`constraint_value` s -that must be present in the target platform for this target to be considered -_compatible_. This is in addition to any constraints already set by the -rule type. If the target platform does not satisfy all listed constraints then -the target is considered _incompatible_. Incompatible targets are -skipped for building and testing when the target pattern is expanded -(e.g. `//...`, `:all`). When explicitly specified on the -command line, incompatible targets cause Bazel to print an error and cause a -build or test failure. - -Targets that transitively depend on incompatible targets are themselves -considered incompatible. They are also skipped for building and testing. - -An empty list (which is the default) signifies that the target is compatible -with all platforms. - -All rules other than [Workspace Rules](workspace.html) support this -attribute. -For some rules this attribute has no effect. For example, specifying -`target_compatible_with` for a -`cc_toolchain` is not useful. - -See the -[Platforms](/docs/platforms#skipping-incompatible-targets) -page for more information about incompatible target skipping. - -`testonly` - -Boolean; [nonconfigurable](#configurable-attributes); default is `False` -except for test and test suite targets - -If `True`, only testonly targets (such as tests) can depend on this target. - -Equivalently, a rule that is not `testonly` is not allowed to -depend on any rule that is `testonly`. - -Tests ( `*_test` rules) -and test suites ( [test\_suite](/reference/be/general.html#test_suite) rules) -are `testonly` by default. - -This attribute is intended to mean that the target should not be -contained in binaries that are released to production. - -Because testonly is enforced at build time, not run time, and propagates -virally through the dependency tree, it should be applied judiciously. For -example, stubs and fakes that -are useful for unit tests may also be useful for integration tests -involving the same binaries that will be released to production, and -therefore should probably not be marked testonly. Conversely, rules that -are dangerous to even link in, perhaps because they unconditionally -override normal behavior, should definitely be marked testonly. - -`toolchains` - -List of [labels](/concepts/labels); -[nonconfigurable](#configurable-attributes); default is `[]` - -The set of targets whose [Make variables](/reference/be/make-variables) this target is -allowed to access. These targets are either instances of rules that provide -`TemplateVariableInfo` or special targets for toolchain types built into Bazel. These -include: - -- `@bazel_tools//tools/cpp:toolchain_type` -- `@rules_java//toolchains:current_java_runtime` - -Note that this is distinct from the concept of -[toolchain resolution](/docs/toolchains#toolchain-resolution) -that is used by rule implementations for platform-dependent configuration. You cannot use this -attribute to determine which specific `cc_toolchain` or `java_toolchain` a -target will use. - -`visibility` - -List of [labels](/concepts/labels); -[nonconfigurable](#configurable-attributes); -default varies - -The `visibility` attribute controls whether the target can be -depended on by targets in other locations. See the documentation for -[visibility](/concepts/visibility). - -For targets declared directly in a BUILD file or in legacy macros called from -a BUILD file, the default value is the package's -`default_visibility` -if specified, or else `["//visibility:private"]`. For targets -declared in one or more symbolic macros, the default value is always just -`["//visibility:private"]` (which makes it useable only within the -package containing the macro's code). +| Attribute | Description | +| --- | --- | +| `aspect_hints` | List of [labels](/concepts/labels); default is `[]` A list of arbitrary labels which is exposed to [aspects](/extending/aspects) (in particular - aspects invoked by this rule's reverse dependencies), but isn't exposed to this rule's own implementation. Consult documentation for language-specific rule sets for details about what effect a particular aspect hint would have. You could think of an aspect hint as a richer alternative to a [tag](#common.tags): while a tag conveys only a boolean state (the tag is either present or absent in the `tags` list), an aspect hint can convey arbitrary structured information in its [providers](/extending/rules#providers). In practice, aspect hints are used for interoperability between different language-specific rule sets. For example, imagine you have a `mylang_binary` target which needs to depend on an `otherlang_library` target. The MyLang-specific logic needs some additional information about the OtherLang target in order to use it, but `otherlang_library` doesn't provide this information because it knows nothing about MyLang. One solution might be for the MyLang rule set to define a `mylang_hint` rule which can be used to encode that additional information; the user can add the hint to their `otherlang_library`'s `aspect_hints`, and `mylang_binary` can use an aspect to collect the additional information from a MyLang-specific provider in the `mylang_hint`. For a concrete example, see [`swift_interop_hint`](https://github.com/bazelbuild/rules_swift/blob/master/doc/rules.md#swift_interop_hint) and [`swift_overlay`](https://github.com/bazelbuild/rules_swift/blob/master/doc/rules.md#swift_overlay) in `rules_swift`. Best practices: * Targets listed in `aspect_hints` should be lightweight and minimal. * Language-specific logic should consider only aspect hints having providers relevant to that language, and should ignore any other aspect hints. | +| `compatible_with` | List of [labels](/concepts/labels); [nonconfigurable](#configurable-attributes); default is `[]` The list of environments this target can be built for, in addition to default-supported environments. This is part of Bazel's constraint system, which lets users declare which targets can and cannot depend on each other. For example, externally deployable binaries shouldn't depend on libraries with company-secret code. See [ConstraintSemantics](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/ConstraintSemantics.java#L46) for details. | +| `deprecation` | String; [nonconfigurable](#configurable-attributes); default is `None` An explanatory warning message associated with this target. Typically this is used to notify users that a target has become obsolete, or has become superseded by another rule, is private to a package, or is perhaps considered harmful for some reason. It is a good idea to include some reference (like a webpage, a bug number or example migration CLs) so that one can easily find out what changes are required to avoid the message. If there is a new target that can be used as a drop in replacement, it is a good idea to just migrate all users of the old target. This attribute has no effect on the way things are built, but it may affect a build tool's diagnostic output. The build tool issues a warning when a rule with a `deprecation` attribute is depended upon by a target in another package. Intra-package dependencies are exempt from this warning, so that, for example, building the tests of a deprecated rule does not encounter a warning. If a deprecated target depends on another deprecated target, no warning message is issued. Once people have stopped using it, the target can be removed. | +| `exec_compatible_with` | List of [labels](/concepts/labels); [nonconfigurable](#configurable-attributes); default is `[]` A list of `constraint_values` that must be present in the execution platform of this target's default exec group. This is in addition to any constraints already set by the rule type. Constraints are used to restrict the list of available execution platforms. For more details, see the description of [toolchain resolution](/docs/toolchains#toolchain-resolution). and [exec groups](/extending/exec-groups) | +| `exec_group_compatible_with` | Dictionary of strings to lists of [labels](/concepts/labels); [nonconfigurable](#configurable-attributes); default is `{}` A dictionary of exec group names to lists of `constraint_values` that must be present in the execution platform for the given exec group. This is in addition to any constraints already set on the exec group's definition. Constraints are used to restrict the list of available execution platforms. For more details, see the description of [toolchain resolution](/docs/toolchains#toolchain-resolution). and [exec groups](/extending/exec-groups) | +| `exec_properties` | Dictionary of strings; default is `{}` A dictionary of strings that will be added to the `exec_properties` of a platform selected for this target. See `exec_properties` of the [platform](platforms-and-toolchains#platform) rule. If a key is present in both the platform and target-level properties, the value will be taken from the target. Keys can be prefixed with the name of an execution group followed by a `.` to apply them only to that particular exec group. | +| `features` | List of *feature* strings; default is `[]` A feature is string tag that can be enabled or disabled on a target. The meaning of a feature depends on the rule itself. This `features` attribute is combined with the [package](/reference/be/functions#package) level `features` attribute. For example, if the features ["a", "b"] are enabled on the package level, and a target's `features` attribute contains ["-a", "c"], the features enabled for the rule will be "b" and "c". [See example](https://github.com/bazelbuild/examples/blob/main/rules/features/BUILD). | +| `package_metadata` | List of [labels](/concepts/labels); [nonconfigurable](#configurable-attributes); default is the package's `default_package_metadata` A list of labels that are associated metadata about this target. Typically, the labels are simple rules that return a provider of constant values. Rules and aspects may use these labels to perform some additional analysis on the build graph. The canonical use case is that of [rules\_license](https://github.com/bazelbuild/rules_license). For that use case, `package_metadata` and `default_package_metadata` is used to attach information about a package's licence or version to targets. An aspect applied to a top-level binary can be used to gather those and produce compliance reports. | +| `restricted_to` | List of [labels](/concepts/labels); [nonconfigurable](#configurable-attributes); default is `[]` The list of environments this target can be built for, *instead* of default-supported environments. This is part of Bazel's constraint system. See `compatible_with` for details. | +| `tags` | List of strings; [nonconfigurable](#configurable-attributes); default is `[]` *Tags* can be used on any rule. *Tags* on test and `test_suite` rules are useful for categorizing the tests. *Tags* on non-test targets are used to control sandboxed execution of `genrule`s and [Starlark](/rules/concepts) actions, and for parsing by humans and/or external tools. Bazel modifies the behavior of its sandboxing code if it finds the following keywords in the `tags` attribute of any test or `genrule` target, or the keys of `execution_requirements` for any Starlark action. * `no-sandbox` keyword results in the action or test never being sandboxed; it can still be cached or run remotely - use `no-cache` or `no-remote` to prevent either or both of those. * `no-cache` keyword results in the action or test never being cached (locally or remotely). Note: for the purposes of this tag, the disk cache is considered a local cache, whereas the HTTP and gRPC caches are considered remote. Other caches, such as Skyframe or the persistent action cache, are not affected. * `no-remote-cache` keyword results in the action or test never being cached remotely (but it may be cached locally; it may also be executed remotely). Note: for the purposes of this tag, the disk cache is considered a local cache, whereas the HTTP and gRPC caches are considered remote. Other caches, such as Skyframe or the persistent action cache, are not affected. If a combination of local disk cache and remote cache are used (combined cache), it's treated as a remote cache and disabled entirely unless `--incompatible_remote_results_ignore_disk` is set in which case the local components will be used. * `no-remote-exec` keyword results in the action or test never being executed remotely (but it may be cached remotely). * `no-remote` keyword prevents the action or test from being executed remotely or cached remotely. This is equivalent to using both `no-remote-cache` and `no-remote-exec`. * `no-remote-cache-upload` keyword disables upload part of remote caching of a spawn. it does not disable remote execution. * `local` keyword precludes the action or test from being remotely cached, remotely executed, or run inside the sandbox. For genrules and tests, marking the rule with the `local = True` attribute has the same effect. * `requires-network` keyword allows access to the external network from inside the sandbox. This tag only has an effect if sandboxing is enabled. * `block-network` keyword blocks access to the external network from inside the sandbox. In this case, only communication with localhost is allowed. This tag only has an effect if sandboxing is enabled. * `requires-fakeroot` runs the test or action as uid and gid 0 (i.e., the root user). This is only supported on Linux. This tag takes precedence over the `--sandbox_fake_username` command-line option. *Tags* on tests are generally used to annotate a test's role in your debug and release process. Typically, tags are most useful for C++ and Python tests, which lack any runtime annotation ability. The use of tags and size elements gives flexibility in assembling suites of tests based around codebase check-in policy. Bazel modifies test running behavior if it finds the following keywords in the `tags` attribute of the test rule: * `exclusive` will force the test to be run in the "exclusive" mode, ensuring that no other tests are running at the same time. Such tests will be executed in serial fashion after all build activity and non-exclusive tests have been completed. Remote execution is disabled for such tests because Bazel doesn't have control over what's running on a remote machine. * `exclusive-if-local` will force the test to be run in the "exclusive" mode if it is executed locally, but will run the test in parallel if it's executed remotely. * `manual` keyword will exclude the target from expansion of target pattern wildcards (`...`, `:*`, `:all`, etc.) and `test_suite` rules which do not list the test explicitly when computing the set of top-level targets to build/run for the `build`, `test`, and `coverage` commands. It does not affect target wildcard or test suite expansion in other contexts, including the `query` command. Note that `manual` does not imply that a target should not be built/run automatically by continuous build/test systems. For example, it may be desirable to exclude a target from `bazel test ...` because it requires specific Bazel flags, but still have it included in properly-configured presubmit or continuous test runs. * `external` keyword will force test to be unconditionally executed (regardless of `--cache_test_results` value). See [Tag Conventions](/reference/test-encyclopedia#tag-conventions) in the Test Encyclopedia for more conventions on tags attached to test targets. | +| `target_compatible_with` | List of [labels](/concepts/labels); default is `[]` A list of `constraint_value`s that must be present in the target platform for this target to be considered *compatible*. This is in addition to any constraints already set by the rule type. If the target platform does not satisfy all listed constraints then the target is considered *incompatible*. Incompatible targets are skipped for building and testing when the target pattern is expanded (e.g. `//...`, `:all`). When explicitly specified on the command line, incompatible targets cause Bazel to print an error and cause a build or test failure. Targets that transitively depend on incompatible targets are themselves considered incompatible. They are also skipped for building and testing. An empty list (which is the default) signifies that the target is compatible with all platforms. All rules other than [Workspace Rules](workspace) support this attribute. For some rules this attribute has no effect. For example, specifying `target_compatible_with` for a `cc_toolchain` is not useful. See the [Platforms](/docs/platforms#skipping-incompatible-targets) page for more information about incompatible target skipping. | +| `testonly` | Boolean; [nonconfigurable](#configurable-attributes); default is `False` except for test and test suite targets If `True`, only testonly targets (such as tests) can depend on this target. Equivalently, a rule that is not `testonly` is not allowed to depend on any rule that is `testonly`. Tests (`*_test` rules) and test suites ([test\_suite](/reference/be/general#test_suite) rules) are `testonly` by default. This attribute is intended to mean that the target should not be contained in binaries that are released to production. Because testonly is enforced at build time, not run time, and propagates virally through the dependency tree, it should be applied judiciously. For example, stubs and fakes that are useful for unit tests may also be useful for integration tests involving the same binaries that will be released to production, and therefore should probably not be marked testonly. Conversely, rules that are dangerous to even link in, perhaps because they unconditionally override normal behavior, should definitely be marked testonly. | +| `toolchains` | List of [labels](/concepts/labels); [nonconfigurable](#configurable-attributes); default is `[]` The set of targets whose [Make variables](/reference/be/make-variables) this target is allowed to access. These targets are either instances of rules that provide `TemplateVariableInfo` or special targets for toolchain types built into Bazel. These include: * `@bazel_tools//tools/cpp:toolchain_type`* `@rules_java//toolchains:current_java_runtime` Note that this is distinct from the concept of [toolchain resolution](/docs/toolchains#toolchain-resolution) that is used by rule implementations for platform-dependent configuration. You cannot use this attribute to determine which specific `cc_toolchain` or `java_toolchain` a target will use. | +| `visibility` | List of [labels](/concepts/labels); [nonconfigurable](#configurable-attributes); default varies The `visibility` attribute controls whether the target can be depended on by targets in other locations. See the documentation for [visibility](/concepts/visibility). For targets declared directly in a BUILD file or in legacy macros called from a BUILD file, the default value is the package's `default_visibility` if specified, or else `["//visibility:private"]`. For targets declared in one or more symbolic macros, the default value is always just `["//visibility:private"]` (which makes it useable only within the package containing the macro's code). | ## Attributes common to all test rules (\*\_test) This section describes attributes that are common to all test rules. -AttributeDescription`args` - -List of strings; subject to -[$(location)](/reference/be/make-variables#predefined_label_variables) and -["Make variable"](/reference/be/make-variables) substitution, and -[Bourne shell tokenization](#sh-tokenization); default is `[]` - -Command line arguments that Bazel passes to the target when it is -executed with `bazel test`. - -These arguments are passed before any `--test_arg` values -specified on the `bazel test` command line. - -`env` - -Dictionary of strings; values are subject to -[$(location)](/reference/be/make-variables#predefined_label_variables) and -["Make variable"](/reference/be/make-variables) substitution; default is `{}` - -Specifies additional environment variables to set when the test is executed by -`bazel test`. - -This attribute only applies to native rules, like `cc_test`, -`py_test`, and `sh_test`. It does not apply to -Starlark-defined test rules. For your own Starlark rules, you can add an "env" -attribute and use it to populate a - -[RunEnvironmentInfo](/rules/lib/providers/RunEnvironmentInfo.html) -Provider. - -[TestEnvironment](/rules/lib/toplevel/testing#TestEnvironment) - - Provider. - -`env_inherit` - -List of strings; default is `[]` - -Specifies additional environment variables to inherit from the -external environment when the test is executed by `bazel test`. - -This attribute only applies to native rules, like `cc_test`, `py_test`, -and `sh_test`. It does not apply to Starlark-defined test rules. - -`size` - -String `"enormous"`, `"large"`, `"medium"`, or -`"small"`; [nonconfigurable](#configurable-attributes); -default is `"medium"` - -Specifies a test target's "heaviness": how much time/resources it needs to run. - -Unit tests are considered "small", integration tests "medium", and end-to-end tests "large" or -"enormous". Bazel uses the size to determine a default timeout, which can be overridden using the -`timeout` attribute. The timeout is for all tests in the BUILD target, not for each -individual test. When the test is run locally, the `size` is additionally used for -scheduling purposes: Bazel tries to respect `--local_{ram,cpu}_resources` and not -overwhelm the local machine by running lots of heavy tests at the same time. - -Test sizes correspond to the following default timeouts and assumed peak local resource -usages: - -SizeRAM (in MB)CPU (in CPU cores)Default timeoutsmall201short (1 minute)medium1001moderate (5 minutes)large3001long (15 minutes)enormous8001eternal (60 minutes) - -The environment variable -`TEST_SIZE` will be set to -the value of this attribute when spawning the test. - -`timeout` - -String `"short"`, `"moderate"`, `"long"`, or -`"eternal"`; [nonconfigurable](#configurable-attributes); default is derived -from the test's `size` attribute - -How long the test is expected to run before returning. - -While a test's size attribute controls resource estimation, a test's -timeout may be set independently. If not explicitly specified, the -timeout is based on the [test's size](#test.size). The test -timeout can be overridden with the `--test_timeout` flag, e.g. for -running under certain conditions which are known to be slow. Test timeout values -correspond to the following time periods: - -Timeout ValueTime Periodshort1 minutemoderate5 minuteslong15 minuteseternal60 minutes - -For times other than the above, the test timeout can be overridden with the -`--test_timeout` bazel flag, e.g. for manually running under -conditions which are known to be slow. The `--test_timeout` values -are in seconds. For example `--test_timeout=120` will set the test -timeout to two minutes. - -The environment variable -`TEST_TIMEOUT` will be set -to the test timeout (in seconds) when spawning the test. - -`flaky` - -Boolean; [nonconfigurable](#configurable-attributes); -default is `False` - -Marks test as flaky. - -If set, executes the test up to three times, marking it as failed only if it -fails each time. By default, this attribute is set to False and the test is -executed only once. Note, that use of this attribute is generally discouraged - -tests should pass reliably when their assertions are upheld. - -`shard_count` - -Non-negative integer less than or equal to 50; default is `-1` - -Specifies the number of parallel shards -to use to run the test. - -If set, this value will override any heuristics used to determine the number of -parallel shards with which to run the test. Note that for some test -rules, this parameter may be required to enable sharding -in the first place. Also see `--test_sharding_strategy`. - -If test sharding is enabled, the environment variable ` -TEST_TOTAL_SHARDS -` will be set to this value when spawning the test. - -Sharding requires the test runner to support the test sharding protocol. -If it does not, then it will most likely run every test in every shard, which -is not what you want. - -See -[Test Sharding](/reference/test-encyclopedia#test-sharding) -in the Test Encyclopedia for details on sharding. - -`local` - -Boolean; [nonconfigurable](#configurable-attributes); -default is `False` - -Forces the test to be run locally, without sandboxing. - -Setting this to True is equivalent to providing "local" as a tag -( `tags=["local"]`). +| Attribute | Description | +| --- | --- | +| `args` | List of strings; subject to [$(location)](/reference/be/make-variables#predefined_label_variables) and ["Make variable"](/reference/be/make-variables) substitution, and [Bourne shell tokenization](#sh-tokenization); default is `[]` Command line arguments that Bazel passes to the target when it is executed with `bazel test`. These arguments are passed before any `--test_arg` values specified on the `bazel test` command line. | +| `env` | Dictionary of strings; values are subject to [$(location)](/reference/be/make-variables#predefined_label_variables) and ["Make variable"](/reference/be/make-variables) substitution; default is `{}` Specifies additional environment variables to set when the test is executed by `bazel test`. This attribute only applies to native rules, like `cc_test`, `py_test`, and `sh_test`. It does not apply to Starlark-defined test rules. For your own Starlark rules, you can add an "env" attribute and use it to populate a [RunEnvironmentInfo](/rules/lib/providers/RunEnvironmentInfo) Provider. [TestEnvironment](/rules/lib/toplevel/testing#TestEnvironment) Provider. | +| `env_inherit` | List of strings; default is `[]` Specifies additional environment variables to inherit from the external environment when the test is executed by `bazel test`. This attribute only applies to native rules, like `cc_test`, `py_test`, and `sh_test`. It does not apply to Starlark-defined test rules. | +| `size` | String `"enormous"`, `"large"`, `"medium"`, or `"small"`; [nonconfigurable](#configurable-attributes); default is `"medium"` Specifies a test target's "heaviness": how much time/resources it needs to run. Unit tests are considered "small", integration tests "medium", and end-to-end tests "large" or "enormous". Bazel uses the size to determine a default timeout, which can be overridden using the `timeout` attribute. The timeout is for all tests in the BUILD target, not for each individual test. When the test is run locally, the `size` is additionally used for scheduling purposes: Bazel tries to respect `--local_{ram,cpu}_resources` and not overwhelm the local machine by running lots of heavy tests at the same time. Test sizes correspond to the following default timeouts and assumed peak local resource usages: | Size | RAM (in MB) | CPU (in CPU cores) | Default timeout | | --- | --- | --- | --- | | small | 20 | 1 | short (1 minute) | | medium | 100 | 1 | moderate (5 minutes) | | large | 300 | 1 | long (15 minutes) | | enormous | 800 | 1 | eternal (60 minutes) | The environment variable `TEST_SIZE` will be set to the value of this attribute when spawning the test. | +| `timeout` | String `"short"`, `"moderate"`, `"long"`, or `"eternal"`; [nonconfigurable](#configurable-attributes); default is derived from the test's `size` attribute How long the test is expected to run before returning. While a test's size attribute controls resource estimation, a test's timeout may be set independently. If not explicitly specified, the timeout is based on the [test's size](#test.size). The test timeout can be overridden with the `--test_timeout` flag, e.g. for running under certain conditions which are known to be slow. Test timeout values correspond to the following time periods: | Timeout Value | Time Period | | --- | --- | | short | 1 minute | | moderate | 5 minutes | | long | 15 minutes | | eternal | 60 minutes | For times other than the above, the test timeout can be overridden with the `--test_timeout` bazel flag, e.g. for manually running under conditions which are known to be slow. The `--test_timeout` values are in seconds. For example `--test_timeout=120` will set the test timeout to two minutes. The environment variable `TEST_TIMEOUT` will be set to the test timeout (in seconds) when spawning the test. | +| `flaky` | Boolean; [nonconfigurable](#configurable-attributes); default is `False` Marks test as flaky. If set, executes the test up to three times, marking it as failed only if it fails each time. By default, this attribute is set to False and the test is executed only once. Note, that use of this attribute is generally discouraged - tests should pass reliably when their assertions are upheld. | +| `shard_count` | Non-negative integer less than or equal to 50; default is `-1` Specifies the number of parallel shards to use to run the test. If set, this value will override any heuristics used to determine the number of parallel shards with which to run the test. Note that for some test rules, this parameter may be required to enable sharding in the first place. Also see `--test_sharding_strategy`. If test sharding is enabled, the environment variable `TEST_TOTAL_SHARDS` will be set to this value when spawning the test. Sharding requires the test runner to support the test sharding protocol. If it does not, then it will most likely run every test in every shard, which is not what you want. See [Test Sharding](/reference/test-encyclopedia#test-sharding) in the Test Encyclopedia for details on sharding. | +| `local` | Boolean; [nonconfigurable](#configurable-attributes); default is `False` Forces the test to be run locally, without sandboxing. Setting this to True is equivalent to providing "local" as a tag (`tags=["local"]`). | ## Attributes common to all binary rules (\*\_binary) This section describes attributes that are common to all binary rules. -AttributeDescription`args` - -List of strings; subject to -[$(location)](/reference/be/make-variables#predefined_label_variables) and -["Make variable"](/reference/be/make-variables) substitution, and -[Bourne shell tokenization](#sh-tokenization); -[nonconfigurable](#configurable-attributes); -default is `[]` - -Command line arguments that Bazel will pass to the target when it is executed -either by the `run` command or as a test. These arguments are -passed before the ones that are specified on the `bazel run` or -`bazel test` command line. - -_NOTE: The arguments are not passed when you run the target_ -_outside of Bazel (for example, by manually executing the binary in_ -_`bazel-bin/`)._ - -`env` - -Dictionary of strings; values are subject to -[$(location)](/reference/be/make-variables#predefined_label_variables) and -["Make variable"](/reference/be/make-variables) substitution; default is `{}` - -Specifies additional environment variables to set when the target is -executed by `bazel run`. - -This attribute only applies to native rules, like `cc_binary`, `py_binary`, -and `sh_binary`. It does not apply to Starlark-defined executable rules. For your own -Starlark rules, you can add an "env" attribute and use it to populate a - -[RunEnvironmentInfo](/rules/lib/providers/RunEnvironmentInfo.html) - -Provider. - -_NOTE: The environment variables are not set when you run the target_ -_outside of Bazel (for example, by manually executing the binary in_ -_`bazel-bin/`)._ - -`output_licenses` - -List of strings; default is `[]` - -The licenses of the output files that this binary generates. - -This is part of a deprecated licensing API that Bazel no longer uses. Don't -use this. +| Attribute | Description | +| --- | --- | +| `args` | List of strings; subject to [$(location)](/reference/be/make-variables#predefined_label_variables) and ["Make variable"](/reference/be/make-variables) substitution, and [Bourne shell tokenization](#sh-tokenization); [nonconfigurable](#configurable-attributes); default is `[]` Command line arguments that Bazel will pass to the target when it is executed either by the `run` command or as a test. These arguments are passed before the ones that are specified on the `bazel run` or `bazel test` command line. *NOTE: The arguments are not passed when you run the target outside of Bazel (for example, by manually executing the binary in `bazel-bin/`).* | +| `env` | Dictionary of strings; values are subject to [$(location)](/reference/be/make-variables#predefined_label_variables) and ["Make variable"](/reference/be/make-variables) substitution; default is `{}` Specifies additional environment variables to set when the target is executed by `bazel run`. This attribute only applies to native rules, like `cc_binary`, `py_binary`, and `sh_binary`. It does not apply to Starlark-defined executable rules. For your own Starlark rules, you can add an "env" attribute and use it to populate a [RunEnvironmentInfo](/rules/lib/providers/RunEnvironmentInfo) Provider. *NOTE: The environment variables are not set when you run the target outside of Bazel (for example, by manually executing the binary in `bazel-bin/`).* | +| `output_licenses` | List of strings; default is `[]` The licenses of the output files that this binary generates. This is part of a deprecated licensing API that Bazel no longer uses. Don't use this. | ## Configurable attributes @@ -721,13 +140,12 @@ config_setting( name = "arm_mode", values = { "cpu": "arm" } ) - ``` -The [`select()`](/reference/be/functions.html#select) function +The [`select()`](/reference/be/functions#select) function chooses among different alternative values for a configurable attribute based -on which [`config_setting`](/reference/be/general.html#config_setting) -or [`constraint_value`](/reference/be/platforms-and-toolchains.html#constraint_value) +on which [`config_setting`](/reference/be/general#config_setting) +or [`constraint_value`](/reference/be/platforms-and-toolchains#constraint_value) criteria the target's configuration satisfies. Bazel evaluates configurable attributes after processing macros and before @@ -749,18 +167,17 @@ See [Configurable Build Attributes](https://bazel.build/docs/configurable-attrib ## Implicit output targets -_Implicit outputs in C++ are deprecated. Please refrain from using it_ -_in other languages where possible. We don't have a deprecation path yet_ -_but they will eventually be deprecated too._ +*Implicit outputs in C++ are deprecated. Please refrain from using it +in other languages where possible. We don't have a deprecation path yet +but they will eventually be deprecated too.* When you define a build rule in a BUILD file, you are explicitly declaring a new, named rule target in a package. Many build rule -functions also _implicitly_ entail one or more output file +functions also *implicitly* entail one or more output file targets, whose contents and meaning are rule-specific. - For example, when you explicitly declare a `java_binary(name='foo', ...)` rule, you are also -_implicitly_ declaring an output file +*implicitly* declaring an output file target `foo_deploy.jar` as a member of the same package. (This particular target is a self-contained Java archive suitable for deployment.) @@ -778,12 +195,12 @@ outputs entailed by a declaration of that kind of rule. An important but somewhat subtle distinction between the two namespaces used by the build system: -[labels](/concepts/labels) identify _targets_, +[labels](/concepts/labels) identify *targets*, which may be rules or files, and file targets may be divided into either source (or input) file targets and derived (or output) file targets. These are the things you can mention in BUILD files, build from the command-line, or examine using `bazel query`; -this is the _target namespace_. Each file target corresponds +this is the *target namespace*. Each file target corresponds to one actual file on disk (the "file system namespace"); each rule target may correspond to zero, one or more actual files on disk. There may be files on disk that have no corresponding target; for @@ -791,4 +208,4 @@ example, `.o` object files produced during C++ compilation cannot be referenced from within BUILD files or from the command line. In this way, the build tool may hide certain implementation details of how it does its job. This is explained more fully in -the [BUILD Concept Reference](/concepts/build-ref). +the [BUILD Concept Reference](/concepts/build-ref). \ No newline at end of file diff --git a/reference/be/extra-actions.mdx b/reference/be/extra-actions.mdx index 0c16bd904..bf31904fe 100644 --- a/reference/be/extra-actions.mdx +++ b/reference/be/extra-actions.mdx @@ -2,12 +2,10 @@ title: 'Extra Actions Rules' --- - - ## Rules -- [action\_listener](#action_listener) -- [extra\_action](#extra_action) +* [action\_listener](#action_listener) +* [extra\_action](#extra_action) ## action\_listener @@ -23,15 +21,15 @@ instead. An `action_listener` rule doesn't produce any output itself. Instead, it allows tool developers to insert -[`extra_action`](/reference/be/extra-actions.html#extra_action) s into the build system, -by providing a mapping from action to [`extra_action`](/reference/be/extra-actions.html#extra_action). +[`extra_action`](/reference/be/extra-actions#extra_action)s into the build system, +by providing a mapping from action to [`extra_action`](/reference/be/extra-actions#extra_action). This rule's arguments map action mnemonics to -[`extra_action`](/reference/be/extra-actions.html#extra_action) rules. +[`extra_action`](/reference/be/extra-actions#extra_action) rules. By specifying the option [`--experimental_action_listener=
    ` default: "" +: A colon-separated list of classpath entries to be added to the classpath of the Bazel server. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--failure_detail_out=` default: see description +: If set, specifies a location to write a failure\_detail protobuf message if the server experiences a failure and cannot report it via gRPC, as normal. Otherwise, the location will be ${OUTPUT\_BASE}/failure\_detail.rawproto. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]home_rc` default: "true" +: Whether or not to look for the home bazelrc file at `$HOME/.bazelrc` + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]idle_server_tasks` default: "true" +: Run System.gc() when the server is idle + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]ignore_all_rc_files` default: "false" +: Disables all rc files, regardless of the values of other rc-modifying flags, even if these flags come later in the list of startup options. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--io_nice_level={-1,0,1,2,3,4,5,6,7}` default: "-1" +: Only on Linux; set a level from 0-7 for best-effort IO scheduling using the sys\_ioprio\_set system call. 0 is highest priority, 7 is lowest. The anticipatory scheduler may only honor up to priority 4. If set to a negative value, then Bazel does not perform a system call. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--local_startup_timeout_secs=` default: "120" +: The maximum amount of time the client waits to connect to the server + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--macos_qos_class=` default: "default" +: Sets the QoS service class of the bazel server when running on macOS. This flag has no effect on all other platforms but is supported to ensure rc files can be shared among them without changes. Possible values are: user-interactive, user-initiated, default, utility, and background. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--max_idle_secs=` default: "10800" +: The number of seconds the build server will wait idling before shutting down. Zero means that the server will never shutdown. This is only read on server-startup, changing this option will not cause the server to restart. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--output_base=` default: see description +: If set, specifies the output location to which all build output will be written. Otherwise, the location will be ${OUTPUT\_ROOT}/*blaze*${USER}/${MD5\_OF\_WORKSPACE\_ROOT}. Note: If you specify a different option from one to the next Bazel invocation for this value, you'll likely start up a new, additional Bazel server. Bazel starts exactly one server per specified output base. Typically there is one output base per workspace - however, with this option you may have multiple output bases per workspace and thereby run multiple builds for the same client on the same machine concurrently. See 'bazel help shutdown' on how to shutdown a Bazel server. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--output_user_root=` default: see description +: The user-specific directory beneath which all build outputs are written; by default, this is a function of $USER, but by specifying a constant, build outputs can be shared between collaborating users. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]preemptible` default: "false" +: If true, the command can be preempted if another command is started. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]quiet` default: "false" +: If true, no informational messages are emitted on the console, only errors. Changing this option will not cause the server to restart. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--server_jvm_out=` default: see description +: The location to write the server's JVM's output. If unset then defaults to a location in output\_base. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]shutdown_on_low_sys_mem` default: "false" +: If max\_idle\_secs is set and the build server has been idle for a while, shut down the server when the system is low on free RAM. Linux and MacOS only. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]system_rc` default: "true" +: Whether or not to look for the system-wide bazelrc. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]unlimit_coredumps` default: "false" +: Raises the soft coredump limit to the hard limit to make coredumps of the server (including the JVM) and the client possible under common conditions. Stick this flag in your bazelrc once and forget about it so that you get coredumps when you actually encounter a condition that triggers them. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--[no]windows_enable_symlinks` default: "false" +: If true, real symbolic links will be created on Windows instead of file copying. Requires Windows developer mode to be enabled and Windows 10 version 1703 or greater. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--[no]workspace_rc` default: "true" +: Whether or not to look for the workspace bazelrc file at `$workspace/.bazelrc` + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Remote caching and execution options: + +`--[no]experimental_remote_repo_contents_cache` default: "false" +: If enabled, the remote cache will be used to store the results of reproducible repository + rules. If a repository rule needs to be evaluated and its result is already in the remote + cache, the contents of the repository will be kept in an in-memory file system and are + only downloaded when needed, either by Bazel itself or an action that runs locally. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Miscellaneous options, not otherwise categorized.: + +`--host_jvm_args=` multiple uses are accumulated +: Flags to pass to the JVM executing Blaze. + +`--host_jvm_debug` +: Convenience option to add some additional JVM startup flags, which cause the JVM to wait during startup until you connect from a JDWP-compliant debugger (like Eclipse) to port 5005. + + Expands to: + +   `--host_jvm_args=-agentlib:jdwp=transport=dt_socket,server=y,address=5005` + +`--server_javabase=` default: "" +: Path to the JVM used to execute Bazel itself. + +## Options Common to all Commands + +Options that appear before the command and are parsed by the client: + +`--distdir=` multiple uses are accumulated +: Additional places to search for archives before accessing the network to download them. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--[no]experimental_repository_cache_hardlinks` default: "false" +: If set, the repository cache will hardlink the file in case of a cache hit, rather than copying. This is intended to save disk space. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--experimental_repository_downloader_retries=` default: "5" +: The maximum number of attempts to retry a download error. If set to 0, retries are disabled. + + Tags: + [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_scale_timeouts=` default: "1.0" +: Scale all timeouts in Starlark repository rules by this factor. In this way, external repositories can be made working on machines that are slower than the rule author expected, without changing the source code + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--http_connector_attempts=` default: "8" +: The maximum number of attempts for http downloads. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--http_connector_retry_max_timeout=` default: "0s" +: The maximum timeout for http download retries. With a value of 0, no timeout maximum is defined. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--http_max_parallel_downloads=` default: "8" +: The maximum number parallel http downloads. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--http_timeout_scaling=` default: "1.0" +: Scale all timeouts related to http downloads by the given factor + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--repo_contents_cache=` default: see description +: Specifies the location of the repo contents cache, which contains fetched repo + directories shareable across workspaces. An empty string as argument requests the repo + contents cache to be disabled, otherwise the default of `{--repository_cache}/contents` + is used. Note that this means setting `--repository_cache=` would by default disable the + repo contents cache as well, unless `--repo_contents_cache={some_path}` is also set. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--repo_contents_cache_gc_idle_delay=` default: "5m" +: Specifies the amount of time the server must remain idle before garbage collection happens + to the repo contents cache. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--repo_contents_cache_gc_max_age=` default: "14d" +: Specifies the amount of time an entry in the repo contents cache can stay unused before + it's garbage collected. If set to zero, only duplicate entries will be garbage collected. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--repository_cache=` default: see description +: Specifies the cache location of the downloaded values obtained + during the fetching of external repositories. An empty string + as argument requests the cache to be disabled, + otherwise the default of `{--output_user_root}/cache/repos/v1` is used. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--[no]repository_disable_download` default: "false" +: If set, downloading using `ctx.download{,_and_extract}` is not allowed during repository + fetching. Note that network access is not completely disabled; ctx.execute could + still run an arbitrary executable that accesses the Internet. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +Options that control build execution: + +`--experimental_ui_max_stdouterr_bytes=` default: "1048576" +: The maximum size of the stdout / stderr files that will be printed to the console. -1 implies no limit. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--gc_churning_threshold=` default: "100" +: At any point after an invocation has been running for at least one minute, if Blaze has spent at least this percentage of the invocation's wall time doing full GCs, Blaze will give up and fail with an OOM. A value of 100 effectively means to never give up for this reason. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--gc_churning_threshold_if_multiple_top_level_targets=` default: "-1" +: If set to a value in [0, 100] and this is a command that takes top-level targets (e.g. build but not query) and there are multiple such top-level targets, overrides --gc\_churning\_threshold. Useful to configure more aggressive OOMing behavior (i.e. a lower value than --gc\_churning\_threshold) when they are multiple top-level targets so that the invoker of Bazel can split and retry while still having less aggressive behavior when there is a single top-level target. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--gc_thrashing_threshold=` default: "100" +: The percent of tenured space occupied (0-100) above which GcThrashingDetector considers memory pressure events against its limits (--gc\_thrashing\_limits). If set to 100, GcThrashingDetector is disabled. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +Options that configure the toolchain used for action execution: + +`--[no]incompatible_enable_proto_toolchain_resolution` default: "true" +: If true, proto lang rules define toolchains from protobuf repository. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--bep_maximum_open_remote_upload_files=` default: "-1" +: Maximum number of open files allowed during BEP artifact upload. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_strict_repo_env` default: "false" +: If true, repository rules and module extensions will only inherit `PATH`, `PATHEXT` + (on Windows), and environment variables explicitly specified by `--repo_env`. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, + `--action_env=NAME=VALUE` will also be included. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_repo_env_ignores_action_env` default: "true" +: If true, --action\_env=NAME=VALUE will no longer affect repository rule and module extension environments. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--remote_download_all` +: Downloads all remote outputs to the local machine. This flag is an alias for --remote\_download\_outputs=all. + + Expands to: + +   `--remote_download_outputs=all` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_minimal` +: Does not download any remote build outputs to the local machine. This flag is an alias for --remote\_download\_outputs=minimal. + + Expands to: + +   `--remote_download_outputs=minimal` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_outputs=` default: "toplevel" +: If set to 'minimal' doesn't download any remote build outputs to the local machine, except the ones required by local actions. If set to 'toplevel' behaves like 'minimal' except that it also downloads outputs of top level targets to the local machine. Both options can significantly reduce build times if network bandwidth is a bottleneck. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_symlink_template=` default: "" +: Instead of downloading remote build outputs to the local machine, create symbolic links. The target of the symbolic links can be specified in the form of a template string. This template string may contain {hash} and {size\_bytes} that expand to the hash of the object and the size in bytes, respectively. These symbolic links may, for example, point to a FUSE file system that loads objects from the CAS on demand. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_toplevel` +: Only downloads remote outputs of top level targets to the local machine. This flag is an alias for --remote\_download\_outputs=toplevel. + + Expands to: + +   `--remote_download_outputs=toplevel` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--repo_env=` multiple uses are accumulated +: Specifies additional environment variables to be available only for repository rules. Note that repository rules see the full environment anyway, but in this way variables can be set via command-line flags and .bazelrc entries. The special syntax =NAME can be used to explicitly unset a variable. The string %bazel\_workspace% in a value will be replaced with the absolute path of the workspace as printed by bazel info workspace. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]allow_experimental_loads` default: "false" +: If enabled, issue only a warning instead of an error for loads of experimental .bzls. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]check_bzl_visibility` default: "true" +: If disabled, .bzl load visibility errors are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]incompatible_enforce_starlark_utf8` default: "warning" +: If enabled (or set to 'error'), fail if Starlark files are not UTF-8 encoded. If set to 'warning', emit a warning instead. If set to 'off', Bazel assumes that Starlark files are UTF-8 encoded but does not verify this assumption. Note that Starlark files which are not UTF-8 encoded can cause Bazel to behave inconsistently. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]experimental_bzl_visibility` default: "true" +: If enabled, adds a `visibility()` function that .bzl files may call during top-level evaluation to set their visibility for the purpose of load() statements. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_cc_shared_library` default: "false" +: If set to true, rule attributes and Starlark API methods needed for the rule cc\_shared\_library will be available + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_disable_external_package` default: "false" +: If set to true, the auto-generated //external package will not be available anymore. Bazel will still be unable to parse the file 'external/BUILD', but globs reaching into external/ from the unnamed package will work. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_dormant_deps` default: "false" +: If set to true, attr.label(materializer=), attr(for\_dependency\_resolution=), attr.dormant\_label(), attr.dormant\_label\_list() and rule(for\_dependency\_resolution=) are allowed. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_enable_android_migration_apis` default: "false" +: If set to true, enables the APIs required to support the Android Starlark migration. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_enable_first_class_macros` default: "true" +: If set to true, enables the `macro()` construct for defining symbolic macros. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_enable_scl_dialect` default: "true" +: If set to true, .scl files may be used in load() statements. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_enable_starlark_set` default: "true" +: If true, enable the set data type and set() constructor in Starlark. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_google_legacy_api` default: "false" +: If set to true, exposes a number of experimental pieces of Starlark build API pertaining to Google legacy code. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_isolated_extension_usages` default: "false" +: If true, enables the isolate parameter in the use\_extension function. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]experimental_platforms_api` default: "false" +: If set to true, enables a number of platform-related Starlark APIs useful for debugging. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_repo_remote_exec` default: "false" +: If set to true, repository\_rule gains some remote execution capabilities. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_repository_ctx_execute_wasm` default: "false" +: If true enables the repository\_ctx `load_wasm` and `execute_wasm` methods. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_sibling_repository_layout` default: "false" +: If set to true, non-main repositories are planted as symlinks to the main repository in the execution root. That is, all repositories are direct children of the $output\_base/execution\_root directory. This has the side effect of freeing up $output\_base/execution\_root/**main**/external for the real top-level 'external' directory. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_single_package_toolchain_binding` default: "false" +: If enabled, the register\_toolchain function may not include target patterns which may refer to more than one package. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]experimental_starlark_dynamic_type_checking` default: "false" +: Enables dynamic type checking of arguments and return values for functions that contain type annotations or related syntax. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_starlark_static_type_checking` default: "false" +: Enables static type checking in files and functions that contain type annotations or related syntax. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_starlark_type_checking` +: Enables both static and dynamic type checking in files and functions that contain type annotations or related syntax. This is an expansion flag for --experimental\_starlark\_static\_type\_checking and --experimental\_starlark\_dynamic\_type\_checking. (When both flags are disabled, Bazel is more forgiving of invalid types in type annotations.) + + Expands to: + +   `--experimental_starlark_static_type_checking` + +   `--experimental_starlark_dynamic_type_checking` + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_starlark_type_syntax` default: "true" +: Enables type annotations and related syntax in .bzl files. Locations of files where these are allowed is further restricted by `--experimental_starlark_types_allowed_paths`. + Type syntax is never permitted in .scl files regardless of this flag. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_starlark_types_allowed_paths=` default: "" +: List of canonical Label prefixes under which Starlark type annotations are allowed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]force_starlark_stack_trace` default: "false" +: If --force\_starlark\_stack\_trace=true, Starlark stace traces will always be printed from calls to fail(), including those normally supressed with fail(..., stack\_trace = False) + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]incompatible_allow_tags_propagation` default: "true" +: If set to true, tags will be propagated from a target to the actions' execution requirements; otherwise tags are not propagated. See https://github.com/bazelbuild/bazel/issues/8830 for details. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_always_check_depset_elements` default: "true" +: Check the validity of elements added to depsets, in all constructors. Elements must be immutable, but historically the depset(direct=...) constructor forgot to check. Use tuples instead of lists in depset elements. See https://github.com/bazelbuild/bazel/issues/10313 for details. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_objc_library_transition` default: "true" +: Disable objc\_library's custom transition and inherit from the top level target instead (No-op in Bazel) + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_starlark_host_transitions` default: "false" +: If set to true, rule attributes cannot set 'cfg = "host"'. Rules should set 'cfg = "exec"' instead. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_target_default_provider_fields` default: "false" +: If set to true, disable the ability to utilize the default provider via field syntax. Use provider-key syntax instead. For example, instead of using `ctx.attr.dep.files` to access `files`, utilize `ctx.attr.dep[DefaultInfo].files See https://github.com/bazelbuild/bazel/issues/9014 for details. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_transitions_on=` default: "" +: A comma-separated list of flags that cannot be used in transitions inputs or outputs. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_disallow_ctx_resolve_tools` default: "true" +: If set to true, calling the deprecated ctx.resolve\_tools API always fails. Uses of this API should be replaced by an executable or tools argument to ctx.actions.run or ctx.actions.run\_shell. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disallow_empty_glob` default: "true" +: If set to true, the default value of the `allow_empty` argument of glob() is False. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_enable_deprecated_label_apis` default: "true" +: If enabled, certain deprecated APIs (native.repository\_name, Label.workspace\_name, Label.relative) can be used. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]incompatible_fail_on_unknown_attributes` default: "true" +: If enabled, targets that have unknown attributes set to None fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_fix_package_group_reporoot_syntax` default: "true" +: In package\_group's `packages` attribute, changes the meaning of the value "//..." to refer to all packages in the current repository instead of all packages in any repository. You can use the special value "public" in place of "//..." to obtain the old behavior. This flag requires that --incompatible\_package\_group\_has\_public\_syntax also be enabled. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_locations_prefers_executable` default: "true" +: Whether a target that provides an executable expands to the executable rather than the files in DefaultInfo.files under $(locations ...) expansion if the number of files is not 1. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_no_attr_license` default: "true" +: If set to true, disables the function `attr.license`. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_no_implicit_file_export` default: "true" +: If set, (used) source files are package private unless exported explicitly. See https://github.com/bazelbuild/proposals/blob/master/designs/2019-10-24-file-visibility.md + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_no_implicit_watch_label` default: "true" +: If true, then methods on repository\_ctx that are passed a Label will no longer automatically watch the file under that label for changes even if watch = "no", and repository\_ctx.path no longer causes the returned path to be watched. Use repository\_ctx.watch instead. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_no_rule_outputs_param` default: "false" +: If set to true, disables the `outputs` parameter of the `rule()` Starlark function. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_package_group_has_public_syntax` default: "true" +: In package\_group's `packages` attribute, allows writing "public" or "private" to refer to all packages or no packages respectively. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_require_mnemonic_for_run_actions` default: "false" +: If set to true, ctx.actions.run and ctx.actions.run\_shell will require an explicit mnemonic + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_resolve_select_keys_eagerly` default: "false" +: If enabled, string keys in dicts passed to select() in .bzl files are immediately resolved to Labels relative to the file instead of being interpreted relative to the BUILD file they are ultimately loaded from. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_run_shell_command_string` default: "true" +: If set to true, the command parameter of actions.run\_shell will only accept string + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_simplify_unconditional_selects_in_rule_attrs` default: "true" +: If true, simplify configurable rule attributes which contain only unconditional selects; for example, if ["a"] + select("//conditions:default", ["b"]) is assigned to a rule attribute, it is stored as ["a", "b"]. This option does not affect attributes of symbolic macros or attribute default values. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_stop_exporting_build_file_path` default: "false" +: If set to true, deprecated ctx.build\_file\_path will not be available. ctx.label.package + '/BUILD' can be used instead. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_stop_exporting_language_modules` default: "false" +: If enabled, certain language-specific modules (such as `cc_common`) are unavailable in user .bzl files and may only be called from their respective rules repositories. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_unambiguous_label_stringification` default: "true" +: When true, Bazel will stringify the label @//foo:bar to @//foo:bar, instead of //foo:bar. This only affects the behavior of str(), the % operator, and so on; the behavior of repr() is unchanged. See https://github.com/bazelbuild/bazel/issues/15916 for more information. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_use_cc_configure_from_rules_cc` default: "false" +: When true, Bazel will no longer allow using cc\_configure from @bazel\_tools. Please see https://github.com/bazelbuild/bazel/issues/10134 for details and migration instructions. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--max_computation_steps=` default: "0" +: The maximum number of Starlark computation steps that may be executed by a BUILD file (zero means no limit). + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--nested_set_depth_limit=` default: "3500" +: The maximum depth of the graph internal to a depset (also known as NestedSet), above which the depset() constructor will fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options relating to Bzlmod output and semantics: + +`--allow_yanked_versions=` multiple uses are accumulated +: Specified the module versions in the form of + `{module1}@{version1},module2@{version2}` that will be allowed in the resolved + dependency graph even if they are declared yanked in the registry where they come + from (if they are not coming from a [`NonRegistryOverride`](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/NonRegistryOverride.java)). + Otherwise, yanked versions will cause the resolution to fail. You can also define allowed + yanked versions with the `BZLMOD_ALLOW_YANKED_VERSIONS` environment variable. You can + disable this check by using the keyword `all` (not recommended). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--check_bazel_compatibility=` default: "error" +: Check bazel version compatibility of Bazel modules. Valid values are `error` to escalate it to a resolution failure, `off` to disable the check, or `warning` to print a warning when mismatch detected. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--check_direct_dependencies=` default: "warning" +: Check if the direct `bazel_dep` dependencies declared in the root module are the same versions you get in the resolved dependency graph. Valid values are `off` to disable the check, `warning` to print a warning when mismatch detected or `error` to escalate it to a resolution failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]ignore_dev_dependency` default: "false" +: If true, Bazel ignores `bazel_dep` and `use_extension` declared as `dev_dependency` in + the `MODULE.bazel` of the root module. Note that, those dev dependencies are always + ignored in the `MODULE.bazel` if it's not the root module regardless of the value + of this flag. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--lockfile_mode=` default: "update" +: Specifies how and whether or not to use the lockfile. Valid values are `update` to use the lockfile and update it if there are changes, `refresh` to additionally refresh mutable information (yanked versions and previously missing modules) from remote registries from time to time, `error` to use the lockfile but throw an error if it's not up-to-date, or `off` to neither read from or write to the lockfile. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--module_mirrors=` multiple uses are accumulated +: Specifies URLs under which the source URLs of Bazel modules can be found, in addition + to and taking precedence over any registry-provided mirror URLs. This flag can be + specified per-registry using the syntax + `--module_mirrors==[,,...]` (e.g., + `--module_mirrors=https://bcr.bazel.build=https://mirror.example.com`). It can also + be specified as a comma-separated list of mirror URLs that applies to all registries that + don't have an explicit list (e.g., `--module_mirrors=https://mirror1,https://mirror2`). + Set this to an empty value to disable the use of any mirrors not specified by the + registries. Later uses of this flag override earlier ones with the same (or no) registry. + The default set of mirrors may change over time, but all downloads from mirrors are + verified by hashes stored in the registry (and thus pinned by the lockfile). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--override_module=` multiple uses are accumulated +: Override a module with a local path in the form of `{module name}={path}`. If the given + path is an absolute path, it will be used as it is. If the given path is a + relative path, it is relative to the current working directory. If the given path + starts with `%workspace%`, it is relative to the workspace root, which is the + output of `bazel info workspace`. If the given path is empty, then remove any + previous overrides. + +`--registry=` multiple uses are accumulated +: Specifies the registries to use to locate Bazel module dependencies. The order is important: modules will be looked up in earlier registries first, and only fall back to later registries when they're missing from the earlier ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--vendor_dir=` default: see description +: Specifies the directory that should hold the external repositories in vendor mode, whether for the purpose of fetching them into it or using them while building. The path can be specified as either an absolute path or a path relative to the workspace directory. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that trigger optimizations of the build time: + +`--gc_thrashing_limits=:>` default: "1s:2,20s:3,1m:5" +: Limits which, if reached, cause GcThrashingDetector to crash Bazel with an OOM. Each limit is specified as : where period is a duration and count is a positive integer. If more than --gc\_thrashing\_threshold percent of tenured space (old gen heap) remains occupied after consecutive full GCs within , an OOM is triggered. Multiple limits can be specified separated by commas. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]heuristically_drop_nodes` default: "false" +: If true, Blaze will remove FileState and DirectoryListingState nodes after related File and DirectoryListing node is done to save memory. We expect that it is less likely that these nodes will be needed again. If so, the program will re-evaluate them. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]incompatible_do_not_split_linking_cmdline` default: "true" +: When true, Bazel no longer modifies command line flags used for linking, and also doesn't selectively decide which flags go to the param file and which don't. See https://github.com/bazelbuild/bazel/issues/7670 for details. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]keep_state_after_build` default: "true" +: If false, Blaze will discard the inmemory state from this build when the build finishes. Subsequent builds will not have any incrementality with respect to this one. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--skyframe_high_water_mark_full_gc_drops_per_invocation== 0>` default: "10" +: Flag for advanced configuration of Bazel's internal Skyframe engine. If Bazel detects its retained heap percentage usage exceeds the threshold set by --skyframe\_high\_water\_mark\_threshold, when a full GC event occurs, it will drop unnecessary temporary Skyframe state, up to this many times per invocation. Defaults to 10. Zero means that full GC events will never trigger drops. If the limit is reached, Skyframe state will no longer be dropped when a full GC event occurs and that retained heap percentage threshold is exceeded. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--skyframe_high_water_mark_minor_gc_drops_per_invocation== 0>` default: "10" +: Flag for advanced configuration of Bazel's internal Skyframe engine. If Bazel detects its retained heap percentage usage exceeds the threshold set by --skyframe\_high\_water\_mark\_threshold, when a minor GC event occurs, it will drop unnecessary temporary Skyframe state, up to this many times per invocation. Defaults to 10. Zero means that minor GC events will never trigger drops. If the limit is reached, Skyframe state will no longer be dropped when a minor GC event occurs and that retained heap percentage threshold is exceeded. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--skyframe_high_water_mark_threshold=` default: "85" +: Flag for advanced configuration of Bazel's internal Skyframe engine. If Bazel detects its retained heap percentage usage is at least this threshold, it will drop unnecessary temporary Skyframe state. Tweaking this may let you mitigate wall time impact of GC thrashing, when the GC thrashing is (i) caused by the memory usage of this temporary state and (ii) more costly than reconstituting the state when it is needed. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]track_incremental_state` default: "true" +: If false, Blaze will not persist data that allows for invalidation and re-evaluation on incremental builds in order to save memory on this build. Subsequent builds will not have any incrementality with respect to this one. Usually you will want to specify --batch when setting this to false. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +Options that affect the verbosity, format or location of logging: + +`--[no]announce_rc` default: "false" +: Whether to announce rc options. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]attempt_to_print_relative_paths` default: "false" +: When printing the location part of messages, attempt to use a path relative to the workspace directory or one of the directories specified by --package\_path. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--bes_backend=` default: "" +: Specifies the build event service (BES) backend endpoint in the form + `[SCHEME://]HOST[:PORT]`. The default is to disable BES uploads. Supported schemes + are `grpc` and `grpcs` (grpc with TLS enabled). If no scheme is provided, Bazel + assumes `grpcs`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]bes_check_preceding_lifecycle_events` default: "false" +: Sets the field `check_preceding_lifecycle_events_present` on + `PublishBuildToolEventStreamRequest` which tells BES to check whether it previously + received `InvocationAttemptStarted` and `BuildEnqueued` events matching the current + tool event. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_header=` multiple uses are accumulated +: Specify a header in `NAME=VALUE` form that will be included in BES requests. + Multiple headers can be passed by specifying the flag multiple times. Multiple + values for the same name will be converted to a comma-separated list. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_instance_name=` default: see description +: Specifies the instance name under which the BES will persist uploaded BEP. Defaults to null. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_keywords=` multiple uses are accumulated +: Specifies a list of notification keywords to be added the default set of keywords + published to BES (`command_name={command_name}`, `protocol_name=BEP`). + Defaults to none. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]bes_lifecycle_events` default: "true" +: Specifies whether to publish BES lifecycle events. (defaults to 'true'). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_oom_finish_upload_timeout=` default: "10m" +: Specifies how long bazel should wait for the BES/BEP upload to complete while OOMing. This flag ensures termination when the JVM is severely GC thrashing and cannot make progress on any user thread. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--bes_outerr_buffer_size=` default: "10240" +: Specifies the maximal size of stdout or stderr to be buffered in BEP, before it is + reported as a progress event. Individual writes are still reported in a single + event, even if larger than the specified value up to `--bes_outerr_chunk_size`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_outerr_chunk_size=` default: "1048576" +: Specifies the maximal size of stdout or stderr to be sent to BEP in a single message. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_proxy=` default: see description +: Connect to the Build Event Service through a proxy. Currently this flag can only be + used to configure a Unix domain socket (`unix:/path/to/socket`). + +`--bes_results_url=` default: "" +: Specifies the base URL where a user can view the information streamed to the BES backend. Bazel will output the URL appended by the invocation id to the terminal. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--bes_system_keywords=` multiple uses are accumulated +: Specifies a list of notification keywords to be included directly, without the + `user_keyword=` prefix included for keywords supplied via `--bes_keywords`. + Intended for Build service operators that set `--bes_lifecycle_events=false` and + include keywords when calling `PublishLifecycleEvent`. Build service operators + using this flag should prevent users from overriding the flag value. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_timeout=` default: "0s" +: Specifies how long bazel should wait for the BES/BEP upload to complete after the + build and tests have finished. A valid timeout is a natural number followed by a + unit: Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). The + default value is `0` which means that there is no timeout. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--bes_upload_mode=` default: "wait\_for\_upload\_complete" +: Specifies whether the Build Event Service upload should block the build completion or + should end the invocation immediately and finish the upload in the + background. + + * `wait_for_upload_complete`: blocks at the end of the current invocation until + all events (including lifecycle events if applicable) are uploaded and + acknowledged by the backend. + * `nowait_for_upload_complete`: blocks at the beginning of the next invocation + until all events (including lifecycle events if applicable) are uploaded and + acknowledged by the backend. + * `fully_async`: blocks at the beginning of the next invocation until all events + are uploaded but does not wait for acknowledgements. Events may be lost in case + of (transient) failures and backends may report streams as incomplete in this + mode. There is no guarantee that `FinishInvocationAttempt` or `FinishBuild` + lifecycle events are sent. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--build_event_binary_file=` default: "" +: If non-empty, write a varint delimited binary representation of representation of the + build event protocol to that file. This option implies + `--bes_upload_mode=wait_for_upload_complete`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_event_binary_file_path_conversion` default: "true" +: Convert paths in the binary file representation of the build event protocol to more + globally valid URIs whenever possible; if disabled, the `file://` uri scheme will + always be used + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--build_event_binary_file_upload_mode=` default: "wait\_for\_upload\_complete" +: Specifies whether the Build Event Service upload for `--build_event_binary_file` should + block the build completion or should end the invocation immediately and finish + the upload in the background. Either `wait_for_upload_complete` (default), + `nowait_for_upload_complete`, or `fully_async`. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--build_event_json_file=` default: "" +: If non-empty, write a JSON serialisation of the build event protocol to that file. + This option implies `--bes_upload_mode=wait_for_upload_complete`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_event_json_file_path_conversion` default: "true" +: Convert paths in the json file representation of the build event protocol to more + globally valid URIs whenever possible; if disabled, the `file://` uri scheme will + always be used + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--build_event_json_file_upload_mode=` default: "wait\_for\_upload\_complete" +: Specifies whether the Build Event Service upload for `--build_event_json_file` should + block the build completion or should end the invocation immediately and finish + the upload in the background. Either `wait_for_upload_complete` (default), + `nowait_for_upload_complete`, or `fully_async`. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--build_event_max_named_set_of_file_entries=` default: "5000" +: The maximum number of entries for a single `named_set_of_files` event; values smaller + than 2 are ignored and no event splitting is performed. This is intended for + limiting the maximum event size in the build event protocol, although it does not + directly control event size. The total event size is a function of the structure + of the set as well as the file and uri lengths, which may in turn depend on the + hash function. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_event_publish_all_actions` default: "false" +: Whether all actions should be published. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--build_event_text_file=` default: "" +: If non-empty, write a textual representation of the build event protocol to that file + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_event_text_file_path_conversion` default: "true" +: Convert paths in the text file representation of the build event protocol to more + globally valid URIs whenever possible; if disabled, the `file://` uri scheme will + always be used + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--build_event_text_file_upload_mode=` default: "wait\_for\_upload\_complete" +: Specifies whether the Build Event Service upload for `--build_event_text_file` should + block the build completion or should end the invocation immediately and finish + the upload in the background. Either `wait_for_upload_complete` (default), + `nowait_for_upload_complete`, or `fully_async`. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--build_event_upload_max_retries=` default: "4" +: The maximum number of times Bazel should retry uploading a build event. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--[no]experimental_bep_target_summary` default: "false" +: Whether to publish `TargetSummary` events. + +`--[no]experimental_build_event_expand_filesets` default: "false" +: If true, expand Filesets in the BEP when presenting output files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--experimental_build_event_output_group_mode=` multiple uses are accumulated +: Specify how an output group's files will be represented in `TargetComplete`/`AspectComplete` + BEP events. Values are an assignment of an output group name to one of + `NAMED_SET_OF_FILES_ONLY`, `INLINE_ONLY`, or `BOTH`. The default value is + `NAMED_SET_OF_FILES_ONLY`. If an output group is repeated, the final value to + appear is used. The default value sets the mode for coverage artifacts to BOTH: + `--experimental_build_event_output_group_mode=baseline.lcov=both` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--experimental_build_event_upload_retry_minimum_delay=` default: "1s" +: Initial, minimum delay for exponential backoff retries when BEP upload fails. (exponent: 1.6) + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--experimental_build_event_upload_strategy=` default: see description +: Selects how to upload artifacts referenced in the build event protocol. In Bazel + the valid options include `local` and `remote`. The default value is `local`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_collect_load_average_in_profiler` default: "true" +: If enabled, the profiler collects the system's overall load average. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_collect_pressure_stall_indicators` default: "false" +: If enabled, the profiler collects the Linux PSI data. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_collect_resource_estimation` default: "false" +: If enabled, the profiler collects CPU and memory usage estimation for local actions. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_collect_skyframe_counts_in_profiler` default: "false" +: If enabled, the profiler collects SkyFunction counts in the Skyframe graph over time for key function types, like configured targets and action executions. May have a performance hit as this visits the ENTIRE Skyframe graph at every profiling time unit. Do not use this flag with performance-critical measurements. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_collect_system_network_usage` default: "true" +: If enabled, the profiler collects the system's network usage. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_collect_worker_data_in_profiler` default: "true" +: If enabled, the profiler collects worker's aggregated resource data. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--experimental_command_profile=` default: see description +: Records a Java Flight Recorder profile for the duration of the command. One of the supported profiling event types (cpu, wall, alloc or lock) must be given as an argument. The profile is written to a file named after the event type under the output base directory. The syntax and semantics of this flag might change in the future to support additional profile types or output formats; use at your own risk. + +`--experimental_profile_additional_tasks=` multiple uses are accumulated +: Specifies additional profile tasks to be included in the profile. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_profile_include_primary_output` default: "false" +: Includes the extra "out" attribute in action events that contains the exec path to the action's primary output. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_profile_include_target_configuration` default: "false" +: Includes target configuration hash in action events' JSON profile data. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_profile_include_target_label` default: "false" +: Includes target label in action events' JSON profile data. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_record_metrics_for_all_mnemonics` default: "false" +: Controls the output of BEP ActionSummary and BuildGraphMetrics, limiting the number of mnemonics in ActionData and number of entries reported in BuildGraphMetrics.AspectCount/RuleClassCount. By default the number of types is limited to the top 20, by number of executed actions for ActionData, and instances for RuleClass and Asepcts. Setting this option will write statistics for all mnemonics, rule classes and aspects. + +`--[no]experimental_record_skyframe_metrics` default: "false" +: Controls the output of BEP BuildGraphMetrics, including expensiveto compute skyframe metrics about Skykeys, RuleClasses and Aspects.With this flag set to false BuildGraphMetrics.rule\_count and aspectfields will not be populated in the BEP. + +`--[no]experimental_run_bep_event_include_residue` default: "false" +: Whether to include the command-line residue in run build events which could contain the residue. By default, the residue is not included in run command build events that could contain the residue. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_stream_log_file_uploads` default: "false" +: Stream log file uploads directly to the remote storage rather than writing them to disk. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--experimental_workspace_rules_log_file=` default: see description +: Log certain Workspace Rules events into this file as delimited WorkspaceEvent protos. + +`--[no]generate_json_trace_profile` default: "auto" +: If enabled, Bazel profiles the build and writes a JSON-format profile into a file in the output base. View profile by loading into chrome://tracing. By default Bazel writes the profile for all build-like commands and query. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]heap_dump_on_oom` default: "false" +: Whether to manually output a heap dump if an OOM is thrown (including manual OOMs due to reaching --gc\_thrashing\_limits). The dump will be written to /.heapdump.hprof. This option effectively replaces -XX:+HeapDumpOnOutOfMemoryError, which has no effect for manual OOMs. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--jvm_heap_histogram_internal_object_pattern=` default: "jdk\.internal\.vm\.Filler.+" +: Regex for overriding the matching logic for JDK21+ JVM heap memory collection. We are relying on volatile internal G1 GC implemenation details to get a clean memory metric, this option allows us to adapt to changes in that internal implementation without having to wait for a binary release. Passed to JDK Matcher.find() + +`--[no]legacy_important_outputs` default: "false" +: Use this to suppress generation of the legacy `important_outputs` field in the + `TargetComplete` event. `important_outputs` are required for Bazel to ResultStore/BTX + integration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--logging=<0 <= an integer <= 6>` default: "3" +: The logging level. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--memory_profile=` default: see description +: If set, write memory usage data to the specified file at phase ends and stable heap to master log at end of build. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--memory_profile_stable_heap_parameters=` default: "1,0" +: Tune memory profile's computation of stable heap at end of build. Should be and even number of integers separated by commas. In each pair the first integer is the number of GCs to perform. The second integer in each pair is the number of seconds to wait between GCs. Ex: 2,4,4,0 would 2 GCs with a 4sec pause, followed by 4 GCs with zero second pause + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--profile=` default: see description +: If set, profile Bazel and write data to the specified file. See https://bazel.build/advanced/performance/json-trace-profile for more information. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--profiles_to_retain=` default: "5" +: Number of profiles to retain in the output base. If there are more than this number of profiles in the output base, the oldest are deleted until the total is under the limit. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]record_full_profiler_data` default: "false" +: By default, Bazel profiler will record only aggregated data for fast but numerous events (such as statting the file). If this option is enabled, profiler will record each event - resulting in more precise profiling data but LARGE performance hit. Option only has effect if --profile used as well. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]redirect_local_instrumentation_output_writes` default: "false" +: If true and supported, instrumentation output is redirected to be written locally on a different machine than where bazel is running on. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--remote_print_execution_messages=` default: "failure" +: Choose when to print remote execution messages. Valid values are `failure`, to print only on failures, `success` to print only on successes and `all` to print always. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]slim_profile` default: "true" +: Slims down the size of the JSON profile by merging events if the profile gets too large. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--starlark_cpu_profile=` default: "" +: Writes into the specified file a pprof profile of CPU usage by all Starlark threads. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--tool_tag=` default: "" +: A tool name to attribute this Bazel invocation to. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--ui_event_filters=` multiple uses are accumulated +: Specifies which events to show in the UI. It is possible to add or remove events to the default ones using leading +/-, or override the default set completely with direct assignment. The set of supported event kinds include INFO, DEBUG, ERROR and more. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]write_command_log` default: "false" +: Whether or not to write the command.log file + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +Remote caching and execution options: + +`--downloader_config=` multiple uses are accumulated +: Specify a file to configure the remote downloader with. This file consists of lines, each of which starts with a directive (`allow`, `block` or `rewrite`) followed by either a host name (for `allow` and `block`) or two patterns, one to match against, and one to use as a substitute URL, with back-references starting from `$1`. It is possible for multiple `rewrite` directives for the same URL to be given, and in this case multiple URLs will be returned. + +`--experimental_circuit_breaker_strategy=` default: see description +: Specifies the strategy for the circuit breaker to use. Available strategies are "failure". On invalid value for the option the behavior same as the option is not set. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_remote_cache_chunking` default: "false" +: If enabled, large blobs are split into content-defined chunks using FastCDC 2020 and uploaded/downloaded in chunks, enabling deduplication across blobs. The server must advertise SplitBlob/SpliceBlob RPCs and FastCDC 2020 parameters in its capabilities. + + Tags: + [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_remote_cache_compression_threshold=` default: "100" +: The minimum blob size required to compress/decompress with zstd. Ineffectual unless --remote\_cache\_compression is set. + +`--[no]experimental_remote_cache_lease_extension` default: "false" +: If set to true, Bazel will extend the lease for outputs of remote actions during the build by sending `FindMissingBlobs` calls periodically to remote cache. The frequency is based on the value of `--experimental_remote_cache_ttl`. + +`--experimental_remote_cache_ttl=` default: "3h" +: The guaranteed minimal TTL of blobs in the remote cache after their digests are recently referenced e.g. by an ActionResult or FindMissingBlobs. Bazel does several optimizations based on the blobs' TTL e.g. doesn't repeatedly call GetActionResult in an incremental build. The value should be set slightly less than the real TTL since there is a gap between when the server returns the digests and when Bazel receives them. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_remote_capture_corrupted_outputs=` default: see description +: A path to a directory where the corrupted outputs will be captured to. + +`--[no]experimental_remote_discard_merkle_trees` default: "true" +: If set to true, discard in-memory copies of the input root's Merkle tree and associated input mappings during calls to GetActionResult() and Execute(). This reduces memory usage significantly, but does require Bazel to recompute them upon remote cache misses and retries. + +`--experimental_remote_downloader=` default: see description +: A Remote Asset API endpoint URI, to be used as a remote download proxy. The supported schemes are grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. See: https://github.com/bazelbuild/remote-apis/blob/master/build/bazel/remote/asset/v1/remote\_asset.proto + +`--[no]experimental_remote_downloader_local_fallback` default: "false" +: Whether to fall back to the local downloader if remote downloader fails. + +`--[no]experimental_remote_downloader_propagate_credentials` default: "false" +: Whether to propagate credentials from netrc and credential helper to the remote downloader server. The server implementation needs to support the new `http_header_url::` qualifier where the `` is a 0-based position of the URL inside the FetchBlobRequest's `uris` field. The URL-specific headers should take precedence over the global headers. + +`--experimental_remote_failure_rate_threshold=` default: "10" +: Sets the allowed number of failure rate in percentage for a specific time window after which it stops calling to the remote cache/executor. By default the value is 10. Setting this to 0 means no limitation. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_remote_failure_window_interval=` default: "60s" +: The interval in which the failure rate of the remote requests are computed. On zero or negative value the failure duration is computed the whole duration of the execution.Following units can be used: Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). If the unit is omitted, the value is interpreted as seconds. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_remote_mark_tool_inputs` default: "false" +: If set to true, Bazel will mark inputs as tool inputs for the remote executor. This can be used to implement remote persistent workers. + +`--experimental_remote_output_service=` default: see description +: HOST or HOST:PORT of a remote output service endpoint. The supported schemes are grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. Specify grpc:// or unix: scheme to disable TLS. + +`--experimental_remote_output_service_output_path_prefix=` default: "" +: The path under which the contents of output directories managed by the --experimental\_remote\_output\_service are placed. The actual output directory used by a build will be a descendant of this path and determined by the output service. + +`--[no]experimental_remote_require_cached` default: "false" +: If set to true, enforce that all actions that can run remotely are cached, or else fail the build. This is useful to troubleshoot non-determinism issues as it allows checking whether actions that should be cached are actually cached without spuriously injecting new results into the cache. + +`--experimental_remote_scrubbing_config=` default: see description +: Enables remote cache key scrubbing with the supplied configuration file, which must be a protocol buffer in text format (see src/main/protobuf/remote\_scrubbing.proto). + + This feature is intended to facilitate sharing a remote/disk cache between actions executing on different platforms but targeting the same platform. It should be used with extreme care, as improper settings may cause accidental sharing of cache entries and result in incorrect builds. + + Scrubbing does not affect how an action is executed, only how its remote/disk cache key is computed for the purpose of retrieving or storing an action result. Scrubbed actions are incompatible with remote execution, and will always be executed locally instead. + + Modifying the scrubbing configuration does not invalidate outputs present in the local filesystem or internal caches; a clean build is required to reexecute affected actions. + + In order to successfully use this feature, you likely want to set a custom --host\_platform together with --experimental\_platform\_in\_output\_dir (to normalize output prefixes). + +`--[no]guard_against_concurrent_changes` default: "lite" +: Set this to 'full' to enable checking the ctime of all input files of an action before uploading it to a remote cache. There may be cases where the Linux kernel delays writing of files, which could cause false positives. The default is 'lite', which only checks source files in the main repository. Setting this to 'off' disables all checks. This is not recommended, as the cache may be polluted when a source file is changed while an action that takes it as an input is executing. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]incompatible_remote_local_fallback_for_remote_cache` default: "false" +: Whether --remote\_local\_fallback applies to --remote\_cache. + +`--[no]remote_accept_cached` default: "true" +: Whether to accept remotely cached action results. + +`--remote_build_event_upload=` default: "minimal" +: If set to 'all', all local outputs referenced by BEP are uploaded to remote cache. + If set to 'minimal', local outputs referenced by BEP are not uploaded to the remote cache, except for files that are important to the consumers of BEP (e.g. test logs and timing profile). bytestream:// scheme is always used for the uri of files even if they are missing from remote cache. + Default to 'minimal'. + +`--remote_bytestream_uri_prefix=` default: see description +: The hostname and instance name to be used in bytestream:// URIs that are written into build event streams. This option can be set when builds are performed using a proxy, which causes the values of --remote\_executor and --remote\_instance\_name to no longer correspond to the canonical name of the remote execution service. When not set, it will default to "${hostname}/${instance\_name}". + +`--remote_cache=` default: see description +: A URI of a caching endpoint. The supported schemes are http, https, grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. Specify grpc://, http:// or unix: scheme to disable TLS. See https://bazel.build/remote/caching + +`--[no]remote_cache_async` default: "true" +: If true, uploading of action results to a disk or remote cache will happen in the background instead of blocking the completion of an action. Some actions are incompatible with background uploads, and may still block even when this flag is set. + +`--[no]remote_cache_compression` default: "false" +: If enabled, compress/decompress cache blobs with zstd when their size is at least --experimental\_remote\_cache\_compression\_threshold. + +`--remote_cache_header=` multiple uses are accumulated +: Specify a header that will be included in cache requests: --remote\_cache\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_default_exec_properties=` multiple uses are accumulated +: Set the default exec properties to be used as the remote execution platform if an execution platform does not already set exec\_properties. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_regex=` multiple uses are accumulated +: Force remote build outputs whose path matches this pattern to be downloaded, irrespective of --remote\_download\_outputs. Multiple patterns may be specified by repeating this flag. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_downloader_header=` multiple uses are accumulated +: Specify a header that will be included in remote downloader requests: --remote\_downloader\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_exec_header=` multiple uses are accumulated +: Specify a header that will be included in execution requests: --remote\_exec\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_execution_priority=` default: "0" +: The relative priority of actions to be executed remotely. The semantics of the particular priority values are server-dependent. + +`--remote_executor=` default: see description +: HOST or HOST:PORT of a remote execution endpoint. The supported schemes are grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. Specify grpc:// or unix: scheme to disable TLS. + +`--remote_grpc_log=` default: see description +: If specified, a path to a file to log gRPC call related details. This log consists of a sequence of serialized com.google.devtools.build.lib.remote.logging.RemoteExecutionLog.LogEntry protobufs with each message prefixed by a varint denoting the size of the following serialized protobuf message, as performed by the method LogEntry.writeDelimitedTo(OutputStream). + +`--remote_header=` multiple uses are accumulated +: Specify a header that will be included in requests: --remote\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_instance_name=` default: "" +: Value to pass as instance\_name in the remote execution API. + +`--[no]remote_local_fallback` default: "false" +: Whether to fall back to standalone local execution strategy if remote execution fails. + +`--remote_local_fallback_strategy=` default: "local" +: Deprecated. See https://github.com/bazelbuild/bazel/issues/7480 for details. + +`--remote_max_concurrency_per_connection=` default: "100" +: Limit the max number of concurrent requests per gRPC connection. By default the value is 100. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--remote_max_connections=` default: "100" +: Limit the max number of concurrent connections to remote cache/executor. By default the value is 100. Setting this to 0 means no limitation. + For HTTP remote cache, one TCP connection could handle one request at one time, so Bazel could make up to --remote\_max\_connections concurrent requests. + For gRPC remote cache/executor, one gRPC channel could usually handle 100+ concurrent requests (controlled by --remote\_max\_concurrency\_per\_connection), so Bazel could make around `--remote_max_connections * 100` concurrent requests. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--remote_proxy=` default: see description +: Connect to the remote cache through a proxy. Currently this flag can only be used to configure a Unix domain socket (unix:/path/to/socket). + +`--remote_result_cache_priority=` default: "0" +: The relative priority of remote actions to be stored in remote cache. The semantics of the particular priority values are server-dependent. + +`--remote_retries=` default: "5" +: The maximum number of attempts to retry a transient error. If set to 0, retries are disabled. + +`--remote_retry_max_delay=` default: "5s" +: The maximum backoff delay between remote retry attempts. Following units can be used: Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). If the unit is omitted, the value is interpreted as seconds. + +`--remote_timeout=` default: "60s" +: The maximum amount of time to wait for remote execution and cache calls. For the REST cache, this is both the connect and the read timeout. Following units can be used: Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). If the unit is omitted, the value is interpreted as seconds. + +`--[no]remote_upload_local_results` default: "true" +: Whether to upload locally executed action results to the remote cache if the remote cache supports it and the user is authorized to do so. + +`--[no]remote_verify_downloads` default: "true" +: If set to true, Bazel will compute the hash sum of all remote downloads and discard the remotely cached values if they don't match the expected value. + +Miscellaneous options, not otherwise categorized.: + +`--build_metadata=` multiple uses are accumulated +: Custom key-value string pairs to supply in a build event. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--color=` default: "auto" +: Use terminal controls to colorize output. + +`--config=` multiple uses are accumulated +: Selects additional config sections from the rc files; for every , it also pulls in the options from : if such a section exists; if this section doesn't exist in any .rc file, Blaze fails with an error. The config sections and flag combinations they are equivalent to are located in the tools/\*.blazerc config files. + +`--credential_helper=` multiple uses are accumulated +: Configures a credential helper conforming to the [Credential Helper Specification](https://github.com/EngFlow/credential-helper-spec) + to use for retrieving authorization credentials for repository + fetching, remote caching and execution, and the build event service. + + The path to the credential helper may be absolute, relative to the PATH environment variable, + or %workspace%-relative. The path may be optionally prefixed by a scope followed by an '='. + The scope is a domain name, optionally with a single leading '\*' wildcard component. A helper + applies to URIs matching its scope, with more specific scopes preferred. If a helper has no + scope, it applies to every URI. + + Credentials supplied by a helper take precedence over credentials supplied by + `--google_default_credentials`, `--google_credentials`, a `.netrc` file, or the + auth parameter to `repository_ctx.download()` and + `repository_ctx.download_and_extract()`. + + May be specified multiple times to set up multiple helpers. + + See [Configuring Bazel's Credential Helper - Engflow Blog](https://blog.engflow.com/2023/10/09/configuring-bazels-credential-helper/) for instructions. + +`--credential_helper_cache_duration=` default: "30m" +: How long to cache credentials for if the credential helper doesn't return an expiration time. Changing the value of this flag clears the cache. + +`--credential_helper_timeout=` default: "10s" +: Configures the timeout for a credential helper. + + Credential helpers failing to respond within this timeout will fail the invocation. + +`--curses=` default: "auto" +: Use terminal cursor controls to minimize scrolling output. + +`--disk_cache=` default: see description +: A path to a directory where Bazel can read and write actions and action outputs. If the directory does not exist, it will be created. + +`--[no]enable_platform_specific_config` default: "false" +: If true, Bazel picks up host-OS-specific config lines from bazelrc files. For example, if the host OS is Linux and you run bazel build, Bazel picks up lines starting with build:linux. Supported OS identifiers are linux, macos, windows, freebsd, and openbsd. Enabling this flag is equivalent to using --config=linux on Linux, --config=windows on Windows, etc. + +`--experimental_action_cache_gc_idle_delay=` default: "5m" +: How long the server must remain idle before a garbage collection of the action cache is attempted. Ineffectual unless --experimental\_action\_cache\_gc\_max\_age is nonzero. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--experimental_action_cache_gc_max_age=` default: "0" +: If set to a nonzero value, the action cache will be periodically garbage collected to remove entries older than this age. Garbage collection occurs in the background once the server has become idle, as determined by the --experimental\_action\_cache\_gc\_idle\_delay and --experimental\_action\_cache\_gc\_threshold flags. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--experimental_action_cache_gc_threshold=` default: "10" +: The percentage of stale action cache entries required for garbage collection to be triggered. Ineffectual unless --experimental\_action\_cache\_gc\_max\_age is nonzero. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--experimental_disk_cache_gc_idle_delay=` default: "5m" +: How long the server must remain idle before a garbage collection of the disk cache occurs. To specify the garbage collection policy, set --experimental\_disk\_cache\_gc\_max\_size and/or --experimental\_disk\_cache\_gc\_max\_age. + +`--experimental_disk_cache_gc_max_age=` default: "0" +: If set to a positive value, the disk cache will be periodically garbage collected to remove entries older than this age. If set in conjunction with --experimental\_disk\_cache\_gc\_max\_size, both criteria are applied. Garbage collection occurrs in the background once the server has become idle, as determined by the --experimental\_disk\_cache\_gc\_idle\_delay flag. + +`--experimental_disk_cache_gc_max_size=` default: "0" +: If set to a positive value, the disk cache will be periodically garbage collected to stay under this size. If set in conjunction with --experimental\_disk\_cache\_gc\_max\_age, both criteria are applied. Garbage collection occurrs in the background once the server has become idle, as determined by the --experimental\_disk\_cache\_gc\_idle\_delay flag. + +`--[no]experimental_enable_thread_dump` default: "false" +: Whether to enable thread dumps. If true, Bazel will dump the state of all threads (including virtual threads) to a file every --experimental\_thread\_dump\_interval, or after action execution being inactive for --experimental\_thread\_dump\_action\_execution\_inactivity\_duration. The dumps will be written to the /server/thread\_dumps/ directory. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--experimental_install_base_gc_max_age=` default: "30d" +: How long an install base must go unused before it's eligible for garbage collection. If nonzero, the server will attempt to garbage collect other install bases when idle. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]experimental_rule_extension_api` default: "true" +: Enable experimental rule extension API and subrule APIs + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_thread_dump_action_execution_inactivity_duration=` default: "0" +: Dump the threads when action execution being inactive for this duration. If zero, no thread dumps are written for action execution being inactive. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--experimental_thread_dump_interval=` default: "0" +: How often to dump the threads periodically. If zero, no thread dumps are written periodically. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]experimental_windows_watchfs` default: "false" +: If true, experimental Windows support for --watchfs is enabled. Otherwise --watchfsis a non-op on Windows. Make sure to also enable --watchfs. + +`--google_auth_scopes=` default: "https://www.googleapis.com/auth/cloud-platform" +: A comma-separated list of Google Cloud authentication scopes. + +`--google_credentials=` default: see description +: Specifies the file to get authentication credentials from. See https://cloud.google.com/docs/authentication for details. + +`--[no]google_default_credentials` default: "false" +: Whether to use 'Google Application Default Credentials' for authentication. + See [Authentication methods at Google - Google Cloud](https://cloud.google.com/docs/authentication) for details. + Disabled by default. + +`--grpc_keepalive_time=` default: "60s" +: Configures keep-alive pings for outgoing gRPC connections. If this is set, then Bazel + sends pings after this much time of no read operations on the connection, but + only if there is at least one pending gRPC call. The value 0 disables the keep-alives. + +`--grpc_keepalive_timeout=` default: "20s" +: Configures a keep-alive timeout for outgoing gRPC connections. If keep-alive pings are + enabled with `--grpc_keepalive_time`, then Bazel times out a connection if it does + not receive a ping reply after this much time. Times are treated as second + granularity; it is an error to set a value less than one second. If keep-alive + pings are disabled, then this setting is ignored. + +`--[no]incompatible_disable_non_executable_java_binary` default: "false" +: If true, java\_binary is always executable. create\_executable attribute is removed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--inject_repository=` multiple uses are accumulated +: Adds a new repository with a local path in the form of `{repository name}={path}`. This + only takes effect with `--enable_bzlmod` and is equivalent to adding a + corresponding `local_repository` to the root module's `MODULE.bazel` file via + `use_repo_rule`. If the given path is an absolute path, it will be used as it is. + If the given path is a relative path, it is relative to the current working + directory. If the given path starts with `%workspace%`, it is relative to the + workspace root, which is the output of `bazel info workspace`. If the given path + is empty, then remove any previous injections. + +`--invocation_id=` default: "" +: Unique identifier, in UUID format, for the command being run. If explicitly specified uniqueness must be ensured by the caller. The UUID is printed to stderr, the BEP and remote execution protocol. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--override_repository=` multiple uses are accumulated +: Override a repository with a local path in the form of `{repository name}={path}`, + where the repository name can be either a canonical name or an apparent name from the + point of view of the main repository. + + Note that if this is flag is used to override a module's repository, changes to the + MODULE.bazel file will not be effective if the module is obtained from a registry. Use + `--override_module` instead to for that purpose. + + If the given path is an absolute path, it will be used as it is. If the given path is a + relative path, it is relative to the current working directory. If the given path starts + with `%workspace%`, it is relative to the workspace root, which is the output of `bazel info workspace`. If the given path is empty, then remove any previous overrides. + +`--[no]progress_in_terminal_title` default: "false" +: Show the command progress in the terminal title. Useful to see what bazel is doing when having multiple terminal tabs. + +`--[no]show_progress` default: "true" +: Display progress messages during a build. + +`--show_progress_rate_limit=` default: "0.2" +: Minimum number of seconds between progress messages in the output. + +`--[no]show_timestamps` default: "false" +: Include timestamps in messages + +`--tls_certificate=` default: see description +: Specify a path to a TLS certificate that is trusted to sign server certificates. + +`--tls_client_certificate=` default: see description +: Specify the TLS client certificate to use; you also need to provide a client key to enable client authentication. + +`--tls_client_key=` default: see description +: Specify the TLS client key to use; you also need to provide a client certificate to enable client authentication. + +`--ui_actions_shown=` default: "8" +: Number of concurrent actions shown in the detailed progress bar; each action is shown on a separate line. The progress bar always shows at least one one, all numbers less than 1 are mapped to 1. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]watchfs` default: "false" +: On Linux/macOS: If true, bazel tries to use the operating system's file watch service for local changes instead of scanning every file for a change. On Windows: this flag currently is a non-op but can be enabled in conjunction with --experimental\_windows\_watchfs. On any OS: The behavior is undefined if your workspace is on a network file system, and files are edited on a remote machine. + +## Aquery Options + +Inherits all options from [build](#build). + +Options relating to query output and semantics: + +`--aspect_deps=` default: "conservative" +: How to resolve aspect dependencies when the output format is one of {xml,proto,record}. 'off' means no aspect dependencies are resolved, 'conservative' (the default) means all declared aspect dependencies are added regardless of whether they are given the rule class of direct dependencies, 'precise' means that only those aspects are added that are possibly active given the rule class of the direct dependencies. Note that precise mode requires loading other packages to evaluate a single target thus making it slower than the other modes. Also note that even precise mode is not completely precise: the decision whether to compute an aspect is decided in the analysis phase, which is not run during 'bazel query'. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]consistent_labels` default: "false" +: If enabled, every query command emits labels as if by the Starlark str function applied to a Label instance. This is useful for tools that need to match the output of different query commands and/or labels emitted by rules. If not enabled, output formatters are free to emit apparent repository names (relative to the main repository) instead to make the output more readable. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_explicit_aspects` default: "false" +: aquery, cquery: whether to include aspect-generated actions in the output. query: no-op (aspects are always followed). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]graph:factored` default: "true" +: If true, then the graph will be emitted 'factored', i.e. topologically-equivalent nodes will be merged together and their labels concatenated. This option is only applicable to --output=graph. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--graph:node_limit=` default: "512" +: The maximum length of the label string for a graph node in the output. Longer labels will be truncated; -1 means no truncation. This option is only applicable to --output=graph. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]implicit_deps` default: "true" +: If enabled, implicit dependencies will be included in the dependency graph over which the query operates. An implicit dependency is one that is not explicitly specified in the BUILD file but added by bazel. For cquery, this option controls filtering resolved toolchains. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]include_artifacts` default: "true" +: Includes names of the action inputs and outputs in the output (potentially large). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]include_aspects` default: "true" +: aquery, cquery: whether to include aspect-generated actions in the output. query: no-op (aspects are always followed). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]include_commandline` default: "true" +: Includes the content of the action command lines in the output (potentially large). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]include_file_write_contents` default: "false" +: Include the file contents for the FileWrite, SourceSymlinkManifest, and RepoMappingManifest actions (potentially large). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]include_param_files` default: "false" +: Include the content of the param files used in the command (potentially large). Note: Enabling this flag will automatically enable the --include\_commandline flag. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]include_pruned_inputs` default: "true" +: Includes action inputs that were pruned during action execution. Only affects actions that discover inputs and have been executed in a previous invocation. Only takes effect if --include\_artifacts is also set. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]incompatible_package_group_includes_double_slash` default: "true" +: If enabled, when outputting package\_group's `packages` attribute, the leading `//` will not be omitted. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]infer_universe_scope` default: "false" +: If set and --universe\_scope is unset, then a value of --universe\_scope will be inferred as the list of unique target patterns in the query expression. Note that the --universe\_scope value inferred for a query expression that uses universe-scoped functions (e.g.`allrdeps`) may not be what you want, so you should use this option only if you know what you are doing. See https://bazel.build/reference/query#sky-query for details and examples. If --universe\_scope is set, then this option's value is ignored. Note: this option applies only to `query` (i.e. not `cquery`). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]line_terminator_null` default: "false" +: Whether each format is terminated with \0 instead of newline. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]nodep_deps` default: "true" +: If enabled, deps from "nodep" attributes will be included in the dependency graph over which the query operates. A common example of a "nodep" attribute is "visibility". Run and parse the output of `info build-language` to learn about all the "nodep" attributes in the build language. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--output=` default: "text" +: The format in which the aquery results should be printed. Allowed values for aquery are: text, textproto, proto, streamed\_proto, jsonproto. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--output_file=` default: "" +: When specified, query results will be written directly to this file, and nothing will be printed to Bazel's standard output stream (stdout). In benchmarks, this is generally faster than bazel query > file. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:default_values` default: "true" +: If true, attributes whose value is not explicitly specified in the BUILD file are included; otherwise they are omitted. This option is applicable to --output=proto + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:definition_stack` default: "false" +: Populate the definition\_stack proto field, which records for each rule instance the Starlark call stack at the moment the rule's class was defined. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:flatten_selects` default: "true" +: If enabled, configurable attributes created by select() are flattened. For list types the flattened representation is a list containing each value of the select map exactly once. Scalar types are flattened to null. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]proto:include_attribute_source_aspects` default: "false" +: Populate the source\_aspect\_name proto field of each Attribute with the source aspect that the attribute came from (empty string if it did not). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:include_starlark_rule_env` default: "true" +: Use the starlark environment in the value of the generated $internal\_attr\_hash attribute. This ensures that the starlark rule definition (and its transitive imports) are part of this identifier. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:include_synthetic_attribute_hash` default: "false" +: Whether or not to calculate and populate the $internal\_attr\_hash attribute. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:instantiation_stack` default: "false" +: Populate the instantiation call stack of each rule. Note that this requires the stack to be present + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:locations` default: "true" +: Whether to output location information in proto output at all. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--proto:output_rule_attrs=` default: "all" +: Comma separated list of attributes to include in output. Defaults to all attributes. Set to empty string to not output any attribute. This option is applicable to --output=proto. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:rule_classes` default: "false" +: Populate the rule\_class\_key field of each rule; and for the first rule with a given rule\_class\_key, also populate its rule\_class\_info proto field. The rule\_class\_key field uniquely identifies a rule class, and the rule\_class\_info field is a Stardoc-format rule class API definition. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:rule_inputs_and_outputs` default: "true" +: Whether or not to populate the rule\_input and rule\_output fields. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--query_file=` default: "" +: If set, query will read the query from the file named here, rather than on the command line. It is an error to specify a file here as well as a command-line query. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]relative_locations` default: "false" +: If true, the location of BUILD files in xml and proto outputs will be relative. By default, the location output is an absolute path and will not be consistent across machines. You can set this option to true to have a consistent result across machines. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]skyframe_state` default: "false" +: Without performing extra analysis, dump the current Action Graph from Skyframe. Note: Specifying a target with --skyframe\_state is currently not supported. This flag is only available with --output=proto or --output=textproto. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]tool_deps` default: "true" +: Query: If disabled, dependencies on 'exec configuration' will not be included in the dependency graph over which the query operates. An 'exec configuration' dependency edge, such as the one from any 'proto\_library' rule to the Protocol Compiler, usually points to a tool executed during the build rather than a part of the same 'target' program. + Cquery: If disabled, filters out all configured targets which cross an execution transition from the top-level target that discovered this configured target. That means if the top-level target is in the target configuration, only configured targets also in the target configuration will be returned. If the top-level target is in the exec configuration, only exec configured targets will be returned. This option will NOT exclude resolved toolchains. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--universe_scope=` default: "" +: A comma-separated set of target patterns (additive and subtractive). The query may be performed in the universe defined by the transitive closure of the specified targets. This option is used for the query and cquery commands. + For cquery, the input to this option is the targets all answers are built under and so this option may affect configurations and transitions. If this option is not specified, the top-level targets are assumed to be the targets parsed from the query expression. Note: For cquery, not specifying this option may cause the build to break if targets parsed from the query expression are not buildable with top-level options. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that control build execution: + +`--[no]experimental_persistent_aar_extractor` default: "false" +: Enable persistent aar extractor by using workers. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_remotable_source_manifests` default: "false" +: Whether to make source manifest actions remotable + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_split_coverage_postprocessing` default: "false" +: If true, then Bazel will run coverage postprocessing for test in a new spawn. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_modify_execution_info_additive` default: "true" +: When enabled, passing multiple `--modify_execution_info` flags is additive. + When disabled, only the last flag is taken into account. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--modify_execution_info=` multiple uses are accumulated +: Add or remove keys from an action's execution info based on action mnemonic. + Applies only to actions which support execution info. Many common actions + support execution info, e.g. Genrule, CppCompile, Javac, StarlarkAction, + TestRunner. When specifying multiple values, order matters because + many regexes may apply to the same mnemonic. + + Syntax: `regex=[+-]key,regex=[+-]key,...`. + + Examples: + + * `.*=+x,.*=-y,.*=+z` adds `x` and `z` to, and removes `y` from, the execution info for all actions. + * `Genrule=+requires-x` adds `requires-x` to the execution info for all Genrule actions. + * `(?!Genrule).*=-requires-x` removes `requires-x` from the execution info for all non-Genrule actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--persistent_android_dex_desugar` +: Enable persistent Android dex and desugar actions by using workers. + + Expands to: + +   `--internal_persistent_android_dex_desugar` + +   `--strategy=Desugar=worker` + +   `--strategy=DexBuilder=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_android_resource_processor` +: Enable persistent Android resource processor by using workers. + + Expands to: + +   `--internal_persistent_busybox_tools` + +   `--strategy=AaptPackage=worker` + +   `--strategy=AndroidResourceParser=worker` + +   `--strategy=AndroidResourceValidator=worker` + +   `--strategy=AndroidResourceCompiler=worker` + +   `--strategy=RClassGenerator=worker` + +   `--strategy=AndroidResourceLink=worker` + +   `--strategy=AndroidAapt2=worker` + +   `--strategy=AndroidAssetMerger=worker` + +   `--strategy=AndroidResourceMerger=worker` + +   `--strategy=AndroidCompiledResourceMerger=worker` + +   `--strategy=ManifestMerger=worker` + +   `--strategy=AndroidManifestMerger=worker` + +   `--strategy=Aapt2Optimize=worker` + +   `--strategy=AARGenerator=worker` + +   `--strategy=ProcessDatabinding=worker` + +   `--strategy=GenerateDataBindingBaseClasses=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_dex_desugar` +: Enable persistent multiplexed Android dex and desugar actions by using workers. + + Expands to: + +   `--persistent_android_dex_desugar` + +   `--internal_persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_resource_processor` +: Enable persistent multiplexed Android resource processor by using workers. + + Expands to: + +   `--persistent_android_resource_processor` + +   `--modify_execution_info=AaptPackage=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceParser=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceValidator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceCompiler=+supports-multiplex-workers` + +   `--modify_execution_info=RClassGenerator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceLink=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAapt2=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAssetMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidCompiledResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=ManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=Aapt2Optimize=+supports-multiplex-workers` + +   `--modify_execution_info=AARGenerator=+supports-multiplex-workers` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_tools` +: Enable persistent and multiplexed Android tools (dexing, desugaring, resource processing). + + Expands to: + +   `--internal_persistent_multiplex_busybox_tools` + +   `--persistent_multiplex_android_resource_processor` + +   `--persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]use_target_platform_for_tests` default: "false" +: If true, use the target platform for running tests rather than the test exec group. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that configure the toolchain used for action execution: + +`--android_compiler=` default: see description +: The Android target compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_manifest_merger=` default: "android" +: Selects the manifest merger to use for android\_binary rules. Flag to help the transition to the Android manifest merger from the legacy merger. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_platforms=` default: "" +: Sets the platforms that android\_binary targets use. If multiple platforms are specified, then the binary is a fat APKs, which contains native binaries for each specified target platform. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--cc_output_directory_tag=` default: "" +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compiler=` default: see description +: The C++ compiler to use for compiling the target. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--coverage_output_generator=` default: "@bazel\_tools//tools/test:lcov\_merger" +: Location of the binary that is used to postprocess raw coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:lcov_merger`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_report_generator=` default: "@bazel\_tools//tools/test:coverage\_report\_generator" +: Location of the binary that is used to generate coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:coverage_report_generator`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_support=` default: "@bazel\_tools//tools/test:coverage\_support" +: Location of support files that are required on the inputs of every test action + that collects code coverage. Defaults to `//tools/test:coverage_support`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--custom_malloc=` default: see description +: Specifies a custom malloc implementation. This setting overrides malloc attributes in build rules. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_include_xcode_execution_requirements` default: "false" +: If set, add a "requires-xcode:{version}" execution requirement to every Xcode action. If the Xcode version has a hyphenated label, also add a "requires-xcode-label:{version\_label}" execution requirement. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_prefer_mutual_xcode` default: "true" +: If true, use the most recent Xcode that is available both locally and remotely. If false, or if there are no mutual available versions, use the local Xcode version selected via xcode-select. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--extra_execution_platforms=` default: "" +: The platforms that are available as execution platforms to run actions. + Platforms can be specified by exact target, or as a target pattern. + These platforms will be considered before those declared in the `WORKSPACE` file by + `register_execution_platforms()`. This option may only be set once; later + instances will override earlier flag settings. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--extra_toolchains=` multiple uses are accumulated +: The toolchain rules to be considered during toolchain resolution. + Toolchains can be specified by exact target, or as a target pattern. + These toolchains will be considered before those declared in the `WORKSPACE` file + by `register_toolchains()`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--grte_top=` default: see description +: A label to a checked-in libc library. The default value is selected by the crosstool toolchain, and you almost never need to override it. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_compiler=` default: see description +: No-op flag. Will be removed in a future release. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--host_grte_top=` default: see description +: If specified, this setting overrides the libc top-level directory (--grte\_top) for the exec configuration. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_platform=` default: "@bazel\_tools//tools:host\_platform" +: The label of a platform rule that describes the host system. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]incompatible_bazel_test_exec_run_under` default: "true" +: If enabled, `bazel test --run_under=//:runner` builds `//:runner` in the exec + configuration. If disabled, it builds `//:runner` in the target configuration. + Bazel executes tests on exec machines, so the former is more correct. This + doesn't affect `bazel run`, which always builds `--run_under=//foo` in the + target configuration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_builtin_objc_strip_action` default: "true" +: Whether to emit a strip action as part of objc linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_dont_enable_host_nonhost_crosstool_features` default: "true" +: If true, Bazel will not enable 'host' and 'nonhost' features in the c++ toolchain (see https://github.com/bazelbuild/bazel/issues/7407 for more information). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_remove_legacy_whole_archive` default: "true" +: If true, Bazel will not link library dependencies as whole archive by default (see https://github.com/bazelbuild/bazel/issues/7362 for migration instructions). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strip_executable_safely` default: "false" +: If true, strip action for executables will use flag -x, which does not break dynamic symbol resolution. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]interface_shared_objects` default: "true" +: Use interface shared objects if supported by the toolchain. All ELF toolchains currently support this setting. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_sdk_version=` default: see description +: Specifies the version of the iOS SDK to use to build iOS applications. If unspecified, uses the default iOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--macos_sdk_version=` default: see description +: Specifies the version of the macOS SDK to use to build macOS applications. If unspecified, uses the default macOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--minimum_os_version=` default: see description +: The minimum OS version which your compilation targets. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_mappings=` default: "" +: The location of a mapping file that describes which platform to use if none is set or + which flags to set when a platform already exists. Must be relative to the main + workspace root. Defaults to `platform_mappings` (a file directly under the + workspace root). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--platforms=` default: "" +: The labels of the platform rules describing the target platforms for the current command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_sdk_version=` default: see description +: Specifies the version of the tvOS SDK to use to build tvOS applications. If unspecified, uses the default tvOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]use_platforms_in_apple_crosstool_transition` default: "false" +: Makes apple\_crosstool\_transition fall back to using the value of `--platforms` flag instead of legacy `--cpu` when needed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_sdk_version=` default: see description +: Specifies the version of the watchOS SDK to use to build watchOS applications. If unspecified, uses the default watchOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version=` default: see description +: If specified, uses Xcode of the given version for relevant build actions. If unspecified, uses the executor default version of Xcode. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version_config=` default: "@bazel\_tools//tools/cpp:host\_xcodes" +: The label of the xcode\_config rule to be used for selecting the Xcode version in the build configuration. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that control the output of the command: + +`--[no]apple_generate_dsym` default: "false" +: Whether to generate debug symbol(.dSYM) file(s). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]build_runfile_links` default: "true" +: If true, build runfiles symlink forests for all targets. If false, write them only when required by a local action, test or run command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_runfile_manifests` default: "true" +: If true, write runfiles manifests for all targets. If false, omit them. Local tests will fail to run when false. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_test_dwp` default: "false" +: If enabled, when building C++ tests statically and with fission the .dwp file for the test binary will be automatically built as well. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cc_proto_library_header_suffixes=` default: ".pb.h" +: Sets the suffixes of header files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--cc_proto_library_source_suffixes=` default: ".pb.cc" +: Sets the suffixes of source files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]experimental_proto_descriptor_sets_include_source_info` default: "false" +: Run extra actions for alternative Java api versions in a proto\_library. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_save_feature_state` default: "false" +: Save the state of enabled and requested feautres as an output of compilation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fission=` default: "no" +: Specifies which compilation modes use fission for C++ compilations and links. May be any combination of {'fastbuild', 'dbg', 'opt'} or the special values 'yes' to enable all modes and 'no' to disable all modes. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_always_include_files_in_data` default: "true" +: If true, native rules add `DefaultInfo.files` of data dependencies to their runfiles, + which matches the recommended behavior for Starlark rules ([runfiles features to avoid](https://bazel.build/extending/rules#runfiles_features_to_avoid)). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_compact_repo_mapping_manifest` default: "true" +: If enabled, the `{binary}.repo_mapping` file emits a module extension's repo mapping + only once instead of once for each repo generated by the extension that + contributes runfiles. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_select_on=` default: "" +: List of flags for which the use in `select()` is disabled. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_filegroup_runfiles_for_data` default: "true" +: If true, runfiles of targets listed in the srcs attribute are available to targets that consume the filegroup as a data dependency. + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]objc_generate_linkmap` default: "false" +: Specifies whether to generate a linkmap file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]save_temps` default: "false" +: If set, temporary outputs from gcc will be saved. These include .s files (assembler code), .i files (preprocessed C) and .ii files (preprocessed C++). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with target + configuration. Variables can be either specified by `name`, in which case + the value will be taken from the invocation environment, by the `name=value` + pair which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can be used + multiple times; for options given for the same variable, the latest wins, + options for different variables accumulate. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, all `name=value` + pairs will be available to repository rules. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--allowed_cpu_values=` default: "" +: Allowed values for the `--cpu` flag. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]android_databinding_use_androidx` default: "true" +: Generate AndroidX-compatible data-binding files. This is only used with databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]android_databinding_use_v3_4_args` default: "true" +: Use android databinding v2 with 3.4.0 argument. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--android_dynamic_mode=` default: "off" +: Determines whether C++ deps of Android rules will be linked dynamically when a cc\_binary does not explicitly create a shared library. 'default' means bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--android_manifest_merger_order=` default: "alphabetical" +: Sets the order of manifests passed to the manifest merger for Android binaries. ALPHABETICAL means manifests are sorted by path relative to the execroot. ALPHABETICAL\_BY\_CONFIGURATION means manifests are sorted by paths relative to the configuration directory within the output directory. DEPENDENCY means manifests are ordered with each library's manifest coming before the manifests of its dependencies. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`execution`](#effect_tag_EXECUTION) + +`--[no]android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]collect_code_coverage` default: "false" +: If specified, Bazel will instrument code (using offline instrumentation where + possible) and will collect coverage information during tests. Only targets that + match `--instrumentation_filter` will be affected. Usually this option should + not be specified directly - `bazel coverage` command should be used instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compilation_mode=` [`-c`] default: "fastbuild" +: Specify the mode the binary will be built in. Values: `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--conlyopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--copt=` multiple uses are accumulated +: Additional options to pass to gcc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cpu=` default: "" +: Deprecated: this flag is not used internally by Blaze although there are legacy platform + mappings to allow for backwards compatibility. Do not use this flag, instead use + `--platforms` with an appropriate platform definition. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_absolute_path=` default: see description +: Use CSFDO profile information to optimize compilation. Specify the absolute path name of the zip file containing the profile file, a raw or an indexed LLVM profile file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_instrument=` default: see description +: Generate binaries with context sensitive FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_profile=` default: see description +: The cs\_fdo\_profile representing the context sensitive profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cxxopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--define=` multiple uses are accumulated +: Each `--define` option specifies an assignment for a build variable. + In case of multiple values for a variable, the last one wins. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--dynamic_mode=` default: "default" +: Determines whether C++ binaries will be linked dynamically. 'default' means Bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_propeller_optimize_absolute_paths` default: "true" +: If set, any use of absolute paths for propeller optimize will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_remaining_fdo_absolute_paths` default: "true" +: If set, any use of absolute paths for FDO will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_runfiles` default: "auto" +: Enable runfiles symlink tree; By default, it's off on Windows, on on other platforms. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--exec_aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to exec-configured targets, regardless of whether or not they are top-level targets. This is an experimental feature and is subject to change. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_action_listener=` multiple uses are accumulated +: Deprecated in favor of aspects. Use `action_listener` to attach an `extra_action` to + existing build actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_compress_java_resources` default: "false" +: Compress Java resources in APKs + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_databinding_v2` default: "true" +: Use android databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_rewrite_dexes_with_rex` default: "false" +: use rex tool to rewrite dex files + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_collect_code_coverage_for_generated_files` default: "false" +: If specified, Bazel will also generate collect coverage information for generated files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_omitfp` default: "false" +: If true, use libunwind for stack unwinding, and compile with -fomit-frame-pointer and -fasynchronous-unwind-tables. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_output_paths=` default: "off" +: Which model to use for where in the output tree rules write their outputs, particularly + for multi-platform / multi-configuration builds. This is highly experimental. See + [GH-6526](https://github.com/bazelbuild/bazel/issues/6526) for details. Starlark actions can opt into path mapping by adding the key + `supports-path-mapping` to the `execution_requirements` dict. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_override_platform_cpu_name=` multiple uses are accumulated +: Each entry should be of the form `label=value` where label refers to a platform and values + is the desired shortname to override the platform's CPU name in `$(TARGET_CPU)` + make variable and output path. Only used when + `--experimental_platform_in_output_dir`, `--incompatible_target_cpu_from_platform` or + `--incompatible_bep_cpu_from_platform` is true. Has highest naming priority. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_platform_in_output_dir` default: "Auto" +: If true, a shortname for the target platform is used in the output directory name + instead of the CPU. The exact scheme is experimental and subject to change: + + 1. First, in the rare case the `--platforms` option does not have exactly one value, a + hash of the platforms option is used. + 2. Next, if any shortname for the current platform was registered by + `--experimental_override_name_platform_in_output_dir`, then that shortname is used. + 3. Then, if `--experimental_use_platforms_in_output_dir_legacy_heuristic` is set, use a + shortname based off the current platform Label. + 4. Finally, a hash of the platform option is used as a last resort. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_llvm_covmap` default: "false" +: If specified, Bazel will generate llvm-cov coverage map information rather than gcov when collect\_code\_coverage is enabled. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_platforms_in_output_dir_legacy_heuristic` default: "true" +: Please only use this flag as part of a suggested migration or testing strategy. Note + that the heuristic has known deficiencies and it is suggested to migrate to + relying on just `--experimental_override_name_platform_in_output_dir`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fdo_instrument=` default: see description +: Generate binaries with FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_optimize=` default: see description +: Use FDO profile information to optimize compilation. Specify the name of a zip file containing a .gcda file tree, an afdo file containing an auto profile, or an LLVM profile file. This flag also accepts files specified as labels (e.g. `//foo/bar:file.afdo` - you may need to add an `exports_files` directive to the corresponding package) and labels pointing to `fdo_profile` targets. This flag will be superseded by the `fdo_profile` rule. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_prefetch_hints=` default: see description +: Use cache prefetch hints. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_profile=` default: see description +: The fdo\_profile representing the profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the target configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + See also `--host_features`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]force_pic` default: "false" +: If enabled, all C++ compilations produce position-independent code ("-fPIC"), links prefer PIC pre-built libraries over non-PIC libraries, and links produce position-independent executables ("-pie"). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with execution + configurations. Variables can be either specified by `name`, in which case the + value will be taken from the invocation environment, by the `name=value` pair + which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can + be used multiple times; for options given for the same variable, the latest + wins, options for different variables accumulate. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_compilation_mode=` default: "opt" +: Specify the mode the tools used during the build will be built in. Values: + `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_conlyopt=` multiple uses are accumulated +: Additional option to pass to the C compiler when compiling C (but not C++) source files in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_copt=` multiple uses are accumulated +: Additional options to pass to the C compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cpu=` default: "" +: The host CPU. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cxxopt=` multiple uses are accumulated +: Additional options to pass to C++ compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the exec configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_linkopt=` multiple uses are accumulated +: Additional option to pass to linker when linking tools in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_macos_minimum_os=` default: see description +: Minimum compatible macOS version for host targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--host_per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to the C/C++ compiler when compiling certain files in the exec configurations. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --host\_per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_auto_exec_groups` default: "false" +: When enabled, an exec groups is automatically created for each toolchain used by a rule. + For this to work rule needs to specify `toolchain` parameter on its actions. For + more information, see [GH-17134](https://github.com/bazelbuild/bazel/issues/17134). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_merge_genfiles_directory` default: "true" +: If true, the genfiles directory is folded into the bin directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_target_cpu_from_platform` default: "true" +: If specified, the value of the cpu constraint (`@platforms//cpu:cpu`) of + the target platform is used to set the `$(TARGET_CPU)` make variable. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]instrument_test_targets` default: "false" +: When coverage is enabled, specifies whether to consider instrumenting test rules. + When set, test rules included by `--instrumentation_filter` are instrumented. + Otherwise, test rules are always excluded from coverage instrumentation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--instrumentation_filter=` default: "-/javatests[/:],-/test/java[/:]" +: When coverage is enabled, only rules with names included by the + specified regex-based filter will be instrumented. Rules prefixed + with '-' are excluded instead. Note that only non-test rules are + instrumented unless `--instrument_test_targets` is enabled. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_minimum_os=` default: see description +: Minimum compatible iOS version for target simulators and devices. If unspecified, uses 'ios\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--ios_multi_cpus=` multiple uses are accumulated +: Comma-separated list of architectures to build an ios\_application with. The result is a universal binary containing all specified architectures. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]legacy_whole_archive` default: "true" +: Deprecated, superseded by --incompatible\_remove\_legacy\_whole\_archive (see https://github.com/bazelbuild/bazel/issues/7362 for details). When on, use --whole-archive for cc\_binary rules that have linkshared=True and either linkstatic=True or '-static' in linkopts. This is for backwards compatibility only. A better alternative is to use alwayslink=1 where required. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`deprecated`](#metadata_tag_DEPRECATED) + +`--linkopt=` multiple uses are accumulated +: Additional option to pass to gcc when linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltobackendopt=` multiple uses are accumulated +: Additional option to pass to the LTO backend step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltoindexopt=` multiple uses are accumulated +: Additional option to pass to the LTO indexing step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--macos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple macOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--macos_minimum_os=` default: see description +: Minimum compatible macOS version for targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--memprof_profile=` default: see description +: Use memprof profile. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]objc_enable_binary_stripping` default: "false" +: Whether to perform symbol and dead-code strippings on linked binaries. Binary strippings will be performed if both this flag and --compilation\_mode=opt are specified. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--objccopt=` multiple uses are accumulated +: Additional options to pass to gcc when compiling Objective-C/C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to gcc when compiling certain files. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--per_file_ltobackendopt=` multiple uses are accumulated +: Additional options to selectively pass to LTO backend (under --features=thin\_lto) when compiling certain backend objects. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns. option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_ltobackendopt=//foo/.\*.o,-//foo/bar.o@-O0 adds the -O0 command line option to the LTO backend command line of all o files in //foo/ except bar.o. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_suffix=` default: see description +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--propeller_optimize=` default: see description +: Use Propeller profile information to optimize the build target.A propeller profile must consist of at least one of two files, a cc profile and a ld profile. This flag accepts a build label which must refer to the propeller profile input files. For example, the BUILD file that defines the label, in a/b/BUILD:propeller\_optimize( name = "propeller\_profile", cc\_profile = "propeller\_cc\_profile.txt", ld\_profile = "propeller\_ld\_profile.txt",)An exports\_files directive may have to be added to the corresponding package to make these files visible to Bazel. The option must be used as: --propeller\_optimize=//a/b:propeller\_profile + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_cc_profile=` default: see description +: Absolute path name of cc\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_ld_profile=` default: see description +: Absolute path name of ld\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--run_under=` default: see description +: Prefix to insert before the executables for the `test` and `run` commands. + If the value is `foo -bar`, and the execution command line is `test_binary -baz`, + then the final command line is `foo -bar test_binary -baz`. + This can also be a label to an executable target. Some examples are: + + * `valgrind` + * `strace` + * `strace -c` + * `valgrind --quiet --num-callers=20` + * `//package:target` + * `//package:target --options` + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]share_native_deps` default: "true" +: If true, native libraries that contain identical functionality will be shared among different targets + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]stamp` default: "false" +: Stamp binaries with the date, username, hostname, workspace information, etc. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--strip=` default: "sometimes" +: Specifies whether to strip binaries and shared libraries (using "-Wl,--strip-debug"). The default value of 'sometimes' means strip iff --compilation\_mode=fastbuild. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--stripopt=` multiple uses are accumulated +: Additional options to pass to strip when generating a '.stripped' binary. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--tvos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple tvOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_minimum_os=` default: see description +: Minimum compatible tvOS version for target simulators and devices. If unspecified, uses 'tvos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--visionos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple visionOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple watchOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_minimum_os=` default: see description +: Minimum compatible watchOS version for target simulators and devices. If unspecified, uses 'watchos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xbinary_fdo=` default: see description +: Use XbinaryFDO profile information to optimize compilation. Specify the name of default cross binary profile. When the option is used together with --fdo\_instrument/--fdo\_optimize/--fdo\_profile, those options will always prevail as if xbinary\_fdo is never specified. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]check_visibility` default: "true" +: If disabled, visibility errors in target dependencies are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]desugar_for_android` default: "true" +: Whether to desugar Java 8 bytecode before dexing. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]desugar_java8_libs` default: "false" +: Whether to include supported Java 8 libraries in apps for legacy devices. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]enforce_constraints` default: "true" +: Checks the environments each target is compatible with and reports errors if any target has dependencies that don't support the same environments + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_check_desugar_deps` default: "true" +: Whether to double-check correct desugaring at Android binary level. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_enforce_transitive_visibility` default: "false" +: If true, enable package()s to set the transitive\_visibility attribute to restrict which packages may depend on them. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_one_version_enforcement=` default: "OFF" +: When enabled, enforce that a java\_binary rule can't contain more than one version of the same class file on the classpath. This enforcement can break the build, or can just result in warnings. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_strict_java_deps=` default: "default" +: If true, checks that a Java target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]incompatible_check_testonly_for_output_files` default: "false" +: If enabled, check testonly for prerequisite targets that are output files by looking up the testonly of the generating rule. This matches visibility checking. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_native_android_rules` default: "false" +: If enabled, direct usage of the native Android rules is disabled. Please use the Starlark Android rules from https://github.com/bazelbuild/rules\_android + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]one_version_enforcement_on_java_tests` default: "true" +: When enabled, and with experimental\_one\_version\_enforcement set to a non-NONE value, enforce one version on java\_test targets. This flag can be disabled to improve incremental test performance at the expense of missing potential one version violations. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--strict_proto_deps=` default: "error" +: Unless OFF, checks that a proto\_library target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--strict_public_imports=` default: "off" +: Unless OFF, checks that a proto\_library target explicitly declares all targets used in 'import public' as exported. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]strict_system_includes` default: "false" +: If true, headers found through system include paths (-isystem) are also required to be declared. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--target_environment=` multiple uses are accumulated +: Declares this build's target environment. Must be a label reference to an + [`environment` rule](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java). If specified, all top-level targets must be compatible with this + environment. + + See also `--platforms`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Options that affect the signing outputs of a build: + +`--apk_signing_method=` default: "v1\_v2" +: Implementation to use to sign APKs + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]device_debug_entitlements` default: "true" +: If set, and compilation mode is not 'opt', objc apps will include debug entitlements when signing. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_disallow_sdk_frameworks_attributes` default: "false" +: If true, disallow sdk\_frameworks and weak\_sdk\_frameworks attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_objc_alwayslink_by_default` default: "false" +: If true, make the default value true for alwayslink attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]allow_analysis_failures` default: "false" +: If true, an analysis failure of a rule target results in the target's propagation + of an instance of `AnalysisFailureInfo` containing the error description, instead + of resulting in a build failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--analysis_testing_deps_limit=` default: "2000" +: Sets the maximum number of transitive dependencies through a rule attribute with + a `for_analysis_testing` configuration transition. + Exceeding this limit will result in a rule error. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]break_build_on_parallel_dex2oat_failure` default: "false" +: If true dex2oat action failures will cause the build to break instead of executing dex2oat during test runtime. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--default_test_resources=` multiple uses are accumulated +: Override the default resources amount for tests. The expected format is + `{resource}={value}`. If a single positive number is specified as `{value}` + it will override the default resources for all test sizes. If 4 + comma-separated numbers are specified, they will override the resource + amount for respectively the `small`, `medium`, `large`, `enormous` test sizes. + Values can also be `HOST_RAM`/`HOST_CPU`, optionally followed + by `[-|*]{float}` (eg. `memory=HOST_RAM*.1,HOST_RAM*.2,HOST_RAM*.3,HOST_RAM*.4`). + The default test resources specified by this flag are overridden by explicit + resources specified in tags. + +`--[no]experimental_android_use_parallel_dex2oat` default: "false" +: Use dex2oat in parallel to possibly speed up android\_test. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--ios_simulator_device=` default: see description +: The device to simulate when running an iOS application in the simulator, e.g. 'iPhone 6'. You can get a list of devices by running 'xcrun simctl list devicetypes' on the machine the simulator will be run on. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--ios_simulator_version=` default: see description +: The version of iOS to run on the simulator when running or testing. This is ignored for ios\_test rules if a target device is specified in the rule. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--runs_per_test=` multiple uses are accumulated +: Specifies number of times to run each test. If any of those attempts fail for any + reason, the whole test is considered failed. Normally the value specified is + just an integer. + + Example: `--runs_per_test=3` will run all tests 3 times. + + Alternate syntax: `regex_filter@runs_per_test`. Where `runs_per_test` stands for + an integer value and `regex_filter` stands for a list of include and exclude + regular expression patterns (Also see --instrumentation\_filter). + + Example: `--runs_per_test=//foo/.*,-//foo/bar/.*@3` runs all tests in `//foo/` except + those under `//foo/bar` three times. This option can be passed multiple times. The most + recently passed argument that matches takes precedence. If nothing matches, + the test is only run once. + +`--test_env=` multiple uses are accumulated +: Specifies additional environment variables to be injected into the test runner + environment. Variables can be either specified by `name`, in which + case its value will be read from the Bazel client environment, or by the + `name=value` pair. + Previously set variables can be unset via `=name`. + This option can be used multiple times to specify several variables. + Used only by the 'bazel test' command. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--test_timeout=` default: "-1" +: Override the default test timeout values for test timeouts (in secs). If a single + positive integer value is specified it will override all categories. If 4 + comma-separated integers are specified, they will override the timeouts for + `short`, `moderate`, `long` and `eternal` (in that order). In either form, a value of + -1 tells blaze to use its default timeouts for that category. + +`--[no]zip_undeclared_test_outputs` default: "false" +: If true, undeclared test outputs will be archived in a zip file. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +Options that trigger optimizations of the build time: + +`--[no]cc_dotd_files` default: "true" +: Whether to generate and analyze .d files. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]cc_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_filter_library_jar_with_program_jar` default: "false" +: Filter the ProGuard ProgramJar to remove any classes also present in the LibraryJar. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_dotd_files` default: "true" +: If enabled, C++ .d files will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_jdeps_files` default: "true" +: If enabled, the dependency (.jdeps) files generated from Java compilations will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_retain_test_configuration_across_testonly` default: "true" +: When enabled, `--trim_test_configuration` will not trim the test configuration for rules + marked testonly=1. This is meant to reduce action conflict issues when non-test + rules depend on `cc_test` rules. No effect if `--trim_test_configuration` is + false. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_unsupported_and_brittle_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incremental_dexing` default: "true" +: Does most of the work for dexing separately for each Jar file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]objc_use_dotd_pruning` default: "true" +: If set, .d files emitted by clang will be used to prune the set of inputs passed into objc compiles. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]process_headers_in_dependencies` default: "false" +: When building a target //a:a, process headers in all targets that //a:a depends on (if header processing is enabled for the toolchain). + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]trim_test_configuration` default: "true" +: When enabled, test-related options will be cleared below the top level of the build. When this flag is active, tests cannot be built as dependencies of non-test rules, but changes to test-related options will not cause non-test rules to be re-analyzed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +Options that affect the verbosity, format or location of logging: + +`--toolchain_resolution_debug=` default: "-.\*" +: Print debug information during toolchain resolution. The flag takes a regex, which is checked against toolchain types and specific targets to see which to debug. Multiple regexes may be separated by commas, and then each regex is checked separately. Note: The output of this flag is very complex and will likely only be useful to experts in toolchain resolution. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]verbose_visibility_errors` default: "false" +: If enabled, visibility errors include additional diagnostic information. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--flag_alias=` multiple uses are accumulated +: Sets a shorthand name for a Starlark flag. It takes a single key-value pair in the form + `{key}={value}` as an argument. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Miscellaneous options, not otherwise categorized.: + +`--[no]cache_test_results` [`-t`] default: "auto" +: If set to `auto`, Bazel reruns a test if and only if: + + 1. Bazel detects changes in the test or its dependencies, + 2. The test is marked as `external`, + 3. Multiple test runs were requested with `--runs_per_test`, or + 4. The test previously failed. + If set to `yes`, Bazel caches all test results except for tests marked as + `external`. If set to `no`, Bazel does not cache any test results. + +`--[no]experimental_cancel_concurrent_tests` default: "never" +: If `on_failed` or `on_passed`, then Blaze will cancel concurrently running tests on the first + successful run with that result. This is only useful in combination with + `--runs_per_test_detects_flakes`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_fetch_all_coverage_outputs` default: "false" +: If true, then Bazel fetches the entire coverage data directory for each test during a coverage run. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_generate_llvm_lcov` default: "false" +: If true, coverage for clang will generate an LCOV report. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_java_classpath=` default: "bazel" +: Enables reduced classpaths for Java compilations. + +`--[no]experimental_run_android_lint_on_java_rules` default: "false" +: Whether to validate java\_\* sources. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]explicit_java_test_deps` default: "false" +: Explicitly specify a dependency to JUnit or Hamcrest in a java\_test instead of accidentally obtaining from the TestRunner's deps. Only works for bazel right now. + +`--host_java_launcher=` default: see description +: The Java launcher used by tools that are executed during a build. + +`--host_javacopt=` multiple uses are accumulated +: Additional options to pass to javac when building tools that are executed during a build. + +`--host_jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM when building tools that are executed during the build. These options will get added to the VM startup options of each java\_binary target. + +`--[no]incompatible_exclusive_test_sandboxed` default: "true" +: If true, exclusive tests will run with sandboxed strategy. Add `local` tag to force + an exclusive test run locally + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strict_action_env` default: "true" +: If true, Bazel uses an environment with a static value for PATH and does not + inherit `LD_LIBRARY_PATH`. Use `--action_env=ENV_VARIABLE` if you want to + inherit specific environment variables from the client, but note that doing so + can prevent cross-user caching if a shared cache is used. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--j2objc_translation_flags=` multiple uses are accumulated +: Additional options to pass to the J2ObjC tool. + +`--java_debug` +: Causes the Java virtual machine of a java test to wait for a connection from a JDWP-compliant debugger (such as jdb) before starting the test. Implies -test\_output=streamed. + + Expands to: + +   `--test_arg=--wrapper_script_flag=--debug` + +   `--test_output=streamed` + +   `--test_strategy=exclusive` + +   `--test_timeout=9999` + +   `--nocache_test_results` + +`--[no]java_deps` default: "true" +: Generate dependency information (for now, compile-time classpath) per Java target. + +`--[no]java_header_compilation` default: "true" +: Compile ijars directly from source. + +`--java_language_version=` default: "" +: The Java language version + +`--java_launcher=` default: see description +: The Java launcher to use when building Java binaries. If this flag is set to the empty string, the JDK launcher is used. The "launcher" attribute overrides this flag. + +`--java_runtime_version=` default: "local\_jdk" +: The Java runtime version + +`--javacopt=` multiple uses are accumulated +: Additional options to pass to javac. + +`--jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM. These options will get added to the VM startup options of each java\_binary target. + +`--legacy_main_dex_list_generator=` default: see description +: Specifies a binary to use to generate the list of classes that must be in the main dex when compiling legacy multidex. + +`--optimizing_dexer=` default: see description +: Specifies a binary to use to do dexing without sharding. + +`--plugin=` multiple uses are accumulated +: Plugins to use in the build. Currently works with java\_plugin. + +`--proguard_top=` default: see description +: Specifies which version of ProGuard to use for code removal when building a Java binary. + +`--proto_compiler=` default: "@bazel\_tools//tools/proto:protoc" +: The label of the proto-compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]proto_profile` default: "true" +: Whether to pass profile\_path to the proto compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_profile_path=` default: see description +: The profile to pass to the proto compiler as profile\_path. If unset, but --proto\_profile is true (the default), infers the path from --fdo\_optimize. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_cc=` default: "@bazel\_tools//tools/proto:cc\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile C++ protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_java=` default: "@bazel\_tools//tools/proto:java\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile Java protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_javalite=` default: "@bazel\_tools//tools/proto:javalite\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile JavaLite protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--protocopt=` multiple uses are accumulated +: Additional options to pass to the protobuf compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]runs_per_test_detects_flakes` default: "false" +: If true, any shard in which at least one run/attempt passes and at least one run/attempt fails gets a FLAKY status. + +`--shell_executable=` default: see description +: Absolute path to the shell executable for Bazel to use. If this is unset, but the + `BAZEL_SH` environment variable is set on the first Bazel invocation (that starts + up a Bazel server), Bazel uses that. If neither is set, Bazel uses a hard-coded + default path depending on the operating system it runs on; + + * Windows: `c:/msys64/usr/bin/bash.exe` + * FreeBSD: `/usr/local/bin/bash` + * All others: `/bin/bash`. + + Note that using a shell that is not compatible with `bash` may lead + to build failures or runtime failures of the generated binaries. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--test_arg=` multiple uses are accumulated +: Specifies additional options and arguments that should be passed to the test + executable. Can be used multiple times to specify several arguments. + If multiple tests are executed, each of them will receive identical arguments. + Used only by the `bazel test` command. + +`--test_filter=` default: see description +: Specifies a filter to forward to the test framework. Used to limit the tests run. Note that this does not affect which targets are built. + +`--test_result_expiration=` default: "-1" +: This option is deprecated and has no effect. + +`--[no]test_runner_fail_fast` default: "false" +: Forwards fail fast option to the test runner. The test runner should stop execution upon first failure. + +`--test_sharding_strategy=` default: "explicit" +: Specify strategy for test sharding: + + * `explicit` to only use sharding if the `shard_count` `BUILD` attribute is + present. + * `disabled` to never use test sharding. + * `forced=k` to enforce `k` shards for testing regardless of the `shard_count` `BUILD` + attribute. + +`--tool_java_language_version=` default: "" +: The Java language version used to execute the tools that are needed during a build + +`--tool_java_runtime_version=` default: "remotejdk\_11" +: The Java runtime version used to execute tools during the build + +`--[no]use_ijars` default: "true" +: If enabled, this option causes Java compilation to use interface jars. This will result in faster incremental compilation, but error messages can be different. + +## Build Options + +Options that control build execution: + +`--[no]allow_one_action_on_resource_unavailable` default: "true" +: If set, allow at least one action to run even if the resource is not enough or unavailable. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--allowed_strategies_by_exec_platform==value[,value]' assignment>` multiple uses are accumulated +: Filters spawn strategies by the execution platform without affecting order. + For example: + + ``` + common --spawn_strategy=remote,sandboxed,worker,local + common --strategy=Genrule=local + common --allowed_strategies_by_exec_platform=@platforms//host:host=local,sandboxed,worker + common --allowed_strategies_by_exec_platform=//:linux_amd64=remote + ``` + + With the above options; + + * Actions configured for the host platform will be given `remote,sandboxed,worker`. + * Actions configured for the `//:linux_amd64` platform will be given `remote`. + * Actions configured for the `//:linux_amd64` platform with mnemonic `Genrule` will be + given no strategies and fail to spawn. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]check_up_to_date` default: "false" +: Don't perform the build, just check if it is up-to-date. If all targets are up-to-date, the build completes successfully. If any step needs to be executed an error is reported and the build fails. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--dynamic_local_execution_delay=` default: "1000" +: How many milliseconds should local execution be delayed, if remote execution was faster during a build at least once? + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--dynamic_local_strategy=` multiple uses are accumulated +: The local strategies, in order, to use for the given mnemonic - the first applicable strategy is used. For example, `worker,sandboxed` runs actions that support persistent workers using the worker strategy, and all others using the sandboxed strategy. If no mnemonic is given, the list of strategies is used as the fallback for all mnemonics. The default fallback list is `worker,sandboxed`, or`worker,sandboxed,standalone` if `experimental_local_lockfree_output` is set. Takes [mnemonic=]local\_strategy[,local\_strategy,...] + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--dynamic_remote_strategy=` multiple uses are accumulated +: The remote strategies, in order, to use for the given mnemonic - the first applicable strategy is used. If no mnemonic is given, the list of strategies is used as the fallback for all mnemonics. The default fallback list is `remote`, so this flag usually does not need to be set explicitly. Takes [mnemonic=]remote\_strategy[,remote\_strategy,...] + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]experimental_async_execution` default: "false" +: If set to true, Bazel is allowed to run action in a virtual thread. The number of + actions in flight is still capped with `--jobs`. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--experimental_async_execution_max_concurrent_actions=` default: "5000" +: The number of maximum concurrent actions to run with async execution. If the value is + less than `--jobs`, it is clamped to `--jobs`. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_docker_image=` default: "" +: Specify a Docker image name (e.g. "ubuntu:latest") that should be used to execute a sandboxed action when using the docker strategy and the action itself doesn't already have a container-image attribute in its exec\_properties in the platform description. The value of this flag is passed verbatim to 'docker run', so it supports the same syntax and mechanisms as Docker itself. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_docker_use_customized_images` default: "true" +: If enabled, injects the uid and gid of the current user into the Docker image before using it. This is required if your build / tests depend on the user having a name and home directory inside the container. This is on by default, but you can disable it in case the automatic image customization feature doesn't work in your case or you know that you don't need it. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_dynamic_exclude_tools` default: "true" +: When set, targets that are build "for tool" are not subject to dynamic execution. Such targets are extremely unlikely to be built incrementally and thus not worth spending local cycles on. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--experimental_dynamic_local_load_factor=` default: "0" +: Controls how much load from dynamic execution to put on the local machine. This flag adjusts how many actions in dynamic execution we will schedule concurrently. It is based on the number of CPUs Blaze thinks is available, which can be controlled with the --local\_resources=cpu= flag. + If this flag is 0, all actions are scheduled locally immediately. If > 0, the amount of actions scheduled locally is limited by the number of CPUs available. If < 1, the load factor is used to reduce the number of locally scheduled actions when the number of actions waiting to schedule is high. This lessens the load on the local machine in the clean build case, where the local machine does not contribute much. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--experimental_dynamic_slow_remote_time=` default: "0" +: If >0, the time a dynamically run action must run remote-only before we prioritize its local execution to avoid remote timeouts. This may hide some problems on the remote execution system. Do not turn this on without monitoring of remote execution issues. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]experimental_enable_docker_sandbox` default: "false" +: Enable Docker-based sandboxing. This option has no effect if Docker is not installed. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_inmemory_sandbox_stashes` default: "false" +: If set to true, the contents of stashed sandboxes for reuse\_sandbox\_directories will be tracked in memory. This reduces the amount of I/O needed during reuse. Depending on the build this flag may improve wall time. Depending on the build as well this flag may use a significant amount of additional memory. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_sandbox_async_tree_delete_idle_threads=) eg. "auto", "HOST_CPUS*.5">` default: "4" +: If 0, sandboxes are deleted as soon as actions finish, blocking action completion. If greater than 0, sandboxes are deleted asynchronously in the background without blocking action completion. Asynchronous deletion uses a single thread while a command is running, but ramps up to as many threads as the value of this flag once the server becomes idle. Set to `auto` to use as many threads as the number of CPUs. A server shutdown blocks on any pending asynchronous deletions. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_sandbox_enforce_resources_regexp=` default: "" +: If true, actions whose mnemonic matches the input regex will have their resources request enforced as limits, overriding the value of --experimental\_sandbox\_limits, if the resource type supports it. For example a test that declares cpu:3 and resources:memory:10, will run with at most 3 cpus and 10 megabytes of memory. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_sandbox_limits=) eg. "HOST_CPUS", "HOST_CPUS*.5">` multiple uses are accumulated +: If > 0, each Linux sandbox will be limited to the given amount for the specified resource. Requires --incompatible\_use\_new\_cgroup\_implementation and overrides --experimental\_sandbox\_memory\_limit\_mb. Requires cgroups v1 or v2 and permissions for the users to the cgroups dir. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_sandbox_memory_limit_mb=.>` default: "0" +: If > 0, each Linux sandbox will be limited to the given amount of memory (in MB). Requires cgroups v1 or v2 and permissions for the users to the cgroups dir. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_shrink_worker_pool` default: "false" +: If enabled, could shrink worker pool if worker memory pressure is high. This flag works only when flag experimental\_total\_worker\_memory\_limit\_mb is enabled. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--experimental_total_worker_memory_limit_mb=.>` default: "0" +: If this limit is greater than zero idle workers might be killed if the total memory usage of all workers exceed the limit. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]experimental_use_hermetic_linux_sandbox` default: "false" +: If set to true, do not mount root, only mount whats provided with sandbox\_add\_mount\_pair. Input files will be hardlinked to the sandbox instead of symlinked to from the sandbox. If action input files are located on a filesystem different from the sandbox, then the input files will be copied instead. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_use_windows_sandbox` default: "false" +: Use Windows sandbox to run actions. If "yes", the binary provided by --experimental\_windows\_sandbox\_path must be valid and correspond to a supported version of sandboxfs. If "auto", the binary may be missing or not compatible. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_windows_sandbox_path=` default: "BazelSandbox.exe" +: Path to the Windows sandbox binary to use when --experimental\_use\_windows\_sandbox is true. If a bare name, use the first binary of that name found in the PATH. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_worker_allowlist=` default: see description +: If non-empty, only allow using persistent workers with the given worker key mnemonic. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]experimental_worker_cancellation` default: "false" +: If enabled, Bazel may send cancellation requests to workers that support them. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_worker_memory_limit_mb=.>` default: "0" +: If this limit is greater than zero, workers might be killed if the memory usage of the worker exceeds the limit. If not used together with dynamic execution and `--experimental_dynamic_ignore_local_signals=9`, this may crash your build. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--experimental_worker_metrics_poll_interval=` default: "5s" +: The interval between collecting worker metrics and possibly attempting evictions. Cannot effectively be less than 1s for performance reasons. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]experimental_worker_multiplex_sandboxing` default: "false" +: If enabled, multiplex workers with a 'supports-multiplex-sandboxing' execution requirement will run in a sandboxed environment, using a separate sandbox directory per work request. Multiplex workers with the execution requirement are always sandboxed when running under the dynamic execution strategy, irrespective of this flag. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_worker_sandbox_hardening` default: "false" +: If enabled, workers are run in a hardened sandbox, if the implementation allows it. If hardening is enabled then tmp directories are distinct for different workers. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_worker_sandbox_inmemory_tracking=` multiple uses are accumulated +: A worker key mnemonic for which the contents of the sandbox directory are tracked in memory. This may improve build performance at the cost of additional memory usage. Only affects sandboxed workers. May be specified multiple times for different mnemonics. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_worker_strict_flagfiles` default: "false" +: If enabled, actions arguments for workers that do not follow the worker specification will cause an error. Worker arguments must have exactly one @flagfile argument as the last of its list of arguments. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--genrule_strategy=` default: "" +: Specify how to execute genrules. This flag will be phased out. Instead, use --spawn\_strategy= to control all actions or --strategy=Genrule= to control genrules only. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]incompatible_use_new_cgroup_implementation` default: "true" +: If true, use the new implementation for cgroups. The old implementation only supports the memory controller and ignores the value of --experimental\_sandbox\_limits. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]internal_spawn_scheduler` default: "true" +: Placeholder option so that we can tell in Blaze whether the spawn scheduler was enabled. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--jobs=) eg. "auto", "HOST_CPUS*.5">` [`-j`] default: "auto" +: The number of concurrent jobs to run. Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". Values must be between 1 and 5000. Values above 2500 may cause memory issues. "auto" calculates a reasonable default based on host resources. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]keep_going` [`-k`] default: "false" +: Continue as much as possible after an error. While the target that failed and those that depend on it cannot be analyzed, other prerequisites of these targets can be. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--loading_phase_threads=) eg. "auto", "HOST_CPUS*.5">` default: "auto" +: Number of parallel threads to use for the loading/analysis phase.Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". "auto" sets a reasonable default based on host resources. Must be at least 1. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--[no]reuse_sandbox_directories` default: "true" +: If set to true, directories used by sandboxed non-worker execution may be reused to avoid unnecessary setup costs. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--sandbox_base=` default: "" +: Lets the sandbox create its sandbox directories underneath this path. Specify a path on tmpfs (like /run/shm) to possibly improve performance a lot when your build / tests have many input files. Note: You need enough RAM and free space on the tmpfs to hold output and intermediate files generated by running actions. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]sandbox_enable_loopback_device` default: "true" +: If true, a loopback device will be set up in the linux-sandbox network namespace for local actions. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]sandbox_explicit_pseudoterminal` default: "false" +: Explicitly enable the creation of pseudoterminals for sandboxed actions. Some linux distributions require setting the group id of the process to 'tty' inside the sandbox in order for pseudoterminals to function. If this is causing issues, this flag can be disabled to enable other groups to be used. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--sandbox_tmpfs_path=` multiple uses are accumulated +: For sandboxed actions, mount an empty, writable directory at this absolute path (if supported by the sandboxing implementation, ignored otherwise). + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]skip_incompatible_explicit_targets` default: "false" +: Skip incompatible targets that are explicitly listed on the command line. + By default, building such targets results in an error but they are + silently skipped when this option is enabled. See: [Skipping incompatible targets](https://bazel.build/extending/platforms#skipping-incompatible-targets) + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--spawn_strategy=` default: "" +: Specify how spawn actions are executed by default. Accepts a comma-separated list of strategies from highest to lowest priority. For each action Bazel picks the strategy with the highest priority that can execute the action. The default value is "remote,worker,sandboxed,local". See https://blog.bazel.build/2019/06/19/list-strategy.html for details. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--strategy=` multiple uses are accumulated +: Specify how to distribute compilation of other spawn actions. Accepts a comma-separated list of strategies from highest to lowest priority. For each action Bazel picks the strategy with the highest priority that can execute the action. The default value is "remote,worker,sandboxed,local". This flag overrides the values set by --spawn\_strategy (and --genrule\_strategy if used with mnemonic Genrule). See https://blog.bazel.build/2019/06/19/list-strategy.html for details. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--strategy_regexp==value[,value]' assignment>` multiple uses are accumulated +: Override which spawn strategy should be used to execute spawn actions that have descriptions matching a certain regex\_filter. See --per\_file\_copt for details onregex\_filter matching. The last regex\_filter that matches the description is used. This option overrides other flags for specifying strategy. Example: --strategy\_regexp=//foo.*.cc,-//foo/bar=local means to run actions using local strategy if their descriptions match //foo.*.cc but not //foo/bar. Example: --strategy\_regexp='Compiling.\*/bar=local --strategy\_regexp=Compiling=sandboxed will run 'Compiling //foo/bar/baz' with the 'local' strategy, but reversing the order would run it with 'sandboxed'. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--worker_extra_flag=` multiple uses are accumulated +: Extra command-flags that will be passed to worker processes in addition to --persistent\_worker, keyed by mnemonic (e.g. --worker\_extra\_flag=Javac=--debug. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--worker_max_instances=<[name=]value, where value is an integer, or a keyword ("auto", "HOST_CPUS", "HOST_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST_CPUS*.5">` multiple uses are accumulated +: How many instances of each kind of persistent worker may be launched if you use the 'worker' strategy. May be specified as [name=value] to give a different value per mnemonic. The limit is based on worker keys, which are differentiated based on mnemonic, but also on startup flags and environment, so there can in some cases be more workers per mnemonic than this flag specifies. Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". 'auto' calculates a reasonable default based on machine capacity. "=value" sets a default for unspecified mnemonics. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--worker_max_multiplex_instances=<[name=]value, where value is an integer, or a keyword ("auto", "HOST_CPUS", "HOST_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST_CPUS*.5">` multiple uses are accumulated +: How many WorkRequests a multiplex worker process may receive in parallel if you use the 'worker' strategy with --worker\_multiplex. May be specified as [name=value] to give a different value per mnemonic. The limit is based on worker keys, which are differentiated based on mnemonic, but also on startup flags and environment, so there can in some cases be more workers per mnemonic than this flag specifies. Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". 'auto' calculates a reasonable default based on machine capacity. "=value" sets a default for unspecified mnemonics. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]worker_multiplex` default: "true" +: If enabled, workers will use multiplexing if they support it. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]worker_quit_after_build` default: "false" +: If enabled, all workers quit after a build is done. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]worker_sandboxing` default: "false" +: If enabled, singleplex workers will run in a sandboxed environment. Singleplex workers are always sandboxed when running under the dynamic execution strategy, irrespective of this flag. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]worker_verbose` default: "false" +: If enabled, prints verbose messages when workers are started, shutdown, ... + +Options that control the output of the command: + +`--[no]build` default: "true" +: Execute the build; this is the usual behaviour. + Specifying `--nobuild` causes the build to stop before executing the build + actions, returning zero if the package loading and analysis phases completed + successfully; this mode is useful for testing those phases. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_use_validation_aspect` default: "false" +: Whether to run validation actions using aspect (for parallelism with tests). + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--output_groups=` multiple uses are accumulated +: A list of comma-separated output group names, each of which optionally prefixed by a `+` + or a `-`. A group prefixed by `+` is added to the default set of output groups, + while a group prefixed by `-` is removed from the default set. If at least one + group is not prefixed, the default set of output groups is omitted. For example, + `--output_groups=+foo,+bar` builds the union of the default set, foo, and bar, + while `--output_groups=foo,bar` overrides the default set such that only foo and + bar are built. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]run_validations` default: "true" +: Whether to run validation actions as part of the build. See [Validation Actions](https://bazel.build/extending/rules#validation_actions). + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--serialized_frontier_profile=` default: "" +: Dump a profile of serialized frontier bytes. Specifies the output path. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to top-level targets. In the list, if + aspect `some_aspect` specifies required aspect providers via + `required_aspect_providers`, `some_aspect` will run after + every aspect that was mentioned before it in the aspects list whose advertised + providers satisfy `some_aspect` required aspect providers. Moreover, + `some_aspect` will run after all its required aspects specified by + `requires` attribute. + `some_aspect` will then have access to the values of those aspects' + providers. + `{bzl-file-label}%{aspect_name}`, for example `//tools:my_def.bzl%my_aspect`, where + `my_aspect` is a top-level value from a file `tools/my_def.bzl`. + +`--bep_maximum_open_remote_upload_files=` default: "-1" +: Maximum number of open files allowed during BEP artifact upload. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_convenience_symlinks` default: "normal" +: This flag controls how the convenience symlinks (the symlinks that appear in the + workspace after the build) will be managed. Possible values: + + * `normal` (default): Each kind of convenience symlink will be created or deleted, + as determined by the build. + * `clean`: All symlinks will be unconditionally deleted. + * `ignore`: Symlinks will not be created or cleaned up. + * `log_only`: Generate log messages as if `normal` were passed, but don't actually + perform any filesystem operations (useful for tools). + + Note that only symlinks whose names are generated by the current value of + `--symlink_prefix` can be affected; if the prefix changes, any pre-existing + symlinks will be left alone. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_convenience_symlinks_bep_event` default: "true" +: This flag controls whether or not we will post the build event + `ConvenienceSymlinksIdentified` to the Build Event Protocol. If the value is true, + the BEP will have an entry for `convenienceSymlinksIdentified`, + listing all of the convenience symlinks created in your workspace. If false, then + the `convenienceSymlinksIdentified` entry in the BEP will be empty. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_all` +: Downloads all remote outputs to the local machine. This flag is an alias for --remote\_download\_outputs=all. + + Expands to: + +   `--remote_download_outputs=all` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_minimal` +: Does not download any remote build outputs to the local machine. This flag is an alias for --remote\_download\_outputs=minimal. + + Expands to: + +   `--remote_download_outputs=minimal` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_outputs=` default: "toplevel" +: If set to 'minimal' doesn't download any remote build outputs to the local machine, except the ones required by local actions. If set to 'toplevel' behaves like 'minimal' except that it also downloads outputs of top level targets to the local machine. Both options can significantly reduce build times if network bandwidth is a bottleneck. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_symlink_template=` default: "" +: Instead of downloading remote build outputs to the local machine, create symbolic links. The target of the symbolic links can be specified in the form of a template string. This template string may contain {hash} and {size\_bytes} that expand to the hash of the object and the size in bytes, respectively. These symbolic links may, for example, point to a FUSE file system that loads objects from the CAS on demand. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_toplevel` +: Only downloads remote outputs of top level targets to the local machine. This flag is an alias for --remote\_download\_outputs=toplevel. + + Expands to: + +   `--remote_download_outputs=toplevel` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--symlink_prefix=` default: see description +: The prefix that is prepended to any of the convenience symlinks that are created + after a build. If omitted, the default value is the name of the build tool + followed by a hyphen. If `/` is passed, then no symlinks are created and no + warning is emitted. Warning: the special functionality for `/` will be deprecated + soon; use `--experimental_convenience_symlinks=ignore` instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]experimental_docker_privileged` default: "false" +: If enabled, Bazel will pass the --privileged flag to 'docker run' when running actions. This might be required by your build, but it might also result in reduced hermeticity. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_sandboxfs_map_symlink_targets` default: "false" +: No-op + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--sandbox_add_mount_pair=` multiple uses are accumulated +: Add additional path pair to mount in sandbox. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--sandbox_block_path=` multiple uses are accumulated +: For sandboxed actions, disallow access to this path. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]sandbox_default_allow_network` default: "true" +: Allow network access by default for actions; this may not work with all sandboxing implementations. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]sandbox_fake_hostname` default: "false" +: Change the current hostname to 'localhost' for sandboxed actions. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]sandbox_fake_username` default: "false" +: Change the current username to 'nobody' for sandboxed actions. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--sandbox_writable_path=` multiple uses are accumulated +: For sandboxed actions, make an existing directory writable in the sandbox (if supported by the sandboxing implementation, ignored otherwise). + + Tags: + [`execution`](#effect_tag_EXECUTION) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_config_setting_private_default_visibility` default: "false" +: If incompatible\_enforce\_config\_setting\_visibility=false, this is a noop. Else, if this flag is false, any config\_setting without an explicit visibility attribute is //visibility:public. If this flag is true, config\_setting follows the same visibility logic as all other rules. See https://github.com/bazelbuild/bazel/issues/12933. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_enforce_config_setting_visibility` default: "true" +: If true, enforce config\_setting visibility restrictions. If false, every config\_setting is visible to every target. See https://github.com/bazelbuild/bazel/issues/12932. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]check_tests_up_to_date` default: "false" +: Don't run tests, just check if they are up-to-date. If all tests results are up-to-date, the testing completes successfully. If any test needs to be built or executed, an error is reported and the testing fails. This option implies --check\_up\_to\_date behavior. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--flaky_test_attempts=` multiple uses are accumulated +: Each test will be retried up to the specified number of times in case of any test failure. Tests that required more than one attempt to pass are marked as 'FLAKY' in the test summary. Normally the value specified is just an integer or the string 'default'. If an integer, then all tests will be run up to N times. If 'default', then only a single test attempt will be made for regular tests and three for tests marked explicitly as flaky by their rule (flaky=1 attribute). Alternate syntax: regex\_filter@flaky\_test\_attempts. Where flaky\_test\_attempts is as above and regex\_filter stands for a list of include and exclude regular expression patterns (Also see --runs\_per\_test). Example: --flaky\_test\_attempts=//foo/.*,-//foo/bar/.*@3 deflakes all tests in //foo/ except those under foo/bar three times. This option can be passed multiple times. The most recently passed argument that matches takes precedence. If nothing matches, behavior is as if 'default' above. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--local_test_jobs=) eg. "auto", "HOST_CPUS*.5">` default: "auto" +: The max number of local test jobs to run concurrently. Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". 0 means local resources will limit the number of local test jobs to run concurrently instead. Setting this greater than the value for --jobs is ineffectual. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]test_keep_going` default: "true" +: When disabled, any non-passing test will cause the entire build to stop. By default all tests are run, even if some do not pass. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--test_strategy=` default: "" +: Specifies which strategy to use when running tests. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--test_tmpdir=` default: see description +: Specifies the base temporary directory for 'bazel test' to use. + +Options that trigger optimizations of the build time: + +`--cache_computed_file_digests=` default: "50000" +: If greater than 0, configures Bazel to cache file digests in memory based on their metadata instead of recomputing the digests from disk every time they are needed. Setting this to 0 ensures correctness because not all file changes can be noted from file metadata. When not 0, the number indicates the size of the cache as the number of file digests to be cached. + +`--experimental_active_directories=` default: "" +: Active directories for Skyfocus and remote analysis caching. Specify as comma-separated workspace root-relative paths. This is a stateful flag. Defining one persists it for subsequent invocations, until it is redefined with a new set. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]experimental_cpu_load_scheduling` default: "false" +: Enables the experimental local execution scheduling based on CPU load, not estimation of actions one by one. Experimental scheduling have showed the large benefit on a large local builds on a powerful machines with the large number of cores. Reccommended to use with --local\_resources=cpu=HOST\_CPUS + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_dynamic_ignore_local_signals=` default: see description +: Takes a list of OS signal numbers. If a local branch of dynamic execution gets killed with any of these signals, the remote branch will be allowed to finish instead. For persistent workers, this only affects signals that kill the worker process. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_enable_skyfocus` default: "false" +: If true, enable the use of --experimental\_active\_directories to reduce Bazel's memory footprint for incremental builds. This feature is known as Skyfocus. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--local_resources=) eg. "HOST_CPUS", "HOST_CPUS*.5">` multiple uses are accumulated +: Set the number of resources available to Bazel. Takes in an assignment to a float or HOST\_RAM/HOST\_CPUS, optionally followed by [-|*] (eg. memory=HOST\_RAM*.5 to use half the available RAM). Can be used multiple times to specify multiple types of resources. Bazel will limit concurrently running actions based on the available resources and the resources required. Tests can declare the amount of resources they need by using a tag of the "resources::" format. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +Options that affect the verbosity, format or location of logging: + +`--build_event_upload_max_retries=` default: "4" +: The maximum number of times Bazel should retry uploading a build event. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--[no]debug_spawn_scheduler` default: "false" + +`--[no]experimental_bep_target_summary` default: "false" +: Whether to publish `TargetSummary` events. + +`--[no]experimental_build_event_expand_filesets` default: "false" +: If true, expand Filesets in the BEP when presenting output files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--experimental_build_event_output_group_mode=` multiple uses are accumulated +: Specify how an output group's files will be represented in `TargetComplete`/`AspectComplete` + BEP events. Values are an assignment of an output group name to one of + `NAMED_SET_OF_FILES_ONLY`, `INLINE_ONLY`, or `BOTH`. The default value is + `NAMED_SET_OF_FILES_ONLY`. If an output group is repeated, the final value to + appear is used. The default value sets the mode for coverage artifacts to BOTH: + `--experimental_build_event_output_group_mode=baseline.lcov=both` + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--experimental_build_event_upload_retry_minimum_delay=` default: "1s" +: Initial, minimum delay for exponential backoff retries when BEP upload fails. (exponent: 1.6) + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--experimental_build_event_upload_strategy=` default: see description +: Selects how to upload artifacts referenced in the build event protocol. In Bazel + the valid options include `local` and `remote`. The default value is `local`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_docker_verbose` default: "false" +: If enabled, Bazel will print more verbose messages about the Docker sandbox strategy. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_frontier_violation_check=` default: "strict" +: Strategies to handle potential incorrectness from changes beyond the frontier (i.e. outside the active directories) + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]experimental_frontier_violation_verbose` default: "false" +: If true, Bazel will print instructions for fixing Skycache violations + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_materialize_param_files_directly` default: "false" +: If materializing param files, do so with direct writes to disk. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_run_bep_event_include_residue` default: "false" +: Whether to include the command-line residue in run build events which could contain the residue. By default, the residue is not included in run command build events that could contain the residue. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--experimental_skyfocus_dump_keys=` default: "none" +: For debugging Skyfocus. Dump the focused SkyKeys (roots, leafs, focused deps, focused rdeps). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_skyfocus_dump_post_gc_stats` default: "false" +: For debugging Skyfocus. If enabled, trigger manual GC before/after focusing to report heap sizes reductions. This will increase the Skyfocus latency. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_stream_log_file_uploads` default: "false" +: Stream log file uploads directly to the remote storage rather than writing them to disk. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--explain=` default: see description +: Causes the build system to explain each executed step of the build. The explanation is written to the specified log file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]legacy_important_outputs` default: "false" +: Use this to suppress generation of the legacy `important_outputs` field in the + `TargetComplete` event. `important_outputs` are required for Bazel to ResultStore/BTX + integration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]materialize_param_files` default: "false" +: Writes intermediate parameter files to output tree even when using remote action execution or caching. Useful when debugging actions. This is implied by --subcommands and --verbose\_failures. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--max_config_changes_to_show=` default: "3" +: When discarding the analysis cache due to a change in the build options, displays up to the given number of changed option names. If the number given is -1, all changed options will be displayed. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--max_test_output_bytes=` default: "-1" +: Specifies maximum per-test-log size that can be emitted when --test\_output is 'errors' or 'all'. Useful for avoiding overwhelming the output with excessively noisy test output. The test header is included in the log size. Negative values imply no limit. Output is all or nothing. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT), [`execution`](#effect_tag_EXECUTION) + +`--output_filter=` default: see description +: Only shows warnings and action outputs for rules with a name matching the provided regular expression. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--progress_report_interval=` default: "0" +: The number of seconds to wait between reports on still running jobs. The + default value 0 means the first report will be printed after 10 + seconds, then 30 seconds and after that progress is reported once every minute. + When `--curses` is enabled, progress is reported every second. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_analysis_json_log=` default: see description +: If set, a JSON file is written to this location that contains a detailed log of the behavior of remote analysis caching. It's interpreted as a path relative to the current working directory. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--remote_print_execution_messages=` default: "failure" +: Choose when to print remote execution messages. Valid values are `failure`, to print only on failures, `success` to print only on successes and `all` to print always. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]sandbox_debug` default: "false" +: Enables debugging features for the sandboxing feature. This includes two things: first, the sandbox root contents are left untouched after a build; and second, prints extra debugging information on execution. This can help developers of Bazel or Starlark rules with debugging failures due to missing input files, etc. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--show_result=` default: "1" +: Show the results of the build. For each target, state whether or not it was brought + up-to-date, and if so, a list of output files that were built. The printed files + are convenient strings for copy+pasting to the shell, to execute them. + + This option requires an integer argument, which is the threshold number of targets + above which result information is not printed. Thus zero causes suppression of + the message and `MAX_INT` causes printing of the result to occur always. The + default is one. + + If nothing was built for a target its results may be omitted to keep the output + under the threshold. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]subcommands` [`-s`] default: "false" +: Display the subcommands executed during a build. Related flags: --execution\_log\_json\_file, --execution\_log\_binary\_file (for logging subcommands to a file in a tool-friendly format). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--test_output=` default: "summary" +: Specifies desired output mode. Not to be confused with `--test_summary` which controls + the test summary printed on command completion. + + Valid values are; + + * `summary` (default) to print summaries for failed tests, + * `errors` to also print test logs for failed tests, + * `all` to print summaries and logs for all tests and + * `streamed` to output logs for all tests in real time (this will force tests to be + executed locally one at a time regardless of `--test_strategy` value). + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT), [`execution`](#effect_tag_EXECUTION) + +`--test_summary=` default: "short" +: Specifies the desired format of the test summary. Valid values are; + + * `short` to list all tests that ran to completion. + * `short_uncached` to list tests that ran to completion, omitting cached tests. + * `terse` to list only failed and flaky tests. + * `detailed` to list tests that ran to completion and their test cases. + * `detailed_uncached` to list tests that ran to completion and their test cases, + omitting cached tests. + * `testcase` to print summary in test case resolution without detailed information about + failed test cases. + * `none` to omit the summary. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]verbose_failures` default: "false" +: If a command fails, print out the full command line. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--aspects_parameters=` multiple uses are accumulated +: Specifies the values of the command-line aspects parameters. Each parameter value is + specified via `=`, for example `my_param=my_val` where + `my_param` is a parameter of some aspect in `--aspects` list or required by an + aspect in the list. This option can be used multiple times. However, it is not + allowed to assign values to the same parameter more than once. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--target_pattern_file=` default: "" +: If set, build will read patterns from the file named here, rather than on the command line. It is an error to specify a file here as well as command-line patterns. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Remote caching and execution options: + +`--experimental_circuit_breaker_strategy=` default: see description +: Specifies the strategy for the circuit breaker to use. Available strategies are "failure". On invalid value for the option the behavior same as the option is not set. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_remote_cache_chunking` default: "false" +: If enabled, large blobs are split into content-defined chunks using FastCDC 2020 and uploaded/downloaded in chunks, enabling deduplication across blobs. The server must advertise SplitBlob/SpliceBlob RPCs and FastCDC 2020 parameters in its capabilities. + + Tags: + [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_remote_cache_compression_threshold=` default: "100" +: The minimum blob size required to compress/decompress with zstd. Ineffectual unless --remote\_cache\_compression is set. + +`--experimental_remote_cache_eviction_retries=` default: "5" +: The maximum number of attempts to retry if the build encountered a transient remote cache error that would otherwise fail the build. Applies for example when artifacts are evicted from the remote cache, or in certain cache failure conditions. A new invocation id will be generated for each attempt. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_remote_cache_lease_extension` default: "false" +: If set to true, Bazel will extend the lease for outputs of remote actions during the build by sending `FindMissingBlobs` calls periodically to remote cache. The frequency is based on the value of `--experimental_remote_cache_ttl`. + +`--experimental_remote_cache_ttl=` default: "3h" +: The guaranteed minimal TTL of blobs in the remote cache after their digests are recently referenced e.g. by an ActionResult or FindMissingBlobs. Bazel does several optimizations based on the blobs' TTL e.g. doesn't repeatedly call GetActionResult in an incremental build. The value should be set slightly less than the real TTL since there is a gap between when the server returns the digests and when Bazel receives them. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_remote_capture_corrupted_outputs=` default: see description +: A path to a directory where the corrupted outputs will be captured to. + +`--[no]experimental_remote_discard_merkle_trees` default: "true" +: If set to true, discard in-memory copies of the input root's Merkle tree and associated input mappings during calls to GetActionResult() and Execute(). This reduces memory usage significantly, but does require Bazel to recompute them upon remote cache misses and retries. + +`--experimental_remote_downloader=` default: see description +: A Remote Asset API endpoint URI, to be used as a remote download proxy. The supported schemes are grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. See: https://github.com/bazelbuild/remote-apis/blob/master/build/bazel/remote/asset/v1/remote\_asset.proto + +`--[no]experimental_remote_downloader_local_fallback` default: "false" +: Whether to fall back to the local downloader if remote downloader fails. + +`--[no]experimental_remote_downloader_propagate_credentials` default: "false" +: Whether to propagate credentials from netrc and credential helper to the remote downloader server. The server implementation needs to support the new `http_header_url::` qualifier where the `` is a 0-based position of the URL inside the FetchBlobRequest's `uris` field. The URL-specific headers should take precedence over the global headers. + +`--experimental_remote_failure_rate_threshold=` default: "10" +: Sets the allowed number of failure rate in percentage for a specific time window after which it stops calling to the remote cache/executor. By default the value is 10. Setting this to 0 means no limitation. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--experimental_remote_failure_window_interval=` default: "60s" +: The interval in which the failure rate of the remote requests are computed. On zero or negative value the failure duration is computed the whole duration of the execution.Following units can be used: Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). If the unit is omitted, the value is interpreted as seconds. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]experimental_remote_mark_tool_inputs` default: "false" +: If set to true, Bazel will mark inputs as tool inputs for the remote executor. This can be used to implement remote persistent workers. + +`--experimental_remote_output_service=` default: see description +: HOST or HOST:PORT of a remote output service endpoint. The supported schemes are grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. Specify grpc:// or unix: scheme to disable TLS. + +`--experimental_remote_output_service_output_path_prefix=` default: "" +: The path under which the contents of output directories managed by the --experimental\_remote\_output\_service are placed. The actual output directory used by a build will be a descendant of this path and determined by the output service. + +`--[no]experimental_remote_require_cached` default: "false" +: If set to true, enforce that all actions that can run remotely are cached, or else fail the build. This is useful to troubleshoot non-determinism issues as it allows checking whether actions that should be cached are actually cached without spuriously injecting new results into the cache. + +`--experimental_remote_scrubbing_config=` default: see description +: Enables remote cache key scrubbing with the supplied configuration file, which must be a protocol buffer in text format (see src/main/protobuf/remote\_scrubbing.proto). + + This feature is intended to facilitate sharing a remote/disk cache between actions executing on different platforms but targeting the same platform. It should be used with extreme care, as improper settings may cause accidental sharing of cache entries and result in incorrect builds. + + Scrubbing does not affect how an action is executed, only how its remote/disk cache key is computed for the purpose of retrieving or storing an action result. Scrubbed actions are incompatible with remote execution, and will always be executed locally instead. + + Modifying the scrubbing configuration does not invalidate outputs present in the local filesystem or internal caches; a clean build is required to reexecute affected actions. + + In order to successfully use this feature, you likely want to set a custom --host\_platform together with --experimental\_platform\_in\_output\_dir (to normalize output prefixes). + +`--[no]guard_against_concurrent_changes` default: "lite" +: Set this to 'full' to enable checking the ctime of all input files of an action before uploading it to a remote cache. There may be cases where the Linux kernel delays writing of files, which could cause false positives. The default is 'lite', which only checks source files in the main repository. Setting this to 'off' disables all checks. This is not recommended, as the cache may be polluted when a source file is changed while an action that takes it as an input is executing. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]incompatible_remote_local_fallback_for_remote_cache` default: "false" +: Whether --remote\_local\_fallback applies to --remote\_cache. + +`--[no]remote_accept_cached` default: "true" +: Whether to accept remotely cached action results. + +`--remote_build_event_upload=` default: "minimal" +: If set to 'all', all local outputs referenced by BEP are uploaded to remote cache. + If set to 'minimal', local outputs referenced by BEP are not uploaded to the remote cache, except for files that are important to the consumers of BEP (e.g. test logs and timing profile). bytestream:// scheme is always used for the uri of files even if they are missing from remote cache. + Default to 'minimal'. + +`--remote_bytestream_uri_prefix=` default: see description +: The hostname and instance name to be used in bytestream:// URIs that are written into build event streams. This option can be set when builds are performed using a proxy, which causes the values of --remote\_executor and --remote\_instance\_name to no longer correspond to the canonical name of the remote execution service. When not set, it will default to "${hostname}/${instance\_name}". + +`--remote_cache=` default: see description +: A URI of a caching endpoint. The supported schemes are http, https, grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. Specify grpc://, http:// or unix: scheme to disable TLS. See https://bazel.build/remote/caching + +`--[no]remote_cache_async` default: "true" +: If true, uploading of action results to a disk or remote cache will happen in the background instead of blocking the completion of an action. Some actions are incompatible with background uploads, and may still block even when this flag is set. + +`--[no]remote_cache_compression` default: "false" +: If enabled, compress/decompress cache blobs with zstd when their size is at least --experimental\_remote\_cache\_compression\_threshold. + +`--remote_cache_header=` multiple uses are accumulated +: Specify a header that will be included in cache requests: --remote\_cache\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_default_exec_properties=` multiple uses are accumulated +: Set the default exec properties to be used as the remote execution platform if an execution platform does not already set exec\_properties. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_download_regex=` multiple uses are accumulated +: Force remote build outputs whose path matches this pattern to be downloaded, irrespective of --remote\_download\_outputs. Multiple patterns may be specified by repeating this flag. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--remote_downloader_header=` multiple uses are accumulated +: Specify a header that will be included in remote downloader requests: --remote\_downloader\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_exec_header=` multiple uses are accumulated +: Specify a header that will be included in execution requests: --remote\_exec\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_execution_priority=` default: "0" +: The relative priority of actions to be executed remotely. The semantics of the particular priority values are server-dependent. + +`--remote_executor=` default: see description +: HOST or HOST:PORT of a remote execution endpoint. The supported schemes are grpc, grpcs (grpc with TLS enabled) and unix (local UNIX sockets). If no scheme is provided Bazel will default to grpcs. Specify grpc:// or unix: scheme to disable TLS. + +`--remote_grpc_log=` default: see description +: If specified, a path to a file to log gRPC call related details. This log consists of a sequence of serialized com.google.devtools.build.lib.remote.logging.RemoteExecutionLog.LogEntry protobufs with each message prefixed by a varint denoting the size of the following serialized protobuf message, as performed by the method LogEntry.writeDelimitedTo(OutputStream). + +`--remote_header=` multiple uses are accumulated +: Specify a header that will be included in requests: --remote\_header=Name=Value. Multiple headers can be passed by specifying the flag multiple times. Multiple values for the same name will be converted to a comma-separated list. + +`--remote_instance_name=` default: "" +: Value to pass as instance\_name in the remote execution API. + +`--[no]remote_local_fallback` default: "false" +: Whether to fall back to standalone local execution strategy if remote execution fails. + +`--remote_local_fallback_strategy=` default: "local" +: Deprecated. See https://github.com/bazelbuild/bazel/issues/7480 for details. + +`--remote_max_concurrency_per_connection=` default: "100" +: Limit the max number of concurrent requests per gRPC connection. By default the value is 100. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--remote_max_connections=` default: "100" +: Limit the max number of concurrent connections to remote cache/executor. By default the value is 100. Setting this to 0 means no limitation. + For HTTP remote cache, one TCP connection could handle one request at one time, so Bazel could make up to --remote\_max\_connections concurrent requests. + For gRPC remote cache/executor, one gRPC channel could usually handle 100+ concurrent requests (controlled by --remote\_max\_concurrency\_per\_connection), so Bazel could make around `--remote_max_connections * 100` concurrent requests. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--remote_proxy=` default: see description +: Connect to the remote cache through a proxy. Currently this flag can only be used to configure a Unix domain socket (unix:/path/to/socket). + +`--remote_result_cache_priority=` default: "0" +: The relative priority of remote actions to be stored in remote cache. The semantics of the particular priority values are server-dependent. + +`--remote_retries=` default: "5" +: The maximum number of attempts to retry a transient error. If set to 0, retries are disabled. + +`--remote_retry_max_delay=` default: "5s" +: The maximum backoff delay between remote retry attempts. Following units can be used: Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). If the unit is omitted, the value is interpreted as seconds. + +`--remote_timeout=` default: "60s" +: The maximum amount of time to wait for remote execution and cache calls. For the REST cache, this is both the connect and the read timeout. Following units can be used: Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). If the unit is omitted, the value is interpreted as seconds. + +`--[no]remote_upload_local_results` default: "true" +: Whether to upload locally executed action results to the remote cache if the remote cache supports it and the user is authorized to do so. + +`--[no]remote_verify_downloads` default: "true" +: If set to true, Bazel will compute the hash sum of all remote downloads and discard the remotely cached values if they don't match the expected value. + +Miscellaneous options, not otherwise categorized.: + +`--[no]allow_analysis_cache_discard` default: "true" +: If discarding the analysis cache due to a change in the build system, setting this + option to false will cause bazel to exit, rather than continuing with the build. + This option has no effect when `--discard_analysis_cache` is also set. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--auto_output_filter=` default: "none" +: If --output\_filter is not specified, then the value for this option is used create a filter automatically. Allowed values are 'none' (filter nothing / show everything), 'all' (filter everything / show nothing), 'packages' (include output from rules in packages mentioned on the Blaze command line), and 'subpackages' (like 'packages', but also include subpackages). For the 'packages' and 'subpackages' values //java/foo and //javatests/foo are treated as one package)'. + +`--[no]build_manual_tests` default: "false" +: Forces test targets tagged 'manual' to be built. 'manual' tests are excluded from processing. This option forces them to be built (but not executed). + +`--build_tag_filters=` default: "" +: Specifies a comma-separated list of tags. Each tag can be optionally preceded with '-' to specify excluded tags. Only those targets will be built that contain at least one included tag and do not contain any excluded tags. This option does not affect the set of tests executed with the 'test' command; those are be governed by the test filtering options, for example '--test\_tag\_filters' + +`--[no]build_tests_only` default: "false" +: If specified, only \*\_test and test\_suite rules will be built and other targets specified on the command line will be ignored. By default everything that was requested will be built. + +`--combined_report=` default: "lcov" +: Specifies desired cumulative coverage report type. At this point only LCOV is supported. + +`--[no]compile_one_dependency` default: "false" +: Compile a single dependency of the argument files. This is useful for syntax checking source files in IDEs, for example, by rebuilding a single target that depends on the source file to detect errors as early as possible in the edit/build/test cycle. This argument affects the way all non-flag arguments are interpreted; instead of being targets to build they are source filenames. For each source filename an arbitrary target that depends on it will be built. + +`--deleted_packages=` multiple uses are accumulated +: A comma-separated list of names of packages which the build system will consider non-existent, even if they are visible somewhere on the package path. + Use this option when deleting a subpackage 'x/y' of an existing package 'x'. For example, after deleting x/y/BUILD in your client, the build system may complain if it encounters a label '//x:y/z' if that is still provided by another package\_path entry. Specifying --deleted\_packages x/y avoids this problem. + +`--[no]discard_analysis_cache` default: "false" +: Discard the analysis cache immediately after the analysis phase completes. Reduces memory usage by ~10%, but makes further incremental builds slower. + +`--disk_cache=` default: see description +: A path to a directory where Bazel can read and write actions and action outputs. If the directory does not exist, it will be created. + +`--embed_label=` default: "" +: Embed source control revision or release label in binary + +`--execution_log_binary_file=` default: see description +: Log the executed spawns into this file as length-delimited SpawnExec protos, according to src/main/protobuf/spawn.proto. Prefer --execution\_log\_compact\_file, which is significantly smaller and cheaper to produce. Related flags: --execution\_log\_compact\_file (compact format; mutually exclusive), --execution\_log\_json\_file (text JSON format; mutually exclusive), --execution\_log\_sort (whether to sort the execution log), --subcommands (for displaying subcommands in terminal output). + +`--execution_log_compact_file=` default: see description +: Log the executed spawns into this file as length-delimited ExecLogEntry protos, according to src/main/protobuf/spawn.proto. The entire file is zstd compressed. Related flags: --execution\_log\_binary\_file (binary protobuf format; mutually exclusive), --execution\_log\_json\_file (text JSON format; mutually exclusive), --subcommands (for displaying subcommands in terminal output). + +`--execution_log_json_file=` default: see description +: Log the executed spawns into this file as newline-delimited JSON representations of SpawnExec protos, according to src/main/protobuf/spawn.proto. Prefer --execution\_log\_compact\_file, which is significantly smaller and cheaper to produce. Related flags: --execution\_log\_compact\_file (compact format; mutually exclusive), --execution\_log\_binary\_file (binary protobuf format; mutually exclusive), --execution\_log\_sort (whether to sort the execution log), --subcommands (for displaying subcommands in terminal output). + +`--[no]execution_log_sort` default: "true" +: Whether to sort the execution log, making it easier to compare logs across invocations. Set to false to avoid potentially significant CPU and memory usage at the end of the invocation, at the cost of producing the log in nondeterministic execution order. Only applies to the binary and JSON formats; the compact format is never sorted. + +`--[no]expand_test_suites` default: "true" +: Expand test\_suite targets into their constituent tests before analysis. When this flag is turned on (the default), negative target patterns will apply to the tests belonging to the test suite, otherwise they will not. Turning off this flag is useful when top-level aspects are applied at command line: then they can analyze test\_suite targets. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_disk_cache_gc_idle_delay=` default: "5m" +: How long the server must remain idle before a garbage collection of the disk cache occurs. To specify the garbage collection policy, set --experimental\_disk\_cache\_gc\_max\_size and/or --experimental\_disk\_cache\_gc\_max\_age. + +`--experimental_disk_cache_gc_max_age=` default: "0" +: If set to a positive value, the disk cache will be periodically garbage collected to remove entries older than this age. If set in conjunction with --experimental\_disk\_cache\_gc\_max\_size, both criteria are applied. Garbage collection occurrs in the background once the server has become idle, as determined by the --experimental\_disk\_cache\_gc\_idle\_delay flag. + +`--experimental_disk_cache_gc_max_size=` default: "0" +: If set to a positive value, the disk cache will be periodically garbage collected to stay under this size. If set in conjunction with --experimental\_disk\_cache\_gc\_max\_age, both criteria are applied. Garbage collection occurrs in the background once the server has become idle, as determined by the --experimental\_disk\_cache\_gc\_idle\_delay flag. + +`--experimental_extra_action_filter=` default: "" +: Deprecated in favor of aspects. Filters set of targets to schedule extra\_actions for. + +`--[no]experimental_extra_action_top_level_only` default: "false" +: Deprecated in favor of aspects. Only schedules extra\_actions for top level targets. + +`--experimental_spawn_scheduler` +: Enable dynamic execution by running actions locally and remotely in parallel. Bazel spawns each action locally and remotely and picks the one that completes first. If an action supports workers, the local action will be run in the persistent worker mode. To enable dynamic execution for an individual action mnemonic, use the `--internal_spawn_scheduler` and `--strategy==dynamic` flags instead. + + Expands to: + +   `--internal_spawn_scheduler` + +   `--spawn_strategy=dynamic` + +`--[no]fetch` default: "true" +: Allows the command to fetch external dependencies. If set to false, the command will utilize any cached version of the dependency, and if none exists, the command will result in failure. + +`--local_termination_grace_seconds=` default: "15" +: Time to wait between terminating a local process due to timeout and forcefully shutting it down. + +`--package_path=` default: "%workspace%" +: A colon-separated list of where to look for packages. Elements beginning with '%workspace%' are relative to the enclosing workspace. If omitted or empty, the default is the output of 'bazel info default-package-path'. + +`--[no]show_loading_progress` default: "true" +: If enabled, causes Bazel to print "Loading package:" messages. + +`--test_lang_filters=` default: "" +: Specifies a comma-separated list of test languages. Each language can be optionally preceded with '-' to specify excluded languages. Only those test targets will be found that are written in the specified languages. The name used for each language should be the same as the language prefix in the \*\_test rule, e.g. one of 'cc', 'java', 'py', etc. This option affects --build\_tests\_only behavior and the test command. + +`--test_size_filters=` default: "" +: Specifies a comma-separated list of test sizes. Each size can be optionally preceded with '-' to specify excluded sizes. Only those test targets will be found that contain at least one included size and do not contain any excluded sizes. This option affects --build\_tests\_only behavior and the test command. + +`--test_tag_filters=` default: "" +: Specifies a comma-separated list of test tags. Each tag can be optionally preceded with '-' to specify excluded tags. Only those test targets will be found that contain at least one included tag and do not contain any excluded tags. This option affects --build\_tests\_only behavior and the test command. + +`--test_timeout_filters=` default: "" +: Specifies a comma-separated list of test timeouts. Each timeout can be optionally preceded with '-' to specify excluded timeouts. Only those test targets will be found that contain at least one included timeout and do not contain any excluded timeouts. This option affects --build\_tests\_only behavior and the test command. + +`--workspace_status_command=` default: "" +: A command invoked at the beginning of the build to provide status + information about the workspace in the form of key/value pairs. + See the User's Manual for the full specification. Also see + [`tools/buildstamp/get_workspace_status`](https://github.com/bazelbuild/bazel/blob/master/tools/buildstamp/get_workspace_status) for an example. + +Options that control build execution: + +`--[no]experimental_persistent_aar_extractor` default: "false" +: Enable persistent aar extractor by using workers. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_remotable_source_manifests` default: "false" +: Whether to make source manifest actions remotable + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_split_coverage_postprocessing` default: "false" +: If true, then Bazel will run coverage postprocessing for test in a new spawn. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_modify_execution_info_additive` default: "true" +: When enabled, passing multiple `--modify_execution_info` flags is additive. + When disabled, only the last flag is taken into account. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--modify_execution_info=` multiple uses are accumulated +: Add or remove keys from an action's execution info based on action mnemonic. + Applies only to actions which support execution info. Many common actions + support execution info, e.g. Genrule, CppCompile, Javac, StarlarkAction, + TestRunner. When specifying multiple values, order matters because + many regexes may apply to the same mnemonic. + + Syntax: `regex=[+-]key,regex=[+-]key,...`. + + Examples: + + * `.*=+x,.*=-y,.*=+z` adds `x` and `z` to, and removes `y` from, the execution info for all actions. + * `Genrule=+requires-x` adds `requires-x` to the execution info for all Genrule actions. + * `(?!Genrule).*=-requires-x` removes `requires-x` from the execution info for all non-Genrule actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--persistent_android_dex_desugar` +: Enable persistent Android dex and desugar actions by using workers. + + Expands to: + +   `--internal_persistent_android_dex_desugar` + +   `--strategy=Desugar=worker` + +   `--strategy=DexBuilder=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_android_resource_processor` +: Enable persistent Android resource processor by using workers. + + Expands to: + +   `--internal_persistent_busybox_tools` + +   `--strategy=AaptPackage=worker` + +   `--strategy=AndroidResourceParser=worker` + +   `--strategy=AndroidResourceValidator=worker` + +   `--strategy=AndroidResourceCompiler=worker` + +   `--strategy=RClassGenerator=worker` + +   `--strategy=AndroidResourceLink=worker` + +   `--strategy=AndroidAapt2=worker` + +   `--strategy=AndroidAssetMerger=worker` + +   `--strategy=AndroidResourceMerger=worker` + +   `--strategy=AndroidCompiledResourceMerger=worker` + +   `--strategy=ManifestMerger=worker` + +   `--strategy=AndroidManifestMerger=worker` + +   `--strategy=Aapt2Optimize=worker` + +   `--strategy=AARGenerator=worker` + +   `--strategy=ProcessDatabinding=worker` + +   `--strategy=GenerateDataBindingBaseClasses=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_dex_desugar` +: Enable persistent multiplexed Android dex and desugar actions by using workers. + + Expands to: + +   `--persistent_android_dex_desugar` + +   `--internal_persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_resource_processor` +: Enable persistent multiplexed Android resource processor by using workers. + + Expands to: + +   `--persistent_android_resource_processor` + +   `--modify_execution_info=AaptPackage=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceParser=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceValidator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceCompiler=+supports-multiplex-workers` + +   `--modify_execution_info=RClassGenerator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceLink=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAapt2=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAssetMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidCompiledResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=ManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=Aapt2Optimize=+supports-multiplex-workers` + +   `--modify_execution_info=AARGenerator=+supports-multiplex-workers` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_tools` +: Enable persistent and multiplexed Android tools (dexing, desugaring, resource processing). + + Expands to: + +   `--internal_persistent_multiplex_busybox_tools` + +   `--persistent_multiplex_android_resource_processor` + +   `--persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]use_target_platform_for_tests` default: "false" +: If true, use the target platform for running tests rather than the test exec group. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that configure the toolchain used for action execution: + +`--android_compiler=` default: see description +: The Android target compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_manifest_merger=` default: "android" +: Selects the manifest merger to use for android\_binary rules. Flag to help the transition to the Android manifest merger from the legacy merger. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_platforms=` default: "" +: Sets the platforms that android\_binary targets use. If multiple platforms are specified, then the binary is a fat APKs, which contains native binaries for each specified target platform. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--cc_output_directory_tag=` default: "" +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compiler=` default: see description +: The C++ compiler to use for compiling the target. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--coverage_output_generator=` default: "@bazel\_tools//tools/test:lcov\_merger" +: Location of the binary that is used to postprocess raw coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:lcov_merger`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_report_generator=` default: "@bazel\_tools//tools/test:coverage\_report\_generator" +: Location of the binary that is used to generate coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:coverage_report_generator`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_support=` default: "@bazel\_tools//tools/test:coverage\_support" +: Location of support files that are required on the inputs of every test action + that collects code coverage. Defaults to `//tools/test:coverage_support`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--custom_malloc=` default: see description +: Specifies a custom malloc implementation. This setting overrides malloc attributes in build rules. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_include_xcode_execution_requirements` default: "false" +: If set, add a "requires-xcode:{version}" execution requirement to every Xcode action. If the Xcode version has a hyphenated label, also add a "requires-xcode-label:{version\_label}" execution requirement. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_prefer_mutual_xcode` default: "true" +: If true, use the most recent Xcode that is available both locally and remotely. If false, or if there are no mutual available versions, use the local Xcode version selected via xcode-select. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--extra_execution_platforms=` default: "" +: The platforms that are available as execution platforms to run actions. + Platforms can be specified by exact target, or as a target pattern. + These platforms will be considered before those declared in the `WORKSPACE` file by + `register_execution_platforms()`. This option may only be set once; later + instances will override earlier flag settings. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--extra_toolchains=` multiple uses are accumulated +: The toolchain rules to be considered during toolchain resolution. + Toolchains can be specified by exact target, or as a target pattern. + These toolchains will be considered before those declared in the `WORKSPACE` file + by `register_toolchains()`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--grte_top=` default: see description +: A label to a checked-in libc library. The default value is selected by the crosstool toolchain, and you almost never need to override it. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_compiler=` default: see description +: No-op flag. Will be removed in a future release. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--host_grte_top=` default: see description +: If specified, this setting overrides the libc top-level directory (--grte\_top) for the exec configuration. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_platform=` default: "@bazel\_tools//tools:host\_platform" +: The label of a platform rule that describes the host system. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]incompatible_bazel_test_exec_run_under` default: "true" +: If enabled, `bazel test --run_under=//:runner` builds `//:runner` in the exec + configuration. If disabled, it builds `//:runner` in the target configuration. + Bazel executes tests on exec machines, so the former is more correct. This + doesn't affect `bazel run`, which always builds `--run_under=//foo` in the + target configuration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_builtin_objc_strip_action` default: "true" +: Whether to emit a strip action as part of objc linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_dont_enable_host_nonhost_crosstool_features` default: "true" +: If true, Bazel will not enable 'host' and 'nonhost' features in the c++ toolchain (see https://github.com/bazelbuild/bazel/issues/7407 for more information). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_remove_legacy_whole_archive` default: "true" +: If true, Bazel will not link library dependencies as whole archive by default (see https://github.com/bazelbuild/bazel/issues/7362 for migration instructions). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strip_executable_safely` default: "false" +: If true, strip action for executables will use flag -x, which does not break dynamic symbol resolution. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]interface_shared_objects` default: "true" +: Use interface shared objects if supported by the toolchain. All ELF toolchains currently support this setting. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_sdk_version=` default: see description +: Specifies the version of the iOS SDK to use to build iOS applications. If unspecified, uses the default iOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--macos_sdk_version=` default: see description +: Specifies the version of the macOS SDK to use to build macOS applications. If unspecified, uses the default macOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--minimum_os_version=` default: see description +: The minimum OS version which your compilation targets. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_mappings=` default: "" +: The location of a mapping file that describes which platform to use if none is set or + which flags to set when a platform already exists. Must be relative to the main + workspace root. Defaults to `platform_mappings` (a file directly under the + workspace root). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--platforms=` default: "" +: The labels of the platform rules describing the target platforms for the current command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_sdk_version=` default: see description +: Specifies the version of the tvOS SDK to use to build tvOS applications. If unspecified, uses the default tvOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]use_platforms_in_apple_crosstool_transition` default: "false" +: Makes apple\_crosstool\_transition fall back to using the value of `--platforms` flag instead of legacy `--cpu` when needed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_sdk_version=` default: see description +: Specifies the version of the watchOS SDK to use to build watchOS applications. If unspecified, uses the default watchOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version=` default: see description +: If specified, uses Xcode of the given version for relevant build actions. If unspecified, uses the executor default version of Xcode. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version_config=` default: "@bazel\_tools//tools/cpp:host\_xcodes" +: The label of the xcode\_config rule to be used for selecting the Xcode version in the build configuration. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that control the output of the command: + +`--[no]apple_generate_dsym` default: "false" +: Whether to generate debug symbol(.dSYM) file(s). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]build_runfile_links` default: "true" +: If true, build runfiles symlink forests for all targets. If false, write them only when required by a local action, test or run command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_runfile_manifests` default: "true" +: If true, write runfiles manifests for all targets. If false, omit them. Local tests will fail to run when false. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_test_dwp` default: "false" +: If enabled, when building C++ tests statically and with fission the .dwp file for the test binary will be automatically built as well. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cc_proto_library_header_suffixes=` default: ".pb.h" +: Sets the suffixes of header files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--cc_proto_library_source_suffixes=` default: ".pb.cc" +: Sets the suffixes of source files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]experimental_proto_descriptor_sets_include_source_info` default: "false" +: Run extra actions for alternative Java api versions in a proto\_library. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_save_feature_state` default: "false" +: Save the state of enabled and requested feautres as an output of compilation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fission=` default: "no" +: Specifies which compilation modes use fission for C++ compilations and links. May be any combination of {'fastbuild', 'dbg', 'opt'} or the special values 'yes' to enable all modes and 'no' to disable all modes. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_always_include_files_in_data` default: "true" +: If true, native rules add `DefaultInfo.files` of data dependencies to their runfiles, + which matches the recommended behavior for Starlark rules ([runfiles features to avoid](https://bazel.build/extending/rules#runfiles_features_to_avoid)). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_compact_repo_mapping_manifest` default: "true" +: If enabled, the `{binary}.repo_mapping` file emits a module extension's repo mapping + only once instead of once for each repo generated by the extension that + contributes runfiles. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_select_on=` default: "" +: List of flags for which the use in `select()` is disabled. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_filegroup_runfiles_for_data` default: "true" +: If true, runfiles of targets listed in the srcs attribute are available to targets that consume the filegroup as a data dependency. + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]objc_generate_linkmap` default: "false" +: Specifies whether to generate a linkmap file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]save_temps` default: "false" +: If set, temporary outputs from gcc will be saved. These include .s files (assembler code), .i files (preprocessed C) and .ii files (preprocessed C++). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with target + configuration. Variables can be either specified by `name`, in which case + the value will be taken from the invocation environment, by the `name=value` + pair which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can be used + multiple times; for options given for the same variable, the latest wins, + options for different variables accumulate. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, all `name=value` + pairs will be available to repository rules. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--allowed_cpu_values=` default: "" +: Allowed values for the `--cpu` flag. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]android_databinding_use_androidx` default: "true" +: Generate AndroidX-compatible data-binding files. This is only used with databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]android_databinding_use_v3_4_args` default: "true" +: Use android databinding v2 with 3.4.0 argument. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--android_dynamic_mode=` default: "off" +: Determines whether C++ deps of Android rules will be linked dynamically when a cc\_binary does not explicitly create a shared library. 'default' means bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--android_manifest_merger_order=` default: "alphabetical" +: Sets the order of manifests passed to the manifest merger for Android binaries. ALPHABETICAL means manifests are sorted by path relative to the execroot. ALPHABETICAL\_BY\_CONFIGURATION means manifests are sorted by paths relative to the configuration directory within the output directory. DEPENDENCY means manifests are ordered with each library's manifest coming before the manifests of its dependencies. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`execution`](#effect_tag_EXECUTION) + +`--[no]android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]collect_code_coverage` default: "false" +: If specified, Bazel will instrument code (using offline instrumentation where + possible) and will collect coverage information during tests. Only targets that + match `--instrumentation_filter` will be affected. Usually this option should + not be specified directly - `bazel coverage` command should be used instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compilation_mode=` [`-c`] default: "fastbuild" +: Specify the mode the binary will be built in. Values: `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--conlyopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--copt=` multiple uses are accumulated +: Additional options to pass to gcc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cpu=` default: "" +: Deprecated: this flag is not used internally by Blaze although there are legacy platform + mappings to allow for backwards compatibility. Do not use this flag, instead use + `--platforms` with an appropriate platform definition. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_absolute_path=` default: see description +: Use CSFDO profile information to optimize compilation. Specify the absolute path name of the zip file containing the profile file, a raw or an indexed LLVM profile file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_instrument=` default: see description +: Generate binaries with context sensitive FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_profile=` default: see description +: The cs\_fdo\_profile representing the context sensitive profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cxxopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--define=` multiple uses are accumulated +: Each `--define` option specifies an assignment for a build variable. + In case of multiple values for a variable, the last one wins. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--dynamic_mode=` default: "default" +: Determines whether C++ binaries will be linked dynamically. 'default' means Bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_propeller_optimize_absolute_paths` default: "true" +: If set, any use of absolute paths for propeller optimize will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_remaining_fdo_absolute_paths` default: "true" +: If set, any use of absolute paths for FDO will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_runfiles` default: "auto" +: Enable runfiles symlink tree; By default, it's off on Windows, on on other platforms. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--exec_aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to exec-configured targets, regardless of whether or not they are top-level targets. This is an experimental feature and is subject to change. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_action_listener=` multiple uses are accumulated +: Deprecated in favor of aspects. Use `action_listener` to attach an `extra_action` to + existing build actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_compress_java_resources` default: "false" +: Compress Java resources in APKs + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_databinding_v2` default: "true" +: Use android databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_rewrite_dexes_with_rex` default: "false" +: use rex tool to rewrite dex files + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_collect_code_coverage_for_generated_files` default: "false" +: If specified, Bazel will also generate collect coverage information for generated files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_omitfp` default: "false" +: If true, use libunwind for stack unwinding, and compile with -fomit-frame-pointer and -fasynchronous-unwind-tables. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_output_paths=` default: "off" +: Which model to use for where in the output tree rules write their outputs, particularly + for multi-platform / multi-configuration builds. This is highly experimental. See + [GH-6526](https://github.com/bazelbuild/bazel/issues/6526) for details. Starlark actions can opt into path mapping by adding the key + `supports-path-mapping` to the `execution_requirements` dict. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_override_platform_cpu_name=` multiple uses are accumulated +: Each entry should be of the form `label=value` where label refers to a platform and values + is the desired shortname to override the platform's CPU name in `$(TARGET_CPU)` + make variable and output path. Only used when + `--experimental_platform_in_output_dir`, `--incompatible_target_cpu_from_platform` or + `--incompatible_bep_cpu_from_platform` is true. Has highest naming priority. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_platform_in_output_dir` default: "Auto" +: If true, a shortname for the target platform is used in the output directory name + instead of the CPU. The exact scheme is experimental and subject to change: + + 1. First, in the rare case the `--platforms` option does not have exactly one value, a + hash of the platforms option is used. + 2. Next, if any shortname for the current platform was registered by + `--experimental_override_name_platform_in_output_dir`, then that shortname is used. + 3. Then, if `--experimental_use_platforms_in_output_dir_legacy_heuristic` is set, use a + shortname based off the current platform Label. + 4. Finally, a hash of the platform option is used as a last resort. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_llvm_covmap` default: "false" +: If specified, Bazel will generate llvm-cov coverage map information rather than gcov when collect\_code\_coverage is enabled. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_platforms_in_output_dir_legacy_heuristic` default: "true" +: Please only use this flag as part of a suggested migration or testing strategy. Note + that the heuristic has known deficiencies and it is suggested to migrate to + relying on just `--experimental_override_name_platform_in_output_dir`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fdo_instrument=` default: see description +: Generate binaries with FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_optimize=` default: see description +: Use FDO profile information to optimize compilation. Specify the name of a zip file containing a .gcda file tree, an afdo file containing an auto profile, or an LLVM profile file. This flag also accepts files specified as labels (e.g. `//foo/bar:file.afdo` - you may need to add an `exports_files` directive to the corresponding package) and labels pointing to `fdo_profile` targets. This flag will be superseded by the `fdo_profile` rule. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_prefetch_hints=` default: see description +: Use cache prefetch hints. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_profile=` default: see description +: The fdo\_profile representing the profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the target configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + See also `--host_features`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]force_pic` default: "false" +: If enabled, all C++ compilations produce position-independent code ("-fPIC"), links prefer PIC pre-built libraries over non-PIC libraries, and links produce position-independent executables ("-pie"). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with execution + configurations. Variables can be either specified by `name`, in which case the + value will be taken from the invocation environment, by the `name=value` pair + which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can + be used multiple times; for options given for the same variable, the latest + wins, options for different variables accumulate. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_compilation_mode=` default: "opt" +: Specify the mode the tools used during the build will be built in. Values: + `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_conlyopt=` multiple uses are accumulated +: Additional option to pass to the C compiler when compiling C (but not C++) source files in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_copt=` multiple uses are accumulated +: Additional options to pass to the C compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cpu=` default: "" +: The host CPU. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cxxopt=` multiple uses are accumulated +: Additional options to pass to C++ compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the exec configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_linkopt=` multiple uses are accumulated +: Additional option to pass to linker when linking tools in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_macos_minimum_os=` default: see description +: Minimum compatible macOS version for host targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--host_per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to the C/C++ compiler when compiling certain files in the exec configurations. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --host\_per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_auto_exec_groups` default: "false" +: When enabled, an exec groups is automatically created for each toolchain used by a rule. + For this to work rule needs to specify `toolchain` parameter on its actions. For + more information, see [GH-17134](https://github.com/bazelbuild/bazel/issues/17134). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_merge_genfiles_directory` default: "true" +: If true, the genfiles directory is folded into the bin directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_target_cpu_from_platform` default: "true" +: If specified, the value of the cpu constraint (`@platforms//cpu:cpu`) of + the target platform is used to set the `$(TARGET_CPU)` make variable. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]instrument_test_targets` default: "false" +: When coverage is enabled, specifies whether to consider instrumenting test rules. + When set, test rules included by `--instrumentation_filter` are instrumented. + Otherwise, test rules are always excluded from coverage instrumentation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--instrumentation_filter=` default: "-/javatests[/:],-/test/java[/:]" +: When coverage is enabled, only rules with names included by the + specified regex-based filter will be instrumented. Rules prefixed + with '-' are excluded instead. Note that only non-test rules are + instrumented unless `--instrument_test_targets` is enabled. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_minimum_os=` default: see description +: Minimum compatible iOS version for target simulators and devices. If unspecified, uses 'ios\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--ios_multi_cpus=` multiple uses are accumulated +: Comma-separated list of architectures to build an ios\_application with. The result is a universal binary containing all specified architectures. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]legacy_whole_archive` default: "true" +: Deprecated, superseded by --incompatible\_remove\_legacy\_whole\_archive (see https://github.com/bazelbuild/bazel/issues/7362 for details). When on, use --whole-archive for cc\_binary rules that have linkshared=True and either linkstatic=True or '-static' in linkopts. This is for backwards compatibility only. A better alternative is to use alwayslink=1 where required. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`deprecated`](#metadata_tag_DEPRECATED) + +`--linkopt=` multiple uses are accumulated +: Additional option to pass to gcc when linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltobackendopt=` multiple uses are accumulated +: Additional option to pass to the LTO backend step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltoindexopt=` multiple uses are accumulated +: Additional option to pass to the LTO indexing step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--macos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple macOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--macos_minimum_os=` default: see description +: Minimum compatible macOS version for targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--memprof_profile=` default: see description +: Use memprof profile. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]objc_enable_binary_stripping` default: "false" +: Whether to perform symbol and dead-code strippings on linked binaries. Binary strippings will be performed if both this flag and --compilation\_mode=opt are specified. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--objccopt=` multiple uses are accumulated +: Additional options to pass to gcc when compiling Objective-C/C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to gcc when compiling certain files. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--per_file_ltobackendopt=` multiple uses are accumulated +: Additional options to selectively pass to LTO backend (under --features=thin\_lto) when compiling certain backend objects. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns. option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_ltobackendopt=//foo/.\*.o,-//foo/bar.o@-O0 adds the -O0 command line option to the LTO backend command line of all o files in //foo/ except bar.o. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_suffix=` default: see description +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--propeller_optimize=` default: see description +: Use Propeller profile information to optimize the build target.A propeller profile must consist of at least one of two files, a cc profile and a ld profile. This flag accepts a build label which must refer to the propeller profile input files. For example, the BUILD file that defines the label, in a/b/BUILD:propeller\_optimize( name = "propeller\_profile", cc\_profile = "propeller\_cc\_profile.txt", ld\_profile = "propeller\_ld\_profile.txt",)An exports\_files directive may have to be added to the corresponding package to make these files visible to Bazel. The option must be used as: --propeller\_optimize=//a/b:propeller\_profile + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_cc_profile=` default: see description +: Absolute path name of cc\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_ld_profile=` default: see description +: Absolute path name of ld\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--run_under=` default: see description +: Prefix to insert before the executables for the `test` and `run` commands. + If the value is `foo -bar`, and the execution command line is `test_binary -baz`, + then the final command line is `foo -bar test_binary -baz`. + This can also be a label to an executable target. Some examples are: + + * `valgrind` + * `strace` + * `strace -c` + * `valgrind --quiet --num-callers=20` + * `//package:target` + * `//package:target --options` + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]share_native_deps` default: "true" +: If true, native libraries that contain identical functionality will be shared among different targets + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]stamp` default: "false" +: Stamp binaries with the date, username, hostname, workspace information, etc. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--strip=` default: "sometimes" +: Specifies whether to strip binaries and shared libraries (using "-Wl,--strip-debug"). The default value of 'sometimes' means strip iff --compilation\_mode=fastbuild. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--stripopt=` multiple uses are accumulated +: Additional options to pass to strip when generating a '.stripped' binary. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--tvos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple tvOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_minimum_os=` default: see description +: Minimum compatible tvOS version for target simulators and devices. If unspecified, uses 'tvos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--visionos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple visionOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple watchOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_minimum_os=` default: see description +: Minimum compatible watchOS version for target simulators and devices. If unspecified, uses 'watchos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xbinary_fdo=` default: see description +: Use XbinaryFDO profile information to optimize compilation. Specify the name of default cross binary profile. When the option is used together with --fdo\_instrument/--fdo\_optimize/--fdo\_profile, those options will always prevail as if xbinary\_fdo is never specified. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]check_visibility` default: "true" +: If disabled, visibility errors in target dependencies are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]desugar_for_android` default: "true" +: Whether to desugar Java 8 bytecode before dexing. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]desugar_java8_libs` default: "false" +: Whether to include supported Java 8 libraries in apps for legacy devices. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]enforce_constraints` default: "true" +: Checks the environments each target is compatible with and reports errors if any target has dependencies that don't support the same environments + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_check_desugar_deps` default: "true" +: Whether to double-check correct desugaring at Android binary level. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_enforce_transitive_visibility` default: "false" +: If true, enable package()s to set the transitive\_visibility attribute to restrict which packages may depend on them. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_one_version_enforcement=` default: "OFF" +: When enabled, enforce that a java\_binary rule can't contain more than one version of the same class file on the classpath. This enforcement can break the build, or can just result in warnings. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_strict_java_deps=` default: "default" +: If true, checks that a Java target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]incompatible_check_testonly_for_output_files` default: "false" +: If enabled, check testonly for prerequisite targets that are output files by looking up the testonly of the generating rule. This matches visibility checking. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_native_android_rules` default: "false" +: If enabled, direct usage of the native Android rules is disabled. Please use the Starlark Android rules from https://github.com/bazelbuild/rules\_android + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]one_version_enforcement_on_java_tests` default: "true" +: When enabled, and with experimental\_one\_version\_enforcement set to a non-NONE value, enforce one version on java\_test targets. This flag can be disabled to improve incremental test performance at the expense of missing potential one version violations. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--strict_proto_deps=` default: "error" +: Unless OFF, checks that a proto\_library target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--strict_public_imports=` default: "off" +: Unless OFF, checks that a proto\_library target explicitly declares all targets used in 'import public' as exported. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]strict_system_includes` default: "false" +: If true, headers found through system include paths (-isystem) are also required to be declared. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--target_environment=` multiple uses are accumulated +: Declares this build's target environment. Must be a label reference to an + [`environment` rule](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java). If specified, all top-level targets must be compatible with this + environment. + + See also `--platforms`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Options that affect the signing outputs of a build: + +`--apk_signing_method=` default: "v1\_v2" +: Implementation to use to sign APKs + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]device_debug_entitlements` default: "true" +: If set, and compilation mode is not 'opt', objc apps will include debug entitlements when signing. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_disallow_sdk_frameworks_attributes` default: "false" +: If true, disallow sdk\_frameworks and weak\_sdk\_frameworks attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_objc_alwayslink_by_default` default: "false" +: If true, make the default value true for alwayslink attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]allow_analysis_failures` default: "false" +: If true, an analysis failure of a rule target results in the target's propagation + of an instance of `AnalysisFailureInfo` containing the error description, instead + of resulting in a build failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--analysis_testing_deps_limit=` default: "2000" +: Sets the maximum number of transitive dependencies through a rule attribute with + a `for_analysis_testing` configuration transition. + Exceeding this limit will result in a rule error. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]break_build_on_parallel_dex2oat_failure` default: "false" +: If true dex2oat action failures will cause the build to break instead of executing dex2oat during test runtime. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--default_test_resources=` multiple uses are accumulated +: Override the default resources amount for tests. The expected format is + `{resource}={value}`. If a single positive number is specified as `{value}` + it will override the default resources for all test sizes. If 4 + comma-separated numbers are specified, they will override the resource + amount for respectively the `small`, `medium`, `large`, `enormous` test sizes. + Values can also be `HOST_RAM`/`HOST_CPU`, optionally followed + by `[-|*]{float}` (eg. `memory=HOST_RAM*.1,HOST_RAM*.2,HOST_RAM*.3,HOST_RAM*.4`). + The default test resources specified by this flag are overridden by explicit + resources specified in tags. + +`--[no]experimental_android_use_parallel_dex2oat` default: "false" +: Use dex2oat in parallel to possibly speed up android\_test. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--ios_simulator_device=` default: see description +: The device to simulate when running an iOS application in the simulator, e.g. 'iPhone 6'. You can get a list of devices by running 'xcrun simctl list devicetypes' on the machine the simulator will be run on. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--ios_simulator_version=` default: see description +: The version of iOS to run on the simulator when running or testing. This is ignored for ios\_test rules if a target device is specified in the rule. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--runs_per_test=` multiple uses are accumulated +: Specifies number of times to run each test. If any of those attempts fail for any + reason, the whole test is considered failed. Normally the value specified is + just an integer. + + Example: `--runs_per_test=3` will run all tests 3 times. + + Alternate syntax: `regex_filter@runs_per_test`. Where `runs_per_test` stands for + an integer value and `regex_filter` stands for a list of include and exclude + regular expression patterns (Also see --instrumentation\_filter). + + Example: `--runs_per_test=//foo/.*,-//foo/bar/.*@3` runs all tests in `//foo/` except + those under `//foo/bar` three times. This option can be passed multiple times. The most + recently passed argument that matches takes precedence. If nothing matches, + the test is only run once. + +`--test_env=` multiple uses are accumulated +: Specifies additional environment variables to be injected into the test runner + environment. Variables can be either specified by `name`, in which + case its value will be read from the Bazel client environment, or by the + `name=value` pair. + Previously set variables can be unset via `=name`. + This option can be used multiple times to specify several variables. + Used only by the 'bazel test' command. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--test_timeout=` default: "-1" +: Override the default test timeout values for test timeouts (in secs). If a single + positive integer value is specified it will override all categories. If 4 + comma-separated integers are specified, they will override the timeouts for + `short`, `moderate`, `long` and `eternal` (in that order). In either form, a value of + -1 tells blaze to use its default timeouts for that category. + +`--[no]zip_undeclared_test_outputs` default: "false" +: If true, undeclared test outputs will be archived in a zip file. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +Options that trigger optimizations of the build time: + +`--[no]cc_dotd_files` default: "true" +: Whether to generate and analyze .d files. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]cc_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_filter_library_jar_with_program_jar` default: "false" +: Filter the ProGuard ProgramJar to remove any classes also present in the LibraryJar. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_dotd_files` default: "true" +: If enabled, C++ .d files will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_jdeps_files` default: "true" +: If enabled, the dependency (.jdeps) files generated from Java compilations will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_retain_test_configuration_across_testonly` default: "true" +: When enabled, `--trim_test_configuration` will not trim the test configuration for rules + marked testonly=1. This is meant to reduce action conflict issues when non-test + rules depend on `cc_test` rules. No effect if `--trim_test_configuration` is + false. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_unsupported_and_brittle_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incremental_dexing` default: "true" +: Does most of the work for dexing separately for each Jar file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]objc_use_dotd_pruning` default: "true" +: If set, .d files emitted by clang will be used to prune the set of inputs passed into objc compiles. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]process_headers_in_dependencies` default: "false" +: When building a target //a:a, process headers in all targets that //a:a depends on (if header processing is enabled for the toolchain). + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]trim_test_configuration` default: "true" +: When enabled, test-related options will be cleared below the top level of the build. When this flag is active, tests cannot be built as dependencies of non-test rules, but changes to test-related options will not cause non-test rules to be re-analyzed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +Options that affect the verbosity, format or location of logging: + +`--toolchain_resolution_debug=` default: "-.\*" +: Print debug information during toolchain resolution. The flag takes a regex, which is checked against toolchain types and specific targets to see which to debug. Multiple regexes may be separated by commas, and then each regex is checked separately. Note: The output of this flag is very complex and will likely only be useful to experts in toolchain resolution. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]verbose_visibility_errors` default: "false" +: If enabled, visibility errors include additional diagnostic information. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--flag_alias=` multiple uses are accumulated +: Sets a shorthand name for a Starlark flag. It takes a single key-value pair in the form + `{key}={value}` as an argument. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Miscellaneous options, not otherwise categorized.: + +`--[no]cache_test_results` [`-t`] default: "auto" +: If set to `auto`, Bazel reruns a test if and only if: + + 1. Bazel detects changes in the test or its dependencies, + 2. The test is marked as `external`, + 3. Multiple test runs were requested with `--runs_per_test`, or + 4. The test previously failed. + If set to `yes`, Bazel caches all test results except for tests marked as + `external`. If set to `no`, Bazel does not cache any test results. + +`--[no]experimental_cancel_concurrent_tests` default: "never" +: If `on_failed` or `on_passed`, then Blaze will cancel concurrently running tests on the first + successful run with that result. This is only useful in combination with + `--runs_per_test_detects_flakes`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_fetch_all_coverage_outputs` default: "false" +: If true, then Bazel fetches the entire coverage data directory for each test during a coverage run. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_generate_llvm_lcov` default: "false" +: If true, coverage for clang will generate an LCOV report. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_java_classpath=` default: "bazel" +: Enables reduced classpaths for Java compilations. + +`--[no]experimental_run_android_lint_on_java_rules` default: "false" +: Whether to validate java\_\* sources. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]explicit_java_test_deps` default: "false" +: Explicitly specify a dependency to JUnit or Hamcrest in a java\_test instead of accidentally obtaining from the TestRunner's deps. Only works for bazel right now. + +`--host_java_launcher=` default: see description +: The Java launcher used by tools that are executed during a build. + +`--host_javacopt=` multiple uses are accumulated +: Additional options to pass to javac when building tools that are executed during a build. + +`--host_jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM when building tools that are executed during the build. These options will get added to the VM startup options of each java\_binary target. + +`--[no]incompatible_exclusive_test_sandboxed` default: "true" +: If true, exclusive tests will run with sandboxed strategy. Add `local` tag to force + an exclusive test run locally + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strict_action_env` default: "true" +: If true, Bazel uses an environment with a static value for PATH and does not + inherit `LD_LIBRARY_PATH`. Use `--action_env=ENV_VARIABLE` if you want to + inherit specific environment variables from the client, but note that doing so + can prevent cross-user caching if a shared cache is used. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--j2objc_translation_flags=` multiple uses are accumulated +: Additional options to pass to the J2ObjC tool. + +`--java_debug` +: Causes the Java virtual machine of a java test to wait for a connection from a JDWP-compliant debugger (such as jdb) before starting the test. Implies -test\_output=streamed. + + Expands to: + +   `--test_arg=--wrapper_script_flag=--debug` + +   `--test_output=streamed` + +   `--test_strategy=exclusive` + +   `--test_timeout=9999` + +   `--nocache_test_results` + +`--[no]java_deps` default: "true" +: Generate dependency information (for now, compile-time classpath) per Java target. + +`--[no]java_header_compilation` default: "true" +: Compile ijars directly from source. + +`--java_language_version=` default: "" +: The Java language version + +`--java_launcher=` default: see description +: The Java launcher to use when building Java binaries. If this flag is set to the empty string, the JDK launcher is used. The "launcher" attribute overrides this flag. + +`--java_runtime_version=` default: "local\_jdk" +: The Java runtime version + +`--javacopt=` multiple uses are accumulated +: Additional options to pass to javac. + +`--jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM. These options will get added to the VM startup options of each java\_binary target. + +`--legacy_main_dex_list_generator=` default: see description +: Specifies a binary to use to generate the list of classes that must be in the main dex when compiling legacy multidex. + +`--optimizing_dexer=` default: see description +: Specifies a binary to use to do dexing without sharding. + +`--plugin=` multiple uses are accumulated +: Plugins to use in the build. Currently works with java\_plugin. + +`--proguard_top=` default: see description +: Specifies which version of ProGuard to use for code removal when building a Java binary. + +`--proto_compiler=` default: "@bazel\_tools//tools/proto:protoc" +: The label of the proto-compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]proto_profile` default: "true" +: Whether to pass profile\_path to the proto compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_profile_path=` default: see description +: The profile to pass to the proto compiler as profile\_path. If unset, but --proto\_profile is true (the default), infers the path from --fdo\_optimize. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_cc=` default: "@bazel\_tools//tools/proto:cc\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile C++ protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_java=` default: "@bazel\_tools//tools/proto:java\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile Java protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_javalite=` default: "@bazel\_tools//tools/proto:javalite\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile JavaLite protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--protocopt=` multiple uses are accumulated +: Additional options to pass to the protobuf compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]runs_per_test_detects_flakes` default: "false" +: If true, any shard in which at least one run/attempt passes and at least one run/attempt fails gets a FLAKY status. + +`--shell_executable=` default: see description +: Absolute path to the shell executable for Bazel to use. If this is unset, but the + `BAZEL_SH` environment variable is set on the first Bazel invocation (that starts + up a Bazel server), Bazel uses that. If neither is set, Bazel uses a hard-coded + default path depending on the operating system it runs on; + + * Windows: `c:/msys64/usr/bin/bash.exe` + * FreeBSD: `/usr/local/bin/bash` + * All others: `/bin/bash`. + + Note that using a shell that is not compatible with `bash` may lead + to build failures or runtime failures of the generated binaries. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--test_arg=` multiple uses are accumulated +: Specifies additional options and arguments that should be passed to the test + executable. Can be used multiple times to specify several arguments. + If multiple tests are executed, each of them will receive identical arguments. + Used only by the `bazel test` command. + +`--test_filter=` default: see description +: Specifies a filter to forward to the test framework. Used to limit the tests run. Note that this does not affect which targets are built. + +`--test_result_expiration=` default: "-1" +: This option is deprecated and has no effect. + +`--[no]test_runner_fail_fast` default: "false" +: Forwards fail fast option to the test runner. The test runner should stop execution upon first failure. + +`--test_sharding_strategy=` default: "explicit" +: Specify strategy for test sharding: + + * `explicit` to only use sharding if the `shard_count` `BUILD` attribute is + present. + * `disabled` to never use test sharding. + * `forced=k` to enforce `k` shards for testing regardless of the `shard_count` `BUILD` + attribute. + +`--tool_java_language_version=` default: "" +: The Java language version used to execute the tools that are needed during a build + +`--tool_java_runtime_version=` default: "remotejdk\_11" +: The Java runtime version used to execute tools during the build + +`--[no]use_ijars` default: "true" +: If enabled, this option causes Java compilation to use interface jars. This will result in faster incremental compilation, but error messages can be different. + +## Canonicalize-flags Options + +Inherits all options from [build](#build). + +Options that control the output of the command: + +`--[no]canonicalize_policy` default: "false" +: Output the canonical policy, after expansion and filtering. To keep the output clean, the canonicalized command arguments will NOT be shown when this option is set to true. Note that the command specified by --for\_command affects the filtered policy, and if none is specified, the default command is 'build'. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_include_default_values` default: "true" +: Whether Starlark options set to their default values are included in the output. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_config_setting_private_default_visibility` default: "false" +: If incompatible\_enforce\_config\_setting\_visibility=false, this is a noop. Else, if this flag is false, any config\_setting without an explicit visibility attribute is //visibility:public. If this flag is true, config\_setting follows the same visibility logic as all other rules. See https://github.com/bazelbuild/bazel/issues/12933. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_enforce_config_setting_visibility` default: "true" +: If true, enforce config\_setting visibility restrictions. If false, every config\_setting is visible to every target. See https://github.com/bazelbuild/bazel/issues/12932. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--for_command=` default: "build" +: The command for which the options should be canonicalized. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--invocation_policy=` default: "" +: Applies an invocation policy to the options to be canonicalized. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +Miscellaneous options, not otherwise categorized.: + +`--deleted_packages=` multiple uses are accumulated +: A comma-separated list of names of packages which the build system will consider non-existent, even if they are visible somewhere on the package path. + Use this option when deleting a subpackage 'x/y' of an existing package 'x'. For example, after deleting x/y/BUILD in your client, the build system may complain if it encounters a label '//x:y/z' if that is still provided by another package\_path entry. Specifying --deleted\_packages x/y avoids this problem. + +`--[no]fetch` default: "true" +: Allows the command to fetch external dependencies. If set to false, the command will utilize any cached version of the dependency, and if none exists, the command will result in failure. + +`--package_path=` default: "%workspace%" +: A colon-separated list of where to look for packages. Elements beginning with '%workspace%' are relative to the enclosing workspace. If omitted or empty, the default is the output of 'bazel info default-package-path'. + +`--[no]show_loading_progress` default: "true" +: If enabled, causes Bazel to print "Loading package:" messages. + +## Clean Options + +Inherits all options from [build](#build). + +Options that control the output of the command: + +`--[no]async` default: "false" +: If true, output cleaning is asynchronous. When this command completes, it will be safe to execute new commands in the same client, even though the deletion may continue in the background. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--[no]expunge` default: "false" +: If true, clean removes the entire working tree for this bazel instance, which includes all bazel-created temporary and build output files, and stops the bazel server if it is running. + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +`--expunge_async` +: If specified, clean asynchronously removes the entire working tree for this bazel instance, which includes all bazel-created temporary and build output files, and stops the bazel server if it is running. When this command completes, it will be safe to execute new commands in the same client, even though the deletion may continue in the background. + + Expands to: + +   `--expunge` + +   `--async` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS) + +## Config Options + +## Coverage Options + +Inherits all options from [test](#test). + +## Cquery Options + +Inherits all options from [test](#test). + +Options relating to query output and semantics: + +`--aspect_deps=` default: "conservative" +: How to resolve aspect dependencies when the output format is one of {xml,proto,record}. 'off' means no aspect dependencies are resolved, 'conservative' (the default) means all declared aspect dependencies are added regardless of whether they are given the rule class of direct dependencies, 'precise' means that only those aspects are added that are possibly active given the rule class of the direct dependencies. Note that precise mode requires loading other packages to evaluate a single target thus making it slower than the other modes. Also note that even precise mode is not completely precise: the decision whether to compute an aspect is decided in the analysis phase, which is not run during 'bazel query'. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]consistent_labels` default: "false" +: If enabled, every query command emits labels as if by the Starlark str function applied to a Label instance. This is useful for tools that need to match the output of different query commands and/or labels emitted by rules. If not enabled, output formatters are free to emit apparent repository names (relative to the main repository) instead to make the output more readable. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_explicit_aspects` default: "false" +: aquery, cquery: whether to include aspect-generated actions in the output. query: no-op (aspects are always followed). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]graph:factored` default: "true" +: If true, then the graph will be emitted 'factored', i.e. topologically-equivalent nodes will be merged together and their labels concatenated. This option is only applicable to --output=graph. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--graph:node_limit=` default: "512" +: The maximum length of the label string for a graph node in the output. Longer labels will be truncated; -1 means no truncation. This option is only applicable to --output=graph. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]implicit_deps` default: "true" +: If enabled, implicit dependencies will be included in the dependency graph over which the query operates. An implicit dependency is one that is not explicitly specified in the BUILD file but added by bazel. For cquery, this option controls filtering resolved toolchains. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]include_aspects` default: "true" +: aquery, cquery: whether to include aspect-generated actions in the output. query: no-op (aspects are always followed). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]incompatible_package_group_includes_double_slash` default: "true" +: If enabled, when outputting package\_group's `packages` attribute, the leading `//` will not be omitted. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]infer_universe_scope` default: "false" +: If set and --universe\_scope is unset, then a value of --universe\_scope will be inferred as the list of unique target patterns in the query expression. Note that the --universe\_scope value inferred for a query expression that uses universe-scoped functions (e.g.`allrdeps`) may not be what you want, so you should use this option only if you know what you are doing. See https://bazel.build/reference/query#sky-query for details and examples. If --universe\_scope is set, then this option's value is ignored. Note: this option applies only to `query` (i.e. not `cquery`). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]line_terminator_null` default: "false" +: Whether each format is terminated with \0 instead of newline. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]nodep_deps` default: "true" +: If enabled, deps from "nodep" attributes will be included in the dependency graph over which the query operates. A common example of a "nodep" attribute is "visibility". Run and parse the output of `info build-language` to learn about all the "nodep" attributes in the build language. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--output=` default: "label" +: The format in which the cquery results should be printed. Allowed values for cquery are: label, label\_kind, textproto, transitions, proto, streamed\_proto, jsonproto. If you select 'transitions', you also have to specify the --transitions=(lite|full) option. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--output_file=` default: "" +: When specified, query results will be written directly to this file, and nothing will be printed to Bazel's standard output stream (stdout). In benchmarks, this is generally faster than bazel query > file. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:default_values` default: "true" +: If true, attributes whose value is not explicitly specified in the BUILD file are included; otherwise they are omitted. This option is applicable to --output=proto + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:definition_stack` default: "false" +: Populate the definition\_stack proto field, which records for each rule instance the Starlark call stack at the moment the rule's class was defined. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:flatten_selects` default: "true" +: If enabled, configurable attributes created by select() are flattened. For list types the flattened representation is a list containing each value of the select map exactly once. Scalar types are flattened to null. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]proto:include_attribute_source_aspects` default: "false" +: Populate the source\_aspect\_name proto field of each Attribute with the source aspect that the attribute came from (empty string if it did not). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:include_configurations` default: "true" +: if enabled, proto output will include information about configurations. When disabled,cquery proto output format resembles query output format. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]proto:include_starlark_rule_env` default: "true" +: Use the starlark environment in the value of the generated $internal\_attr\_hash attribute. This ensures that the starlark rule definition (and its transitive imports) are part of this identifier. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:include_synthetic_attribute_hash` default: "false" +: Whether or not to calculate and populate the $internal\_attr\_hash attribute. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:instantiation_stack` default: "false" +: Populate the instantiation call stack of each rule. Note that this requires the stack to be present + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:locations` default: "true" +: Whether to output location information in proto output at all. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--proto:output_rule_attrs=` default: "all" +: Comma separated list of attributes to include in output. Defaults to all attributes. Set to empty string to not output any attribute. This option is applicable to --output=proto. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:rule_classes` default: "false" +: Populate the rule\_class\_key field of each rule; and for the first rule with a given rule\_class\_key, also populate its rule\_class\_info proto field. The rule\_class\_key field uniquely identifies a rule class, and the rule\_class\_info field is a Stardoc-format rule class API definition. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:rule_inputs_and_outputs` default: "true" +: Whether or not to populate the rule\_input and rule\_output fields. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--query_file=` default: "" +: If set, query will read the query from the file named here, rather than on the command line. It is an error to specify a file here as well as a command-line query. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]relative_locations` default: "false" +: If true, the location of BUILD files in xml and proto outputs will be relative. By default, the location output is an absolute path and will not be consistent across machines. You can set this option to true to have a consistent result across machines. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--show_config_fragments=` default: "off" +: Shows the configuration fragments required by a rule and its transitive dependencies. This can be useful for evaluating how much a configured target graph can be trimmed. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--starlark:expr=` default: "" +: A Starlark expression to format each configured target in cquery's --output=starlark mode. The configured target is bound to 'target'. If neither --starlark:expr nor --starlark:file is specified, this option will default to 'str(target.label)'. It is an error to specify both --starlark:expr and --starlark:file. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--starlark:file=` default: "" +: The name of a file that defines a Starlark function called 'format', of one argument, that is applied to each configured target to format it as a string. It is an error to specify both --starlark:expr and --starlark:file. See help for --output=starlark for additional detail. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]tool_deps` default: "true" +: Query: If disabled, dependencies on 'exec configuration' will not be included in the dependency graph over which the query operates. An 'exec configuration' dependency edge, such as the one from any 'proto\_library' rule to the Protocol Compiler, usually points to a tool executed during the build rather than a part of the same 'target' program. + Cquery: If disabled, filters out all configured targets which cross an execution transition from the top-level target that discovered this configured target. That means if the top-level target is in the target configuration, only configured targets also in the target configuration will be returned. If the top-level target is in the exec configuration, only exec configured targets will be returned. This option will NOT exclude resolved toolchains. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--transitions=` default: "none" +: The format in which cquery will print transition information. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--universe_scope=` default: "" +: A comma-separated set of target patterns (additive and subtractive). The query may be performed in the universe defined by the transitive closure of the specified targets. This option is used for the query and cquery commands. + For cquery, the input to this option is the targets all answers are built under and so this option may affect configurations and transitions. If this option is not specified, the top-level targets are assumed to be the targets parsed from the query expression. Note: For cquery, not specifying this option may cause the build to break if targets parsed from the query expression are not buildable with top-level options. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that control build execution: + +`--[no]experimental_persistent_aar_extractor` default: "false" +: Enable persistent aar extractor by using workers. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_remotable_source_manifests` default: "false" +: Whether to make source manifest actions remotable + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_split_coverage_postprocessing` default: "false" +: If true, then Bazel will run coverage postprocessing for test in a new spawn. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_modify_execution_info_additive` default: "true" +: When enabled, passing multiple `--modify_execution_info` flags is additive. + When disabled, only the last flag is taken into account. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--modify_execution_info=` multiple uses are accumulated +: Add or remove keys from an action's execution info based on action mnemonic. + Applies only to actions which support execution info. Many common actions + support execution info, e.g. Genrule, CppCompile, Javac, StarlarkAction, + TestRunner. When specifying multiple values, order matters because + many regexes may apply to the same mnemonic. + + Syntax: `regex=[+-]key,regex=[+-]key,...`. + + Examples: + + * `.*=+x,.*=-y,.*=+z` adds `x` and `z` to, and removes `y` from, the execution info for all actions. + * `Genrule=+requires-x` adds `requires-x` to the execution info for all Genrule actions. + * `(?!Genrule).*=-requires-x` removes `requires-x` from the execution info for all non-Genrule actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--persistent_android_dex_desugar` +: Enable persistent Android dex and desugar actions by using workers. + + Expands to: + +   `--internal_persistent_android_dex_desugar` + +   `--strategy=Desugar=worker` + +   `--strategy=DexBuilder=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_android_resource_processor` +: Enable persistent Android resource processor by using workers. + + Expands to: + +   `--internal_persistent_busybox_tools` + +   `--strategy=AaptPackage=worker` + +   `--strategy=AndroidResourceParser=worker` + +   `--strategy=AndroidResourceValidator=worker` + +   `--strategy=AndroidResourceCompiler=worker` + +   `--strategy=RClassGenerator=worker` + +   `--strategy=AndroidResourceLink=worker` + +   `--strategy=AndroidAapt2=worker` + +   `--strategy=AndroidAssetMerger=worker` + +   `--strategy=AndroidResourceMerger=worker` + +   `--strategy=AndroidCompiledResourceMerger=worker` + +   `--strategy=ManifestMerger=worker` + +   `--strategy=AndroidManifestMerger=worker` + +   `--strategy=Aapt2Optimize=worker` + +   `--strategy=AARGenerator=worker` + +   `--strategy=ProcessDatabinding=worker` + +   `--strategy=GenerateDataBindingBaseClasses=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_dex_desugar` +: Enable persistent multiplexed Android dex and desugar actions by using workers. + + Expands to: + +   `--persistent_android_dex_desugar` + +   `--internal_persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_resource_processor` +: Enable persistent multiplexed Android resource processor by using workers. + + Expands to: + +   `--persistent_android_resource_processor` + +   `--modify_execution_info=AaptPackage=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceParser=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceValidator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceCompiler=+supports-multiplex-workers` + +   `--modify_execution_info=RClassGenerator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceLink=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAapt2=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAssetMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidCompiledResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=ManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=Aapt2Optimize=+supports-multiplex-workers` + +   `--modify_execution_info=AARGenerator=+supports-multiplex-workers` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_tools` +: Enable persistent and multiplexed Android tools (dexing, desugaring, resource processing). + + Expands to: + +   `--internal_persistent_multiplex_busybox_tools` + +   `--persistent_multiplex_android_resource_processor` + +   `--persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]use_target_platform_for_tests` default: "false" +: If true, use the target platform for running tests rather than the test exec group. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that configure the toolchain used for action execution: + +`--android_compiler=` default: see description +: The Android target compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_manifest_merger=` default: "android" +: Selects the manifest merger to use for android\_binary rules. Flag to help the transition to the Android manifest merger from the legacy merger. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_platforms=` default: "" +: Sets the platforms that android\_binary targets use. If multiple platforms are specified, then the binary is a fat APKs, which contains native binaries for each specified target platform. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--cc_output_directory_tag=` default: "" +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compiler=` default: see description +: The C++ compiler to use for compiling the target. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--coverage_output_generator=` default: "@bazel\_tools//tools/test:lcov\_merger" +: Location of the binary that is used to postprocess raw coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:lcov_merger`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_report_generator=` default: "@bazel\_tools//tools/test:coverage\_report\_generator" +: Location of the binary that is used to generate coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:coverage_report_generator`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_support=` default: "@bazel\_tools//tools/test:coverage\_support" +: Location of support files that are required on the inputs of every test action + that collects code coverage. Defaults to `//tools/test:coverage_support`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--custom_malloc=` default: see description +: Specifies a custom malloc implementation. This setting overrides malloc attributes in build rules. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_include_xcode_execution_requirements` default: "false" +: If set, add a "requires-xcode:{version}" execution requirement to every Xcode action. If the Xcode version has a hyphenated label, also add a "requires-xcode-label:{version\_label}" execution requirement. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_prefer_mutual_xcode` default: "true" +: If true, use the most recent Xcode that is available both locally and remotely. If false, or if there are no mutual available versions, use the local Xcode version selected via xcode-select. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--extra_execution_platforms=` default: "" +: The platforms that are available as execution platforms to run actions. + Platforms can be specified by exact target, or as a target pattern. + These platforms will be considered before those declared in the `WORKSPACE` file by + `register_execution_platforms()`. This option may only be set once; later + instances will override earlier flag settings. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--extra_toolchains=` multiple uses are accumulated +: The toolchain rules to be considered during toolchain resolution. + Toolchains can be specified by exact target, or as a target pattern. + These toolchains will be considered before those declared in the `WORKSPACE` file + by `register_toolchains()`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--grte_top=` default: see description +: A label to a checked-in libc library. The default value is selected by the crosstool toolchain, and you almost never need to override it. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_compiler=` default: see description +: No-op flag. Will be removed in a future release. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--host_grte_top=` default: see description +: If specified, this setting overrides the libc top-level directory (--grte\_top) for the exec configuration. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_platform=` default: "@bazel\_tools//tools:host\_platform" +: The label of a platform rule that describes the host system. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]incompatible_bazel_test_exec_run_under` default: "true" +: If enabled, `bazel test --run_under=//:runner` builds `//:runner` in the exec + configuration. If disabled, it builds `//:runner` in the target configuration. + Bazel executes tests on exec machines, so the former is more correct. This + doesn't affect `bazel run`, which always builds `--run_under=//foo` in the + target configuration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_builtin_objc_strip_action` default: "true" +: Whether to emit a strip action as part of objc linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_dont_enable_host_nonhost_crosstool_features` default: "true" +: If true, Bazel will not enable 'host' and 'nonhost' features in the c++ toolchain (see https://github.com/bazelbuild/bazel/issues/7407 for more information). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_remove_legacy_whole_archive` default: "true" +: If true, Bazel will not link library dependencies as whole archive by default (see https://github.com/bazelbuild/bazel/issues/7362 for migration instructions). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strip_executable_safely` default: "false" +: If true, strip action for executables will use flag -x, which does not break dynamic symbol resolution. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]interface_shared_objects` default: "true" +: Use interface shared objects if supported by the toolchain. All ELF toolchains currently support this setting. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_sdk_version=` default: see description +: Specifies the version of the iOS SDK to use to build iOS applications. If unspecified, uses the default iOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--macos_sdk_version=` default: see description +: Specifies the version of the macOS SDK to use to build macOS applications. If unspecified, uses the default macOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--minimum_os_version=` default: see description +: The minimum OS version which your compilation targets. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_mappings=` default: "" +: The location of a mapping file that describes which platform to use if none is set or + which flags to set when a platform already exists. Must be relative to the main + workspace root. Defaults to `platform_mappings` (a file directly under the + workspace root). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--platforms=` default: "" +: The labels of the platform rules describing the target platforms for the current command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_sdk_version=` default: see description +: Specifies the version of the tvOS SDK to use to build tvOS applications. If unspecified, uses the default tvOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]use_platforms_in_apple_crosstool_transition` default: "false" +: Makes apple\_crosstool\_transition fall back to using the value of `--platforms` flag instead of legacy `--cpu` when needed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_sdk_version=` default: see description +: Specifies the version of the watchOS SDK to use to build watchOS applications. If unspecified, uses the default watchOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version=` default: see description +: If specified, uses Xcode of the given version for relevant build actions. If unspecified, uses the executor default version of Xcode. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version_config=` default: "@bazel\_tools//tools/cpp:host\_xcodes" +: The label of the xcode\_config rule to be used for selecting the Xcode version in the build configuration. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that control the output of the command: + +`--[no]apple_generate_dsym` default: "false" +: Whether to generate debug symbol(.dSYM) file(s). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]build_runfile_links` default: "true" +: If true, build runfiles symlink forests for all targets. If false, write them only when required by a local action, test or run command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_runfile_manifests` default: "true" +: If true, write runfiles manifests for all targets. If false, omit them. Local tests will fail to run when false. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_test_dwp` default: "false" +: If enabled, when building C++ tests statically and with fission the .dwp file for the test binary will be automatically built as well. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cc_proto_library_header_suffixes=` default: ".pb.h" +: Sets the suffixes of header files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--cc_proto_library_source_suffixes=` default: ".pb.cc" +: Sets the suffixes of source files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]experimental_proto_descriptor_sets_include_source_info` default: "false" +: Run extra actions for alternative Java api versions in a proto\_library. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_save_feature_state` default: "false" +: Save the state of enabled and requested feautres as an output of compilation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fission=` default: "no" +: Specifies which compilation modes use fission for C++ compilations and links. May be any combination of {'fastbuild', 'dbg', 'opt'} or the special values 'yes' to enable all modes and 'no' to disable all modes. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_always_include_files_in_data` default: "true" +: If true, native rules add `DefaultInfo.files` of data dependencies to their runfiles, + which matches the recommended behavior for Starlark rules ([runfiles features to avoid](https://bazel.build/extending/rules#runfiles_features_to_avoid)). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_compact_repo_mapping_manifest` default: "true" +: If enabled, the `{binary}.repo_mapping` file emits a module extension's repo mapping + only once instead of once for each repo generated by the extension that + contributes runfiles. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_select_on=` default: "" +: List of flags for which the use in `select()` is disabled. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_filegroup_runfiles_for_data` default: "true" +: If true, runfiles of targets listed in the srcs attribute are available to targets that consume the filegroup as a data dependency. + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]objc_generate_linkmap` default: "false" +: Specifies whether to generate a linkmap file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]save_temps` default: "false" +: If set, temporary outputs from gcc will be saved. These include .s files (assembler code), .i files (preprocessed C) and .ii files (preprocessed C++). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with target + configuration. Variables can be either specified by `name`, in which case + the value will be taken from the invocation environment, by the `name=value` + pair which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can be used + multiple times; for options given for the same variable, the latest wins, + options for different variables accumulate. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, all `name=value` + pairs will be available to repository rules. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--allowed_cpu_values=` default: "" +: Allowed values for the `--cpu` flag. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]android_databinding_use_androidx` default: "true" +: Generate AndroidX-compatible data-binding files. This is only used with databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]android_databinding_use_v3_4_args` default: "true" +: Use android databinding v2 with 3.4.0 argument. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--android_dynamic_mode=` default: "off" +: Determines whether C++ deps of Android rules will be linked dynamically when a cc\_binary does not explicitly create a shared library. 'default' means bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--android_manifest_merger_order=` default: "alphabetical" +: Sets the order of manifests passed to the manifest merger for Android binaries. ALPHABETICAL means manifests are sorted by path relative to the execroot. ALPHABETICAL\_BY\_CONFIGURATION means manifests are sorted by paths relative to the configuration directory within the output directory. DEPENDENCY means manifests are ordered with each library's manifest coming before the manifests of its dependencies. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`execution`](#effect_tag_EXECUTION) + +`--[no]android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]collect_code_coverage` default: "false" +: If specified, Bazel will instrument code (using offline instrumentation where + possible) and will collect coverage information during tests. Only targets that + match `--instrumentation_filter` will be affected. Usually this option should + not be specified directly - `bazel coverage` command should be used instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compilation_mode=` [`-c`] default: "fastbuild" +: Specify the mode the binary will be built in. Values: `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--conlyopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--copt=` multiple uses are accumulated +: Additional options to pass to gcc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cpu=` default: "" +: Deprecated: this flag is not used internally by Blaze although there are legacy platform + mappings to allow for backwards compatibility. Do not use this flag, instead use + `--platforms` with an appropriate platform definition. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_absolute_path=` default: see description +: Use CSFDO profile information to optimize compilation. Specify the absolute path name of the zip file containing the profile file, a raw or an indexed LLVM profile file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_instrument=` default: see description +: Generate binaries with context sensitive FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_profile=` default: see description +: The cs\_fdo\_profile representing the context sensitive profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cxxopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--define=` multiple uses are accumulated +: Each `--define` option specifies an assignment for a build variable. + In case of multiple values for a variable, the last one wins. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--dynamic_mode=` default: "default" +: Determines whether C++ binaries will be linked dynamically. 'default' means Bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_propeller_optimize_absolute_paths` default: "true" +: If set, any use of absolute paths for propeller optimize will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_remaining_fdo_absolute_paths` default: "true" +: If set, any use of absolute paths for FDO will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_runfiles` default: "auto" +: Enable runfiles symlink tree; By default, it's off on Windows, on on other platforms. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--exec_aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to exec-configured targets, regardless of whether or not they are top-level targets. This is an experimental feature and is subject to change. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_action_listener=` multiple uses are accumulated +: Deprecated in favor of aspects. Use `action_listener` to attach an `extra_action` to + existing build actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_compress_java_resources` default: "false" +: Compress Java resources in APKs + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_databinding_v2` default: "true" +: Use android databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_rewrite_dexes_with_rex` default: "false" +: use rex tool to rewrite dex files + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_collect_code_coverage_for_generated_files` default: "false" +: If specified, Bazel will also generate collect coverage information for generated files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_omitfp` default: "false" +: If true, use libunwind for stack unwinding, and compile with -fomit-frame-pointer and -fasynchronous-unwind-tables. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_output_paths=` default: "off" +: Which model to use for where in the output tree rules write their outputs, particularly + for multi-platform / multi-configuration builds. This is highly experimental. See + [GH-6526](https://github.com/bazelbuild/bazel/issues/6526) for details. Starlark actions can opt into path mapping by adding the key + `supports-path-mapping` to the `execution_requirements` dict. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_override_platform_cpu_name=` multiple uses are accumulated +: Each entry should be of the form `label=value` where label refers to a platform and values + is the desired shortname to override the platform's CPU name in `$(TARGET_CPU)` + make variable and output path. Only used when + `--experimental_platform_in_output_dir`, `--incompatible_target_cpu_from_platform` or + `--incompatible_bep_cpu_from_platform` is true. Has highest naming priority. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_platform_in_output_dir` default: "Auto" +: If true, a shortname for the target platform is used in the output directory name + instead of the CPU. The exact scheme is experimental and subject to change: + + 1. First, in the rare case the `--platforms` option does not have exactly one value, a + hash of the platforms option is used. + 2. Next, if any shortname for the current platform was registered by + `--experimental_override_name_platform_in_output_dir`, then that shortname is used. + 3. Then, if `--experimental_use_platforms_in_output_dir_legacy_heuristic` is set, use a + shortname based off the current platform Label. + 4. Finally, a hash of the platform option is used as a last resort. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_llvm_covmap` default: "false" +: If specified, Bazel will generate llvm-cov coverage map information rather than gcov when collect\_code\_coverage is enabled. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_platforms_in_output_dir_legacy_heuristic` default: "true" +: Please only use this flag as part of a suggested migration or testing strategy. Note + that the heuristic has known deficiencies and it is suggested to migrate to + relying on just `--experimental_override_name_platform_in_output_dir`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fdo_instrument=` default: see description +: Generate binaries with FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_optimize=` default: see description +: Use FDO profile information to optimize compilation. Specify the name of a zip file containing a .gcda file tree, an afdo file containing an auto profile, or an LLVM profile file. This flag also accepts files specified as labels (e.g. `//foo/bar:file.afdo` - you may need to add an `exports_files` directive to the corresponding package) and labels pointing to `fdo_profile` targets. This flag will be superseded by the `fdo_profile` rule. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_prefetch_hints=` default: see description +: Use cache prefetch hints. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_profile=` default: see description +: The fdo\_profile representing the profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the target configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + See also `--host_features`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]force_pic` default: "false" +: If enabled, all C++ compilations produce position-independent code ("-fPIC"), links prefer PIC pre-built libraries over non-PIC libraries, and links produce position-independent executables ("-pie"). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with execution + configurations. Variables can be either specified by `name`, in which case the + value will be taken from the invocation environment, by the `name=value` pair + which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can + be used multiple times; for options given for the same variable, the latest + wins, options for different variables accumulate. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_compilation_mode=` default: "opt" +: Specify the mode the tools used during the build will be built in. Values: + `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_conlyopt=` multiple uses are accumulated +: Additional option to pass to the C compiler when compiling C (but not C++) source files in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_copt=` multiple uses are accumulated +: Additional options to pass to the C compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cpu=` default: "" +: The host CPU. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cxxopt=` multiple uses are accumulated +: Additional options to pass to C++ compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the exec configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_linkopt=` multiple uses are accumulated +: Additional option to pass to linker when linking tools in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_macos_minimum_os=` default: see description +: Minimum compatible macOS version for host targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--host_per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to the C/C++ compiler when compiling certain files in the exec configurations. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --host\_per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_auto_exec_groups` default: "false" +: When enabled, an exec groups is automatically created for each toolchain used by a rule. + For this to work rule needs to specify `toolchain` parameter on its actions. For + more information, see [GH-17134](https://github.com/bazelbuild/bazel/issues/17134). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_merge_genfiles_directory` default: "true" +: If true, the genfiles directory is folded into the bin directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_target_cpu_from_platform` default: "true" +: If specified, the value of the cpu constraint (`@platforms//cpu:cpu`) of + the target platform is used to set the `$(TARGET_CPU)` make variable. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]instrument_test_targets` default: "false" +: When coverage is enabled, specifies whether to consider instrumenting test rules. + When set, test rules included by `--instrumentation_filter` are instrumented. + Otherwise, test rules are always excluded from coverage instrumentation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--instrumentation_filter=` default: "-/javatests[/:],-/test/java[/:]" +: When coverage is enabled, only rules with names included by the + specified regex-based filter will be instrumented. Rules prefixed + with '-' are excluded instead. Note that only non-test rules are + instrumented unless `--instrument_test_targets` is enabled. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_minimum_os=` default: see description +: Minimum compatible iOS version for target simulators and devices. If unspecified, uses 'ios\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--ios_multi_cpus=` multiple uses are accumulated +: Comma-separated list of architectures to build an ios\_application with. The result is a universal binary containing all specified architectures. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]legacy_whole_archive` default: "true" +: Deprecated, superseded by --incompatible\_remove\_legacy\_whole\_archive (see https://github.com/bazelbuild/bazel/issues/7362 for details). When on, use --whole-archive for cc\_binary rules that have linkshared=True and either linkstatic=True or '-static' in linkopts. This is for backwards compatibility only. A better alternative is to use alwayslink=1 where required. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`deprecated`](#metadata_tag_DEPRECATED) + +`--linkopt=` multiple uses are accumulated +: Additional option to pass to gcc when linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltobackendopt=` multiple uses are accumulated +: Additional option to pass to the LTO backend step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltoindexopt=` multiple uses are accumulated +: Additional option to pass to the LTO indexing step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--macos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple macOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--macos_minimum_os=` default: see description +: Minimum compatible macOS version for targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--memprof_profile=` default: see description +: Use memprof profile. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]objc_enable_binary_stripping` default: "false" +: Whether to perform symbol and dead-code strippings on linked binaries. Binary strippings will be performed if both this flag and --compilation\_mode=opt are specified. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--objccopt=` multiple uses are accumulated +: Additional options to pass to gcc when compiling Objective-C/C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to gcc when compiling certain files. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--per_file_ltobackendopt=` multiple uses are accumulated +: Additional options to selectively pass to LTO backend (under --features=thin\_lto) when compiling certain backend objects. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns. option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_ltobackendopt=//foo/.\*.o,-//foo/bar.o@-O0 adds the -O0 command line option to the LTO backend command line of all o files in //foo/ except bar.o. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_suffix=` default: see description +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--propeller_optimize=` default: see description +: Use Propeller profile information to optimize the build target.A propeller profile must consist of at least one of two files, a cc profile and a ld profile. This flag accepts a build label which must refer to the propeller profile input files. For example, the BUILD file that defines the label, in a/b/BUILD:propeller\_optimize( name = "propeller\_profile", cc\_profile = "propeller\_cc\_profile.txt", ld\_profile = "propeller\_ld\_profile.txt",)An exports\_files directive may have to be added to the corresponding package to make these files visible to Bazel. The option must be used as: --propeller\_optimize=//a/b:propeller\_profile + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_cc_profile=` default: see description +: Absolute path name of cc\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_ld_profile=` default: see description +: Absolute path name of ld\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--run_under=` default: see description +: Prefix to insert before the executables for the `test` and `run` commands. + If the value is `foo -bar`, and the execution command line is `test_binary -baz`, + then the final command line is `foo -bar test_binary -baz`. + This can also be a label to an executable target. Some examples are: + + * `valgrind` + * `strace` + * `strace -c` + * `valgrind --quiet --num-callers=20` + * `//package:target` + * `//package:target --options` + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]share_native_deps` default: "true" +: If true, native libraries that contain identical functionality will be shared among different targets + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]stamp` default: "false" +: Stamp binaries with the date, username, hostname, workspace information, etc. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--strip=` default: "sometimes" +: Specifies whether to strip binaries and shared libraries (using "-Wl,--strip-debug"). The default value of 'sometimes' means strip iff --compilation\_mode=fastbuild. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--stripopt=` multiple uses are accumulated +: Additional options to pass to strip when generating a '.stripped' binary. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--tvos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple tvOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_minimum_os=` default: see description +: Minimum compatible tvOS version for target simulators and devices. If unspecified, uses 'tvos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--visionos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple visionOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple watchOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_minimum_os=` default: see description +: Minimum compatible watchOS version for target simulators and devices. If unspecified, uses 'watchos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xbinary_fdo=` default: see description +: Use XbinaryFDO profile information to optimize compilation. Specify the name of default cross binary profile. When the option is used together with --fdo\_instrument/--fdo\_optimize/--fdo\_profile, those options will always prevail as if xbinary\_fdo is never specified. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]check_visibility` default: "true" +: If disabled, visibility errors in target dependencies are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]desugar_for_android` default: "true" +: Whether to desugar Java 8 bytecode before dexing. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]desugar_java8_libs` default: "false" +: Whether to include supported Java 8 libraries in apps for legacy devices. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]enforce_constraints` default: "true" +: Checks the environments each target is compatible with and reports errors if any target has dependencies that don't support the same environments + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_check_desugar_deps` default: "true" +: Whether to double-check correct desugaring at Android binary level. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_enforce_transitive_visibility` default: "false" +: If true, enable package()s to set the transitive\_visibility attribute to restrict which packages may depend on them. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_one_version_enforcement=` default: "OFF" +: When enabled, enforce that a java\_binary rule can't contain more than one version of the same class file on the classpath. This enforcement can break the build, or can just result in warnings. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_strict_java_deps=` default: "default" +: If true, checks that a Java target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]incompatible_check_testonly_for_output_files` default: "false" +: If enabled, check testonly for prerequisite targets that are output files by looking up the testonly of the generating rule. This matches visibility checking. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_native_android_rules` default: "false" +: If enabled, direct usage of the native Android rules is disabled. Please use the Starlark Android rules from https://github.com/bazelbuild/rules\_android + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]one_version_enforcement_on_java_tests` default: "true" +: When enabled, and with experimental\_one\_version\_enforcement set to a non-NONE value, enforce one version on java\_test targets. This flag can be disabled to improve incremental test performance at the expense of missing potential one version violations. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--strict_proto_deps=` default: "error" +: Unless OFF, checks that a proto\_library target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--strict_public_imports=` default: "off" +: Unless OFF, checks that a proto\_library target explicitly declares all targets used in 'import public' as exported. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]strict_system_includes` default: "false" +: If true, headers found through system include paths (-isystem) are also required to be declared. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--target_environment=` multiple uses are accumulated +: Declares this build's target environment. Must be a label reference to an + [`environment` rule](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java). If specified, all top-level targets must be compatible with this + environment. + + See also `--platforms`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Options that affect the signing outputs of a build: + +`--apk_signing_method=` default: "v1\_v2" +: Implementation to use to sign APKs + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]device_debug_entitlements` default: "true" +: If set, and compilation mode is not 'opt', objc apps will include debug entitlements when signing. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_disallow_sdk_frameworks_attributes` default: "false" +: If true, disallow sdk\_frameworks and weak\_sdk\_frameworks attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_objc_alwayslink_by_default` default: "false" +: If true, make the default value true for alwayslink attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]allow_analysis_failures` default: "false" +: If true, an analysis failure of a rule target results in the target's propagation + of an instance of `AnalysisFailureInfo` containing the error description, instead + of resulting in a build failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--analysis_testing_deps_limit=` default: "2000" +: Sets the maximum number of transitive dependencies through a rule attribute with + a `for_analysis_testing` configuration transition. + Exceeding this limit will result in a rule error. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]break_build_on_parallel_dex2oat_failure` default: "false" +: If true dex2oat action failures will cause the build to break instead of executing dex2oat during test runtime. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--default_test_resources=` multiple uses are accumulated +: Override the default resources amount for tests. The expected format is + `{resource}={value}`. If a single positive number is specified as `{value}` + it will override the default resources for all test sizes. If 4 + comma-separated numbers are specified, they will override the resource + amount for respectively the `small`, `medium`, `large`, `enormous` test sizes. + Values can also be `HOST_RAM`/`HOST_CPU`, optionally followed + by `[-|*]{float}` (eg. `memory=HOST_RAM*.1,HOST_RAM*.2,HOST_RAM*.3,HOST_RAM*.4`). + The default test resources specified by this flag are overridden by explicit + resources specified in tags. + +`--[no]experimental_android_use_parallel_dex2oat` default: "false" +: Use dex2oat in parallel to possibly speed up android\_test. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--ios_simulator_device=` default: see description +: The device to simulate when running an iOS application in the simulator, e.g. 'iPhone 6'. You can get a list of devices by running 'xcrun simctl list devicetypes' on the machine the simulator will be run on. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--ios_simulator_version=` default: see description +: The version of iOS to run on the simulator when running or testing. This is ignored for ios\_test rules if a target device is specified in the rule. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--runs_per_test=` multiple uses are accumulated +: Specifies number of times to run each test. If any of those attempts fail for any + reason, the whole test is considered failed. Normally the value specified is + just an integer. + + Example: `--runs_per_test=3` will run all tests 3 times. + + Alternate syntax: `regex_filter@runs_per_test`. Where `runs_per_test` stands for + an integer value and `regex_filter` stands for a list of include and exclude + regular expression patterns (Also see --instrumentation\_filter). + + Example: `--runs_per_test=//foo/.*,-//foo/bar/.*@3` runs all tests in `//foo/` except + those under `//foo/bar` three times. This option can be passed multiple times. The most + recently passed argument that matches takes precedence. If nothing matches, + the test is only run once. + +`--test_env=` multiple uses are accumulated +: Specifies additional environment variables to be injected into the test runner + environment. Variables can be either specified by `name`, in which + case its value will be read from the Bazel client environment, or by the + `name=value` pair. + Previously set variables can be unset via `=name`. + This option can be used multiple times to specify several variables. + Used only by the 'bazel test' command. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--test_timeout=` default: "-1" +: Override the default test timeout values for test timeouts (in secs). If a single + positive integer value is specified it will override all categories. If 4 + comma-separated integers are specified, they will override the timeouts for + `short`, `moderate`, `long` and `eternal` (in that order). In either form, a value of + -1 tells blaze to use its default timeouts for that category. + +`--[no]zip_undeclared_test_outputs` default: "false" +: If true, undeclared test outputs will be archived in a zip file. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +Options that trigger optimizations of the build time: + +`--[no]cc_dotd_files` default: "true" +: Whether to generate and analyze .d files. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]cc_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_filter_library_jar_with_program_jar` default: "false" +: Filter the ProGuard ProgramJar to remove any classes also present in the LibraryJar. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_dotd_files` default: "true" +: If enabled, C++ .d files will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_jdeps_files` default: "true" +: If enabled, the dependency (.jdeps) files generated from Java compilations will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_retain_test_configuration_across_testonly` default: "true" +: When enabled, `--trim_test_configuration` will not trim the test configuration for rules + marked testonly=1. This is meant to reduce action conflict issues when non-test + rules depend on `cc_test` rules. No effect if `--trim_test_configuration` is + false. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_unsupported_and_brittle_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incremental_dexing` default: "true" +: Does most of the work for dexing separately for each Jar file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]objc_use_dotd_pruning` default: "true" +: If set, .d files emitted by clang will be used to prune the set of inputs passed into objc compiles. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]process_headers_in_dependencies` default: "false" +: When building a target //a:a, process headers in all targets that //a:a depends on (if header processing is enabled for the toolchain). + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]trim_test_configuration` default: "true" +: When enabled, test-related options will be cleared below the top level of the build. When this flag is active, tests cannot be built as dependencies of non-test rules, but changes to test-related options will not cause non-test rules to be re-analyzed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +Options that affect the verbosity, format or location of logging: + +`--toolchain_resolution_debug=` default: "-.\*" +: Print debug information during toolchain resolution. The flag takes a regex, which is checked against toolchain types and specific targets to see which to debug. Multiple regexes may be separated by commas, and then each regex is checked separately. Note: The output of this flag is very complex and will likely only be useful to experts in toolchain resolution. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]verbose_visibility_errors` default: "false" +: If enabled, visibility errors include additional diagnostic information. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--flag_alias=` multiple uses are accumulated +: Sets a shorthand name for a Starlark flag. It takes a single key-value pair in the form + `{key}={value}` as an argument. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Miscellaneous options, not otherwise categorized.: + +`--[no]cache_test_results` [`-t`] default: "auto" +: If set to `auto`, Bazel reruns a test if and only if: + + 1. Bazel detects changes in the test or its dependencies, + 2. The test is marked as `external`, + 3. Multiple test runs were requested with `--runs_per_test`, or + 4. The test previously failed. + If set to `yes`, Bazel caches all test results except for tests marked as + `external`. If set to `no`, Bazel does not cache any test results. + +`--[no]experimental_cancel_concurrent_tests` default: "never" +: If `on_failed` or `on_passed`, then Blaze will cancel concurrently running tests on the first + successful run with that result. This is only useful in combination with + `--runs_per_test_detects_flakes`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_fetch_all_coverage_outputs` default: "false" +: If true, then Bazel fetches the entire coverage data directory for each test during a coverage run. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_generate_llvm_lcov` default: "false" +: If true, coverage for clang will generate an LCOV report. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_java_classpath=` default: "bazel" +: Enables reduced classpaths for Java compilations. + +`--[no]experimental_run_android_lint_on_java_rules` default: "false" +: Whether to validate java\_\* sources. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]explicit_java_test_deps` default: "false" +: Explicitly specify a dependency to JUnit or Hamcrest in a java\_test instead of accidentally obtaining from the TestRunner's deps. Only works for bazel right now. + +`--host_java_launcher=` default: see description +: The Java launcher used by tools that are executed during a build. + +`--host_javacopt=` multiple uses are accumulated +: Additional options to pass to javac when building tools that are executed during a build. + +`--host_jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM when building tools that are executed during the build. These options will get added to the VM startup options of each java\_binary target. + +`--[no]incompatible_exclusive_test_sandboxed` default: "true" +: If true, exclusive tests will run with sandboxed strategy. Add `local` tag to force + an exclusive test run locally + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strict_action_env` default: "true" +: If true, Bazel uses an environment with a static value for PATH and does not + inherit `LD_LIBRARY_PATH`. Use `--action_env=ENV_VARIABLE` if you want to + inherit specific environment variables from the client, but note that doing so + can prevent cross-user caching if a shared cache is used. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--j2objc_translation_flags=` multiple uses are accumulated +: Additional options to pass to the J2ObjC tool. + +`--java_debug` +: Causes the Java virtual machine of a java test to wait for a connection from a JDWP-compliant debugger (such as jdb) before starting the test. Implies -test\_output=streamed. + + Expands to: + +   `--test_arg=--wrapper_script_flag=--debug` + +   `--test_output=streamed` + +   `--test_strategy=exclusive` + +   `--test_timeout=9999` + +   `--nocache_test_results` + +`--[no]java_deps` default: "true" +: Generate dependency information (for now, compile-time classpath) per Java target. + +`--[no]java_header_compilation` default: "true" +: Compile ijars directly from source. + +`--java_language_version=` default: "" +: The Java language version + +`--java_launcher=` default: see description +: The Java launcher to use when building Java binaries. If this flag is set to the empty string, the JDK launcher is used. The "launcher" attribute overrides this flag. + +`--java_runtime_version=` default: "local\_jdk" +: The Java runtime version + +`--javacopt=` multiple uses are accumulated +: Additional options to pass to javac. + +`--jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM. These options will get added to the VM startup options of each java\_binary target. + +`--legacy_main_dex_list_generator=` default: see description +: Specifies a binary to use to generate the list of classes that must be in the main dex when compiling legacy multidex. + +`--optimizing_dexer=` default: see description +: Specifies a binary to use to do dexing without sharding. + +`--plugin=` multiple uses are accumulated +: Plugins to use in the build. Currently works with java\_plugin. + +`--proguard_top=` default: see description +: Specifies which version of ProGuard to use for code removal when building a Java binary. + +`--proto_compiler=` default: "@bazel\_tools//tools/proto:protoc" +: The label of the proto-compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]proto_profile` default: "true" +: Whether to pass profile\_path to the proto compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_profile_path=` default: see description +: The profile to pass to the proto compiler as profile\_path. If unset, but --proto\_profile is true (the default), infers the path from --fdo\_optimize. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_cc=` default: "@bazel\_tools//tools/proto:cc\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile C++ protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_java=` default: "@bazel\_tools//tools/proto:java\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile Java protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_javalite=` default: "@bazel\_tools//tools/proto:javalite\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile JavaLite protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--protocopt=` multiple uses are accumulated +: Additional options to pass to the protobuf compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]runs_per_test_detects_flakes` default: "false" +: If true, any shard in which at least one run/attempt passes and at least one run/attempt fails gets a FLAKY status. + +`--shell_executable=` default: see description +: Absolute path to the shell executable for Bazel to use. If this is unset, but the + `BAZEL_SH` environment variable is set on the first Bazel invocation (that starts + up a Bazel server), Bazel uses that. If neither is set, Bazel uses a hard-coded + default path depending on the operating system it runs on; + + * Windows: `c:/msys64/usr/bin/bash.exe` + * FreeBSD: `/usr/local/bin/bash` + * All others: `/bin/bash`. + + Note that using a shell that is not compatible with `bash` may lead + to build failures or runtime failures of the generated binaries. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--test_arg=` multiple uses are accumulated +: Specifies additional options and arguments that should be passed to the test + executable. Can be used multiple times to specify several arguments. + If multiple tests are executed, each of them will receive identical arguments. + Used only by the `bazel test` command. + +`--test_filter=` default: see description +: Specifies a filter to forward to the test framework. Used to limit the tests run. Note that this does not affect which targets are built. + +`--test_result_expiration=` default: "-1" +: This option is deprecated and has no effect. + +`--[no]test_runner_fail_fast` default: "false" +: Forwards fail fast option to the test runner. The test runner should stop execution upon first failure. + +`--test_sharding_strategy=` default: "explicit" +: Specify strategy for test sharding: + + * `explicit` to only use sharding if the `shard_count` `BUILD` attribute is + present. + * `disabled` to never use test sharding. + * `forced=k` to enforce `k` shards for testing regardless of the `shard_count` `BUILD` + attribute. + +`--tool_java_language_version=` default: "" +: The Java language version used to execute the tools that are needed during a build + +`--tool_java_runtime_version=` default: "remotejdk\_11" +: The Java runtime version used to execute tools during the build + +`--[no]use_ijars` default: "true" +: If enabled, this option causes Java compilation to use interface jars. This will result in faster incremental compilation, but error messages can be different. + +## Dump Options + +Options that control the output of the command: + +`--[no]action_cache` default: "false" +: Dump action cache content. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--memory=` default: see description +: Dump the memory use of the given Skyframe node. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]packages` default: "false" +: Dump package cache content. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]rule_classes` default: "false" +: Dump rule classes. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--[no]rules` default: "false" +: Dump rules, including counts and memory usage (if memory is tracked). + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--skyframe=` default: "off" +: Dump the Skyframe graph. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--skykey_filter=` default: ".\*" +: Regex filter of SkyKey names to output. Only used with --skyframe=deps, rdeps, function\_graph. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +`--skylark_memory=` default: see description +: Dumps a pprof-compatible memory profile to the specified path. To learn more please see https://github.com/google/pprof. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +## Fetch Options + +Inherits all options from [test](#test). + +Options that control build execution: + +`--[no]all` default: "false" +: Fetches all external repositories necessary for building any target or repository. + This is the default if no other flags and arguments are provided. Only works + when `--enable_bzlmod` is on. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]keep_going` [`-k`] default: "false" +: Continue as much as possible after an error. While the target that failed and those that depend on it cannot be analyzed, other prerequisites of these targets can be. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--loading_phase_threads=) eg. "auto", "HOST_CPUS*.5">` default: "auto" +: Number of parallel threads to use for the loading/analysis phase.Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". "auto" sets a reasonable default based on host resources. Must be at least 1. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_config_setting_private_default_visibility` default: "false" +: If incompatible\_enforce\_config\_setting\_visibility=false, this is a noop. Else, if this flag is false, any config\_setting without an explicit visibility attribute is //visibility:public. If this flag is true, config\_setting follows the same visibility logic as all other rules. See https://github.com/bazelbuild/bazel/issues/12933. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_enforce_config_setting_visibility` default: "true" +: If true, enforce config\_setting visibility restrictions. If false, every config\_setting is visible to every target. See https://github.com/bazelbuild/bazel/issues/12932. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options relating to Bzlmod output and semantics: + +`--[no]configure` default: "false" +: Only fetches repositories marked as `configure` for system-configuration purpose. Only + works when `--enable_bzlmod` is on. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]force` default: "false" +: Ignore existing repository if any and force fetch the repository again. Only works when + `--enable_bzlmod` is on. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--repo=` multiple uses are accumulated +: Only fetches the specified repository, which can be either `@apparent_repo_name` or + `@@canonical_repo_name`. Only works when `--enable_bzlmod` is on. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Miscellaneous options, not otherwise categorized.: + +`--deleted_packages=` multiple uses are accumulated +: A comma-separated list of names of packages which the build system will consider non-existent, even if they are visible somewhere on the package path. + Use this option when deleting a subpackage 'x/y' of an existing package 'x'. For example, after deleting x/y/BUILD in your client, the build system may complain if it encounters a label '//x:y/z' if that is still provided by another package\_path entry. Specifying --deleted\_packages x/y avoids this problem. + +`--[no]fetch` default: "true" +: Allows the command to fetch external dependencies. If set to false, the command will utilize any cached version of the dependency, and if none exists, the command will result in failure. + +`--package_path=` default: "%workspace%" +: A colon-separated list of where to look for packages. Elements beginning with '%workspace%' are relative to the enclosing workspace. If omitted or empty, the default is the output of 'bazel info default-package-path'. + +`--[no]show_loading_progress` default: "true" +: If enabled, causes Bazel to print "Loading package:" messages. + +Options that control build execution: + +`--[no]experimental_persistent_aar_extractor` default: "false" +: Enable persistent aar extractor by using workers. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_remotable_source_manifests` default: "false" +: Whether to make source manifest actions remotable + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_split_coverage_postprocessing` default: "false" +: If true, then Bazel will run coverage postprocessing for test in a new spawn. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_modify_execution_info_additive` default: "true" +: When enabled, passing multiple `--modify_execution_info` flags is additive. + When disabled, only the last flag is taken into account. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--modify_execution_info=` multiple uses are accumulated +: Add or remove keys from an action's execution info based on action mnemonic. + Applies only to actions which support execution info. Many common actions + support execution info, e.g. Genrule, CppCompile, Javac, StarlarkAction, + TestRunner. When specifying multiple values, order matters because + many regexes may apply to the same mnemonic. + + Syntax: `regex=[+-]key,regex=[+-]key,...`. + + Examples: + + * `.*=+x,.*=-y,.*=+z` adds `x` and `z` to, and removes `y` from, the execution info for all actions. + * `Genrule=+requires-x` adds `requires-x` to the execution info for all Genrule actions. + * `(?!Genrule).*=-requires-x` removes `requires-x` from the execution info for all non-Genrule actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--persistent_android_dex_desugar` +: Enable persistent Android dex and desugar actions by using workers. + + Expands to: + +   `--internal_persistent_android_dex_desugar` + +   `--strategy=Desugar=worker` + +   `--strategy=DexBuilder=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_android_resource_processor` +: Enable persistent Android resource processor by using workers. + + Expands to: + +   `--internal_persistent_busybox_tools` + +   `--strategy=AaptPackage=worker` + +   `--strategy=AndroidResourceParser=worker` + +   `--strategy=AndroidResourceValidator=worker` + +   `--strategy=AndroidResourceCompiler=worker` + +   `--strategy=RClassGenerator=worker` + +   `--strategy=AndroidResourceLink=worker` + +   `--strategy=AndroidAapt2=worker` + +   `--strategy=AndroidAssetMerger=worker` + +   `--strategy=AndroidResourceMerger=worker` + +   `--strategy=AndroidCompiledResourceMerger=worker` + +   `--strategy=ManifestMerger=worker` + +   `--strategy=AndroidManifestMerger=worker` + +   `--strategy=Aapt2Optimize=worker` + +   `--strategy=AARGenerator=worker` + +   `--strategy=ProcessDatabinding=worker` + +   `--strategy=GenerateDataBindingBaseClasses=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_dex_desugar` +: Enable persistent multiplexed Android dex and desugar actions by using workers. + + Expands to: + +   `--persistent_android_dex_desugar` + +   `--internal_persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_resource_processor` +: Enable persistent multiplexed Android resource processor by using workers. + + Expands to: + +   `--persistent_android_resource_processor` + +   `--modify_execution_info=AaptPackage=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceParser=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceValidator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceCompiler=+supports-multiplex-workers` + +   `--modify_execution_info=RClassGenerator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceLink=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAapt2=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAssetMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidCompiledResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=ManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=Aapt2Optimize=+supports-multiplex-workers` + +   `--modify_execution_info=AARGenerator=+supports-multiplex-workers` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_tools` +: Enable persistent and multiplexed Android tools (dexing, desugaring, resource processing). + + Expands to: + +   `--internal_persistent_multiplex_busybox_tools` + +   `--persistent_multiplex_android_resource_processor` + +   `--persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]use_target_platform_for_tests` default: "false" +: If true, use the target platform for running tests rather than the test exec group. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that configure the toolchain used for action execution: + +`--android_compiler=` default: see description +: The Android target compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_manifest_merger=` default: "android" +: Selects the manifest merger to use for android\_binary rules. Flag to help the transition to the Android manifest merger from the legacy merger. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_platforms=` default: "" +: Sets the platforms that android\_binary targets use. If multiple platforms are specified, then the binary is a fat APKs, which contains native binaries for each specified target platform. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--cc_output_directory_tag=` default: "" +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compiler=` default: see description +: The C++ compiler to use for compiling the target. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--coverage_output_generator=` default: "@bazel\_tools//tools/test:lcov\_merger" +: Location of the binary that is used to postprocess raw coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:lcov_merger`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_report_generator=` default: "@bazel\_tools//tools/test:coverage\_report\_generator" +: Location of the binary that is used to generate coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:coverage_report_generator`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_support=` default: "@bazel\_tools//tools/test:coverage\_support" +: Location of support files that are required on the inputs of every test action + that collects code coverage. Defaults to `//tools/test:coverage_support`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--custom_malloc=` default: see description +: Specifies a custom malloc implementation. This setting overrides malloc attributes in build rules. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_include_xcode_execution_requirements` default: "false" +: If set, add a "requires-xcode:{version}" execution requirement to every Xcode action. If the Xcode version has a hyphenated label, also add a "requires-xcode-label:{version\_label}" execution requirement. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_prefer_mutual_xcode` default: "true" +: If true, use the most recent Xcode that is available both locally and remotely. If false, or if there are no mutual available versions, use the local Xcode version selected via xcode-select. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--extra_execution_platforms=` default: "" +: The platforms that are available as execution platforms to run actions. + Platforms can be specified by exact target, or as a target pattern. + These platforms will be considered before those declared in the `WORKSPACE` file by + `register_execution_platforms()`. This option may only be set once; later + instances will override earlier flag settings. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--extra_toolchains=` multiple uses are accumulated +: The toolchain rules to be considered during toolchain resolution. + Toolchains can be specified by exact target, or as a target pattern. + These toolchains will be considered before those declared in the `WORKSPACE` file + by `register_toolchains()`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--grte_top=` default: see description +: A label to a checked-in libc library. The default value is selected by the crosstool toolchain, and you almost never need to override it. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_compiler=` default: see description +: No-op flag. Will be removed in a future release. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--host_grte_top=` default: see description +: If specified, this setting overrides the libc top-level directory (--grte\_top) for the exec configuration. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_platform=` default: "@bazel\_tools//tools:host\_platform" +: The label of a platform rule that describes the host system. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]incompatible_bazel_test_exec_run_under` default: "true" +: If enabled, `bazel test --run_under=//:runner` builds `//:runner` in the exec + configuration. If disabled, it builds `//:runner` in the target configuration. + Bazel executes tests on exec machines, so the former is more correct. This + doesn't affect `bazel run`, which always builds `--run_under=//foo` in the + target configuration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_builtin_objc_strip_action` default: "true" +: Whether to emit a strip action as part of objc linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_dont_enable_host_nonhost_crosstool_features` default: "true" +: If true, Bazel will not enable 'host' and 'nonhost' features in the c++ toolchain (see https://github.com/bazelbuild/bazel/issues/7407 for more information). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_remove_legacy_whole_archive` default: "true" +: If true, Bazel will not link library dependencies as whole archive by default (see https://github.com/bazelbuild/bazel/issues/7362 for migration instructions). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strip_executable_safely` default: "false" +: If true, strip action for executables will use flag -x, which does not break dynamic symbol resolution. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]interface_shared_objects` default: "true" +: Use interface shared objects if supported by the toolchain. All ELF toolchains currently support this setting. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_sdk_version=` default: see description +: Specifies the version of the iOS SDK to use to build iOS applications. If unspecified, uses the default iOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--macos_sdk_version=` default: see description +: Specifies the version of the macOS SDK to use to build macOS applications. If unspecified, uses the default macOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--minimum_os_version=` default: see description +: The minimum OS version which your compilation targets. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_mappings=` default: "" +: The location of a mapping file that describes which platform to use if none is set or + which flags to set when a platform already exists. Must be relative to the main + workspace root. Defaults to `platform_mappings` (a file directly under the + workspace root). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--platforms=` default: "" +: The labels of the platform rules describing the target platforms for the current command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_sdk_version=` default: see description +: Specifies the version of the tvOS SDK to use to build tvOS applications. If unspecified, uses the default tvOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]use_platforms_in_apple_crosstool_transition` default: "false" +: Makes apple\_crosstool\_transition fall back to using the value of `--platforms` flag instead of legacy `--cpu` when needed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_sdk_version=` default: see description +: Specifies the version of the watchOS SDK to use to build watchOS applications. If unspecified, uses the default watchOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version=` default: see description +: If specified, uses Xcode of the given version for relevant build actions. If unspecified, uses the executor default version of Xcode. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version_config=` default: "@bazel\_tools//tools/cpp:host\_xcodes" +: The label of the xcode\_config rule to be used for selecting the Xcode version in the build configuration. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that control the output of the command: + +`--[no]apple_generate_dsym` default: "false" +: Whether to generate debug symbol(.dSYM) file(s). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]build_runfile_links` default: "true" +: If true, build runfiles symlink forests for all targets. If false, write them only when required by a local action, test or run command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_runfile_manifests` default: "true" +: If true, write runfiles manifests for all targets. If false, omit them. Local tests will fail to run when false. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_test_dwp` default: "false" +: If enabled, when building C++ tests statically and with fission the .dwp file for the test binary will be automatically built as well. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cc_proto_library_header_suffixes=` default: ".pb.h" +: Sets the suffixes of header files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--cc_proto_library_source_suffixes=` default: ".pb.cc" +: Sets the suffixes of source files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]experimental_proto_descriptor_sets_include_source_info` default: "false" +: Run extra actions for alternative Java api versions in a proto\_library. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_save_feature_state` default: "false" +: Save the state of enabled and requested feautres as an output of compilation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fission=` default: "no" +: Specifies which compilation modes use fission for C++ compilations and links. May be any combination of {'fastbuild', 'dbg', 'opt'} or the special values 'yes' to enable all modes and 'no' to disable all modes. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_always_include_files_in_data` default: "true" +: If true, native rules add `DefaultInfo.files` of data dependencies to their runfiles, + which matches the recommended behavior for Starlark rules ([runfiles features to avoid](https://bazel.build/extending/rules#runfiles_features_to_avoid)). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_compact_repo_mapping_manifest` default: "true" +: If enabled, the `{binary}.repo_mapping` file emits a module extension's repo mapping + only once instead of once for each repo generated by the extension that + contributes runfiles. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_select_on=` default: "" +: List of flags for which the use in `select()` is disabled. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_filegroup_runfiles_for_data` default: "true" +: If true, runfiles of targets listed in the srcs attribute are available to targets that consume the filegroup as a data dependency. + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]objc_generate_linkmap` default: "false" +: Specifies whether to generate a linkmap file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]save_temps` default: "false" +: If set, temporary outputs from gcc will be saved. These include .s files (assembler code), .i files (preprocessed C) and .ii files (preprocessed C++). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with target + configuration. Variables can be either specified by `name`, in which case + the value will be taken from the invocation environment, by the `name=value` + pair which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can be used + multiple times; for options given for the same variable, the latest wins, + options for different variables accumulate. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, all `name=value` + pairs will be available to repository rules. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--allowed_cpu_values=` default: "" +: Allowed values for the `--cpu` flag. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]android_databinding_use_androidx` default: "true" +: Generate AndroidX-compatible data-binding files. This is only used with databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]android_databinding_use_v3_4_args` default: "true" +: Use android databinding v2 with 3.4.0 argument. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--android_dynamic_mode=` default: "off" +: Determines whether C++ deps of Android rules will be linked dynamically when a cc\_binary does not explicitly create a shared library. 'default' means bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--android_manifest_merger_order=` default: "alphabetical" +: Sets the order of manifests passed to the manifest merger for Android binaries. ALPHABETICAL means manifests are sorted by path relative to the execroot. ALPHABETICAL\_BY\_CONFIGURATION means manifests are sorted by paths relative to the configuration directory within the output directory. DEPENDENCY means manifests are ordered with each library's manifest coming before the manifests of its dependencies. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`execution`](#effect_tag_EXECUTION) + +`--[no]android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]collect_code_coverage` default: "false" +: If specified, Bazel will instrument code (using offline instrumentation where + possible) and will collect coverage information during tests. Only targets that + match `--instrumentation_filter` will be affected. Usually this option should + not be specified directly - `bazel coverage` command should be used instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compilation_mode=` [`-c`] default: "fastbuild" +: Specify the mode the binary will be built in. Values: `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--conlyopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--copt=` multiple uses are accumulated +: Additional options to pass to gcc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cpu=` default: "" +: Deprecated: this flag is not used internally by Blaze although there are legacy platform + mappings to allow for backwards compatibility. Do not use this flag, instead use + `--platforms` with an appropriate platform definition. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_absolute_path=` default: see description +: Use CSFDO profile information to optimize compilation. Specify the absolute path name of the zip file containing the profile file, a raw or an indexed LLVM profile file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_instrument=` default: see description +: Generate binaries with context sensitive FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_profile=` default: see description +: The cs\_fdo\_profile representing the context sensitive profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cxxopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--define=` multiple uses are accumulated +: Each `--define` option specifies an assignment for a build variable. + In case of multiple values for a variable, the last one wins. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--dynamic_mode=` default: "default" +: Determines whether C++ binaries will be linked dynamically. 'default' means Bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_propeller_optimize_absolute_paths` default: "true" +: If set, any use of absolute paths for propeller optimize will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_remaining_fdo_absolute_paths` default: "true" +: If set, any use of absolute paths for FDO will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_runfiles` default: "auto" +: Enable runfiles symlink tree; By default, it's off on Windows, on on other platforms. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--exec_aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to exec-configured targets, regardless of whether or not they are top-level targets. This is an experimental feature and is subject to change. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_action_listener=` multiple uses are accumulated +: Deprecated in favor of aspects. Use `action_listener` to attach an `extra_action` to + existing build actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_compress_java_resources` default: "false" +: Compress Java resources in APKs + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_databinding_v2` default: "true" +: Use android databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_rewrite_dexes_with_rex` default: "false" +: use rex tool to rewrite dex files + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_collect_code_coverage_for_generated_files` default: "false" +: If specified, Bazel will also generate collect coverage information for generated files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_omitfp` default: "false" +: If true, use libunwind for stack unwinding, and compile with -fomit-frame-pointer and -fasynchronous-unwind-tables. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_output_paths=` default: "off" +: Which model to use for where in the output tree rules write their outputs, particularly + for multi-platform / multi-configuration builds. This is highly experimental. See + [GH-6526](https://github.com/bazelbuild/bazel/issues/6526) for details. Starlark actions can opt into path mapping by adding the key + `supports-path-mapping` to the `execution_requirements` dict. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_override_platform_cpu_name=` multiple uses are accumulated +: Each entry should be of the form `label=value` where label refers to a platform and values + is the desired shortname to override the platform's CPU name in `$(TARGET_CPU)` + make variable and output path. Only used when + `--experimental_platform_in_output_dir`, `--incompatible_target_cpu_from_platform` or + `--incompatible_bep_cpu_from_platform` is true. Has highest naming priority. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_platform_in_output_dir` default: "Auto" +: If true, a shortname for the target platform is used in the output directory name + instead of the CPU. The exact scheme is experimental and subject to change: + + 1. First, in the rare case the `--platforms` option does not have exactly one value, a + hash of the platforms option is used. + 2. Next, if any shortname for the current platform was registered by + `--experimental_override_name_platform_in_output_dir`, then that shortname is used. + 3. Then, if `--experimental_use_platforms_in_output_dir_legacy_heuristic` is set, use a + shortname based off the current platform Label. + 4. Finally, a hash of the platform option is used as a last resort. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_llvm_covmap` default: "false" +: If specified, Bazel will generate llvm-cov coverage map information rather than gcov when collect\_code\_coverage is enabled. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_platforms_in_output_dir_legacy_heuristic` default: "true" +: Please only use this flag as part of a suggested migration or testing strategy. Note + that the heuristic has known deficiencies and it is suggested to migrate to + relying on just `--experimental_override_name_platform_in_output_dir`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fdo_instrument=` default: see description +: Generate binaries with FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_optimize=` default: see description +: Use FDO profile information to optimize compilation. Specify the name of a zip file containing a .gcda file tree, an afdo file containing an auto profile, or an LLVM profile file. This flag also accepts files specified as labels (e.g. `//foo/bar:file.afdo` - you may need to add an `exports_files` directive to the corresponding package) and labels pointing to `fdo_profile` targets. This flag will be superseded by the `fdo_profile` rule. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_prefetch_hints=` default: see description +: Use cache prefetch hints. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_profile=` default: see description +: The fdo\_profile representing the profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the target configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + See also `--host_features`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]force_pic` default: "false" +: If enabled, all C++ compilations produce position-independent code ("-fPIC"), links prefer PIC pre-built libraries over non-PIC libraries, and links produce position-independent executables ("-pie"). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with execution + configurations. Variables can be either specified by `name`, in which case the + value will be taken from the invocation environment, by the `name=value` pair + which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can + be used multiple times; for options given for the same variable, the latest + wins, options for different variables accumulate. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_compilation_mode=` default: "opt" +: Specify the mode the tools used during the build will be built in. Values: + `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_conlyopt=` multiple uses are accumulated +: Additional option to pass to the C compiler when compiling C (but not C++) source files in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_copt=` multiple uses are accumulated +: Additional options to pass to the C compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cpu=` default: "" +: The host CPU. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cxxopt=` multiple uses are accumulated +: Additional options to pass to C++ compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the exec configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_linkopt=` multiple uses are accumulated +: Additional option to pass to linker when linking tools in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_macos_minimum_os=` default: see description +: Minimum compatible macOS version for host targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--host_per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to the C/C++ compiler when compiling certain files in the exec configurations. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --host\_per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_auto_exec_groups` default: "false" +: When enabled, an exec groups is automatically created for each toolchain used by a rule. + For this to work rule needs to specify `toolchain` parameter on its actions. For + more information, see [GH-17134](https://github.com/bazelbuild/bazel/issues/17134). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_merge_genfiles_directory` default: "true" +: If true, the genfiles directory is folded into the bin directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_target_cpu_from_platform` default: "true" +: If specified, the value of the cpu constraint (`@platforms//cpu:cpu`) of + the target platform is used to set the `$(TARGET_CPU)` make variable. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]instrument_test_targets` default: "false" +: When coverage is enabled, specifies whether to consider instrumenting test rules. + When set, test rules included by `--instrumentation_filter` are instrumented. + Otherwise, test rules are always excluded from coverage instrumentation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--instrumentation_filter=` default: "-/javatests[/:],-/test/java[/:]" +: When coverage is enabled, only rules with names included by the + specified regex-based filter will be instrumented. Rules prefixed + with '-' are excluded instead. Note that only non-test rules are + instrumented unless `--instrument_test_targets` is enabled. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_minimum_os=` default: see description +: Minimum compatible iOS version for target simulators and devices. If unspecified, uses 'ios\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--ios_multi_cpus=` multiple uses are accumulated +: Comma-separated list of architectures to build an ios\_application with. The result is a universal binary containing all specified architectures. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]legacy_whole_archive` default: "true" +: Deprecated, superseded by --incompatible\_remove\_legacy\_whole\_archive (see https://github.com/bazelbuild/bazel/issues/7362 for details). When on, use --whole-archive for cc\_binary rules that have linkshared=True and either linkstatic=True or '-static' in linkopts. This is for backwards compatibility only. A better alternative is to use alwayslink=1 where required. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`deprecated`](#metadata_tag_DEPRECATED) + +`--linkopt=` multiple uses are accumulated +: Additional option to pass to gcc when linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltobackendopt=` multiple uses are accumulated +: Additional option to pass to the LTO backend step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltoindexopt=` multiple uses are accumulated +: Additional option to pass to the LTO indexing step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--macos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple macOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--macos_minimum_os=` default: see description +: Minimum compatible macOS version for targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--memprof_profile=` default: see description +: Use memprof profile. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]objc_enable_binary_stripping` default: "false" +: Whether to perform symbol and dead-code strippings on linked binaries. Binary strippings will be performed if both this flag and --compilation\_mode=opt are specified. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--objccopt=` multiple uses are accumulated +: Additional options to pass to gcc when compiling Objective-C/C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to gcc when compiling certain files. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--per_file_ltobackendopt=` multiple uses are accumulated +: Additional options to selectively pass to LTO backend (under --features=thin\_lto) when compiling certain backend objects. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns. option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_ltobackendopt=//foo/.\*.o,-//foo/bar.o@-O0 adds the -O0 command line option to the LTO backend command line of all o files in //foo/ except bar.o. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_suffix=` default: see description +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--propeller_optimize=` default: see description +: Use Propeller profile information to optimize the build target.A propeller profile must consist of at least one of two files, a cc profile and a ld profile. This flag accepts a build label which must refer to the propeller profile input files. For example, the BUILD file that defines the label, in a/b/BUILD:propeller\_optimize( name = "propeller\_profile", cc\_profile = "propeller\_cc\_profile.txt", ld\_profile = "propeller\_ld\_profile.txt",)An exports\_files directive may have to be added to the corresponding package to make these files visible to Bazel. The option must be used as: --propeller\_optimize=//a/b:propeller\_profile + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_cc_profile=` default: see description +: Absolute path name of cc\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_ld_profile=` default: see description +: Absolute path name of ld\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--run_under=` default: see description +: Prefix to insert before the executables for the `test` and `run` commands. + If the value is `foo -bar`, and the execution command line is `test_binary -baz`, + then the final command line is `foo -bar test_binary -baz`. + This can also be a label to an executable target. Some examples are: + + * `valgrind` + * `strace` + * `strace -c` + * `valgrind --quiet --num-callers=20` + * `//package:target` + * `//package:target --options` + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]share_native_deps` default: "true" +: If true, native libraries that contain identical functionality will be shared among different targets + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]stamp` default: "false" +: Stamp binaries with the date, username, hostname, workspace information, etc. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--strip=` default: "sometimes" +: Specifies whether to strip binaries and shared libraries (using "-Wl,--strip-debug"). The default value of 'sometimes' means strip iff --compilation\_mode=fastbuild. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--stripopt=` multiple uses are accumulated +: Additional options to pass to strip when generating a '.stripped' binary. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--tvos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple tvOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_minimum_os=` default: see description +: Minimum compatible tvOS version for target simulators and devices. If unspecified, uses 'tvos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--visionos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple visionOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple watchOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_minimum_os=` default: see description +: Minimum compatible watchOS version for target simulators and devices. If unspecified, uses 'watchos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xbinary_fdo=` default: see description +: Use XbinaryFDO profile information to optimize compilation. Specify the name of default cross binary profile. When the option is used together with --fdo\_instrument/--fdo\_optimize/--fdo\_profile, those options will always prevail as if xbinary\_fdo is never specified. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]check_visibility` default: "true" +: If disabled, visibility errors in target dependencies are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]desugar_for_android` default: "true" +: Whether to desugar Java 8 bytecode before dexing. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]desugar_java8_libs` default: "false" +: Whether to include supported Java 8 libraries in apps for legacy devices. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]enforce_constraints` default: "true" +: Checks the environments each target is compatible with and reports errors if any target has dependencies that don't support the same environments + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_check_desugar_deps` default: "true" +: Whether to double-check correct desugaring at Android binary level. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_enforce_transitive_visibility` default: "false" +: If true, enable package()s to set the transitive\_visibility attribute to restrict which packages may depend on them. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_one_version_enforcement=` default: "OFF" +: When enabled, enforce that a java\_binary rule can't contain more than one version of the same class file on the classpath. This enforcement can break the build, or can just result in warnings. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_strict_java_deps=` default: "default" +: If true, checks that a Java target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]incompatible_check_testonly_for_output_files` default: "false" +: If enabled, check testonly for prerequisite targets that are output files by looking up the testonly of the generating rule. This matches visibility checking. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_native_android_rules` default: "false" +: If enabled, direct usage of the native Android rules is disabled. Please use the Starlark Android rules from https://github.com/bazelbuild/rules\_android + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]one_version_enforcement_on_java_tests` default: "true" +: When enabled, and with experimental\_one\_version\_enforcement set to a non-NONE value, enforce one version on java\_test targets. This flag can be disabled to improve incremental test performance at the expense of missing potential one version violations. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--strict_proto_deps=` default: "error" +: Unless OFF, checks that a proto\_library target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--strict_public_imports=` default: "off" +: Unless OFF, checks that a proto\_library target explicitly declares all targets used in 'import public' as exported. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]strict_system_includes` default: "false" +: If true, headers found through system include paths (-isystem) are also required to be declared. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--target_environment=` multiple uses are accumulated +: Declares this build's target environment. Must be a label reference to an + [`environment` rule](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java). If specified, all top-level targets must be compatible with this + environment. + + See also `--platforms`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Options that affect the signing outputs of a build: + +`--apk_signing_method=` default: "v1\_v2" +: Implementation to use to sign APKs + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]device_debug_entitlements` default: "true" +: If set, and compilation mode is not 'opt', objc apps will include debug entitlements when signing. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_disallow_sdk_frameworks_attributes` default: "false" +: If true, disallow sdk\_frameworks and weak\_sdk\_frameworks attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_objc_alwayslink_by_default` default: "false" +: If true, make the default value true for alwayslink attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]allow_analysis_failures` default: "false" +: If true, an analysis failure of a rule target results in the target's propagation + of an instance of `AnalysisFailureInfo` containing the error description, instead + of resulting in a build failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--analysis_testing_deps_limit=` default: "2000" +: Sets the maximum number of transitive dependencies through a rule attribute with + a `for_analysis_testing` configuration transition. + Exceeding this limit will result in a rule error. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]break_build_on_parallel_dex2oat_failure` default: "false" +: If true dex2oat action failures will cause the build to break instead of executing dex2oat during test runtime. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--default_test_resources=` multiple uses are accumulated +: Override the default resources amount for tests. The expected format is + `{resource}={value}`. If a single positive number is specified as `{value}` + it will override the default resources for all test sizes. If 4 + comma-separated numbers are specified, they will override the resource + amount for respectively the `small`, `medium`, `large`, `enormous` test sizes. + Values can also be `HOST_RAM`/`HOST_CPU`, optionally followed + by `[-|*]{float}` (eg. `memory=HOST_RAM*.1,HOST_RAM*.2,HOST_RAM*.3,HOST_RAM*.4`). + The default test resources specified by this flag are overridden by explicit + resources specified in tags. + +`--[no]experimental_android_use_parallel_dex2oat` default: "false" +: Use dex2oat in parallel to possibly speed up android\_test. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--ios_simulator_device=` default: see description +: The device to simulate when running an iOS application in the simulator, e.g. 'iPhone 6'. You can get a list of devices by running 'xcrun simctl list devicetypes' on the machine the simulator will be run on. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--ios_simulator_version=` default: see description +: The version of iOS to run on the simulator when running or testing. This is ignored for ios\_test rules if a target device is specified in the rule. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--runs_per_test=` multiple uses are accumulated +: Specifies number of times to run each test. If any of those attempts fail for any + reason, the whole test is considered failed. Normally the value specified is + just an integer. + + Example: `--runs_per_test=3` will run all tests 3 times. + + Alternate syntax: `regex_filter@runs_per_test`. Where `runs_per_test` stands for + an integer value and `regex_filter` stands for a list of include and exclude + regular expression patterns (Also see --instrumentation\_filter). + + Example: `--runs_per_test=//foo/.*,-//foo/bar/.*@3` runs all tests in `//foo/` except + those under `//foo/bar` three times. This option can be passed multiple times. The most + recently passed argument that matches takes precedence. If nothing matches, + the test is only run once. + +`--test_env=` multiple uses are accumulated +: Specifies additional environment variables to be injected into the test runner + environment. Variables can be either specified by `name`, in which + case its value will be read from the Bazel client environment, or by the + `name=value` pair. + Previously set variables can be unset via `=name`. + This option can be used multiple times to specify several variables. + Used only by the 'bazel test' command. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--test_timeout=` default: "-1" +: Override the default test timeout values for test timeouts (in secs). If a single + positive integer value is specified it will override all categories. If 4 + comma-separated integers are specified, they will override the timeouts for + `short`, `moderate`, `long` and `eternal` (in that order). In either form, a value of + -1 tells blaze to use its default timeouts for that category. + +`--[no]zip_undeclared_test_outputs` default: "false" +: If true, undeclared test outputs will be archived in a zip file. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +Options that trigger optimizations of the build time: + +`--[no]cc_dotd_files` default: "true" +: Whether to generate and analyze .d files. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]cc_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_filter_library_jar_with_program_jar` default: "false" +: Filter the ProGuard ProgramJar to remove any classes also present in the LibraryJar. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_dotd_files` default: "true" +: If enabled, C++ .d files will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_jdeps_files` default: "true" +: If enabled, the dependency (.jdeps) files generated from Java compilations will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_retain_test_configuration_across_testonly` default: "true" +: When enabled, `--trim_test_configuration` will not trim the test configuration for rules + marked testonly=1. This is meant to reduce action conflict issues when non-test + rules depend on `cc_test` rules. No effect if `--trim_test_configuration` is + false. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_unsupported_and_brittle_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incremental_dexing` default: "true" +: Does most of the work for dexing separately for each Jar file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]objc_use_dotd_pruning` default: "true" +: If set, .d files emitted by clang will be used to prune the set of inputs passed into objc compiles. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]process_headers_in_dependencies` default: "false" +: When building a target //a:a, process headers in all targets that //a:a depends on (if header processing is enabled for the toolchain). + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]trim_test_configuration` default: "true" +: When enabled, test-related options will be cleared below the top level of the build. When this flag is active, tests cannot be built as dependencies of non-test rules, but changes to test-related options will not cause non-test rules to be re-analyzed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +Options that affect the verbosity, format or location of logging: + +`--toolchain_resolution_debug=` default: "-.\*" +: Print debug information during toolchain resolution. The flag takes a regex, which is checked against toolchain types and specific targets to see which to debug. Multiple regexes may be separated by commas, and then each regex is checked separately. Note: The output of this flag is very complex and will likely only be useful to experts in toolchain resolution. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]verbose_visibility_errors` default: "false" +: If enabled, visibility errors include additional diagnostic information. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--flag_alias=` multiple uses are accumulated +: Sets a shorthand name for a Starlark flag. It takes a single key-value pair in the form + `{key}={value}` as an argument. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Miscellaneous options, not otherwise categorized.: + +`--[no]cache_test_results` [`-t`] default: "auto" +: If set to `auto`, Bazel reruns a test if and only if: + + 1. Bazel detects changes in the test or its dependencies, + 2. The test is marked as `external`, + 3. Multiple test runs were requested with `--runs_per_test`, or + 4. The test previously failed. + If set to `yes`, Bazel caches all test results except for tests marked as + `external`. If set to `no`, Bazel does not cache any test results. + +`--[no]experimental_cancel_concurrent_tests` default: "never" +: If `on_failed` or `on_passed`, then Blaze will cancel concurrently running tests on the first + successful run with that result. This is only useful in combination with + `--runs_per_test_detects_flakes`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_fetch_all_coverage_outputs` default: "false" +: If true, then Bazel fetches the entire coverage data directory for each test during a coverage run. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_generate_llvm_lcov` default: "false" +: If true, coverage for clang will generate an LCOV report. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_java_classpath=` default: "bazel" +: Enables reduced classpaths for Java compilations. + +`--[no]experimental_run_android_lint_on_java_rules` default: "false" +: Whether to validate java\_\* sources. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]explicit_java_test_deps` default: "false" +: Explicitly specify a dependency to JUnit or Hamcrest in a java\_test instead of accidentally obtaining from the TestRunner's deps. Only works for bazel right now. + +`--host_java_launcher=` default: see description +: The Java launcher used by tools that are executed during a build. + +`--host_javacopt=` multiple uses are accumulated +: Additional options to pass to javac when building tools that are executed during a build. + +`--host_jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM when building tools that are executed during the build. These options will get added to the VM startup options of each java\_binary target. + +`--[no]incompatible_exclusive_test_sandboxed` default: "true" +: If true, exclusive tests will run with sandboxed strategy. Add `local` tag to force + an exclusive test run locally + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strict_action_env` default: "true" +: If true, Bazel uses an environment with a static value for PATH and does not + inherit `LD_LIBRARY_PATH`. Use `--action_env=ENV_VARIABLE` if you want to + inherit specific environment variables from the client, but note that doing so + can prevent cross-user caching if a shared cache is used. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--j2objc_translation_flags=` multiple uses are accumulated +: Additional options to pass to the J2ObjC tool. + +`--java_debug` +: Causes the Java virtual machine of a java test to wait for a connection from a JDWP-compliant debugger (such as jdb) before starting the test. Implies -test\_output=streamed. + + Expands to: + +   `--test_arg=--wrapper_script_flag=--debug` + +   `--test_output=streamed` + +   `--test_strategy=exclusive` + +   `--test_timeout=9999` + +   `--nocache_test_results` + +`--[no]java_deps` default: "true" +: Generate dependency information (for now, compile-time classpath) per Java target. + +`--[no]java_header_compilation` default: "true" +: Compile ijars directly from source. + +`--java_language_version=` default: "" +: The Java language version + +`--java_launcher=` default: see description +: The Java launcher to use when building Java binaries. If this flag is set to the empty string, the JDK launcher is used. The "launcher" attribute overrides this flag. + +`--java_runtime_version=` default: "local\_jdk" +: The Java runtime version + +`--javacopt=` multiple uses are accumulated +: Additional options to pass to javac. + +`--jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM. These options will get added to the VM startup options of each java\_binary target. + +`--legacy_main_dex_list_generator=` default: see description +: Specifies a binary to use to generate the list of classes that must be in the main dex when compiling legacy multidex. + +`--optimizing_dexer=` default: see description +: Specifies a binary to use to do dexing without sharding. + +`--plugin=` multiple uses are accumulated +: Plugins to use in the build. Currently works with java\_plugin. + +`--proguard_top=` default: see description +: Specifies which version of ProGuard to use for code removal when building a Java binary. + +`--proto_compiler=` default: "@bazel\_tools//tools/proto:protoc" +: The label of the proto-compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]proto_profile` default: "true" +: Whether to pass profile\_path to the proto compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_profile_path=` default: see description +: The profile to pass to the proto compiler as profile\_path. If unset, but --proto\_profile is true (the default), infers the path from --fdo\_optimize. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_cc=` default: "@bazel\_tools//tools/proto:cc\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile C++ protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_java=` default: "@bazel\_tools//tools/proto:java\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile Java protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_javalite=` default: "@bazel\_tools//tools/proto:javalite\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile JavaLite protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--protocopt=` multiple uses are accumulated +: Additional options to pass to the protobuf compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]runs_per_test_detects_flakes` default: "false" +: If true, any shard in which at least one run/attempt passes and at least one run/attempt fails gets a FLAKY status. + +`--shell_executable=` default: see description +: Absolute path to the shell executable for Bazel to use. If this is unset, but the + `BAZEL_SH` environment variable is set on the first Bazel invocation (that starts + up a Bazel server), Bazel uses that. If neither is set, Bazel uses a hard-coded + default path depending on the operating system it runs on; + + * Windows: `c:/msys64/usr/bin/bash.exe` + * FreeBSD: `/usr/local/bin/bash` + * All others: `/bin/bash`. + + Note that using a shell that is not compatible with `bash` may lead + to build failures or runtime failures of the generated binaries. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--test_arg=` multiple uses are accumulated +: Specifies additional options and arguments that should be passed to the test + executable. Can be used multiple times to specify several arguments. + If multiple tests are executed, each of them will receive identical arguments. + Used only by the `bazel test` command. + +`--test_filter=` default: see description +: Specifies a filter to forward to the test framework. Used to limit the tests run. Note that this does not affect which targets are built. + +`--test_result_expiration=` default: "-1" +: This option is deprecated and has no effect. + +`--[no]test_runner_fail_fast` default: "false" +: Forwards fail fast option to the test runner. The test runner should stop execution upon first failure. + +`--test_sharding_strategy=` default: "explicit" +: Specify strategy for test sharding: + + * `explicit` to only use sharding if the `shard_count` `BUILD` attribute is + present. + * `disabled` to never use test sharding. + * `forced=k` to enforce `k` shards for testing regardless of the `shard_count` `BUILD` + attribute. + +`--tool_java_language_version=` default: "" +: The Java language version used to execute the tools that are needed during a build + +`--tool_java_runtime_version=` default: "remotejdk\_11" +: The Java runtime version used to execute tools during the build + +`--[no]use_ijars` default: "true" +: If enabled, this option causes Java compilation to use interface jars. This will result in faster incremental compilation, but error messages can be different. + +## Help Options + +Options that affect the verbosity, format or location of logging: + +`--help_verbosity=` default: "medium" +: Select the verbosity of the help command. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--long` [`-l`] +: Show full description of each option, instead of just its name. + + Expands to: + +   `--help_verbosity=long` + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--short` +: Show only the names of the options, not their types or meanings. + + Expands to: + +   `--help_verbosity=short` + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +## Info Options + +Inherits all options from [build](#build). + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--info_output_type=` default: "stdout" +: If stdout, results are directly printed to the console. If response\_proto, the info command results are packed in response extensions. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +Options that affect the verbosity, format or location of logging: + +`--[no]show_make_env` default: "false" +: Include the "Make" environment in the output. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +## License Options + +## Mobile-install Options + +Inherits all options from [build](#build). + +Options that control build execution: + +`--mode=` default: "skylark" +: Deprecated no-effect flag. Only skylark mode is still supported. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that configure the toolchain used for action execution: + +`--adb=` default: "" +: adb binary to use for the 'mobile-install' command. If unspecified, the one in the Android SDK specified by the --android\_sdk\_channel command line option (or the default SDK if --android\_sdk\_channel is not specified) is used. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Options that control the output of the command: + +`--[no]incremental` default: "false" +: Whether to do an incremental install. If true, try to avoid unnecessary additional work by reading the state of the device the code is to be installed on and using that information to avoid unnecessary work. If false (the default), always do a full install. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]split_apks` default: "false" +: Whether to use split apks to install and update the application on the device. Works only with devices with Marshmallow or later + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--adb_arg=` multiple uses are accumulated +: Extra arguments to pass to adb. Usually used to designate a device to install to. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--debug_app` +: Whether to wait for the debugger before starting the app. + + Expands to: + +   `--start=DEBUG` + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--device=` default: "" +: The adb device serial number. If not specified, the first device will be used. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--start=` default: "NO" +: How the app should be started after installing it. Set to WARM to preserve and restore application state on incremental installs. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--start_app` +: Whether to start the app after installing it. + + Expands to: + +   `--start=COLD` + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that affect the verbosity, format or location of logging: + +`--incremental_install_verbosity=` default: "" +: The verbosity for incremental install. Set to 1 for debug logging. + + Tags: + [`bazel_monitoring`](#effect_tag_BAZEL_MONITORING) + +## Mod Options + +Options that control build execution: + +`--[no]experimental_remotable_source_manifests` default: "false" +: Whether to make source manifest actions remotable + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_modify_execution_info_additive` default: "true" +: When enabled, passing multiple `--modify_execution_info` flags is additive. + When disabled, only the last flag is taken into account. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--loading_phase_threads=) eg. "auto", "HOST_CPUS*.5">` default: "auto" +: Number of parallel threads to use for the loading/analysis phase.Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". "auto" sets a reasonable default based on host resources. Must be at least 1. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--modify_execution_info=` multiple uses are accumulated +: Add or remove keys from an action's execution info based on action mnemonic. + Applies only to actions which support execution info. Many common actions + support execution info, e.g. Genrule, CppCompile, Javac, StarlarkAction, + TestRunner. When specifying multiple values, order matters because + many regexes may apply to the same mnemonic. + + Syntax: `regex=[+-]key,regex=[+-]key,...`. + + Examples: + + * `.*=+x,.*=-y,.*=+z` adds `x` and `z` to, and removes `y` from, the execution info for all actions. + * `Genrule=+requires-x` adds `requires-x` to the execution info for all Genrule actions. + * `(?!Genrule).*=-requires-x` removes `requires-x` from the execution info for all non-Genrule actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]use_target_platform_for_tests` default: "false" +: If true, use the target platform for running tests rather than the test exec group. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that configure the toolchain used for action execution: + +`--[no]incompatible_bazel_test_exec_run_under` default: "true" +: If enabled, `bazel test --run_under=//:runner` builds `//:runner` in the exec + configuration. If disabled, it builds `//:runner` in the target configuration. + Bazel executes tests on exec machines, so the former is more correct. This + doesn't affect `bazel run`, which always builds `--run_under=//foo` in the + target configuration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that control the output of the command: + +`--[no]build_runfile_links` default: "true" +: If true, build runfiles symlink forests for all targets. If false, write them only when required by a local action, test or run command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_runfile_manifests` default: "true" +: If true, write runfiles manifests for all targets. If false, omit them. Local tests will fail to run when false. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_always_include_files_in_data` default: "true" +: If true, native rules add `DefaultInfo.files` of data dependencies to their runfiles, + which matches the recommended behavior for Starlark rules ([runfiles features to avoid](https://bazel.build/extending/rules#runfiles_features_to_avoid)). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_compact_repo_mapping_manifest` default: "true" +: If enabled, the `{binary}.repo_mapping` file emits a module extension's repo mapping + only once instead of once for each repo generated by the extension that + contributes runfiles. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_select_on=` default: "" +: List of flags for which the use in `select()` is disabled. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_filegroup_runfiles_for_data` default: "true" +: If true, runfiles of targets listed in the srcs attribute are available to targets that consume the filegroup as a data dependency. + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with target + configuration. Variables can be either specified by `name`, in which case + the value will be taken from the invocation environment, by the `name=value` + pair which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can be used + multiple times; for options given for the same variable, the latest wins, + options for different variables accumulate. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, all `name=value` + pairs will be available to repository rules. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--allowed_cpu_values=` default: "" +: Allowed values for the `--cpu` flag. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]collect_code_coverage` default: "false" +: If specified, Bazel will instrument code (using offline instrumentation where + possible) and will collect coverage information during tests. Only targets that + match `--instrumentation_filter` will be affected. Usually this option should + not be specified directly - `bazel coverage` command should be used instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compilation_mode=` [`-c`] default: "fastbuild" +: Specify the mode the binary will be built in. Values: `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--cpu=` default: "" +: Deprecated: this flag is not used internally by Blaze although there are legacy platform + mappings to allow for backwards compatibility. Do not use this flag, instead use + `--platforms` with an appropriate platform definition. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--define=` multiple uses are accumulated +: Each `--define` option specifies an assignment for a build variable. + In case of multiple values for a variable, the last one wins. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_runfiles` default: "auto" +: Enable runfiles symlink tree; By default, it's off on Windows, on on other platforms. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--exec_aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to exec-configured targets, regardless of whether or not they are top-level targets. This is an experimental feature and is subject to change. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_action_listener=` multiple uses are accumulated +: Deprecated in favor of aspects. Use `action_listener` to attach an `extra_action` to + existing build actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_collect_code_coverage_for_generated_files` default: "false" +: If specified, Bazel will also generate collect coverage information for generated files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_output_paths=` default: "off" +: Which model to use for where in the output tree rules write their outputs, particularly + for multi-platform / multi-configuration builds. This is highly experimental. See + [GH-6526](https://github.com/bazelbuild/bazel/issues/6526) for details. Starlark actions can opt into path mapping by adding the key + `supports-path-mapping` to the `execution_requirements` dict. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_override_platform_cpu_name=` multiple uses are accumulated +: Each entry should be of the form `label=value` where label refers to a platform and values + is the desired shortname to override the platform's CPU name in `$(TARGET_CPU)` + make variable and output path. Only used when + `--experimental_platform_in_output_dir`, `--incompatible_target_cpu_from_platform` or + `--incompatible_bep_cpu_from_platform` is true. Has highest naming priority. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_platform_in_output_dir` default: "Auto" +: If true, a shortname for the target platform is used in the output directory name + instead of the CPU. The exact scheme is experimental and subject to change: + + 1. First, in the rare case the `--platforms` option does not have exactly one value, a + hash of the platforms option is used. + 2. Next, if any shortname for the current platform was registered by + `--experimental_override_name_platform_in_output_dir`, then that shortname is used. + 3. Then, if `--experimental_use_platforms_in_output_dir_legacy_heuristic` is set, use a + shortname based off the current platform Label. + 4. Finally, a hash of the platform option is used as a last resort. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_platforms_in_output_dir_legacy_heuristic` default: "true" +: Please only use this flag as part of a suggested migration or testing strategy. Note + that the heuristic has known deficiencies and it is suggested to migrate to + relying on just `--experimental_override_name_platform_in_output_dir`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the target configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + See also `--host_features`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with execution + configurations. Variables can be either specified by `name`, in which case the + value will be taken from the invocation environment, by the `name=value` pair + which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can + be used multiple times; for options given for the same variable, the latest + wins, options for different variables accumulate. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_compilation_mode=` default: "opt" +: Specify the mode the tools used during the build will be built in. Values: + `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_cpu=` default: "" +: The host CPU. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the exec configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_auto_exec_groups` default: "false" +: When enabled, an exec groups is automatically created for each toolchain used by a rule. + For this to work rule needs to specify `toolchain` parameter on its actions. For + more information, see [GH-17134](https://github.com/bazelbuild/bazel/issues/17134). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_merge_genfiles_directory` default: "true" +: If true, the genfiles directory is folded into the bin directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_target_cpu_from_platform` default: "true" +: If specified, the value of the cpu constraint (`@platforms//cpu:cpu`) of + the target platform is used to set the `$(TARGET_CPU)` make variable. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]instrument_test_targets` default: "false" +: When coverage is enabled, specifies whether to consider instrumenting test rules. + When set, test rules included by `--instrumentation_filter` are instrumented. + Otherwise, test rules are always excluded from coverage instrumentation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--instrumentation_filter=` default: "-/javatests[/:],-/test/java[/:]" +: When coverage is enabled, only rules with names included by the + specified regex-based filter will be instrumented. Rules prefixed + with '-' are excluded instead. Note that only non-test rules are + instrumented unless `--instrument_test_targets` is enabled. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_suffix=` default: see description +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--run_under=` default: see description +: Prefix to insert before the executables for the `test` and `run` commands. + If the value is `foo -bar`, and the execution command line is `test_binary -baz`, + then the final command line is `foo -bar test_binary -baz`. + This can also be a label to an executable target. Some examples are: + + * `valgrind` + * `strace` + * `strace -c` + * `valgrind --quiet --num-callers=20` + * `//package:target` + * `//package:target --options` + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]stamp` default: "false" +: Stamp binaries with the date, username, hostname, workspace information, etc. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]check_visibility` default: "true" +: If disabled, visibility errors in target dependencies are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]enforce_constraints` default: "true" +: Checks the environments each target is compatible with and reports errors if any target has dependencies that don't support the same environments + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_enforce_transitive_visibility` default: "false" +: If true, enable package()s to set the transitive\_visibility attribute to restrict which packages may depend on them. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_check_testonly_for_output_files` default: "false" +: If enabled, check testonly for prerequisite targets that are output files by looking up the testonly of the generating rule. This matches visibility checking. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--target_environment=` multiple uses are accumulated +: Declares this build's target environment. Must be a label reference to an + [`environment` rule](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java). If specified, all top-level targets must be compatible with this + environment. + + See also `--platforms`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_config_setting_private_default_visibility` default: "false" +: If incompatible\_enforce\_config\_setting\_visibility=false, this is a noop. Else, if this flag is false, any config\_setting without an explicit visibility attribute is //visibility:public. If this flag is true, config\_setting follows the same visibility logic as all other rules. See https://github.com/bazelbuild/bazel/issues/12933. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_enforce_config_setting_visibility` default: "true" +: If true, enforce config\_setting visibility restrictions. If false, every config\_setting is visible to every target. See https://github.com/bazelbuild/bazel/issues/12932. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]allow_analysis_failures` default: "false" +: If true, an analysis failure of a rule target results in the target's propagation + of an instance of `AnalysisFailureInfo` containing the error description, instead + of resulting in a build failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--analysis_testing_deps_limit=` default: "2000" +: Sets the maximum number of transitive dependencies through a rule attribute with + a `for_analysis_testing` configuration transition. + Exceeding this limit will result in a rule error. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options relating to the output and semantics of the `mod` subcommand: + +`--[no]all_repos` default: "false" +: For `mod show_repo`: display all repos in the entire workspace. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]all_visible_repos` default: "false" +: For `mod show_repo`: display all repos visible to the chosen base module, under their apparent names. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--base_module=<"" for the root module; @ for a specific version of a module; for all versions of a module; @ for a repo with the given apparent name; or @@ for a repo with the given canonical name>` default: "" +: Specify a module relative to which the specified target repos will be interpreted. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--charset=` default: "utf8" +: Chooses the character set to use for the tree. Only affects text output. Valid values + are `utf8` or `ascii`. Default is `utf8` + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]cycles` default: "true" +: Points out dependency cycles inside the displayed tree. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--depth=` default: "-1" +: Maximum display depth of the dependency tree. A depth of 1 displays the direct + dependencies, for example. For `tree`, `path` and `all_paths` it defaults to + `Integer.MAX_VALUE`, while for `deps` and `explain` it defaults to 1 (only displays + direct deps of the root besides the target leaves and their parents). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--extension_filter=s>` default: see description +: Only display the usages of these module extensions and the repos generated by them if their respective flags are set. If set, the result graph will only include paths that contain modules using the specified extensions. An empty list disables the filter, effectively specifying all possible extensions. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--extension_info=` default: "hidden" +: Specify how much detail about extension usages to include in the query result. + + * `hidden` will not show any extension information. + * `usages` will only show the extensions names. + * `repos` will also include repos imported with `use_repo`. + * `all` will also show the other repositories generated by extensions. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--extension_usages=s>` default: "" +: Specify modules whose extension usages will be displayed in the show\_extension query. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--from=s>` default: "" +: The module(s) starting from which the dependency graph query will be displayed. Check + each query’s description for the exact semantics. Defaults to ``. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]include_builtin` default: "false" +: Include built-in modules in the dependency graph. Disabled by default because it is quite noisy. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]include_unused` default: "false" +: The queries will also take into account and display the unused modules, which are not + present in the module resolution graph after selection (due to the + Minimal-Version Selection or override rules). This can have different effects for + each of the query types i.e. include new paths in the `all_paths` command, or extra + dependants in the `explain` command. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--output=` default: "text" +: The format in which the query results should be printed. Allowed values for query are: + `text`, `json`, `graph`. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]verbose` default: "false" +: The queries will also display the reason why modules were resolved to their current version (if changed). Defaults to true only for the explain query. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +Options that affect the verbosity, format or location of logging: + +`--[no]verbose_visibility_errors` default: "false" +: If enabled, visibility errors include additional diagnostic information. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--flag_alias=` multiple uses are accumulated +: Sets a shorthand name for a Starlark flag. It takes a single key-value pair in the form + `{key}={value}` as an argument. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Miscellaneous options, not otherwise categorized.: + +`--deleted_packages=` multiple uses are accumulated +: A comma-separated list of names of packages which the build system will consider non-existent, even if they are visible somewhere on the package path. + Use this option when deleting a subpackage 'x/y' of an existing package 'x'. For example, after deleting x/y/BUILD in your client, the build system may complain if it encounters a label '//x:y/z' if that is still provided by another package\_path entry. Specifying --deleted\_packages x/y avoids this problem. + +`--[no]fetch` default: "true" +: Allows the command to fetch external dependencies. If set to false, the command will utilize any cached version of the dependency, and if none exists, the command will result in failure. + +`--package_path=` default: "%workspace%" +: A colon-separated list of where to look for packages. Elements beginning with '%workspace%' are relative to the enclosing workspace. If omitted or empty, the default is the output of 'bazel info default-package-path'. + +`--[no]show_loading_progress` default: "true" +: If enabled, causes Bazel to print "Loading package:" messages. + +## Print\_action Options + +Inherits all options from [build](#build). + +Miscellaneous options, not otherwise categorized.: + +`--print_action_mnemonics=` multiple uses are accumulated +: Lists which mnemonics to filter print\_action data by, no filtering takes place when left empty. + +## Query Options + +Options that control build execution: + +`--[no]experimental_remotable_source_manifests` default: "false" +: Whether to make source manifest actions remotable + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_modify_execution_info_additive` default: "true" +: When enabled, passing multiple `--modify_execution_info` flags is additive. + When disabled, only the last flag is taken into account. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]keep_going` [`-k`] default: "false" +: Continue as much as possible after an error. While the target that failed and those that depend on it cannot be analyzed, other prerequisites of these targets can be. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--loading_phase_threads=) eg. "auto", "HOST_CPUS*.5">` default: "auto" +: Number of parallel threads to use for the loading/analysis phase.Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". "auto" sets a reasonable default based on host resources. Must be at least 1. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +`--modify_execution_info=` multiple uses are accumulated +: Add or remove keys from an action's execution info based on action mnemonic. + Applies only to actions which support execution info. Many common actions + support execution info, e.g. Genrule, CppCompile, Javac, StarlarkAction, + TestRunner. When specifying multiple values, order matters because + many regexes may apply to the same mnemonic. + + Syntax: `regex=[+-]key,regex=[+-]key,...`. + + Examples: + + * `.*=+x,.*=-y,.*=+z` adds `x` and `z` to, and removes `y` from, the execution info for all actions. + * `Genrule=+requires-x` adds `requires-x` to the execution info for all Genrule actions. + * `(?!Genrule).*=-requires-x` removes `requires-x` from the execution info for all non-Genrule actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]use_target_platform_for_tests` default: "false" +: If true, use the target platform for running tests rather than the test exec group. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that configure the toolchain used for action execution: + +`--[no]incompatible_bazel_test_exec_run_under` default: "true" +: If enabled, `bazel test --run_under=//:runner` builds `//:runner` in the exec + configuration. If disabled, it builds `//:runner` in the target configuration. + Bazel executes tests on exec machines, so the former is more correct. This + doesn't affect `bazel run`, which always builds `--run_under=//foo` in the + target configuration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that control the output of the command: + +`--[no]build_runfile_links` default: "true" +: If true, build runfiles symlink forests for all targets. If false, write them only when required by a local action, test or run command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_runfile_manifests` default: "true" +: If true, write runfiles manifests for all targets. If false, omit them. Local tests will fail to run when false. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_always_include_files_in_data` default: "true" +: If true, native rules add `DefaultInfo.files` of data dependencies to their runfiles, + which matches the recommended behavior for Starlark rules ([runfiles features to avoid](https://bazel.build/extending/rules#runfiles_features_to_avoid)). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_compact_repo_mapping_manifest` default: "true" +: If enabled, the `{binary}.repo_mapping` file emits a module extension's repo mapping + only once instead of once for each repo generated by the extension that + contributes runfiles. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_select_on=` default: "" +: List of flags for which the use in `select()` is disabled. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_filegroup_runfiles_for_data` default: "true" +: If true, runfiles of targets listed in the srcs attribute are available to targets that consume the filegroup as a data dependency. + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with target + configuration. Variables can be either specified by `name`, in which case + the value will be taken from the invocation environment, by the `name=value` + pair which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can be used + multiple times; for options given for the same variable, the latest wins, + options for different variables accumulate. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, all `name=value` + pairs will be available to repository rules. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--allowed_cpu_values=` default: "" +: Allowed values for the `--cpu` flag. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]collect_code_coverage` default: "false" +: If specified, Bazel will instrument code (using offline instrumentation where + possible) and will collect coverage information during tests. Only targets that + match `--instrumentation_filter` will be affected. Usually this option should + not be specified directly - `bazel coverage` command should be used instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compilation_mode=` [`-c`] default: "fastbuild" +: Specify the mode the binary will be built in. Values: `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--cpu=` default: "" +: Deprecated: this flag is not used internally by Blaze although there are legacy platform + mappings to allow for backwards compatibility. Do not use this flag, instead use + `--platforms` with an appropriate platform definition. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--define=` multiple uses are accumulated +: Each `--define` option specifies an assignment for a build variable. + In case of multiple values for a variable, the last one wins. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_runfiles` default: "auto" +: Enable runfiles symlink tree; By default, it's off on Windows, on on other platforms. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--exec_aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to exec-configured targets, regardless of whether or not they are top-level targets. This is an experimental feature and is subject to change. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_action_listener=` multiple uses are accumulated +: Deprecated in favor of aspects. Use `action_listener` to attach an `extra_action` to + existing build actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_collect_code_coverage_for_generated_files` default: "false" +: If specified, Bazel will also generate collect coverage information for generated files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_output_paths=` default: "off" +: Which model to use for where in the output tree rules write their outputs, particularly + for multi-platform / multi-configuration builds. This is highly experimental. See + [GH-6526](https://github.com/bazelbuild/bazel/issues/6526) for details. Starlark actions can opt into path mapping by adding the key + `supports-path-mapping` to the `execution_requirements` dict. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_override_platform_cpu_name=` multiple uses are accumulated +: Each entry should be of the form `label=value` where label refers to a platform and values + is the desired shortname to override the platform's CPU name in `$(TARGET_CPU)` + make variable and output path. Only used when + `--experimental_platform_in_output_dir`, `--incompatible_target_cpu_from_platform` or + `--incompatible_bep_cpu_from_platform` is true. Has highest naming priority. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_platform_in_output_dir` default: "Auto" +: If true, a shortname for the target platform is used in the output directory name + instead of the CPU. The exact scheme is experimental and subject to change: + + 1. First, in the rare case the `--platforms` option does not have exactly one value, a + hash of the platforms option is used. + 2. Next, if any shortname for the current platform was registered by + `--experimental_override_name_platform_in_output_dir`, then that shortname is used. + 3. Then, if `--experimental_use_platforms_in_output_dir_legacy_heuristic` is set, use a + shortname based off the current platform Label. + 4. Finally, a hash of the platform option is used as a last resort. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_platforms_in_output_dir_legacy_heuristic` default: "true" +: Please only use this flag as part of a suggested migration or testing strategy. Note + that the heuristic has known deficiencies and it is suggested to migrate to + relying on just `--experimental_override_name_platform_in_output_dir`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the target configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + See also `--host_features`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with execution + configurations. Variables can be either specified by `name`, in which case the + value will be taken from the invocation environment, by the `name=value` pair + which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can + be used multiple times; for options given for the same variable, the latest + wins, options for different variables accumulate. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_compilation_mode=` default: "opt" +: Specify the mode the tools used during the build will be built in. Values: + `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_cpu=` default: "" +: The host CPU. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the exec configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_auto_exec_groups` default: "false" +: When enabled, an exec groups is automatically created for each toolchain used by a rule. + For this to work rule needs to specify `toolchain` parameter on its actions. For + more information, see [GH-17134](https://github.com/bazelbuild/bazel/issues/17134). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_merge_genfiles_directory` default: "true" +: If true, the genfiles directory is folded into the bin directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_target_cpu_from_platform` default: "true" +: If specified, the value of the cpu constraint (`@platforms//cpu:cpu`) of + the target platform is used to set the `$(TARGET_CPU)` make variable. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]instrument_test_targets` default: "false" +: When coverage is enabled, specifies whether to consider instrumenting test rules. + When set, test rules included by `--instrumentation_filter` are instrumented. + Otherwise, test rules are always excluded from coverage instrumentation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--instrumentation_filter=` default: "-/javatests[/:],-/test/java[/:]" +: When coverage is enabled, only rules with names included by the + specified regex-based filter will be instrumented. Rules prefixed + with '-' are excluded instead. Note that only non-test rules are + instrumented unless `--instrument_test_targets` is enabled. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_suffix=` default: see description +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--run_under=` default: see description +: Prefix to insert before the executables for the `test` and `run` commands. + If the value is `foo -bar`, and the execution command line is `test_binary -baz`, + then the final command line is `foo -bar test_binary -baz`. + This can also be a label to an executable target. Some examples are: + + * `valgrind` + * `strace` + * `strace -c` + * `valgrind --quiet --num-callers=20` + * `//package:target` + * `//package:target --options` + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]stamp` default: "false" +: Stamp binaries with the date, username, hostname, workspace information, etc. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]check_visibility` default: "true" +: If disabled, visibility errors in target dependencies are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]enforce_constraints` default: "true" +: Checks the environments each target is compatible with and reports errors if any target has dependencies that don't support the same environments + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_enforce_transitive_visibility` default: "false" +: If true, enable package()s to set the transitive\_visibility attribute to restrict which packages may depend on them. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_check_testonly_for_output_files` default: "false" +: If enabled, check testonly for prerequisite targets that are output files by looking up the testonly of the generating rule. This matches visibility checking. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--target_environment=` multiple uses are accumulated +: Declares this build's target environment. Must be a label reference to an + [`environment` rule](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java). If specified, all top-level targets must be compatible with this + environment. + + See also `--platforms`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_config_setting_private_default_visibility` default: "false" +: If incompatible\_enforce\_config\_setting\_visibility=false, this is a noop. Else, if this flag is false, any config\_setting without an explicit visibility attribute is //visibility:public. If this flag is true, config\_setting follows the same visibility logic as all other rules. See https://github.com/bazelbuild/bazel/issues/12933. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_enforce_config_setting_visibility` default: "true" +: If true, enforce config\_setting visibility restrictions. If false, every config\_setting is visible to every target. See https://github.com/bazelbuild/bazel/issues/12932. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]allow_analysis_failures` default: "false" +: If true, an analysis failure of a rule target results in the target's propagation + of an instance of `AnalysisFailureInfo` containing the error description, instead + of resulting in a build failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--analysis_testing_deps_limit=` default: "2000" +: Sets the maximum number of transitive dependencies through a rule attribute with + a `for_analysis_testing` configuration transition. + Exceeding this limit will result in a rule error. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options relating to query output and semantics: + +`--aspect_deps=` default: "conservative" +: How to resolve aspect dependencies when the output format is one of {xml,proto,record}. 'off' means no aspect dependencies are resolved, 'conservative' (the default) means all declared aspect dependencies are added regardless of whether they are given the rule class of direct dependencies, 'precise' means that only those aspects are added that are possibly active given the rule class of the direct dependencies. Note that precise mode requires loading other packages to evaluate a single target thus making it slower than the other modes. Also note that even precise mode is not completely precise: the decision whether to compute an aspect is decided in the analysis phase, which is not run during 'bazel query'. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]consistent_labels` default: "false" +: If enabled, every query command emits labels as if by the Starlark str function applied to a Label instance. This is useful for tools that need to match the output of different query commands and/or labels emitted by rules. If not enabled, output formatters are free to emit apparent repository names (relative to the main repository) instead to make the output more readable. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_explicit_aspects` default: "false" +: aquery, cquery: whether to include aspect-generated actions in the output. query: no-op (aspects are always followed). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]experimental_graphless_query` default: "auto" +: If true, uses a Query implementation that does not make a copy of the graph. The new implementation only supports --order\_output=no, as well as only a subset of output formatters. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--graph:conditional_edges_limit=` default: "4" +: The maximum number of condition labels to show. -1 means no truncation and 0 means no annotation. This option is only applicable to --output=graph. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]graph:factored` default: "true" +: If true, then the graph will be emitted 'factored', i.e. topologically-equivalent nodes will be merged together and their labels concatenated. This option is only applicable to --output=graph. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--graph:node_limit=` default: "512" +: The maximum length of the label string for a graph node in the output. Longer labels will be truncated; -1 means no truncation. This option is only applicable to --output=graph. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]implicit_deps` default: "true" +: If enabled, implicit dependencies will be included in the dependency graph over which the query operates. An implicit dependency is one that is not explicitly specified in the BUILD file but added by bazel. For cquery, this option controls filtering resolved toolchains. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]include_aspects` default: "true" +: aquery, cquery: whether to include aspect-generated actions in the output. query: no-op (aspects are always followed). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]incompatible_package_group_includes_double_slash` default: "true" +: If enabled, when outputting package\_group's `packages` attribute, the leading `//` will not be omitted. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]infer_universe_scope` default: "false" +: If set and --universe\_scope is unset, then a value of --universe\_scope will be inferred as the list of unique target patterns in the query expression. Note that the --universe\_scope value inferred for a query expression that uses universe-scoped functions (e.g.`allrdeps`) may not be what you want, so you should use this option only if you know what you are doing. See https://bazel.build/reference/query#sky-query for details and examples. If --universe\_scope is set, then this option's value is ignored. Note: this option applies only to `query` (i.e. not `cquery`). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]line_terminator_null` default: "false" +: Whether each format is terminated with \0 instead of newline. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]nodep_deps` default: "true" +: If enabled, deps from "nodep" attributes will be included in the dependency graph over which the query operates. A common example of a "nodep" attribute is "visibility". Run and parse the output of `info build-language` to learn about all the "nodep" attributes in the build language. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--noorder_results` +: Output the results in dependency-ordered (default) or unordered fashion. The unordered output is faster but only supported when --output is not minrank, maxrank, or graph. + + Expands to: + +   `--order_output=no` + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--null` +: Whether each format is terminated with \0 instead of newline. + + Expands to: + +   `--line_terminator_null=true` + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--order_output=` default: "auto" +: Output the results unordered (no), dependency-ordered (deps), or fully ordered (full). The default is 'auto', meaning that results are output either dependency-ordered or fully ordered, depending on the output formatter (dependency-ordered for proto, minrank, maxrank, and graph, fully ordered for all others). When output is fully ordered, nodes are printed in a fully deterministic (total) order. First, all nodes are sorted alphabetically. Then, each node in the list is used as the start of a post-order depth-first search in which outgoing edges to unvisited nodes are traversed in alphabetical order of the successor nodes. Finally, nodes are printed in the reverse of the order in which they were visited. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--order_results` +: Output the results in dependency-ordered (default) or unordered fashion. The unordered output is faster but only supported when --output is not minrank, maxrank, or graph. + + Expands to: + +   `--order_output=auto` + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--output=` default: "label" +: The format in which the query results should be printed. Allowed values for query are: build, graph, streamed\_jsonproto, label, label\_kind, location, maxrank, minrank, package, proto, streamed\_proto, xml. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--output_file=` default: "" +: When specified, query results will be written directly to this file, and nothing will be printed to Bazel's standard output stream (stdout). In benchmarks, this is generally faster than bazel query > file. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:default_values` default: "true" +: If true, attributes whose value is not explicitly specified in the BUILD file are included; otherwise they are omitted. This option is applicable to --output=proto + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:definition_stack` default: "false" +: Populate the definition\_stack proto field, which records for each rule instance the Starlark call stack at the moment the rule's class was defined. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:flatten_selects` default: "true" +: If enabled, configurable attributes created by select() are flattened. For list types the flattened representation is a list containing each value of the select map exactly once. Scalar types are flattened to null. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]proto:include_attribute_source_aspects` default: "false" +: Populate the source\_aspect\_name proto field of each Attribute with the source aspect that the attribute came from (empty string if it did not). + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:include_starlark_rule_env` default: "true" +: Use the starlark environment in the value of the generated $internal\_attr\_hash attribute. This ensures that the starlark rule definition (and its transitive imports) are part of this identifier. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:include_synthetic_attribute_hash` default: "false" +: Whether or not to calculate and populate the $internal\_attr\_hash attribute. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:instantiation_stack` default: "false" +: Populate the instantiation call stack of each rule. Note that this requires the stack to be present + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:locations` default: "true" +: Whether to output location information in proto output at all. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--proto:output_rule_attrs=` default: "all" +: Comma separated list of attributes to include in output. Defaults to all attributes. Set to empty string to not output any attribute. This option is applicable to --output=proto. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:rule_classes` default: "false" +: Populate the rule\_class\_key field of each rule; and for the first rule with a given rule\_class\_key, also populate its rule\_class\_info proto field. The rule\_class\_key field uniquely identifies a rule class, and the rule\_class\_info field is a Stardoc-format rule class API definition. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]proto:rule_inputs_and_outputs` default: "true" +: Whether or not to populate the rule\_input and rule\_output fields. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--query_file=` default: "" +: If set, query will read the query from the file named here, rather than on the command line. It is an error to specify a file here as well as a command-line query. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]relative_locations` default: "false" +: If true, the location of BUILD files in xml and proto outputs will be relative. By default, the location output is an absolute path and will not be consistent across machines. You can set this option to true to have a consistent result across machines. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]strict_test_suite` default: "false" +: If true, the tests() expression gives an error if it encounters a test\_suite containing non-test targets. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]tool_deps` default: "true" +: Query: If disabled, dependencies on 'exec configuration' will not be included in the dependency graph over which the query operates. An 'exec configuration' dependency edge, such as the one from any 'proto\_library' rule to the Protocol Compiler, usually points to a tool executed during the build rather than a part of the same 'target' program. + Cquery: If disabled, filters out all configured targets which cross an execution transition from the top-level target that discovered this configured target. That means if the top-level target is in the target configuration, only configured targets also in the target configuration will be returned. If the top-level target is in the exec configuration, only exec configured targets will be returned. This option will NOT exclude resolved toolchains. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--universe_scope=` default: "" +: A comma-separated set of target patterns (additive and subtractive). The query may be performed in the universe defined by the transitive closure of the specified targets. This option is used for the query and cquery commands. + For cquery, the input to this option is the targets all answers are built under and so this option may affect configurations and transitions. If this option is not specified, the top-level targets are assumed to be the targets parsed from the query expression. Note: For cquery, not specifying this option may cause the build to break if targets parsed from the query expression are not buildable with top-level options. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]xml:default_values` default: "false" +: If true, rule attributes whose value is not explicitly specified in the BUILD file are printed; otherwise they are omitted. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]xml:line_numbers` default: "true" +: If true, XML output contains line numbers. Disabling this option may make diffs easier to read. This option is only applicable to --output=xml. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +Options that affect the verbosity, format or location of logging: + +`--[no]verbose_visibility_errors` default: "false" +: If enabled, visibility errors include additional diagnostic information. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--flag_alias=` multiple uses are accumulated +: Sets a shorthand name for a Starlark flag. It takes a single key-value pair in the form + `{key}={value}` as an argument. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Miscellaneous options, not otherwise categorized.: + +`--deleted_packages=` multiple uses are accumulated +: A comma-separated list of names of packages which the build system will consider non-existent, even if they are visible somewhere on the package path. + Use this option when deleting a subpackage 'x/y' of an existing package 'x'. For example, after deleting x/y/BUILD in your client, the build system may complain if it encounters a label '//x:y/z' if that is still provided by another package\_path entry. Specifying --deleted\_packages x/y avoids this problem. + +`--[no]fetch` default: "true" +: Allows the command to fetch external dependencies. If set to false, the command will utilize any cached version of the dependency, and if none exists, the command will result in failure. + +`--package_path=` default: "%workspace%" +: A colon-separated list of where to look for packages. Elements beginning with '%workspace%' are relative to the enclosing workspace. If omitted or empty, the default is the output of 'bazel info default-package-path'. + +`--[no]show_loading_progress` default: "true" +: If enabled, causes Bazel to print "Loading package:" messages. + +## Run Options + +Inherits all options from [build](#build). + +Options that appear before the command and are parsed by the client: + +`--[no]portable_paths` default: "false" +: If true, includes paths to replace in ExecRequest to make the resulting paths portable. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]run` default: "true" +: If false, skip running the command line constructed for the built target. Note that this flag is ignored for all --script\_path builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--run_env=` multiple uses are accumulated +: Specifies the set of environment variables available to the target to run. Variables can be either specified by name, in which case the value will be taken from the invocation environment, by the name=value pair which sets the value independent of the invocation environment, or by =name, which unsets the variable of that name. This option can be used multiple times; for options given for the same variable, the latest wins, options for different variables accumulate. Note that the executed target will generally see the full environment of the host except for those variables that have been explicitly unset. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]run_in_cwd` default: "false" +: If true, runs the target in the current working directory instead of the runfile tree. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--script_path=` default: see description +: If set, write a shell script to the given file which invokes the target. If this option is set, the target is not run from bazel. Use 'bazel run --script\_path=foo //foo && ./foo' to invoke target '//foo' This differs from 'bazel run //foo' in that the bazel lock is released and the executable is connected to the terminal's stdin. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +Options that affect the verbosity, format or location of logging: + +`--[no]omit_run_args` default: "true" +: Specifies whether the arguments passed to the runnable target will be omitted from the output for privacy reasons. If set to true, the output will not contain the arguments passed to the target. If set to false, the output will contain the arguments passed to the target. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +## Shutdown Options + +Options that control the output of the command: + +`--iff_heap_size_greater_than=` default: "0" +: Iff non-zero, then shutdown will only shut down the server if the total memory (in MB) consumed by the JVM exceeds this value. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +## Test Options + +Inherits all options from [build](#build). + +Options that affect the verbosity, format or location of logging: + +`--[no]print_relative_test_log_paths` default: "false" +: If true, when printing the path to a test log, use relative path that makes use of the 'testlogs' convenience symlink. N.B. - A subsequent 'build'/'test'/etc invocation with a different configuration can cause the target of this symlink to change, making the path printed previously no longer useful. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]test_verbose_timeout_warnings` default: "false" +: If true, print additional warnings when the actual test execution time does not match the timeout defined by the test (whether implied or explicit). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]verbose_test_summary` default: "true" +: If true, print additional information (timing, number of failed runs, etc) in the test summary. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +## Vendor Options + +Inherits all options from [test](#test). + +Options that control build execution: + +`--[no]keep_going` [`-k`] default: "false" +: Continue as much as possible after an error. While the target that failed and those that depend on it cannot be analyzed, other prerequisites of these targets can be. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--loading_phase_threads=) eg. "auto", "HOST_CPUS*.5">` default: "auto" +: Number of parallel threads to use for the loading/analysis phase.Takes an integer, or a keyword ("auto", "HOST\_CPUS", "HOST\_RAM"), optionally followed by an operation ([-|*]) eg. "auto", "HOST\_CPUS*.5". "auto" sets a reasonable default based on host resources. Must be at least 1. + + Tags: + [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_config_setting_private_default_visibility` default: "false" +: If incompatible\_enforce\_config\_setting\_visibility=false, this is a noop. Else, if this flag is false, any config\_setting without an explicit visibility attribute is //visibility:public. If this flag is true, config\_setting follows the same visibility logic as all other rules. See https://github.com/bazelbuild/bazel/issues/12933. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_enforce_config_setting_visibility` default: "true" +: If true, enforce config\_setting visibility restrictions. If false, every config\_setting is visible to every target. See https://github.com/bazelbuild/bazel/issues/12932. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options relating to Bzlmod output and semantics: + +`--repo=` multiple uses are accumulated +: Only vendors the specified repository, which can be either `@apparent_repo_name` or + `@@canonical_repo_name`. This option can be set multiple times. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Miscellaneous options, not otherwise categorized.: + +`--deleted_packages=` multiple uses are accumulated +: A comma-separated list of names of packages which the build system will consider non-existent, even if they are visible somewhere on the package path. + Use this option when deleting a subpackage 'x/y' of an existing package 'x'. For example, after deleting x/y/BUILD in your client, the build system may complain if it encounters a label '//x:y/z' if that is still provided by another package\_path entry. Specifying --deleted\_packages x/y avoids this problem. + +`--[no]fetch` default: "true" +: Allows the command to fetch external dependencies. If set to false, the command will utilize any cached version of the dependency, and if none exists, the command will result in failure. + +`--package_path=` default: "%workspace%" +: A colon-separated list of where to look for packages. Elements beginning with '%workspace%' are relative to the enclosing workspace. If omitted or empty, the default is the output of 'bazel info default-package-path'. + +`--[no]show_loading_progress` default: "true" +: If enabled, causes Bazel to print "Loading package:" messages. + +Options that control build execution: + +`--[no]experimental_persistent_aar_extractor` default: "false" +: Enable persistent aar extractor by using workers. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_remotable_source_manifests` default: "false" +: Whether to make source manifest actions remotable + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_split_coverage_postprocessing` default: "false" +: If true, then Bazel will run coverage postprocessing for test in a new spawn. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incompatible_modify_execution_info_additive` default: "true" +: When enabled, passing multiple `--modify_execution_info` flags is additive. + When disabled, only the last flag is taken into account. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--modify_execution_info=` multiple uses are accumulated +: Add or remove keys from an action's execution info based on action mnemonic. + Applies only to actions which support execution info. Many common actions + support execution info, e.g. Genrule, CppCompile, Javac, StarlarkAction, + TestRunner. When specifying multiple values, order matters because + many regexes may apply to the same mnemonic. + + Syntax: `regex=[+-]key,regex=[+-]key,...`. + + Examples: + + * `.*=+x,.*=-y,.*=+z` adds `x` and `z` to, and removes `y` from, the execution info for all actions. + * `Genrule=+requires-x` adds `requires-x` to the execution info for all Genrule actions. + * `(?!Genrule).*=-requires-x` removes `requires-x` from the execution info for all non-Genrule actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--persistent_android_dex_desugar` +: Enable persistent Android dex and desugar actions by using workers. + + Expands to: + +   `--internal_persistent_android_dex_desugar` + +   `--strategy=Desugar=worker` + +   `--strategy=DexBuilder=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_android_resource_processor` +: Enable persistent Android resource processor by using workers. + + Expands to: + +   `--internal_persistent_busybox_tools` + +   `--strategy=AaptPackage=worker` + +   `--strategy=AndroidResourceParser=worker` + +   `--strategy=AndroidResourceValidator=worker` + +   `--strategy=AndroidResourceCompiler=worker` + +   `--strategy=RClassGenerator=worker` + +   `--strategy=AndroidResourceLink=worker` + +   `--strategy=AndroidAapt2=worker` + +   `--strategy=AndroidAssetMerger=worker` + +   `--strategy=AndroidResourceMerger=worker` + +   `--strategy=AndroidCompiledResourceMerger=worker` + +   `--strategy=ManifestMerger=worker` + +   `--strategy=AndroidManifestMerger=worker` + +   `--strategy=Aapt2Optimize=worker` + +   `--strategy=AARGenerator=worker` + +   `--strategy=ProcessDatabinding=worker` + +   `--strategy=GenerateDataBindingBaseClasses=worker` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_dex_desugar` +: Enable persistent multiplexed Android dex and desugar actions by using workers. + + Expands to: + +   `--persistent_android_dex_desugar` + +   `--internal_persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_resource_processor` +: Enable persistent multiplexed Android resource processor by using workers. + + Expands to: + +   `--persistent_android_resource_processor` + +   `--modify_execution_info=AaptPackage=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceParser=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceValidator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceCompiler=+supports-multiplex-workers` + +   `--modify_execution_info=RClassGenerator=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceLink=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAapt2=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidAssetMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidCompiledResourceMerger=+supports-multiplex-workers` + +   `--modify_execution_info=ManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=AndroidManifestMerger=+supports-multiplex-workers` + +   `--modify_execution_info=Aapt2Optimize=+supports-multiplex-workers` + +   `--modify_execution_info=AARGenerator=+supports-multiplex-workers` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--persistent_multiplex_android_tools` +: Enable persistent and multiplexed Android tools (dexing, desugaring, resource processing). + + Expands to: + +   `--internal_persistent_multiplex_busybox_tools` + +   `--persistent_multiplex_android_resource_processor` + +   `--persistent_multiplex_android_dex_desugar` + + Tags: + [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`execution`](#effect_tag_EXECUTION) + +`--[no]use_target_platform_for_tests` default: "false" +: If true, use the target platform for running tests rather than the test exec group. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +Options that configure the toolchain used for action execution: + +`--android_compiler=` default: see description +: The Android target compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_manifest_merger=` default: "android" +: Selects the manifest merger to use for android\_binary rules. Flag to help the transition to the Android manifest merger from the legacy merger. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--android_platforms=` default: "" +: Sets the platforms that android\_binary targets use. If multiple platforms are specified, then the binary is a fat APKs, which contains native binaries for each specified target platform. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--cc_output_directory_tag=` default: "" +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compiler=` default: see description +: The C++ compiler to use for compiling the target. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--coverage_output_generator=` default: "@bazel\_tools//tools/test:lcov\_merger" +: Location of the binary that is used to postprocess raw coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:lcov_merger`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_report_generator=` default: "@bazel\_tools//tools/test:coverage\_report\_generator" +: Location of the binary that is used to generate coverage reports. This must + be a binary target. Defaults to `@bazel_tools//tools/test:coverage_report_generator`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--coverage_support=` default: "@bazel\_tools//tools/test:coverage\_support" +: Location of support files that are required on the inputs of every test action + that collects code coverage. Defaults to `//tools/test:coverage_support`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--custom_malloc=` default: see description +: Specifies a custom malloc implementation. This setting overrides malloc attributes in build rules. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]experimental_include_xcode_execution_requirements` default: "false" +: If set, add a "requires-xcode:{version}" execution requirement to every Xcode action. If the Xcode version has a hyphenated label, also add a "requires-xcode-label:{version\_label}" execution requirement. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_prefer_mutual_xcode` default: "true" +: If true, use the most recent Xcode that is available both locally and remotely. If false, or if there are no mutual available versions, use the local Xcode version selected via xcode-select. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--extra_execution_platforms=` default: "" +: The platforms that are available as execution platforms to run actions. + Platforms can be specified by exact target, or as a target pattern. + These platforms will be considered before those declared in the `WORKSPACE` file by + `register_execution_platforms()`. This option may only be set once; later + instances will override earlier flag settings. + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--extra_toolchains=` multiple uses are accumulated +: The toolchain rules to be considered during toolchain resolution. + Toolchains can be specified by exact target, or as a target pattern. + These toolchains will be considered before those declared in the `WORKSPACE` file + by `register_toolchains()`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--grte_top=` default: see description +: A label to a checked-in libc library. The default value is selected by the crosstool toolchain, and you almost never need to override it. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_compiler=` default: see description +: No-op flag. Will be removed in a future release. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION) + +`--host_grte_top=` default: see description +: If specified, this setting overrides the libc top-level directory (--grte\_top) for the exec configuration. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_platform=` default: "@bazel\_tools//tools:host\_platform" +: The label of a platform rule that describes the host system. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]incompatible_bazel_test_exec_run_under` default: "true" +: If enabled, `bazel test --run_under=//:runner` builds `//:runner` in the exec + configuration. If disabled, it builds `//:runner` in the target configuration. + Bazel executes tests on exec machines, so the former is more correct. This + doesn't affect `bazel run`, which always builds `--run_under=//foo` in the + target configuration. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_builtin_objc_strip_action` default: "true" +: Whether to emit a strip action as part of objc linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_dont_enable_host_nonhost_crosstool_features` default: "true" +: If true, Bazel will not enable 'host' and 'nonhost' features in the c++ toolchain (see https://github.com/bazelbuild/bazel/issues/7407 for more information). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_remove_legacy_whole_archive` default: "true" +: If true, Bazel will not link library dependencies as whole archive by default (see https://github.com/bazelbuild/bazel/issues/7362 for migration instructions). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strip_executable_safely` default: "false" +: If true, strip action for executables will use flag -x, which does not break dynamic symbol resolution. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]interface_shared_objects` default: "true" +: Use interface shared objects if supported by the toolchain. All ELF toolchains currently support this setting. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_sdk_version=` default: see description +: Specifies the version of the iOS SDK to use to build iOS applications. If unspecified, uses the default iOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--macos_sdk_version=` default: see description +: Specifies the version of the macOS SDK to use to build macOS applications. If unspecified, uses the default macOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--minimum_os_version=` default: see description +: The minimum OS version which your compilation targets. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_mappings=` default: "" +: The location of a mapping file that describes which platform to use if none is set or + which flags to set when a platform already exists. Must be relative to the main + workspace root. Defaults to `platform_mappings` (a file directly under the + workspace root). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--platforms=` default: "" +: The labels of the platform rules describing the target platforms for the current command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_sdk_version=` default: see description +: Specifies the version of the tvOS SDK to use to build tvOS applications. If unspecified, uses the default tvOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]use_platforms_in_apple_crosstool_transition` default: "false" +: Makes apple\_crosstool\_transition fall back to using the value of `--platforms` flag instead of legacy `--cpu` when needed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_sdk_version=` default: see description +: Specifies the version of the watchOS SDK to use to build watchOS applications. If unspecified, uses the default watchOS SDK version from 'xcode\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version=` default: see description +: If specified, uses Xcode of the given version for relevant build actions. If unspecified, uses the executor default version of Xcode. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xcode_version_config=` default: "@bazel\_tools//tools/cpp:host\_xcodes" +: The label of the xcode\_config rule to be used for selecting the Xcode version in the build configuration. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +Options that control the output of the command: + +`--[no]apple_generate_dsym` default: "false" +: Whether to generate debug symbol(.dSYM) file(s). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]build_runfile_links` default: "true" +: If true, build runfiles symlink forests for all targets. If false, write them only when required by a local action, test or run command. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_runfile_manifests` default: "true" +: If true, write runfiles manifests for all targets. If false, omit them. Local tests will fail to run when false. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]build_test_dwp` default: "false" +: If enabled, when building C++ tests statically and with fission the .dwp file for the test binary will be automatically built as well. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cc_proto_library_header_suffixes=` default: ".pb.h" +: Sets the suffixes of header files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--cc_proto_library_source_suffixes=` default: ".pb.cc" +: Sets the suffixes of source files that a cc\_proto\_library creates. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]experimental_proto_descriptor_sets_include_source_info` default: "false" +: Run extra actions for alternative Java api versions in a proto\_library. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_save_feature_state` default: "false" +: Save the state of enabled and requested feautres as an output of compilation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fission=` default: "no" +: Specifies which compilation modes use fission for C++ compilations and links. May be any combination of {'fastbuild', 'dbg', 'opt'} or the special values 'yes' to enable all modes and 'no' to disable all modes. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_always_include_files_in_data` default: "true" +: If true, native rules add `DefaultInfo.files` of data dependencies to their runfiles, + which matches the recommended behavior for Starlark rules ([runfiles features to avoid](https://bazel.build/extending/rules#runfiles_features_to_avoid)). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_compact_repo_mapping_manifest` default: "true" +: If enabled, the `{binary}.repo_mapping` file emits a module extension's repo mapping + only once instead of once for each repo generated by the extension that + contributes runfiles. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--incompatible_disable_select_on=` default: "" +: List of flags for which the use in `select()` is disabled. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]incompatible_filegroup_runfiles_for_data` default: "true" +: If true, runfiles of targets listed in the srcs attribute are available to targets that consume the filegroup as a data dependency. + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]objc_generate_linkmap` default: "false" +: Specifies whether to generate a linkmap file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]save_temps` default: "false" +: If set, temporary outputs from gcc will be saved. These include .s files (assembler code), .i files (preprocessed C) and .ii files (preprocessed C++). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with target + configuration. Variables can be either specified by `name`, in which case + the value will be taken from the invocation environment, by the `name=value` + pair which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can be used + multiple times; for options given for the same variable, the latest wins, + options for different variables accumulate. + + Note that unless `--incompatible_repo_env_ignores_action_env` is true, all `name=value` + pairs will be available to repository rules. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--allowed_cpu_values=` default: "" +: Allowed values for the `--cpu` flag. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]android_databinding_use_androidx` default: "true" +: Generate AndroidX-compatible data-binding files. This is only used with databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]android_databinding_use_v3_4_args` default: "true" +: Use android databinding v2 with 3.4.0 argument. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--android_dynamic_mode=` default: "off" +: Determines whether C++ deps of Android rules will be linked dynamically when a cc\_binary does not explicitly create a shared library. 'default' means bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--android_manifest_merger_order=` default: "alphabetical" +: Sets the order of manifests passed to the manifest merger for Android binaries. ALPHABETICAL means manifests are sorted by path relative to the execroot. ALPHABETICAL\_BY\_CONFIGURATION means manifests are sorted by paths relative to the configuration directory within the output directory. DEPENDENCY means manifests are ordered with each library's manifest coming before the manifests of its dependencies. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`execution`](#effect_tag_EXECUTION) + +`--[no]android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]collect_code_coverage` default: "false" +: If specified, Bazel will instrument code (using offline instrumentation where + possible) and will collect coverage information during tests. Only targets that + match `--instrumentation_filter` will be affected. Usually this option should + not be specified directly - `bazel coverage` command should be used instead. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--compilation_mode=` [`-c`] default: "fastbuild" +: Specify the mode the binary will be built in. Values: `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--conlyopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--copt=` multiple uses are accumulated +: Additional options to pass to gcc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cpu=` default: "" +: Deprecated: this flag is not used internally by Blaze although there are legacy platform + mappings to allow for backwards compatibility. Do not use this flag, instead use + `--platforms` with an appropriate platform definition. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_absolute_path=` default: see description +: Use CSFDO profile information to optimize compilation. Specify the absolute path name of the zip file containing the profile file, a raw or an indexed LLVM profile file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_instrument=` default: see description +: Generate binaries with context sensitive FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cs_fdo_profile=` default: see description +: The cs\_fdo\_profile representing the context sensitive profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--cxxopt=` multiple uses are accumulated +: Additional option to pass to gcc when compiling C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--define=` multiple uses are accumulated +: Each `--define` option specifies an assignment for a build variable. + In case of multiple values for a variable, the last one wins. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--dynamic_mode=` default: "default" +: Determines whether C++ binaries will be linked dynamically. 'default' means Bazel will choose whether to link dynamically. 'fully' means all libraries will be linked dynamically. 'off' means that all libraries will be linked in mostly static mode. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_propeller_optimize_absolute_paths` default: "true" +: If set, any use of absolute paths for propeller optimize will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_remaining_fdo_absolute_paths` default: "true" +: If set, any use of absolute paths for FDO will raise an error. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]enable_runfiles` default: "auto" +: Enable runfiles symlink tree; By default, it's off on Windows, on on other platforms. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--exec_aspects=` multiple uses are accumulated +: Comma-separated list of aspects to be applied to exec-configured targets, regardless of whether or not they are top-level targets. This is an experimental feature and is subject to change. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_action_listener=` multiple uses are accumulated +: Deprecated in favor of aspects. Use `action_listener` to attach an `extra_action` to + existing build actions. + + Tags: + [`execution`](#effect_tag_EXECUTION), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_compress_java_resources` default: "false" +: Compress Java resources in APKs + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_databinding_v2` default: "true" +: Use android databinding v2. This flag is a no-op. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_resource_shrinking` default: "false" +: Enables resource shrinking for android\_binary APKs that use ProGuard. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_android_rewrite_dexes_with_rex` default: "false" +: use rex tool to rewrite dex files + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_collect_code_coverage_for_generated_files` default: "false" +: If specified, Bazel will also generate collect coverage information for generated files. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_omitfp` default: "false" +: If true, use libunwind for stack unwinding, and compile with -fomit-frame-pointer and -fasynchronous-unwind-tables. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_output_paths=` default: "off" +: Which model to use for where in the output tree rules write their outputs, particularly + for multi-platform / multi-configuration builds. This is highly experimental. See + [GH-6526](https://github.com/bazelbuild/bazel/issues/6526) for details. Starlark actions can opt into path mapping by adding the key + `supports-path-mapping` to the `execution_requirements` dict. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`bazel_internal_configuration`](#effect_tag_BAZEL_INTERNAL_CONFIGURATION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +`--experimental_override_platform_cpu_name=` multiple uses are accumulated +: Each entry should be of the form `label=value` where label refers to a platform and values + is the desired shortname to override the platform's CPU name in `$(TARGET_CPU)` + make variable and output path. Only used when + `--experimental_platform_in_output_dir`, `--incompatible_target_cpu_from_platform` or + `--incompatible_bep_cpu_from_platform` is true. Has highest naming priority. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_platform_in_output_dir` default: "Auto" +: If true, a shortname for the target platform is used in the output directory name + instead of the CPU. The exact scheme is experimental and subject to change: + + 1. First, in the rare case the `--platforms` option does not have exactly one value, a + hash of the platforms option is used. + 2. Next, if any shortname for the current platform was registered by + `--experimental_override_name_platform_in_output_dir`, then that shortname is used. + 3. Then, if `--experimental_use_platforms_in_output_dir_legacy_heuristic` is set, use a + shortname based off the current platform Label. + 4. Finally, a hash of the platform option is used as a last resort. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_llvm_covmap` default: "false" +: If specified, Bazel will generate llvm-cov coverage map information rather than gcov when collect\_code\_coverage is enabled. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_use_platforms_in_output_dir_legacy_heuristic` default: "true" +: Please only use this flag as part of a suggested migration or testing strategy. Note + that the heuristic has known deficiencies and it is suggested to migrate to + relying on just `--experimental_override_name_platform_in_output_dir`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--fdo_instrument=` default: see description +: Generate binaries with FDO instrumentation. With Clang/LLVM compiler, it also accepts the directory name under which the raw profile file(s) will be dumped at runtime. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_optimize=` default: see description +: Use FDO profile information to optimize compilation. Specify the name of a zip file containing a .gcda file tree, an afdo file containing an auto profile, or an LLVM profile file. This flag also accepts files specified as labels (e.g. `//foo/bar:file.afdo` - you may need to add an `exports_files` directive to the corresponding package) and labels pointing to `fdo_profile` targets. This flag will be superseded by the `fdo_profile` rule. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_prefetch_hints=` default: see description +: Use cache prefetch hints. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--fdo_profile=` default: see description +: The fdo\_profile representing the profile to be used for optimization. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the target configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + See also `--host_features`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]force_pic` default: "false" +: If enabled, all C++ compilations produce position-independent code ("-fPIC"), links prefer PIC pre-built libraries over non-PIC libraries, and links produce position-independent executables ("-pie"). + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_action_env=` multiple uses are accumulated +: Specifies the set of environment variables available to actions with execution + configurations. Variables can be either specified by `name`, in which case the + value will be taken from the invocation environment, by the `name=value` pair + which sets the value independent of the invocation environment, or by + `=name`, which unsets the variable of that name. This option can + be used multiple times; for options given for the same variable, the latest + wins, options for different variables accumulate. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_compilation_mode=` default: "opt" +: Specify the mode the tools used during the build will be built in. Values: + `fastbuild`, `dbg`, `opt`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--host_conlyopt=` multiple uses are accumulated +: Additional option to pass to the C compiler when compiling C (but not C++) source files in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_copt=` multiple uses are accumulated +: Additional options to pass to the C compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cpu=` default: "" +: The host CPU. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_cxxopt=` multiple uses are accumulated +: Additional options to pass to C++ compiler for tools built in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_features=` multiple uses are accumulated +: The given features will be enabled or disabled by default for targets built in the exec configuration. + Specifying `-{feature}` will disable the feature. Negative features always override positive ones. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_linkopt=` multiple uses are accumulated +: Additional option to pass to linker when linking tools in the exec configurations. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--host_macos_minimum_os=` default: see description +: Minimum compatible macOS version for host targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--host_per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to the C/C++ compiler when compiling certain files in the exec configurations. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --host\_per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]incompatible_auto_exec_groups` default: "false" +: When enabled, an exec groups is automatically created for each toolchain used by a rule. + For this to work rule needs to specify `toolchain` parameter on its actions. For + more information, see [GH-17134](https://github.com/bazelbuild/bazel/issues/17134). + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_merge_genfiles_directory` default: "true" +: If true, the genfiles directory is folded into the bin directory. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_target_cpu_from_platform` default: "true" +: If specified, the value of the cpu constraint (`@platforms//cpu:cpu`) of + the target platform is used to set the `$(TARGET_CPU)` make variable. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]instrument_test_targets` default: "false" +: When coverage is enabled, specifies whether to consider instrumenting test rules. + When set, test rules included by `--instrumentation_filter` are instrumented. + Otherwise, test rules are always excluded from coverage instrumentation. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--instrumentation_filter=` default: "-/javatests[/:],-/test/java[/:]" +: When coverage is enabled, only rules with names included by the + specified regex-based filter will be instrumented. Rules prefixed + with '-' are excluded instead. Note that only non-test rules are + instrumented unless `--instrument_test_targets` is enabled. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ios_minimum_os=` default: see description +: Minimum compatible iOS version for target simulators and devices. If unspecified, uses 'ios\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--ios_multi_cpus=` multiple uses are accumulated +: Comma-separated list of architectures to build an ios\_application with. The result is a universal binary containing all specified architectures. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]legacy_whole_archive` default: "true" +: Deprecated, superseded by --incompatible\_remove\_legacy\_whole\_archive (see https://github.com/bazelbuild/bazel/issues/7362 for details). When on, use --whole-archive for cc\_binary rules that have linkshared=True and either linkstatic=True or '-static' in linkopts. This is for backwards compatibility only. A better alternative is to use alwayslink=1 where required. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`deprecated`](#metadata_tag_DEPRECATED) + +`--linkopt=` multiple uses are accumulated +: Additional option to pass to gcc when linking. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltobackendopt=` multiple uses are accumulated +: Additional option to pass to the LTO backend step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--ltoindexopt=` multiple uses are accumulated +: Additional option to pass to the LTO indexing step (under --features=thin\_lto). + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--macos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple macOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--macos_minimum_os=` default: see description +: Minimum compatible macOS version for targets. If unspecified, uses 'macos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--memprof_profile=` default: see description +: Use memprof profile. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]objc_enable_binary_stripping` default: "false" +: Whether to perform symbol and dead-code strippings on linked binaries. Binary strippings will be performed if both this flag and --compilation\_mode=opt are specified. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--objccopt=` multiple uses are accumulated +: Additional options to pass to gcc when compiling Objective-C/C++ source files. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--per_file_copt=` multiple uses are accumulated +: Additional options to selectively pass to gcc when compiling certain files. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns (Also see --instrumentation\_filter). option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_copt=//foo/.\*.cc,-//foo/bar.cc@-O0 adds the -O0 command line option to the gcc command line of all cc files in //foo/ except bar.cc. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--per_file_ltobackendopt=` multiple uses are accumulated +: Additional options to selectively pass to LTO backend (under --features=thin\_lto) when compiling certain backend objects. This option can be passed multiple times. Syntax: regex\_filter@option\_1,option\_2,...,option\_n. Where regex\_filter stands for a list of include and exclude regular expression patterns. option\_1 to option\_n stand for arbitrary command line options. If an option contains a comma it has to be quoted with a backslash. Options can contain @. Only the first @ is used to split the string. Example: --per\_file\_ltobackendopt=//foo/.\*.o,-//foo/bar.o@-O0 adds the -O0 command line option to the LTO backend command line of all o files in //foo/ except bar.o. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--platform_suffix=` default: see description +: Specifies a suffix to be added to the configuration directory. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--propeller_optimize=` default: see description +: Use Propeller profile information to optimize the build target.A propeller profile must consist of at least one of two files, a cc profile and a ld profile. This flag accepts a build label which must refer to the propeller profile input files. For example, the BUILD file that defines the label, in a/b/BUILD:propeller\_optimize( name = "propeller\_profile", cc\_profile = "propeller\_cc\_profile.txt", ld\_profile = "propeller\_ld\_profile.txt",)An exports\_files directive may have to be added to the corresponding package to make these files visible to Bazel. The option must be used as: --propeller\_optimize=//a/b:propeller\_profile + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_cc_profile=` default: see description +: Absolute path name of cc\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--propeller_optimize_absolute_ld_profile=` default: see description +: Absolute path name of ld\_profile file for Propeller Optimized builds. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--run_under=` default: see description +: Prefix to insert before the executables for the `test` and `run` commands. + If the value is `foo -bar`, and the execution command line is `test_binary -baz`, + then the final command line is `foo -bar test_binary -baz`. + This can also be a label to an executable target. Some examples are: + + * `valgrind` + * `strace` + * `strace -c` + * `valgrind --quiet --num-callers=20` + * `//package:target` + * `//package:target --options` + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES) + +`--[no]share_native_deps` default: "true" +: If true, native libraries that contain identical functionality will be shared among different targets + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]stamp` default: "false" +: Stamp binaries with the date, username, hostname, workspace information, etc. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--strip=` default: "sometimes" +: Specifies whether to strip binaries and shared libraries (using "-Wl,--strip-debug"). The default value of 'sometimes' means strip iff --compilation\_mode=fastbuild. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--stripopt=` multiple uses are accumulated +: Additional options to pass to strip when generating a '.stripped' binary. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--tvos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple tvOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--tvos_minimum_os=` default: see description +: Minimum compatible tvOS version for target simulators and devices. If unspecified, uses 'tvos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--visionos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple visionOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_cpus=` multiple uses are accumulated +: Comma-separated list of architectures for which to build Apple watchOS binaries. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--watchos_minimum_os=` default: see description +: Minimum compatible watchOS version for target simulators and devices. If unspecified, uses 'watchos\_sdk\_version'. + + Tags: + [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--xbinary_fdo=` default: see description +: Use XbinaryFDO profile information to optimize compilation. Specify the name of default cross binary profile. When the option is used together with --fdo\_instrument/--fdo\_optimize/--fdo\_profile, those options will always prevail as if xbinary\_fdo is never specified. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +Options that affect how strictly Bazel enforces valid build inputs (rule definitions, flag combinations, etc.): + +`--[no]check_visibility` default: "true" +: If disabled, visibility errors in target dependencies are demoted to warnings. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +`--[no]desugar_for_android` default: "true" +: Whether to desugar Java 8 bytecode before dexing. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]desugar_java8_libs` default: "false" +: Whether to include supported Java 8 libraries in apps for legacy devices. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]enforce_constraints` default: "true" +: Checks the environments each target is compatible with and reports errors if any target has dependencies that don't support the same environments + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS) + +`--[no]experimental_check_desugar_deps` default: "true" +: Whether to double-check correct desugaring at Android binary level. + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_enforce_transitive_visibility` default: "false" +: If true, enable package()s to set the transitive\_visibility attribute to restrict which packages may depend on them. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_one_version_enforcement=` default: "OFF" +: When enabled, enforce that a java\_binary rule can't contain more than one version of the same class file on the classpath. This enforcement can break the build, or can just result in warnings. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--experimental_strict_java_deps=` default: "default" +: If true, checks that a Java target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--[no]incompatible_check_testonly_for_output_files` default: "false" +: If enabled, check testonly for prerequisite targets that are output files by looking up the testonly of the generating rule. This matches visibility checking. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_disable_native_android_rules` default: "false" +: If enabled, direct usage of the native Android rules is disabled. Please use the Starlark Android rules from https://github.com/bazelbuild/rules\_android + + Tags: + [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]one_version_enforcement_on_java_tests` default: "true" +: When enabled, and with experimental\_one\_version\_enforcement set to a non-NONE value, enforce one version on java\_test targets. This flag can be disabled to improve incremental test performance at the expense of missing potential one version violations. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--strict_proto_deps=` default: "error" +: Unless OFF, checks that a proto\_library target explicitly declares all directly used targets as dependencies. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--strict_public_imports=` default: "off" +: Unless OFF, checks that a proto\_library target explicitly declares all targets used in 'import public' as exported. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]strict_system_includes` default: "false" +: If true, headers found through system include paths (-isystem) are also required to be declared. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`eagerness_to_exit`](#effect_tag_EAGERNESS_TO_EXIT) + +`--target_environment=` multiple uses are accumulated +: Declares this build's target environment. Must be a label reference to an + [`environment` rule](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java). If specified, all top-level targets must be compatible with this + environment. + + See also `--platforms`. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +Options that affect the signing outputs of a build: + +`--apk_signing_method=` default: "v1\_v2" +: Implementation to use to sign APKs + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]device_debug_entitlements` default: "true" +: If set, and compilation mode is not 'opt', objc apps will include debug entitlements when signing. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +This option affects semantics of the Starlark language or the build API accessible to BUILD files, .bzl files, or WORKSPACE files.: + +`--[no]incompatible_disallow_sdk_frameworks_attributes` default: "false" +: If true, disallow sdk\_frameworks and weak\_sdk\_frameworks attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_objc_alwayslink_by_default` default: "false" +: If true, make the default value true for alwayslink attributes in objc\_library and objc\_import. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +Options that govern the behavior of the test environment or test runner: + +`--[no]allow_analysis_failures` default: "false" +: If true, an analysis failure of a rule target results in the target's propagation + of an instance of `AnalysisFailureInfo` containing the error description, instead + of resulting in a build failure. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--analysis_testing_deps_limit=` default: "2000" +: Sets the maximum number of transitive dependencies through a rule attribute with + a `for_analysis_testing` configuration transition. + Exceeding this limit will result in a rule error. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]break_build_on_parallel_dex2oat_failure` default: "false" +: If true dex2oat action failures will cause the build to break instead of executing dex2oat during test runtime. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--default_test_resources=` multiple uses are accumulated +: Override the default resources amount for tests. The expected format is + `{resource}={value}`. If a single positive number is specified as `{value}` + it will override the default resources for all test sizes. If 4 + comma-separated numbers are specified, they will override the resource + amount for respectively the `small`, `medium`, `large`, `enormous` test sizes. + Values can also be `HOST_RAM`/`HOST_CPU`, optionally followed + by `[-|*]{float}` (eg. `memory=HOST_RAM*.1,HOST_RAM*.2,HOST_RAM*.3,HOST_RAM*.4`). + The default test resources specified by this flag are overridden by explicit + resources specified in tags. + +`--[no]experimental_android_use_parallel_dex2oat` default: "false" +: Use dex2oat in parallel to possibly speed up android\_test. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`host_machine_resource_optimizations`](#effect_tag_HOST_MACHINE_RESOURCE_OPTIMIZATIONS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--ios_simulator_device=` default: see description +: The device to simulate when running an iOS application in the simulator, e.g. 'iPhone 6'. You can get a list of devices by running 'xcrun simctl list devicetypes' on the machine the simulator will be run on. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--ios_simulator_version=` default: see description +: The version of iOS to run on the simulator when running or testing. This is ignored for ios\_test rules if a target device is specified in the rule. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--runs_per_test=` multiple uses are accumulated +: Specifies number of times to run each test. If any of those attempts fail for any + reason, the whole test is considered failed. Normally the value specified is + just an integer. + + Example: `--runs_per_test=3` will run all tests 3 times. + + Alternate syntax: `regex_filter@runs_per_test`. Where `runs_per_test` stands for + an integer value and `regex_filter` stands for a list of include and exclude + regular expression patterns (Also see --instrumentation\_filter). + + Example: `--runs_per_test=//foo/.*,-//foo/bar/.*@3` runs all tests in `//foo/` except + those under `//foo/bar` three times. This option can be passed multiple times. The most + recently passed argument that matches takes precedence. If nothing matches, + the test is only run once. + +`--test_env=` multiple uses are accumulated +: Specifies additional environment variables to be injected into the test runner + environment. Variables can be either specified by `name`, in which + case its value will be read from the Bazel client environment, or by the + `name=value` pair. + Previously set variables can be unset via `=name`. + This option can be used multiple times to specify several variables. + Used only by the 'bazel test' command. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +`--test_timeout=` default: "-1" +: Override the default test timeout values for test timeouts (in secs). If a single + positive integer value is specified it will override all categories. If 4 + comma-separated integers are specified, they will override the timeouts for + `short`, `moderate`, `long` and `eternal` (in that order). In either form, a value of + -1 tells blaze to use its default timeouts for that category. + +`--[no]zip_undeclared_test_outputs` default: "false" +: If true, undeclared test outputs will be archived in a zip file. + + Tags: + [`test_runner`](#effect_tag_TEST_RUNNER) + +Options that trigger optimizations of the build time: + +`--[no]cc_dotd_files` default: "true" +: Whether to generate and analyze .d files. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS) + +`--[no]cc_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_filter_library_jar_with_program_jar` default: "false" +: Filter the ProGuard ProgramJar to remove any classes also present in the LibraryJar. + + Tags: + [`action_command_lines`](#effect_tag_ACTION_COMMAND_LINES), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_dotd_files` default: "true" +: If enabled, C++ .d files will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_inmemory_jdeps_files` default: "true" +: If enabled, the dependency (.jdeps) files generated from Java compilations will be passed through in memory directly from the remote build nodes instead of being written to disk. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_retain_test_configuration_across_testonly` default: "true" +: When enabled, `--trim_test_configuration` will not trim the test configuration for rules + marked testonly=1. This is meant to reduce action conflict issues when non-test + rules depend on `cc_test` rules. No effect if `--trim_test_configuration` is + false. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_unsupported_and_brittle_include_scanning` default: "false" +: Whether to narrow inputs to C/C++ compilation by parsing #include lines from input files. This can improve performance and incrementality by decreasing the size of compilation input trees. However, it can also break builds because the include scanner does not fully implement C preprocessor semantics. In particular, it does not understand dynamic #include directives and ignores preprocessor conditional logic. Use at your own risk. Any issues relating to this flag that are filed will be closed. At Google without this flag your build will most likely fail. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`execution`](#effect_tag_EXECUTION), [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]incremental_dexing` default: "true" +: Does most of the work for dexing separately for each Jar file. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +`--[no]objc_use_dotd_pruning` default: "true" +: If set, .d files emitted by clang will be used to prune the set of inputs passed into objc compiles. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]process_headers_in_dependencies` default: "false" +: When building a target //a:a, process headers in all targets that //a:a depends on (if header processing is enabled for the toolchain). + + Tags: + [`execution`](#effect_tag_EXECUTION) + +`--[no]trim_test_configuration` default: "true" +: When enabled, test-related options will be cleared below the top level of the build. When this flag is active, tests cannot be built as dependencies of non-test rules, but changes to test-related options will not cause non-test rules to be re-analyzed. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`loses_incremental_state`](#effect_tag_LOSES_INCREMENTAL_STATE) + +Options that affect the verbosity, format or location of logging: + +`--toolchain_resolution_debug=` default: "-.\*" +: Print debug information during toolchain resolution. The flag takes a regex, which is checked against toolchain types and specific targets to see which to debug. Multiple regexes may be separated by commas, and then each regex is checked separately. Note: The output of this flag is very complex and will likely only be useful to experts in toolchain resolution. + + Tags: + [`terminal_output`](#effect_tag_TERMINAL_OUTPUT) + +`--[no]verbose_visibility_errors` default: "false" +: If enabled, visibility errors include additional diagnostic information. + + Tags: + [`build_file_semantics`](#effect_tag_BUILD_FILE_SEMANTICS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Options specifying or altering a generic input to a Bazel command that does not fall into other categories.: + +`--flag_alias=` multiple uses are accumulated +: Sets a shorthand name for a Starlark flag. It takes a single key-value pair in the form + `{key}={value}` as an argument. + + Tags: + [`changes_inputs`](#effect_tag_CHANGES_INPUTS), [`non_configurable`](#metadata_tag_NON_CONFIGURABLE) + +Miscellaneous options, not otherwise categorized.: + +`--[no]cache_test_results` [`-t`] default: "auto" +: If set to `auto`, Bazel reruns a test if and only if: + + 1. Bazel detects changes in the test or its dependencies, + 2. The test is marked as `external`, + 3. Multiple test runs were requested with `--runs_per_test`, or + 4. The test previously failed. + If set to `yes`, Bazel caches all test results except for tests marked as + `external`. If set to `no`, Bazel does not cache any test results. + +`--[no]experimental_cancel_concurrent_tests` default: "never" +: If `on_failed` or `on_passed`, then Blaze will cancel concurrently running tests on the first + successful run with that result. This is only useful in combination with + `--runs_per_test_detects_flakes`. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_fetch_all_coverage_outputs` default: "false" +: If true, then Bazel fetches the entire coverage data directory for each test during a coverage run. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]experimental_generate_llvm_lcov` default: "false" +: If true, coverage for clang will generate an LCOV report. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--experimental_java_classpath=` default: "bazel" +: Enables reduced classpaths for Java compilations. + +`--[no]experimental_run_android_lint_on_java_rules` default: "false" +: Whether to validate java\_\* sources. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`experimental`](#metadata_tag_EXPERIMENTAL) + +`--[no]explicit_java_test_deps` default: "false" +: Explicitly specify a dependency to JUnit or Hamcrest in a java\_test instead of accidentally obtaining from the TestRunner's deps. Only works for bazel right now. + +`--host_java_launcher=` default: see description +: The Java launcher used by tools that are executed during a build. + +`--host_javacopt=` multiple uses are accumulated +: Additional options to pass to javac when building tools that are executed during a build. + +`--host_jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM when building tools that are executed during the build. These options will get added to the VM startup options of each java\_binary target. + +`--[no]incompatible_exclusive_test_sandboxed` default: "true" +: If true, exclusive tests will run with sandboxed strategy. Add `local` tag to force + an exclusive test run locally + + Tags: + [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--[no]incompatible_strict_action_env` default: "true" +: If true, Bazel uses an environment with a static value for PATH and does not + inherit `LD_LIBRARY_PATH`. Use `--action_env=ENV_VARIABLE` if you want to + inherit specific environment variables from the client, but note that doing so + can prevent cross-user caching if a shared cache is used. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS), [`incompatible_change`](#metadata_tag_INCOMPATIBLE_CHANGE) + +`--j2objc_translation_flags=` multiple uses are accumulated +: Additional options to pass to the J2ObjC tool. + +`--java_debug` +: Causes the Java virtual machine of a java test to wait for a connection from a JDWP-compliant debugger (such as jdb) before starting the test. Implies -test\_output=streamed. + + Expands to: + +   `--test_arg=--wrapper_script_flag=--debug` + +   `--test_output=streamed` + +   `--test_strategy=exclusive` + +   `--test_timeout=9999` + +   `--nocache_test_results` + +`--[no]java_deps` default: "true" +: Generate dependency information (for now, compile-time classpath) per Java target. + +`--[no]java_header_compilation` default: "true" +: Compile ijars directly from source. + +`--java_language_version=` default: "" +: The Java language version + +`--java_launcher=` default: see description +: The Java launcher to use when building Java binaries. If this flag is set to the empty string, the JDK launcher is used. The "launcher" attribute overrides this flag. + +`--java_runtime_version=` default: "local\_jdk" +: The Java runtime version + +`--javacopt=` multiple uses are accumulated +: Additional options to pass to javac. + +`--jvmopt=` multiple uses are accumulated +: Additional options to pass to the Java VM. These options will get added to the VM startup options of each java\_binary target. + +`--legacy_main_dex_list_generator=` default: see description +: Specifies a binary to use to generate the list of classes that must be in the main dex when compiling legacy multidex. + +`--optimizing_dexer=` default: see description +: Specifies a binary to use to do dexing without sharding. + +`--plugin=` multiple uses are accumulated +: Plugins to use in the build. Currently works with java\_plugin. + +`--proguard_top=` default: see description +: Specifies which version of ProGuard to use for code removal when building a Java binary. + +`--proto_compiler=` default: "@bazel\_tools//tools/proto:protoc" +: The label of the proto-compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--[no]proto_profile` default: "true" +: Whether to pass profile\_path to the proto compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_profile_path=` default: see description +: The profile to pass to the proto compiler as profile\_path. If unset, but --proto\_profile is true (the default), infers the path from --fdo\_optimize. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_cc=` default: "@bazel\_tools//tools/proto:cc\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile C++ protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_java=` default: "@bazel\_tools//tools/proto:java\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile Java protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--proto_toolchain_for_javalite=` default: "@bazel\_tools//tools/proto:javalite\_toolchain" +: Label of proto\_lang\_toolchain() which describes how to compile JavaLite protos + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--protocopt=` multiple uses are accumulated +: Additional options to pass to the protobuf compiler. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS) + +`--[no]runs_per_test_detects_flakes` default: "false" +: If true, any shard in which at least one run/attempt passes and at least one run/attempt fails gets a FLAKY status. + +`--shell_executable=` default: see description +: Absolute path to the shell executable for Bazel to use. If this is unset, but the + `BAZEL_SH` environment variable is set on the first Bazel invocation (that starts + up a Bazel server), Bazel uses that. If neither is set, Bazel uses a hard-coded + default path depending on the operating system it runs on; + + * Windows: `c:/msys64/usr/bin/bash.exe` + * FreeBSD: `/usr/local/bin/bash` + * All others: `/bin/bash`. + + Note that using a shell that is not compatible with `bash` may lead + to build failures or runtime failures of the generated binaries. + + Tags: + [`loading_and_analysis`](#effect_tag_LOADING_AND_ANALYSIS) + +`--test_arg=` multiple uses are accumulated +: Specifies additional options and arguments that should be passed to the test + executable. Can be used multiple times to specify several arguments. + If multiple tests are executed, each of them will receive identical arguments. + Used only by the `bazel test` command. + +`--test_filter=` default: see description +: Specifies a filter to forward to the test framework. Used to limit the tests run. Note that this does not affect which targets are built. + +`--test_result_expiration=` default: "-1" +: This option is deprecated and has no effect. + +`--[no]test_runner_fail_fast` default: "false" +: Forwards fail fast option to the test runner. The test runner should stop execution upon first failure. + +`--test_sharding_strategy=` default: "explicit" +: Specify strategy for test sharding: + + * `explicit` to only use sharding if the `shard_count` `BUILD` attribute is + present. + * `disabled` to never use test sharding. + * `forced=k` to enforce `k` shards for testing regardless of the `shard_count` `BUILD` + attribute. + +`--tool_java_language_version=` default: "" +: The Java language version used to execute the tools that are needed during a build + +`--tool_java_runtime_version=` default: "remotejdk\_11" +: The Java runtime version used to execute tools during the build + +`--[no]use_ijars` default: "true" +: If enabled, this option causes Java compilation to use interface jars. This will result in faster incremental compilation, but error messages can be different. + +## Version Options + +Options that let the user configure the intended output, affecting its value, as opposed to its existence: + +`--[no]gnu_format` default: "false" +: If set, write the version to stdout using the conventions described in the GNU standards. + + Tags: + [`affects_outputs`](#effect_tag_AFFECTS_OUTPUTS), [`execution`](#effect_tag_EXECUTION) + +### Option Effect Tags + +| | | +| --- | --- | +| `unknown` | This option has unknown, or undocumented, effect. | +| `no_op` | This option has literally no effect. | +| `loses_incremental_state` | Changing the value of this option can cause significant loss of incremental state, which slows builds. State could be lost due to a server restart or to invalidation of a large part of the dependency graph. | +| `changes_inputs` | This option actively changes the inputs that bazel considers for the build, such as filesystem restrictions, repository versions, or other options. | +| `affects_outputs` | This option affects bazel's outputs. This tag is intentionally broad, can include transitive affects, and does not specify the type of output it affects. | +| `build_file_semantics` | This option affects the semantics of BUILD or .bzl files. | +| `bazel_internal_configuration` | This option affects settings of bazel-internal machinery. This tag does not, on its own, mean that build artifacts are affected. | +| `loading_and_analysis` | This option affects the loading and analysis of dependencies, and the building of the dependency graph. | +| `execution` | This option affects the execution phase, such as sandboxing or remote execution related options. | +| `host_machine_resource_optimizations` | This option triggers an optimization that may be machine specific and is not guaranteed to work on all machines. The optimization could include a tradeoff with other aspects of performance, such as memory or cpu cost. | +| `eagerness_to_exit` | This option changes how eagerly bazel will exit from a failure, where a choice between continuing despite the failure and ending the invocation exists. | +| `bazel_monitoring` | This option is used to monitor bazel's behavior and performance. | +| `terminal_output` | This option affects bazel's terminal output. | +| `action_command_lines` | This option changes the command line arguments of one or more build actions. | +| `test_runner` | This option changes the testrunner environment of the build. | + +### Option Metadata Tags + +| | | +| --- | --- | +| `experimental` | This option triggers an experimental feature with no guarantees of functionality. | +| `incompatible_change` | This option triggers a breaking change. Use this option to test your migration readiness or get early access to the new feature | +| `deprecated` | This option is deprecated. It might be that the feature it affects is deprecated, or that another method of supplying the information is preferred. | +| `non_configurable` | This option cannot be changed in a transition or be used in a select() statement. | + + + + diff --git a/reference/flag-cheatsheet.mdx b/reference/flag-cheatsheet.mdx new file mode 100644 index 000000000..c564b4a4c --- /dev/null +++ b/reference/flag-cheatsheet.mdx @@ -0,0 +1,562 @@ + + + + + + + +--- +title: 'Bazel flag cheat sheet' +--- + +Navigating Bazel's extensive list of command line flags can be a challenge. +This page focuses on the most crucial flags you'll need to know. + + + + + +## Useful general options {:#useful-command} + +The following flags are meant to be set explicitly on the command line. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FlagDescription
    +

    --config

    +
    + +You can organize flags in a .bazelrc file into configurations, +like ones for debugging or release builds. Additional configuration groups can +be selected with --config=<group>. + +
    +

    --keep_going

    +
    + +Bazel should try as much as possible to continue with build and test execution. +By default, Bazel fails eagerly. + +
    +

    --remote_download_outputs

    +
    + +When using remote execution or caching (both disk and remote), you can signal to +Bazel that you +want to download all (intermediate) build artifacts as follows: + +
    +--remote_download_outputs=all
    +
    + +By default, Bazel only downloads top-level artifacts, such as the final binary, +and intermediate artifacts that are necessary for local actions. + +
    +

    --stamp

    +
    + +Adds build info (user, timestamp) to binaries. + + + +
    + +## Uncover Build & Test Issues {:#uncover-build} + +The following flags can help you better understand Bazel build or test errors. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FlagDescription
    +

    --announce_rc

    +
    + +Shows which flags are implicitly set through user-defined, +machine-defined, or project-defined .bazelrc files. + +
    +

    --auto_output_filter

    +
    + +By default, Bazel tries to prevent log spam and does only print compiler +warnings and Starlark debug output for packages and subpackages requested on the +command line. To disable all filtering, set +--auto_output_filter=none. + +
    +

    --sandbox_debug

    +
    + +Lets you drill into sandboxing errors. For details on why Bazel sandboxes +builds by default and what gets sandboxed, see our +sandboxing documentation. + + + +
    +

    --subcommands (-s)

    +
    + +Displays a comprehensive list of every command that Bazel runs during a build, +regardless of whether it succeeds or fails + +
    + +## Startup {:#startup} + +Caution: Startup flags need to be passed before the command and cause +a server restart. Toggle these flags with caution. + + + + + + + + + + + + + + + + + + + + + + + +
    FlagDescription
    +

    --bazelrc

    +
    + +You can specify default Bazel options in .bazelrc files. If +multiple .bazelrc files exist, you can select which +.bazelrc file is used by adding --bazelrc=<path to +the .bazelrc file>. + + +
    +

    --host_jvm_args

    +
    + +Limits the amount of RAM the Bazel server uses. + +For example, the following limits the Bazel heap size to 3GB: + +
    +--host_jvm_args=-Xmx3g
    +
    + + + +
    +

    --output_base

    +
    + +Controls Bazel's output tree. Bazel doesn't store build outputs, including logs, +within the source tree itself. Instead, it uses a distinct output tree for this +purpose. + + + +
    + +## Bazel tests {:#bazel-tests} + +The following flags are related to Bazel test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FlagDescription
    +

    --java_debug

    +
    + +Causes Java tests to wait for a debugger connection before being executed. + +
    +

    --runs_per_test

    +
    + +The number of times to run tests. For example, to run tests N times, add +--runs_per_test=N. This can be useful to debug +flaky tests and see whether a fix causes a test to pass consistently. + +
    +

    --test_filter

    +
    + +This flag is particularly useful when iterating on a single test method, such as +when a change you made breaks a test. Instead of re-running +all the test methods in the test suite, you can focus solely on the specific +test(s) that failed. This allows for faster feedback and more efficient +debugging. This flag is often used in conjunction with +--test_output=streamed for real-time test output. + +
    +

    --test_output

    +
    + +Specifies the output mode. By default, Bazel captures test output in +local log files. When iterating on a broken test, you typically want to use +--test_output=streamed to see the test output in +real time. + +
    + +## Bazel run {:#bazel-run} + +The following flags are related to Bazel run. + + + + + + + + + + + + + +
    FlagDescription
    +

    --run_under

    +
    + +Changes how executables are invoked. For example --run_under="strace -c" is +commonly used for debugging. + +
    + +## User-specific bazelrc options {:#user-specific-bazelrc} + +The following flags are related to user-specific **.bazelrc** +options. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FlagDescription
    +

    --disk_cache

    +
    + +A path to a directory where Bazel can read and write actions and action outputs. +If the directory doesn't exist, it will be created. + +You can share build artifacts between multiple branches or workspaces and speed +up Bazel builds by adding +--disk_cache=<path> to your command. + +
    +

    --jobs

    +
    + +The number of concurrent jobs to run. + +This is typically only required when using remote execution where a remote build +cluster executes more jobs than you have cores locally. + +
    +

    --local_resources

    +
    + +Limits how much CPU or RAM is consumed by locally running actions. + + + +
    +

    --sandbox_base

    +
    + +Lets the sandbox create its sandbox directories underneath this path. By +default, Bazel executes local actions sandboxed which adds some overhead to the +build. + + + +
    + +## Project-specific bazelrc options {:#project-specific-bazelrc} + +The following flags are related to project-specific .bazelrc +options. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FlagDescription
    +

    --flaky_test_attempts

    +
    + +Retry each test up to the specified number of times in case of any +test failure. This is especially useful on Continuous Integration. Tests that +require more than one attempt to pass are marked as FLAKY in +the test summary. + +
    +

    --remote_cache

    +
    + +A URI of a caching endpoint. Setting up remote caching can be a great way to +speed up Bazel builds. It can be combined with a local disk cache. + +
    +

    --remote_download_regex

    +
    + +Force remote build outputs whose path matches this pattern to be downloaded, +irrespective of the --remote_download_outputs setting. Multiple +patterns may be specified by repeating this flag. + +
    +

    --remote_executor

    +
    + +HOST or HOST:PORT of a remote execution endpoint. Pass this if you are using +a remote execution service. You'll often need to Add +--remote_instance_name=<name>. + +
    +

    --remote_instance_name

    +
    + +The value to pass as instance_name in the remote execution API. + +
    +

    --show_timestamps

    +
    + +If specified, a timestamp is added to each message generated by Bazel specifying +the time at which the message was displayed. This is useful on CI systems to +quickly understand what step took how long. + +
    +

    --spawn_strategy

    +
    + +Even with remote execution, running some build actions locally might be faster. +This depends on factors like your build cluster's capacity, network speed, and +network delays. + + + +
    + + \ No newline at end of file diff --git a/reference/glossary.mdx b/reference/glossary.mdx index da7478c39..408edbeaf 100644 --- a/reference/glossary.mdx +++ b/reference/glossary.mdx @@ -2,9 +2,7 @@ title: 'Bazel Glossary' --- - - -### Action +### Action {:#action} A command to run during the build, for example, a call to a compiler that takes [artifacts](#artifact) as inputs and produces other artifacts as outputs. @@ -13,14 +11,14 @@ variables, and declared input/output artifacts. **See also:** [Rules documentation](/extending/rules#actions) -### Action cache +### Action cache {:#action-cache} An on-disk cache that stores a mapping of executed [actions](#action) to the outputs they created. The cache key is known as the [action key](#action-key). A core component for Bazel's incrementality model. The cache is stored in the output base directory and thus survives Bazel server restarts. -### Action graph +### Action graph {:#action-graph} An in-memory graph of [actions](#action) and the [artifacts](#artifact) that these actions read and generate. The graph might include artifacts that exist as @@ -29,20 +27,20 @@ intermediate/final artifacts that are not mentioned in `BUILD` files. Produced during the [analysis phase](#analysis-phase) and used during the [execution phase](#execution-phase). -### Action graph query (aquery) +### Action graph query (aquery) {:#action-graph-query} A [query](#query-concept) tool that can query over build [actions](#action). This provides the ability to analyze how [build rules](#rule) translate into the actual work builds do. -### Action key +### Action key {:#action-key} The cache key of an [action](#action). Computed based on action metadata, which might include the command to be executed in the action, compiler flags, library locations, or system headers, depending on the action. Enables Bazel to cache or invalidate individual actions deterministically. -### Analysis phase +### Analysis phase {:#analysis-phase} The second phase of a build. Processes the [target graph](#target-graph) specified in [`BUILD` files](#build-file) to produce an in-memory [action @@ -50,7 +48,7 @@ graph](#action-graph) that determines the order of actions to run during the [execution phase](#execution-phase). This is the phase in which rule implementations are evaluated. -### Artifact +### Artifact {:#artifact} A source file or a generated file. Can also be a directory of files, known as [tree artifacts](#tree-artifact). @@ -61,7 +59,7 @@ at most one action. An artifact that corresponds to a [file target](#target) can be addressed by a label. -### Aspect +### Aspect {:#aspect} A mechanism for rules to create additional [actions](#action) in their dependencies. For example, if target A depends on B, one can apply an aspect on @@ -73,7 +71,7 @@ metadata for IDEs, and create actions for linting. **See also:** [Aspects documentation](/extending/aspects) -### Aspect-on-aspect +### Aspect-on-aspect {:#aspect-on-aspect} A composition mechanism whereby aspects can be applied to the results of other aspects. For example, an aspect that generates information for use by @@ -85,14 +83,14 @@ For an aspect `A` to apply on top of aspect `B`, the [providers](#provider) that must match what `A` declares it wants in its [`required_aspect_providers`](/rules/lib/globals#aspect.required_aspect_providers) attribute. -### Attribute +### Attribute {:#attribute} A parameter to a [rule](#rule), used to express per-target build information. Examples include `srcs`, `deps`, and `copts`, which respectively declare a target's source files, dependencies, and custom compiler options. The particular attributes available for a given target depend on its rule type. -### .bazelrc +### .bazelrc {:#bazelrc} Bazel’s configuration file used to change the default values for [startup flags](#startup-flags) and [command flags](#command-flags), and to define common @@ -101,12 +99,12 @@ a `--config` flag. Bazel can combine settings from multiple bazelrc files (systemwide, per-workspace, per-user, or from a custom location), and a `bazelrc` file may also import settings from other `bazelrc` files. -### Blaze +### Blaze {:#blaze} The Google-internal version of Bazel. Google’s main build system for its mono-repository. -### BUILD File +### BUILD File {:#build-file} A `BUILD` file is the main configuration file that tells Bazel what software outputs to build, what their dependencies are, and how to build them. Bazel @@ -117,22 +115,22 @@ containing a `BUILD` file as a [package](#package), and can contain [targets](#target) created by [rules](#rule). The file can also be named `BUILD.bazel`. -### BUILD.bazel File +### BUILD.bazel File {:#build-bazel-file} See [`BUILD` File](#build-file). Takes precedence over a `BUILD` file in the same directory. -### .bzl File +### .bzl File {:#bzl-file} A file that defines rules, [macros](#macro), and constants written in [Starlark](#starlark). These can then be imported into [`BUILD` files](#build-file) using the `load()` function. -{/* TODO: ### Build event protocol */} + -{/* TODO: ### Build flag */} + -### Build graph +### Build graph {:#build-graph} The dependency graph that Bazel constructs and traverses to perform a build. Includes nodes like [targets](#target), [configured @@ -140,21 +138,21 @@ targets](#configured-target), [actions](#action), and [artifacts](#artifact). A build is considered complete when all [artifacts](#artifact) on which a set of requested targets depend are verified as up-to-date. -### Build setting +### Build setting {:#build-setting} A Starlark-defined piece of [configuration](#configuration). [Transitions](#transition) can set build settings to change a subgraph's configuration. If exposed to the user as a [command-line flag](#command-flags), also known as a build flag. -### Clean build +### Clean build {:#clean-build} A build that doesn't use the results of earlier builds. This is generally slower than an [incremental build](#incremental-build) but commonly considered to be more [correct](#correctness). Bazel guarantees both clean and incremental builds are always correct. -### Client-server model +### Client-server model {:#client-server-model} The `bazel` command-line client automatically starts a background server on the local machine to execute Bazel [commands](#command). The server persists across @@ -163,12 +161,12 @@ bazel shutdown). Splitting Bazel into a server and client helps amortize JVM startup time and supports faster [incremental builds](#incremental-build) because the [action graph](#action-graph) remains in memory across commands. -### Command +### Command {:#command} Used on the command line to invoke different Bazel functions, like `bazel build`, `bazel test`, `bazel run`, and `bazel query`. -### Command flags +### Command flags {:#command-flags} A set of flags specific to a [command](#command). Command flags are specified *after* the command (`bazel build `). Flags can be applicable to @@ -178,7 +176,7 @@ one or more commands. For example, `--configure` is a flag exclusively for the purposes, so changes in flag values can cause Bazel to invalidate in-memory graphs and restart the [analysis phase](#analysis-phase). -### Configuration +### Configuration {:#configuration} Information outside of [rule](#rule) definitions that impacts how rules generate [actions](#action). Every build has at least one configuration specifying the @@ -188,9 +186,9 @@ configurations, such as for host tools or cross-compilation. **See also:** [Configurations](/extending/rules#configurations) -{/* TODO: ### Configuration fragment */} + -### Configuration trimming +### Configuration trimming {:#config-trimming} The process of only including the pieces of [configuration](#configuration) a target actually needs. For example, if you build Java binary `//:j` with C++ @@ -198,7 +196,7 @@ dependency `//:c`, it's wasteful to include the value of `--javacopt` in the configuration of `//:c` because changing `--javacopt` unnecessarily breaks C++ build cacheability. -### Configured query (cquery) +### Configured query (cquery) {:#configured-query} A [query](#query-concept) tool that queries over [configured targets](#configured-target) (after the [analysis phase](#analysis-phase) @@ -207,7 +205,7 @@ completes). This means `select()` and [build flags](#command-flags) (such as **See also:** [cquery documentation](/query/cquery) -### Configured target +### Configured target {:#configured-target} The result of evaluating a [target](#target) with a [configuration](#configuration). The [analysis phase](#analysis-phase) produces @@ -215,7 +213,7 @@ this by combining the build's options with the targets that need to be built. For example, if `//:foo` builds for two different architectures in the same build, it has two configured targets: `` and ``. -### Correctness +### Correctness {:#correctness} A build is correct when its output faithfully reflects the state of its transitive inputs. To achieve correct builds, Bazel strives to be @@ -223,7 +221,7 @@ transitive inputs. To achieve correct builds, Bazel strives to be analysis](#analysis-phase) and [action execution](#execution-phase) deterministic. -### Dependency +### Dependency {:#dependency} A directed edge between two [targets](#target). A target `//:foo` has a *target dependency* on target `//:bar` if `//:foo`'s attribute values contain a @@ -234,7 +232,7 @@ action in `//:bar`. In certain contexts, it could also refer to an _external dependency_; see [modules](#module). -### Depset +### Depset {:#depset} A data structure for collecting data on transitive dependencies. Optimized so that merging depsets is time and space efficient, because it’s common to have @@ -247,17 +245,17 @@ implementation. **See also:** [Depset documentation](/extending/depsets) -### Disk cache +### Disk cache {:#disk-cache} A local on-disk blob store for the remote caching feature. Can be used in conjunction with an actual remote blob store. -### Distdir +### Distdir {:#distdir} A read-only directory containing files that Bazel would otherwise fetch from the internet using repository rules. Enables builds to run fully offline. -### Dynamic execution +### Dynamic execution {:#dynamic-execution} An execution strategy that selects between local and remote execution based on various heuristics, and uses the execution results of the faster successful @@ -266,7 +264,7 @@ linking) and others are faster remotely (for example, highly parallelizable compilation). A dynamic execution strategy can provide the best possible incremental and clean build times. -### Execution phase +### Execution phase {:#execution-phase} The third phase of a build. Executes the [actions](#action) in the [action graph](#action-graph) created during the [analysis phase](#analysis-phase). @@ -274,7 +272,7 @@ These actions invoke executables (compilers, scripts) to read and write [artifacts](#artifact). *Spawn strategies* control how these actions are executed: locally, remotely, dynamically, sandboxed, docker, and so on. -### Execution root +### Execution root {:#execution-root} A directory in the [workspace](#workspace)’s [output base](#output-base) directory where local [actions](#action) are executed in @@ -286,11 +284,11 @@ by creating a *symlink forest* of the directories that represent the transitive closure of packages on which a build depends. Accessible with `bazel info execution_root` on the command line. -### File +### File {:#file} See [Artifact](#artifact). -### Hermeticity +### Hermeticity {:#hermeticity} A build is hermetic if there are no external influences on its build and test operations, which helps to make sure that results are deterministic and @@ -299,16 +297,16 @@ access to actions, restrict access to declared inputs, use fixed timestamps and timezones, restrict access to environment variables, and use fixed seeds for random number generators -### Incremental build +### Incremental build {:#incremental-build} An incremental build reuses the results of earlier builds to reduce build time and resource usage. Dependency checking and caching aim to produce correct results for this type of build. An incremental build is the opposite of a clean build. -{/* TODO: ### Install base */} + -### Label +### Label {:#label} An identifier for a [target](#target). Generally has the form `@repo//path/to/package:target`, where `repo` is the (apparent) name of the @@ -320,7 +318,7 @@ syntax may be omitted. **See also**: [Labels](/concepts/labels) -### Loading phase +### Loading phase {:#loading-phase} The first phase of a build where Bazel executes [`BUILD` files](#build-file) to create [packages](#package). [Macros](#macro) and certain functions like @@ -328,7 +326,7 @@ create [packages](#package). [Macros](#macro) and certain functions like build, the [analysis phase](#analysis-phase), to build up a [target graph](#target-graph). -### Legacy macro +### Legacy macro {:#legacy-macro} A flavor of [macro](#macro) which is declared as an ordinary [Starlark](#starlark) function, and which runs as a side effect of executing a @@ -343,7 +341,7 @@ Contrast with [symbolic macros](#symbolic-macro). **See also:** [Legacy macro documentation](/extending/legacy-macros) -### Macro +### Macro {:#macro} A mechanism to compose multiple [rule](#rule) target declarations together under a single [Starlark](#starlark) callable. Enables reusing common rule declaration @@ -353,7 +351,7 @@ declarations during the [loading phase](#loading-phase). Comes in two flavors: [symbolic macros](#symbolic-macro) (since Bazel 8) and [legacy macros](#legacy-macro). -### Mnemonic +### Mnemonic {:#mnemonic} A short, human-readable string selected by a rule author to quickly understand what an [action](#action) in the rule is doing. Mnemonics can be used as @@ -361,7 +359,7 @@ identifiers for *spawn strategy* selections. Some examples of action mnemonics are `Javac` from Java rules, `CppCompile` from C++ rules, and `AndroidManifestMerger` from Android rules. -### Module +### Module {:#module} A Bazel project that can have multiple versions, each of which can have dependencies on other modules. This is analogous to familiar concepts in other @@ -378,7 +376,7 @@ Module metadata is hosted in Bazel registries. **See also:** [Bazel modules](/external/module) -### Module Extension +### Module Extension {:#module-extension} A piece of logic that can be run to generate [repos](#repository) by reading inputs from across the [module](#module) dependency graph and invoking [repo @@ -387,20 +385,20 @@ rules, allowing them to access the internet, perform file I/O, and so on. **See also:** [Module extensions](/external/extension) -### Native rules +### Native rules {:#native-rules} [Rules](#rule) that are built into Bazel and implemented in Java. Such rules appear in [`.bzl` files](#bzl-file) as functions in the native module (for example, `native.cc_library` or `native.java_library`). User-defined rules (non-native) are created using [Starlark](#starlark). -### Output base +### Output base {:#output-base} A [workspace](#workspace)-specific directory to store Bazel output files. Used to separate outputs from the *workspace*'s source tree (the [main repo](#repository)). Located in the [output user root](#output-user-root). -### Output groups +### Output groups {:#output-groups} A group of files that is expected to be built when Bazel finishes building a target. [Rules](#rule) put their usual outputs in the "default output group" @@ -411,7 +409,7 @@ Rules can define more named output groups that can be explicitly specified in [`BUILD` files](#build-file) (`filegroup` rule) or the command line (`--output_groups` flag). -### Output user root +### Output user root {:#output-user-root} A user-specific directory to store Bazel's outputs. The directory name is derived from the user's system username. Prevents output file collisions if @@ -419,25 +417,25 @@ multiple users are building the same project on the system at the same time. Contains subdirectories corresponding to build outputs of individual workspaces, also known as [output bases](#output-base). -### Package +### Package {:#package} The set of [targets](#target) defined by a [`BUILD` file](#build-file). A package's name is the `BUILD` file's path relative to the [repo](#repository) root. A package can contain subpackages, or subdirectories containing `BUILD` files, thus forming a package hierarchy. -### Package group +### Package group {:#package-group} A [target](#target) representing a set of packages. Often used in `visibility` attribute values. -### Platform +### Platform {:#platform} A "machine type" involved in a build. This includes the machine Bazel runs on (the "host" platform), the machines build tools execute on ("exec" platforms), and the machines targets are built for ("target platforms"). -### Provider +### Provider {:#provider} A schema describing a unit of information to pass between [rule targets](#rule-target) along dependency relationships. Typically this @@ -452,14 +450,14 @@ referred to as a "provider instance", although sometimes this is conflated with **See also:** [Provider documentation](/extending/rules#providers) -### Query (concept) +### Query (concept) {:#query-concept} The process of analyzing a [build graph](#build-graph) to understand [target](#target) properties and dependency structures. Bazel supports three query variants: [query](#query-command), [cquery](#configured-query), and [aquery](#action-graph-query). -### query (command) +### query (command) {:#query-command} A [query](#query-concept) tool that operates over the build's post-[loading phase](#loading-phase) [target graph](#target-graph). This is relatively fast, @@ -468,7 +466,7 @@ but can't analyze the effects of `select()`, [build flags](#command-flags), **See also:** [Query how-to](/query/guide), [Query reference](/query/language) -### Repository +### Repository {:#repository} A directory tree with a boundary marker file at its root, containing source files that can be used in a Bazel build. Often shortened to just **repo**. @@ -490,7 +488,7 @@ Each repo has a unique, constant *canonical* name, and potentially different **See also**: [External dependencies overview](/external/overview) -### Repository cache +### Repository cache {:#repo-cache} A shared content-addressable cache of files downloaded by Bazel for builds, shareable across [workspaces](#workspace). Enables offline builds after the @@ -499,7 +497,7 @@ rules](#repository-rule) like `http_archive` and repository rule APIs like `repository_ctx.download`. Files are cached only if their SHA-256 checksums are specified for the download. -### Repository rule +### Repository rule {:#repository-rule} A schema for repository definitions that tells Bazel how to materialize (or "fetch") a [repository](#repository). Often shortened to just **repo rule**. @@ -511,14 +509,14 @@ internet. **See also:** [Repo rule documentation](/external/repo) -### Reproducibility +### Reproducibility {:#reproducibility} The property of a build or test that a set of inputs to the build or test will always produce the same set of outputs every time, regardless of time, method, or environment. Note that this does not necessarily imply that the outputs are [correct](#correctness) or the desired outputs. -### Rule +### Rule {:#rule} A schema for defining [rule targets](#rule-target) in a `BUILD` file, such as `cc_library`. From the perspective of a `BUILD` file author, a rule consists of @@ -541,12 +539,12 @@ be avoided for Bazel. **See also:** [Rules documentation](/extending/rules) -### Rule target +### Rule target {:#rule-target} A [target](#target) that is an instance of a rule. Contrasts with file targets and package groups. Not to be confused with [rule](#rule). -### Runfiles +### Runfiles {:#runfiles} The runtime dependencies of an executable [target](#target). Most commonly, the executable is the executable output of a test rule, and the runfiles are runtime @@ -556,7 +554,7 @@ according to their source directory structure. **See also:** [Runfiles documentation](/extending/rules#runfiles) -### Sandboxing +### Sandboxing {:#sandboxing} A technique to isolate a running [action](#action) inside a restricted and temporary [execution root](#execution-root), helping to ensure that it doesn’t @@ -565,13 +563,13 @@ read undeclared inputs or write undeclared outputs. Sandboxing greatly improves support from the operating system. The performance cost depends on the platform. On Linux, it's not significant, but on macOS it can make sandboxing unusable. -### Skyframe +### Skyframe {:#skyframe} [Skyframe](/reference/skyframe) is the core parallel, functional, and incremental evaluation framework of Bazel. -{/* TODO: ### Spawn strategy */} + -### Stamping +### Stamping {:#stamping} A feature to embed additional information into Bazel-built [artifacts](#artifact). For example, this can be used for source control, build @@ -579,7 +577,7 @@ time and other workspace or environment-related information for release builds. Enable through the `--workspace_status_command` flag and [rules](/extending/rules) that support the stamp attribute. -### Starlark +### Starlark {:#starlark} The extension language for writing [rules](/extending/rules) and [macros](#macro). A restricted subset of Python (syntactically and grammatically) aimed for the @@ -590,11 +588,11 @@ known as Skylark. **See also:** [Starlark language documentation](/rules/language) -{/* TODO: ### Starlark rules */} + -{/* TODO: ### Starlark rule sandwich */} + -### Startup flags +### Startup flags {:#startup-flags} The set of flags specified between `bazel` and the [command](#query-command), for example, bazel `--host_jvm_debug` build. These flags modify the @@ -602,7 +600,7 @@ for example, bazel `--host_jvm_debug` build. These flags modify the startup flags causes a server restart. Startup flags are not specific to any command. -### Symbolic macro +### Symbolic macro {:#symbolic-macro} A flavor of [macro](#macro) which is declared with a [rule](#rule)-like [attribute](#attribute) schema, allows hiding internal declared @@ -612,7 +610,7 @@ problems seen in large [legacy macro](#legacy-macro) codebases. **See also:** [Symbolic macro documentation](/extending/macros) -### Target +### Target {:#target} An object that is defined in a [`BUILD` file](#build-file) and identified by a [label](#label). Targets represent the buildable units of a workspace from @@ -634,13 +632,13 @@ Targets are discovered during the [loading phase](#loading-phase). During the configurations](#configuration) to form [configured targets](#configured-target). -### Target graph +### Target graph {:#target-graph} An in-memory graph of [targets](#target) and their dependencies. Produced during the [loading phase](#loading-phase) and used as an input to the [analysis phase](#analysis-phase). -### Target pattern +### Target pattern {:#target-pattern} A way to specify a group of [targets](#target) on the command line. Commonly used patterns are `:all` (all rule targets), `:*` (all rule + file targets), @@ -648,7 +646,7 @@ used patterns are `:all` (all rule targets), `:*` (all rule + file targets), in combination, for example, `//...:*` means all rule and file targets in all packages recursively from the root of the [workspace](#workspace). -### Tests +### Tests {:#tests} Rule [targets](#target) instantiated from test rules, and therefore contains a test executable. A return code of zero from the completion of the executable @@ -656,7 +654,7 @@ indicates test success. The exact contract between Bazel and tests (such as test environment variables, test result collection methods) is specified in the [Test Encyclopedia](/reference/test-encyclopedia). -### Toolchain +### Toolchain {:#toolchain} A set of tools to build outputs for a language. Typically, a toolchain includes compilers, linkers, interpreters or/and linters. A toolchain can also vary by @@ -664,7 +662,7 @@ platform, that is, a Unix compiler toolchain's components may differ for the Windows variant, even though the toolchain is for the same language. Selecting the right toolchain for the platform is known as toolchain resolution. -### Top-level target +### Top-level target {:#top-level-target} A build [target](#target) is top-level if it’s requested on the Bazel command line. For example, if `//:foo` depends on `//:bar`, and `bazel build //:foo` is @@ -676,7 +674,7 @@ flags](#command-flags) set on the Bazel command line (or via targets, but might be modified by a [transition](#transition) for non-top-level targets. -### Transition +### Transition {:#transition} A mapping of [configuration](#configuration) state from one value to another. Enables [targets](#target) in the [build graph](#build-graph) to have different @@ -688,13 +686,13 @@ compiled for ARM and x86 using split transitions in a single build. **See also:** [User-defined transitions](/extending/config#user-defined-transitions) -### Tree artifact +### Tree artifact {:#tree-artifact} An [artifact](#artifact) that represents a collection of files. Since these files are not themselves artifacts, an [action](#action) operating on them must instead register the tree artifact as its input or output. -### Visibility +### Visibility {:#visibility} One of two mechanisms for preventing unwanted dependencies in the build system: *target visibility* for controlling whether a [target](#target) can be depended @@ -704,7 +702,7 @@ or `.bzl` file may load a given `.bzl` file. Without context, usually **See also:** [Visibility documentation](/concepts/visibility) -### Workspace +### Workspace {:#workspace} The environment shared by all Bazel commands run from the same [main repository](#repository). diff --git a/reference/skyframe.mdx b/reference/skyframe.mdx index ba9149faf..d8b350cdb 100644 --- a/reference/skyframe.mdx +++ b/reference/skyframe.mdx @@ -2,8 +2,6 @@ title: 'Skyframe' --- - - The parallel evaluation and incrementality model of Bazel. ## Data model @@ -195,4 +193,4 @@ implementations Bazel uses to perform a build: As a visual aid, this diagram shows the relationships between SkyFunction implementations after a build of Bazel itself: -![A graph of SkyFunction implementation relationships](/reference/skyframe.png) +![A graph of SkyFunction implementation relationships](/reference/skyframe.png) \ No newline at end of file diff --git a/reference/test-encyclopedia.mdx b/reference/test-encyclopedia.mdx new file mode 100644 index 000000000..4f1f3ace4 --- /dev/null +++ b/reference/test-encyclopedia.mdx @@ -0,0 +1,818 @@ +--- +title: 'Test encyclopedia' +--- + +An exhaustive specification of the test execution environment. + +## Background {:#background} + +The Bazel BUILD language includes rules which can be used to define automated +test programs in many languages. + +Tests are run using [`bazel test`](/docs/user-manual#test). + +Users may also execute test binaries directly. This is allowed but not endorsed, +as such an invocation will not adhere to the mandates described below. + +Tests should be *hermetic*: that is, they ought to access only those resources +on which they have a declared dependency. If tests are not properly hermetic +then they do not give historically reproducible results. This could be a +significant problem for culprit finding (determining which change broke a test), +release engineering auditability, and resource isolation of tests (automated +testing frameworks ought not DDOS a server because some tests happen to talk to +it). + +## Objective {:#objective} + +The goal of this page is to formally establish the runtime environment for and +expected behavior of Bazel tests. It will also impose requirements on the test +runner and the build system. + +The test environment specification helps test authors avoid relying on +unspecified behavior, and thus gives the testing infrastructure more freedom to +make implementation changes. The specification tightens up some holes that +currently allow many tests to pass despite not being properly hermetic, +deterministic, and reentrant. + +This page is intended to be both normative and authoritative. If this +specification and the implemented behavior of test runner disagree, the +specification takes precedence. + +## Proposed Specification {:#proposed-specification} + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", +"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" are to be interpreted as +described in IETF RFC 2119. + +## Purpose of tests {:#purpose-of-tests} + +The purpose of Bazel tests is to confirm some property of the source files +checked into the repository. (On this page, "source files" includes test data, +golden outputs, and anything else kept under version control.) One user writes a +test to assert an invariant which they expect to be maintained. Other users +execute the test later to check whether the invariant has been broken. If the +test depends on any variables other than source files (non-hermetic), its value +is diminished, because the later users cannot be sure their changes are at fault +when the test stops passing. + +Therefore the outcome of a test must depend only on: + +* source files on which the test has a declared dependency +* products of the build system on which the test has a declared dependency +* resources whose behavior is guaranteed by the test runner to remain constant + +Currently, such behavior is not enforced. However, test runners reserve the +right to add such enforcement in the future. + +## Role of the build system {:#role-build-system} + +Test rules are analogous to binary rules in that each must yield an executable +program. For some languages, this is a stub program which combines a +language-specific harness with the test code. Test rules must produce other +outputs as well. In addition to the primary test executable, the test runner +will need a manifest of **runfiles**, input files which should be made available +to the test at runtime, and it may need information about the type, size, and +tags of a test. + +The build system may use the runfiles to deliver code as well as data. (This +might be used as an optimization to make each test binary smaller by sharing +files across tests, such as through the use of dynamic linking.) The build system +should ensure that the generated executable loads these files via the runfiles +image provided by the test runner, rather than hardcoded references to absolute +locations in the source or output tree. + +## Role of the test runner {:#role-test-runner} + +From the point of view of the test runner, each test is a program which can be +invoked with `execve()`. There may be other ways to execute tests; for example, +an IDE might allow the execution of Java tests in-process. However, the result +of running the test as a standalone process must be considered authoritative. If +a test process runs to completion and terminates normally with an exit code of +zero, the test has passed. Any other result is considered a test failure. In +particular, writing any of the strings `PASS` or `FAIL` to stdout has no +significance to the test runner. + +If a test takes too long to execute, exceeds some resource limit, or the test +runner otherwise detects prohibited behavior, it may choose to kill the test and +treat the run as a failure. The runner must not report the test as passing after +sending a signal to the test process or any children thereof. + +The whole test target (not individual methods or tests) is given a limited +amount of time to run to completion. The time limit for a test is based on its +[`timeout`](/reference/be/common-definitions#test.timeout) attribute according +to the following table: + + + + + + + + + + + + + + + + + + + + + + +
    timeoutTime Limit (sec.)
    short60
    moderate300
    long900
    eternal3600
    + +Tests which do not explicitly specify a timeout have one implied based on the +test's [`size`](/reference/be/common-definitions#test.size) as follows: + + + + + + + + + + + + + + + + + + + + + + +
    sizeImplied timeout label
    smallshort
    mediummoderate
    largelong
    enormouseternal
    + +A "large" test with no explicit timeout setting will be allotted 900 +seconds to run. A "medium" test with a timeout of "short" will be allotted 60 +seconds. + +Unlike `timeout`, the `size` additionally determines the assumed peak usage of +other resources (like RAM) when running the test locally, as described in +[Common definitions](/reference/be/common-definitions#common-attributes-tests). + +All combinations of `size` and `timeout` labels are legal, so an "enormous" test +may be declared to have a timeout of "short". Presumably it would do some really +horrible things very quickly. + +Tests may return arbitrarily fast regardless of timeout. A test is not penalized +for an overgenerous timeout, although a warning may be issued: you should +generally set your timeout as tight as you can without incurring any flakiness. + +The test timeout can be overridden with the `--test_timeout` bazel flag when +manually running under conditions that are known to be slow. The +`--test_timeout` values are in seconds. For example, `--test_timeout=120` +sets the test timeout to two minutes. + +There is also a recommended lower bound for test timeouts as follows: + + + + + + + + + + + + + + + + + + + + + + +
    timeoutTime minimum (sec.)
    short0
    moderate30
    long300
    eternal900
    + +For example, if a "moderate" test completes in 5.5s, consider setting `timeout = +"short"` or `size = "small"`. Using the bazel `--test_verbose_timeout_warnings` +command line option will show the tests whose specified size is too big. + +Test sizes and timeouts are specified in the BUILD file according to the +specification [here](/reference/be/common-definitions#common-attributes-tests). If +unspecified, a test's size will default to "medium". + +If the main process of a test exits, but some of its children are still running, +the test runner should consider the run complete and count it as a success or +failure based on the exit code observed from the main process. The test runner +may kill any stray processes. Tests should not leak processes in this fashion. + +## Test sharding {:#test-sharding} + +Tests can be parallelized via test sharding. See +[`--test_sharding_strategy`](/reference/command-line-reference#flag--test_sharding_strategy) +and [`shard_count`](/reference/be/common-definitions#common-attributes-tests) to +enable test sharding. When sharding is enabled, the test runner is launched once +per shard. The environment variable [`TEST_TOTAL_SHARDS`](#initial-conditions) +is the number of shards, and [`TEST_SHARD_INDEX`](#initial-conditions) is the +shard index, beginning at 0. Runners use this information to select which tests +to run - for example, using a round-robin strategy. Not all test runners support +sharding. If a runner supports sharding, it must create or update the last +modified date of the file specified by +[`TEST_SHARD_STATUS_FILE`](#initial-conditions), otherwise Bazel will fail the +test if it is sharded. + +## Initial conditions {:#initial-conditions} + +When executing a test, the test runner must establish certain initial +conditions. + +The test runner must invoke each test with the path to the test executable in +`argv[0]`. This path must be relative and beneath the test's current directory +(which is in the runfiles tree, see below). The test runner should not pass any +other arguments to a test unless the user explicitly requests it. + +The initial environment block shall be composed as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VariableValueStatus
    HOMEvalue of $TEST_TMPDIRrecommended
    LANGunsetrequired
    LANGUAGEunsetrequired
    LC_ALLunsetrequired
    LC_COLLATEunsetrequired
    LC_CTYPEunset or C.UTF-8required
    LC_MESSAGESunsetrequired
    LC_MONETARYunsetrequired
    LC_NUMERICunsetrequired
    LC_TIMEunsetrequired
    LD_LIBRARY_PATHcolon-separated list of directories containing shared librariesoptional
    JAVA_RUNFILESvalue of $TEST_SRCDIRdeprecated
    LOGNAMEvalue of $USERrequired
    PATH/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.recommended
    PWD$TEST_SRCDIR/workspace-namerecommended
    SHLVL2recommended
    TEST_INFRASTRUCTURE_FAILURE_FILEabsolute path to a private file in a writable directory (This file + should only be used to report failures originating from the testing + infrastructure, not as a general mechanism for reporting flaky failures + of tests. In this context, testing infrastructure is defined as systems + or libraries that are not test-specific, but can cause test failures by + malfunctioning. The first line is the name of the testing infrastructure + component that caused the failure, the second one a human-readable + description of the failure. Additional lines are ignored.)optional
    TEST_LOGSPLITTER_OUTPUT_FILEabsolute path to a private file in a writable directory (used to write + Logsplitter protobuffer log)optional
    TEST_PREMATURE_EXIT_FILEabsolute path to a private file in a writable directory (used for + catching calls to exit())optional
    TEST_RANDOM_SEEDIf the --runs_per_test option is used, + TEST_RANDOM_SEED is set to the run number + (starting with 1) for each individual test run.optional
    TEST_RUN_NUMBERIf the --runs_per_test option is used, + TEST_RUN_NUMBER is set to the run number + (starting with 1) for each individual test run.optional
    TEST_TARGETThe name of the target being testedoptional
    TEST_SIZEThe test sizeoptional
    TEST_TIMEOUTThe test timeout in secondsoptional
    TEST_SHARD_INDEXshard index, if sharding is usedoptional
    TEST_SHARD_STATUS_FILEpath to file to touch to indicate support for shardingoptional
    TEST_SRCDIRabsolute path to the base of the runfiles treerequired
    TEST_TOTAL_SHARDStotal + shard count, + if sharding is usedoptional
    TEST_TMPDIRabsolute path to a private writable directoryrequired
    TEST_WORKSPACEthe local repository's workspace nameoptional
    TEST_UNDECLARED_OUTPUTS_DIRabsolute path to a private writable directory (used to write undeclared + test outputs). Any files written to the + TEST_UNDECLARED_OUTPUTS_DIR directory will be zipped up and + added to an outputs.zip file under + bazel-testlogs.optional
    TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIRabsolute path to a private writable directory (used to write undeclared + test output annotation .part and .pb files).optional
    TEST_WARNINGS_OUTPUT_FILEabsolute path to a private file in a writable directory (used to write + test target warnings)optional
    TESTBRIDGE_TEST_ONLYvalue of + --test_filter, + if specifiedoptional
    TZUTCrequired
    USERvalue of getpwuid(getuid())->pw_namerequired
    XML_OUTPUT_FILE + Location to which test actions should write a test result XML output file. + Otherwise, Bazel generates a default XML output file wrapping the test log + as part of the test action. The XML schema is based on the + JUnit test result schema.optional
    BAZEL_TESTSignifies test executable is being driven by bazel testrequired
    + +The environment may contain additional entries. Tests should not depend on the +presence, absence, or value of any environment variable not listed above. + +The initial working directory shall be `$TEST_SRCDIR/$TEST_WORKSPACE`. + +The current process id, process group id, session id, and parent process id are +unspecified. The process may or may not be a process group leader or a session +leader. The process may or may not have a controlling terminal. The process may +have zero or more running or unreaped child processes. The process should not +have multiple threads when the test code gains control. + +File descriptor 0 (`stdin`) shall be open for reading, but what it is attached to +is unspecified. Tests must not read from it. File descriptors 1 (`stdout`) and 2 +(`stderr`) shall be open for writing, but what they are attached to is +unspecified. It could be a terminal, a pipe, a regular file, or anything else to +which characters can be written. They may share an entry in the open file table +(meaning that they cannot seek independently). Tests should not inherit any +other open file descriptors. + +The initial umask shall be `022` or `027`. + +No alarm or interval timer shall be pending. + +The initial mask of blocked signals shall be empty. All signals shall be set to +their default action. + +The initial resource limits, both soft and hard, should be set as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ResourceLimit
    RLIMIT_ASunlimited
    RLIMIT_COREunspecified
    RLIMIT_CPUunlimited
    RLIMIT_DATAunlimited
    RLIMIT_FSIZEunlimited
    RLIMIT_LOCKSunlimited
    RLIMIT_MEMLOCKunlimited
    RLIMIT_MSGQUEUEunspecified
    RLIMIT_NICEunspecified
    RLIMIT_NOFILEat least 1024
    RLIMIT_NPROCunspecified
    RLIMIT_RSSunlimited
    RLIMIT_RTPRIOunspecified
    RLIMIT_SIGPENDINGunspecified
    RLIMIT_STACKunlimited, or 2044KB <= rlim <= 8192KB
    + +The initial process times (as returned by `times()`) and resource utilization +(as returned by `getrusage()`) are unspecified. + +The initial scheduling policy and priority are unspecified. + +## Role of the host system {:#role-host-system} + +In addition to the aspects of user context under direct control of the test +runner, the operating system on which tests execute must satisfy certain +properties for a test run to be valid. + +#### Filesystem {:#filesystem} + +The root directory observed by a test may or may not be the real root directory. + +`/proc` shall be mounted. + +All build tools shall be present at the absolute paths under `/usr` used by a +local installation. + +Paths starting with `/home` may not be available. Tests should not access any +such paths. + +`/tmp` shall be writable, but tests should avoid using these paths. + +Tests must not assume that any constant path is available for their exclusive +use. + +Tests must not assume that atimes are enabled for any mounted filesystem. + +#### Users and groups {:#users-groups} + +The users root, nobody, and unittest must exist. The groups root, nobody, and +eng must exist. + +Tests must be executed as a non-root user. The real and effective user ids must +be equal; likewise for group ids. Beyond this, the current user id, group id, +user name, and group name are unspecified. The set of supplementary group ids is +unspecified. + +The current user id and group id must have corresponding names which can be +retrieved with `getpwuid()` and `getgrgid()`. The same may not be true for +supplementary group ids. + +The current user must have a home directory. It may not be writable. Tests must +not attempt to write to it. + +#### Networking {:#networking} + +The hostname is unspecified. It may or may not contain a dot. Resolving the +hostname must give an IP address of the current host. Resolving the hostname cut +after the first dot must also work. The hostname localhost must resolve. + +#### Other resources {:#other-resources} + +Tests are granted at least one CPU core. Others may be available but this is not +guaranteed. Other performance aspects of this core are not specified. You can +increase the reservation to a higher number of CPU cores by adding the tag +"cpu:n" (where n is a positive number) to a test rule. If a machine has less +total CPU cores than requested, Bazel will still run the test. If a test uses +[sharding](#test-sharding), each individual shard will reserve the number of CPU +cores specified here. + +Tests may create subprocesses, but not process groups or sessions. + +There is a limit on the number of input files a test may consume. This limit is +subject to change, but is currently in the range of tens of thousands of inputs. + +#### Time and date {:#time-and-date} + +The current time and date are unspecified. The system timezone is unspecified. + +X Windows may or may not be available. Tests that need an X server should start +Xvfb. + +## Test interaction with the filesystem {:#test-interaction-filesystem} + +All file paths specified in test environment variables point to somewhere on the +local filesystem, unless otherwise specified. + +Tests should create files only within the directories specified by +`$TEST_TMPDIR` and `$TEST_UNDECLARED_OUTPUTS_DIR` (if set). + +These directories will be initially empty. + +Tests must not attempt to remove, chmod, or otherwise alter these directories. + +These directories may be a symbolic links. + +The filesystem type of `$TEST_TMPDIR/.` remains unspecified. + +Tests may also write .part files to the +`$TEST_UNDECLARED_OUTPUTS_ANNOTATIONS_DIR` to annotate undeclared output files. + +In rare cases, a test may be forced to create files in `/tmp`. For example, +[path length limits for Unix domain sockets](https://serverfault.com/questions/641347){: .external} +typically require creating the socket under `/tmp`. Bazel will be unable to +track such files; the test itself must take care to be hermetic, to use unique +paths to avoid colliding with other, simultaneously running tests and non-test +processes, and to clean up the files it creates in `/tmp`. + +Some popular testing frameworks, such as +[JUnit4 `TemporaryFolder`](https://junit.org/junit4/javadoc/latest/org/junit/rules/TemporaryFolder.html){: .external} +or [Go `TempDir`](https://golang.org/pkg/testing/#T.TempDir){: .external}, have +their own ways to create a temporary directory under `/tmp`. These testing +frameworks include functionality that cleans up files in `/tmp`, so you may use +them even though they create files outside of `TEST_TMPDIR`. + +Tests must access inputs through the **runfiles** mechanism, or other parts of +the execution environment which are specifically intended to make input files +available. + +Tests must not access other outputs of the build system at paths inferred from +the location of their own executable. + +It is unspecified whether the runfiles tree contains regular files, symbolic +links, or a mixture. The runfiles tree may contain symlinks to directories. +Tests should avoid using paths containing `..` components within the runfiles +tree. + +No directory, file, or symlink within the runfiles tree (including paths which +traverse symlinks) should be writable. (It follows that the initial working +directory should not be writable.) Tests must not assume that any part of the +runfiles is writable, or owned by the current user (for example, `chmod` and `chgrp` may +fail). + +The runfiles tree (including paths which traverse symlinks) must not change +during test execution. Parent directories and filesystem mounts must not change +in any way which affects the result of resolving a path within the runfiles +tree. + +In order to catch early exit, a test may create a file at the path specified by +`TEST_PREMATURE_EXIT_FILE` upon start and remove it upon exit. If Bazel sees the +file when the test finishes, it will assume that the test exited prematurely and +mark it as having failed. + +## Execution platform {:#execution-platform} + +The [execution platform](/extending/platforms) for a test action is determined +via [toolchain resolution](/extending/toolchains#toolchain-resolution), just +like for any other action. Each test rule has an implicitly defined [ +`test` exec group](/extending/exec-groups#exec-groups-for-native-rules) that, +unless overridden, has a mandatory toolchain requirement on +`@bazel_tools//tools/test:default_test_toolchain_type`. + +Toolchains of this type do not carry any data in the form of providers, but can +be used to influence the execution platform of the test action. + +Bazel registers two such toolchains, which take effect if users don't explicitly +define their own:: + +* If `--@bazel_tools//tools/test:incompatible_use_default_test_toolchain` is + enabled (**default**), the active test toolchain is + `@bazel_tools//tools/test:default_test_toolchain`. This toolchain requires an + execution platform to match all of the test rule's target platform + constraints. + + In particular, the target platform is compatible with this toolchain + if it is also registered as an execution platform. If no such platform is + found, the test rule fails with a toolchain resolution error +* If `--@bazel_tools//tools/test:incompatible_use_default_test_toolchain` is + disabled, the active test toolchain is + `@bazel_tools//tools/test:legacy_test_toolchain`. This toolchain does not + impose any constraints and thus test actions without manually specified exec + constraints are configured for the first registered execution platform. + + This is often not the intended behavior in multi-platform builds as it can + result in, for example, a test binary built for Linux on a Windows machine to + be executed on Windows. + + As a legacy setting, expect this option to be unavailable in a future Bazel + release. + +Users can register additional toolchains for this type to influence this +behavior and their toolchains will take precedence over the default ones. +Test rule authors can define their own test toolchain type and also register +a default toolchain for it. + +## Tag conventions {:#tag-conventions} + +Some tags in the test rules have a special meaning. +See also the +[Bazel Build Encyclopedia on the `tags` attribute] +(/reference/be/common-definitions#common.tags). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TagMeaning
    exclusiverun no other test at the same time
    externaltest has an external dependency; disable test caching
    largetest_suite convention; suite of large tests
    manual *don't include test target in wildcard target patterns like + :..., :*, or :all
    mediumtest_suite convention; suite of medium tests
    smalltest_suite convention; suite of small tests
    smoketest_suite convention; means it should be run before + committing code changes into the version control system
    + +Note: bazel `query` does not respect the manual tag. + +## Runfiles {:#runfiles} + +In the following, assume there is a *_binary() rule labeled +`//foo/bar:unittest`, with a run-time dependency on the rule labeled +`//deps/server:server`. + +#### Location {:#runfiles-location} + +The runfiles directory for a target `//foo/bar:unittest` is the directory +`$(WORKSPACE)/$(BINDIR)/foo/bar/unittest.runfiles`. This path is referred to as +the `runfiles_dir`. + +#### Dependencies {:#runfiles-dependencies} + +The runfiles directory is declared as a compile-time dependency of the +`*_binary()` rule. The runfiles directory itself depends on the set of BUILD +files that affect the `*_binary()` rule or any of its compile-time or run-time +dependencies. Modifying source files does not affect the structure of the +runfiles directory, and thus does not trigger any rebuilding. + +#### Contents {:#runfiles-contents} + +The runfiles directory contains the following: + +* **Symlinks to run-time dependencies**: each OutputFile and CommandRule that + is a run-time dependency of the `*_binary()` rule is represented by one + symlink in the runfiles directory. The name of the symlink is + `$(WORKSPACE)/package_name/rule_name`. For example, the symlink for server + would be named `$(WORKSPACE)/deps/server/server`, and the full path would be + `$(WORKSPACE)/foo/bar/unittest.runfiles/$(WORKSPACE)/deps/server/server`. + The destination of the symlink is the OutputFileName() of the OutputFile or + CommandRule, expressed as an absolute path. Thus, the destination of the + symlink might be `$(WORKSPACE)/linux-dbg/deps/server/42/server`. diff --git a/remote/cache-local.mdx b/remote/cache-local.mdx index a3415a642..6973c90b2 100644 --- a/remote/cache-local.mdx +++ b/remote/cache-local.mdx @@ -52,14 +52,14 @@ the steps in this section. cannot cache. Check the output of your Bazel invocation for warnings, such as: - ```none + ```none WARNING: Error reading from the remote cache: ``` or - ```none + ```none WARNING: Error writing to the remote cache: ``` diff --git a/remote/dynamic.mdx b/remote/dynamic.mdx new file mode 100644 index 000000000..8dd0bafd2 --- /dev/null +++ b/remote/dynamic.mdx @@ -0,0 +1,178 @@ +--- +title: 'Dynamic Execution' +--- + +__Dynamic execution__ is a feature in Bazel where local and remote execution of +the same action are started in parallel, using the output from the first branch +that finishes, cancelling the other branch. It combines the execution power +and/or large shared cache of a remote build system with the low latency of local +execution, providing the best of both worlds for clean and incremental builds +alike. + +This page describes how to enable, tune, and debug dynamic execution. If you +have both local and remote execution set up and are trying to adjust Bazel +settings for better performance, this page is for you. If you don't already have +remote execution set up, go to the Bazel [Remote Execution +Overview](/remote/rbe) first. + +## Enabling dynamic execution? {:#enabling-dynamic-execution} + +The dynamic execution module is part of Bazel, but to make use of dynamic +execution, you must already be able to compile both locally and remotely from +the same Bazel setup. + +To enable the dynamic execution module, pass the `--internal_spawn_scheduler` +flag to Bazel. This adds a new execution strategy called `dynamic`. You can now +use this as your strategy for the mnemonics you want to run dynamically, such as +`--strategy=Javac=dynamic`. See the next section for how to pick which mnemonics +to enable dynamic execution for. + +For any mnemonic using the dynamic strategy, the remote execution strategies are +taken from the `--dynamic_remote_strategy` flag, and local strategies from the +`--dynamic_local_strategy` flag. Passing +`--dynamic_local_strategy=worker,sandboxed` sets the default for the local +branch of dynamic execution to try with workers or sandboxed execution in that +order. Passing `--dynamic_local_strategy=Javac=worker` overrides the default for +the Javac mnemonic only. The remote version works the same way. Both flags can +be specified multiple times. If an action cannot be executed locally, it is +executed remotely as normal, and vice-versa. + +If your remote system has a cache, the `--dynamic_local_execution_delay` flag +adds a delay in milliseconds to the local execution after the remote system has +indicated a cache hit. This avoids running local execution when more cache hits +are likely. The default value is 1000ms, but should be tuned to being just a bit +longer than cache hits usually take. The actual time depends both on the remote +system and on how long a round-trip takes. Usually, the value will be the same +for all users of a given remote system, unless some of them are far enough away +to add roundtrip latency. You can use the [Bazel profiling +features](/rules/performance#performance-profiling) to look at how long typical +cache hits take. + +Dynamic execution can be used with local sandboxed strategy as well as with +[persistent workers](/remote/persistent). Persistent workers will automatically +run with sandboxing when used with dynamic execution, and cannot use [multiplex +workers](/remote/multiplex). On Darwin and Windows systems, the sandboxed +strategy can be slow; you can pass `--reuse_sandbox_directories` to reduce +overhead of creating sandboxes on these systems. + +Dynamic execution can also run with the `standalone` strategy, though since the +`standalone` strategy must take the output lock when it starts executing, it +effectively blocks the remote strategy from finishing first. The +`--experimental_local_lockfree_output` flag enables a way around this problem by +allowing the local execution to write directly to the output, but be aborted by +the remote execution, should that finish first. + +If one of the branches of dynamic execution finishes first but is a failure, the +entire action fails. This is an intentional choice to prevent differences +between local and remote execution from going unnoticed. + +For more background on how dynamic execution and its locking works, see Julio +Merino's excellent [blog +posts](https://jmmv.dev/series/bazel-dynamic-execution/){: .external} + +## When should I use dynamic execution? {:#when-to-use} + +Dynamic execution requires some form of [remote execution system](/remote/rbe). +It is not currently possible to use a cache-only remote system, as a cache miss +would be considered a failed action. + +Not all types of actions are well suited for remote execution. The best +candidates are those that are inherently faster locally, for instance through +the use of [persistent workers](/remote/persistent), or those that run fast +enough that the overhead of remote execution dominates execution time. Since +each locally executed action locks some amount of CPU and memory resources, +running actions that don't fall into those categories merely delays execution +for those that do. + +As of release +[5.0.0-pre.20210708.4](https://github.com/bazelbuild/bazel/releases/tag/5.0.0-pre.20210708.4){: .external}, +[performance profiling](/rules/performance#performance-profiling) contains data +about worker execution, including time spent finishing a work request after +losing a dynamic execution race. If you see dynamic execution worker threads +spending significant time acquiring resources, or a lot of time in the +`async-worker-finish`, you may have some slow local actions delaying the worker +threads. + +

    +Profiling data with poor dynamic execution performance +

    + +In the profile above, which uses 8 Javac workers, we see many Javac workers +having lost the races and finishing their work on the `async-worker-finish` +threads. This was caused by a non-worker mnemonic taking enough resources to +delay the workers. + +

    +Profiling data with better dynamic execution performance +

    + +When only Javac is run with dynamic execution, only about half of the started +workers end up losing the race after starting their work. + +The previously recommended `--experimental_spawn_scheduler` flag is deprecated. +It turns on dynamic execution and sets `dynamic` as the default strategy for all +mnemonics, which would often lead to these kinds of problems. + +## Performance {:#performance} + +The dynamic execution approach assumes there are enough resources available +locally and remotely that it's worth spending some extra resources to improve +overall performance. But excessive resource usage may slow down Bazel itself or +the machine it runs on, or put unexpected pressure on a remote system. There are +several options for changing the behaviour of dynamic execution: + +`--dynamic_local_execution_delay` delays the start of a local branch by a number +of milliseconds after the remote branch has started, but only if there has been +a remote cache hit during the current build. This makes builds that benefit +from remote caching not waste local resources when it is likely that most +outputs can be found in the cache. Depending on the quality of the cache, +reducing this might improve build speeds, at the cost of using more local +resources. + +`--experimental_dynamic_local_load_factor` is an experimental advanced resource +management option. It takes a value from 0 to 1, 0 turning off this feature. +When set to a value above 0, Bazel adjusts the number of +locally scheduled actions when many actions waiting to +be scheduled. Setting it to 1 allows as many actions to be scheduled as there +are CPUs available (as per `--local_resources`). Lower values set the number +of actions scheduled to correspondingly fewer as higher numbers of actions are +available to run. This may sound counter-intuitive, but with a good remote +system, local execution does not help much when many actions are being run, and +the local CPU is better spent managing remote actions. + +`--experimental_dynamic_slow_remote_time` prioritizes starting local branches +when the remote branch has been running for at least this long. Normally the +most recently scheduled action gets priority, as it has the greatest chance of +winning the race, but if the remote system sometimes hangs or takes extra long, +this can get a build to move along. This is not enabled by default, because it +could hide issues with the remote system that should rather be fixed. Make sure +to monitor your remote system performance if you enable this option. + +`--experimental_dynamic_ignore_local_signals` can be used to let the remote +branch take over when a local spawn exits due to a given signal. This is +is mainly useful together with worker resource limits (see +[`--experimental_worker_memory_limit_mb`](https://bazel.build/reference/command-line-reference#flag--experimental_worker_memory_limit_mb), +[`--experimental_worker_sandbox_hardening`](https://bazel.build/reference/command-line-reference#flag--experimental_worker_sandbox_hardening), +and +[`--experimental_sandbox_memory_limit_mb`)](https://bazel.build/reference/command-line-reference#flag--experimental_sandbox_memory_limit_mb)), +where worker processes may be killed when they use too many resources. + +The [JSON trace profile](/advanced/performance/json-trace-profile) contains a +number of performance-related graphs that can help identify ways to improve the +trade-off of performance and resource usage. + +## Troubleshooting {:#troubleshooting} + +Problems with dynamic execution can be subtle and hard to debug, as they can +manifest only under some specific combinations of local and remote execution. +The `--debug_spawn_scheduler` adds extra output from the dynamic execution +system that can help debug these problems. You can also adjust the +`--dynamic_local_execution_delay` flag and number of remote vs. local jobs to +make it easier to reproduce the problems. + +If you are experiencing problems with dynamic execution using the `standalone` +strategy, try running without `--experimental_local_lockfree_output`, or run +your local actions sandboxed. This may slow down your build a bit (see above if +you're on Mac or Windows), but removes some possible causes for failures. \ No newline at end of file diff --git a/remote/output-directories.mdx b/remote/output-directories.mdx index 91e968eb3..f3af3a72a 100644 --- a/remote/output-directories.mdx +++ b/remote/output-directories.mdx @@ -25,8 +25,8 @@ Requirements for an output directory layout: The solution that's currently implemented: -* Bazel must be invoked from a directory containing a repository boundary file, -or a subdirectory thereof. In other words, Bazel must be invoked from inside a +* Bazel must be invoked from a directory containing a repo boundary file, or a + subdirectory thereof. In other words, Bazel must be invoked from inside a [repository](../external/overview#repository). Otherwise, an error is reported. * The _outputRoot_ directory defaults to ~/.cache/bazel on Linux, @@ -37,15 +37,15 @@ or a subdirectory thereof. In other words, Bazel must be invoked from inside a is set on either Linux or macOS, the value `${XDG_CACHE_HOME}/bazel` will override the default. If the environment variable `$TEST_TMPDIR` is set, as in a test of Bazel itself, then that value overrides any defaults. - * Note that Bazel 8.x and earlier on macOS used `/private/var/tmp` as _outputR - oot_,and ignored `$XDG_CACHE_HOME`. + * Note that Bazel 8.x and earlier on macOS used `/private/var/tmp` as _outputRoot_, + and ignored `$XDG_CACHE_HOME`. * The Bazel user's build state is located beneath `outputRoot/_bazel_$USER`. This is called the _outputUserRoot_ directory. * Beneath the `outputUserRoot` directory there is an `install` directory, and in it is an `installBase` directory whose name is the MD5 hash of the Bazel installation manifest. * Beneath the `outputUserRoot` directory, an `outputBase` directory - is also created whose name is the MD5 hash of the path of the workspace + is also created whose name is the MD5 hash of the path name of the workspace root. So, for example, if Bazel is running in the workspace root `/home/user/src/my-project` (or in a directory symlinked to that one), then an output base directory is created called: diff --git a/rules/lib/builtins.mdx b/rules/lib/builtins.mdx index da1e7ea57..fd86936c8 100644 --- a/rules/lib/builtins.mdx +++ b/rules/lib/builtins.mdx @@ -2,67 +2,66 @@ title: 'Built-in Types' --- - This section lists types of Starlark objects. With some exceptions, these type names are not valid Starlark symbols; instances of them may be acquired through different means. -- [Action](/rules/lib/builtins/Action) -- [actions](/rules/lib/builtins/actions) -- [apple\_platform](/rules/lib/builtins/apple_platform) -- [Args](/rules/lib/builtins/Args) -- [Aspect](/rules/lib/builtins/Aspect) -- [Attribute](/rules/lib/builtins/Attribute) -- [bazel\_module](/rules/lib/builtins/bazel_module) -- [bazel\_module\_tags](/rules/lib/builtins/bazel_module_tags) -- [BuildSetting](/rules/lib/builtins/BuildSetting) -- [CcCompilationOutputs](/rules/lib/builtins/CcCompilationOutputs) -- [CcLinkingOutputs](/rules/lib/builtins/CcLinkingOutputs) -- [CompilationContext](/rules/lib/builtins/CompilationContext) -- [configuration](/rules/lib/builtins/configuration) -- [ctx](/rules/lib/builtins/ctx) -- [depset](/rules/lib/builtins/depset) -- [DirectoryExpander](/rules/lib/builtins/DirectoryExpander) -- [DottedVersion](/rules/lib/builtins/DottedVersion) -- [exec\_result](/rules/lib/builtins/exec_result) -- [ExecGroupCollection](/rules/lib/builtins/ExecGroupCollection) -- [ExecGroupContext](/rules/lib/builtins/ExecGroupContext) -- [ExecTransitionFactory](/rules/lib/builtins/ExecTransitionFactory) -- [ExpandedDirectory](/rules/lib/builtins/ExpandedDirectory) -- [extension\_metadata](/rules/lib/builtins/extension_metadata) -- [Facts](/rules/lib/builtins/Facts) -- [FeatureConfiguration](/rules/lib/builtins/FeatureConfiguration) -- [File](/rules/lib/builtins/File) -- [fragments](/rules/lib/builtins/fragments) -- [java\_annotation\_processing](/rules/lib/builtins/java_annotation_processing) -- [Label](/rules/lib/builtins/Label) -- [LateBoundDefault](/rules/lib/builtins/LateBoundDefault) -- [LibraryToLink](/rules/lib/builtins/LibraryToLink) -- [License](/rules/lib/builtins/License) -- [LinkerInput](/rules/lib/builtins/LinkerInput) -- [LinkingContext](/rules/lib/builtins/LinkingContext) -- [macro](/rules/lib/builtins/macro) -- [mapped\_root](/rules/lib/builtins/mapped_root) -- [module\_ctx](/rules/lib/builtins/module_ctx) -- [path](/rules/lib/builtins/path) -- [propagation\_ctx](/rules/lib/builtins/propagation_ctx) -- [Provider](/rules/lib/builtins/Provider) -- [repo\_metadata](/rules/lib/builtins/repo_metadata) -- [repository\_ctx](/rules/lib/builtins/repository_ctx) -- [repository\_os](/rules/lib/builtins/repository_os) -- [repository\_rule](/rules/lib/builtins/repository_rule) -- [root](/rules/lib/builtins/root) -- [rule](/rules/lib/builtins/rule) -- [rule\_attributes](/rules/lib/builtins/rule_attributes) -- [runfiles](/rules/lib/builtins/runfiles) -- [struct](/rules/lib/builtins/struct) -- [Subrule](/rules/lib/builtins/Subrule) -- [subrule\_ctx](/rules/lib/builtins/subrule_ctx) -- [SymlinkEntry](/rules/lib/builtins/SymlinkEntry) -- [tag\_class](/rules/lib/builtins/tag_class) -- [Target](/rules/lib/builtins/Target) -- [template\_ctx](/rules/lib/builtins/template_ctx) -- [TemplateDict](/rules/lib/builtins/TemplateDict) -- [toolchain\_type](/rules/lib/builtins/toolchain_type) -- [ToolchainContext](/rules/lib/builtins/ToolchainContext) -- [transition](/rules/lib/builtins/transition) -- [wasm\_exec\_result](/rules/lib/builtins/wasm_exec_result) -- [wasm\_module](/rules/lib/builtins/wasm_module) +* [Action](/rules/lib/builtins/Action) +* [actions](/rules/lib/builtins/actions) +* [apple\_platform](/rules/lib/builtins/apple_platform) +* [Args](/rules/lib/builtins/Args) +* [Aspect](/rules/lib/builtins/Aspect) +* [Attribute](/rules/lib/builtins/Attribute) +* [bazel\_module](/rules/lib/builtins/bazel_module) +* [bazel\_module\_tags](/rules/lib/builtins/bazel_module_tags) +* [BuildSetting](/rules/lib/builtins/BuildSetting) +* [CcCompilationOutputs](/rules/lib/builtins/CcCompilationOutputs) +* [CcLinkingOutputs](/rules/lib/builtins/CcLinkingOutputs) +* [CompilationContext](/rules/lib/builtins/CompilationContext) +* [configuration](/rules/lib/builtins/configuration) +* [ctx](/rules/lib/builtins/ctx) +* [depset](/rules/lib/builtins/depset) +* [DirectoryExpander](/rules/lib/builtins/DirectoryExpander) +* [DottedVersion](/rules/lib/builtins/DottedVersion) +* [exec\_result](/rules/lib/builtins/exec_result) +* [ExecGroupCollection](/rules/lib/builtins/ExecGroupCollection) +* [ExecGroupContext](/rules/lib/builtins/ExecGroupContext) +* [ExecTransitionFactory](/rules/lib/builtins/ExecTransitionFactory) +* [ExpandedDirectory](/rules/lib/builtins/ExpandedDirectory) +* [extension\_metadata](/rules/lib/builtins/extension_metadata) +* [Facts](/rules/lib/builtins/Facts) +* [FeatureConfiguration](/rules/lib/builtins/FeatureConfiguration) +* [File](/rules/lib/builtins/File) +* [fragments](/rules/lib/builtins/fragments) +* [java\_annotation\_processing](/rules/lib/builtins/java_annotation_processing) +* [Label](/rules/lib/builtins/Label) +* [LateBoundDefault](/rules/lib/builtins/LateBoundDefault) +* [LibraryToLink](/rules/lib/builtins/LibraryToLink) +* [License](/rules/lib/builtins/License) +* [LinkerInput](/rules/lib/builtins/LinkerInput) +* [LinkingContext](/rules/lib/builtins/LinkingContext) +* [macro](/rules/lib/builtins/macro) +* [mapped\_root](/rules/lib/builtins/mapped_root) +* [module\_ctx](/rules/lib/builtins/module_ctx) +* [path](/rules/lib/builtins/path) +* [propagation\_ctx](/rules/lib/builtins/propagation_ctx) +* [Provider](/rules/lib/builtins/Provider) +* [repo\_metadata](/rules/lib/builtins/repo_metadata) +* [repository\_ctx](/rules/lib/builtins/repository_ctx) +* [repository\_os](/rules/lib/builtins/repository_os) +* [repository\_rule](/rules/lib/builtins/repository_rule) +* [root](/rules/lib/builtins/root) +* [rule](/rules/lib/builtins/rule) +* [rule\_attributes](/rules/lib/builtins/rule_attributes) +* [runfiles](/rules/lib/builtins/runfiles) +* [struct](/rules/lib/builtins/struct) +* [Subrule](/rules/lib/builtins/Subrule) +* [subrule\_ctx](/rules/lib/builtins/subrule_ctx) +* [SymlinkEntry](/rules/lib/builtins/SymlinkEntry) +* [tag\_class](/rules/lib/builtins/tag_class) +* [Target](/rules/lib/builtins/Target) +* [template\_ctx](/rules/lib/builtins/template_ctx) +* [TemplateDict](/rules/lib/builtins/TemplateDict) +* [toolchain\_type](/rules/lib/builtins/toolchain_type) +* [ToolchainContext](/rules/lib/builtins/ToolchainContext) +* [transition](/rules/lib/builtins/transition) +* [wasm\_exec\_result](/rules/lib/builtins/wasm_exec_result) +* [wasm\_module](/rules/lib/builtins/wasm_module) \ No newline at end of file diff --git a/rules/lib/builtins/Action.mdx b/rules/lib/builtins/Action.mdx index 4236324de..a73471a9b 100644 --- a/rules/lib/builtins/Action.mdx +++ b/rules/lib/builtins/Action.mdx @@ -2,24 +2,22 @@ title: 'Action' --- - - An action created during rule analysis. -This object is visible for the purpose of testing, and may be obtained from an `Actions` provider. It is normally not necessary to access `Action` objects or their fields within a rule's implementation function. You may instead want to see the [Rules page](https://bazel.build/extending/rules#actions) for a general discussion of how to use actions when defining custom rules, or the [API reference](../builtins/actions.html) for creating actions. +This object is visible for the purpose of testing, and may be obtained from an `Actions` provider. It is normally not necessary to access `Action` objects or their fields within a rule's implementation function. You may instead want to see the [Rules page](https://bazel.build/extending/rules#actions) for a general discussion of how to use actions when defining custom rules, or the [API reference](../builtins/actions) for creating actions. Some fields of this object are only applicable for certain kinds of actions. Fields that are inapplicable are set to `None`. ## Members -- [args](#args) -- [argv](#argv) -- [content](#content) -- [env](#env) -- [inputs](#inputs) -- [mnemonic](#mnemonic) -- [outputs](#outputs) -- [substitutions](#substitutions) +* [args](#args) +* [argv](#argv) +* [content](#content) +* [env](#env) +* [inputs](#inputs) +* [mnemonic](#mnemonic) +* [outputs](#outputs) +* [substitutions](#substitutions) ## args @@ -27,23 +25,19 @@ Some fields of this object are only applicable for certain kinds of actions. Fie sequence Action.args ``` - A list of frozen [Args](../builtins/Args.html) objects containing information about the action arguments. These objects contain accurate argument information, including arguments involving expanded action output directories. However, [Args](../builtins/Args.html) objects are not readable in the analysis phase. For a less accurate account of arguments which is available in the analysis phase, see [argv](#argv). +A list of frozen [Args](../builtins/Args) objects containing information about the action arguments. These objects contain accurate argument information, including arguments involving expanded action output directories. However, [Args](../builtins/Args) objects are not readable in the analysis phase. For a less accurate account of arguments which is available in the analysis phase, see [argv](#argv). Note that some types of actions do not yet support exposure of this field. For such action types, this is `None`. May return `None`. - - ## argv ``` sequence Action.argv ``` - For actions created by [ctx.actions.run()](../builtins/actions.html#run) or [ctx.actions.run\_shell()](../builtins/actions.html#run_shell) an immutable list of the arguments for the command line to be executed. Note that for shell actions the first two arguments will be the shell path and `"-c"`. - May return `None`. - - +For actions created by [ctx.actions.run()](../builtins/actions#run) or [ctx.actions.run\_shell()](../builtins/actions#run_shell) an immutable list of the arguments for the command line to be executed. Note that for shell actions the first two arguments will be the shell path and `"-c"`. +May return `None`. ## content @@ -51,10 +45,8 @@ sequence Action.argv string Action.content ``` - For actions created by [ctx.actions.write()](../builtins/actions.html#write) or [ctx.actions.expand\_template()](../builtins/actions.html#expand_template), the contents of the file to be written, if those contents can be computed during the analysis phase. The value is `None` if the contents cannot be determined until the execution phase, such as when a directory in an [Args](../builtins/Args.html) object needs to be expanded. - May return `None`. - - +For actions created by [ctx.actions.write()](../builtins/actions#write) or [ctx.actions.expand\_template()](../builtins/actions#expand_template), the contents of the file to be written, if those contents can be computed during the analysis phase. The value is `None` if the contents cannot be determined until the execution phase, such as when a directory in an [Args](../builtins/Args) object needs to be expanded. +May return `None`. ## env @@ -62,9 +54,7 @@ string Action.content dict Action.env ``` - The 'fixed' environment variables for this action. This includes only environment settings which are explicitly set by the action definition, and thus omits settings which are only pre-set in the execution environment. - - +The 'fixed' environment variables for this action. This includes only environment settings which are explicitly set by the action definition, and thus omits settings which are only pre-set in the execution environment. ## inputs @@ -72,9 +62,7 @@ dict Action.env depset Action.inputs ``` - A set of the input files of this action. - - +A set of the input files of this action. ## mnemonic @@ -82,9 +70,7 @@ depset Action.inputs string Action.mnemonic ``` - The mnemonic for this action. - - +The mnemonic for this action. ## outputs @@ -92,9 +78,7 @@ string Action.mnemonic depset Action.outputs ``` - A set of the output files of this action. - - +A set of the output files of this action. ## substitutions @@ -102,5 +86,5 @@ depset Action.outputs dict Action.substitutions ``` - For actions created by [ctx.actions.expand\_template()](../builtins/actions.html#expand_template), an immutable dict holding the substitution mapping. - May return `None`. +For actions created by [ctx.actions.expand\_template()](../builtins/actions#expand_template), an immutable dict holding the substitution mapping. +May return `None`. \ No newline at end of file diff --git a/rules/lib/builtins/Args.mdx b/rules/lib/builtins/Args.mdx index 7710c4c48..b7011baa4 100644 --- a/rules/lib/builtins/Args.mdx +++ b/rules/lib/builtins/Args.mdx @@ -2,24 +2,19 @@ title: 'Args' --- - - An object that encapsulates, in a memory-efficient way, the data needed to build part or all of a command line. -It often happens that an action requires a large command line containing values accumulated from transitive dependencies. For example, a linker command line might list every object file needed by all of the libraries being linked. It is best practice to store such transitive data in [`depset`](../builtins/depset.html) s, so that they can be shared by multiple targets. However, if the rule author had to convert these depsets into lists of strings in order to construct an action command line, it would defeat this memory-sharing optimization. +It often happens that an action requires a large command line containing values accumulated from transitive dependencies. For example, a linker command line might list every object file needed by all of the libraries being linked. It is best practice to store such transitive data in [`depset`](../builtins/depset)s, so that they can be shared by multiple targets. However, if the rule author had to convert these depsets into lists of strings in order to construct an action command line, it would defeat this memory-sharing optimization. For this reason, the action-constructing functions accept `Args` objects in addition to strings. Each `Args` object represents a concatenation of strings and depsets, with optional transformations for manipulating the data. `Args` objects do not process the depsets they encapsulate until the execution phase, when it comes time to calculate the command line. This helps defer any expensive copying until after the analysis phase is complete. See the [Optimizing Performance](https://bazel.build/rules/performance) page for more information. -`Args` are constructed by calling [`ctx.actions.args()`](../builtins/actions.html#args). They can be passed as the `arguments` parameter of [`ctx.actions.run()`](../builtins/actions.html#run) or [`ctx.actions.run_shell()`](../builtins/actions.html#run_shell). Each mutation of an `Args` object appends values to the eventual command line. +`Args` are constructed by calling [`ctx.actions.args()`](../builtins/actions#args). They can be passed as the `arguments` parameter of [`ctx.actions.run()`](../builtins/actions#run) or [`ctx.actions.run_shell()`](../builtins/actions#run_shell). Each mutation of an `Args` object appends values to the eventual command line. The `map_each` feature allows you to customize how items are transformed into strings. If you do not provide a `map_each` function, the standard conversion is as follows: -- Values that are already strings are left as-is. -- [`File`](../builtins/File.html) objects are turned into their `File.path` values. -- [`Label`](../builtins/Label.html) objects are turned into a string representation that resolves back to the same object when resolved in the context of the main repository. If possible, the string representation uses the apparent name of a repository in favor of the repository's canonical name, which makes this representation suited for use in BUILD files. While the exact form of the representation is not guaranteed, typical examples are `//foo:bar`, `@repo//foo:bar` and `@@canonical_name+//foo:bar.bzl`. -- All other types are turned into strings in an _unspecified_ manner. For this reason, you should avoid passing values that are not of string or `File` type to `add()`, and if you pass them to `add_all()` or `add_joined()` then you should provide a `map_each` function. +* Values that are already strings are left as-is.* [`File`](../builtins/File) objects are turned into their `File.path` values.* [`Label`](../builtins/Label) objects are turned into a string representation that resolves back to the same object when resolved in the context of the main repository. If possible, the string representation uses the apparent name of a repository in favor of the repository's canonical name, which makes this representation suited for use in BUILD files. While the exact form of the representation is not guaranteed, typical examples are `//foo:bar`, `@repo//foo:bar` and `@@canonical_name+//foo:bar.bzl`.* All other types are turned into strings in an *unspecified* manner. For this reason, you should avoid passing values that are not of string or `File` type to `add()`, and if you pass them to `add_all()` or `add_joined()` then you should provide a `map_each` function. -When using string formatting ( `format`, `format_each`, and `format_joined` params of the `add*()` methods), the format template is interpreted in the same way as `%`-substitution on strings, except that the template must have exactly one substitution placeholder and it must be `%s`. Literal percents may be escaped as `%%`. Formatting is applied after the value is converted to a string as per the above. +When using string formatting (`format`, `format_each`, and `format_joined` params of the `add*()` methods), the format template is interpreted in the same way as `%`-substitution on strings, except that the template must have exactly one substitution placeholder and it must be `%s`. Literal percents may be escaped as `%%`. Formatting is applied after the value is converted to a string as per the above. Each of the `add*()` methods have an alternate form that accepts an extra positional parameter, an "arg name" string to insert before the rest of the arguments. For `add_all` and `add_joined` the extra string will not be added if the sequence turns out to be empty. For instance, the same usage can add either `--foo val1 val2 val3 --bar` or just `--bar` to the command line, depending on whether the given sequence contains `val1..val3` or is empty. @@ -29,7 +24,6 @@ Example: Suppose we wanted to generate the command line: ``` --foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz - ``` We could use the following `Args` object: @@ -46,16 +40,15 @@ ctx.actions.run( arguments = [args], ... ) - ``` ## Members -- [add](#add) -- [add\_all](#add_all) -- [add\_joined](#add_joined) -- [set\_param\_file\_format](#set_param_file_format) -- [use\_param\_file](#use_param_file) +* [add](#add) +* [add\_all](#add_all) +* [add\_joined](#add_joined) +* [set\_param\_file\_format](#set_param_file_format) +* [use\_param\_file](#use_param_file) ## add @@ -63,24 +56,15 @@ ctx.actions.run( Args Args.add(arg_name_or_value, value=unbound, *, format=None) ``` - Appends an argument to this command line. - +Appends an argument to this command line. ### Parameters -ParameterDescription`arg_name_or_value` - required - - If two positional parameters are passed this is interpreted as the arg name. The arg name is added before the value without any processing. If only one positional parameter is passed, it is interpreted as `value` (see below). - `value` - default is `unbound` - - The object to append. It will be converted to a string using the standard conversion mentioned above. Since there is no `map_each` parameter for this function, `value` should be either a string or a `File`. A list, tuple, depset, or directory `File` must be passed to [`add_all()` or](#add_all) [`add_joined()`](#add_joined) instead of this method. - `format`[string](../core/string.html); or `None`; - default is `None` - - A format string pattern, to be applied to the stringified version of `value`. - +| Parameter | Description | +| --- | --- | +| `arg_name_or_value` | required If two positional parameters are passed this is interpreted as the arg name. The arg name is added before the value without any processing. If only one positional parameter is passed, it is interpreted as `value` (see below). | +| `value` | default is `unbound` The object to append. It will be converted to a string using the standard conversion mentioned above. Since there is no `map_each` parameter for this function, `value` should be either a string or a `File`. A list, tuple, depset, or directory `File` must be passed to [`add_all()` or [`add_joined()`](#add_joined) instead of this method.](#add_all) | +| `format` | [string](../core/string); or `None`; default is `None` A format string pattern, to be applied to the stringified version of `value`. | ## add\_all @@ -88,82 +72,29 @@ ParameterDescription`arg_name_or_value` Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False) ``` - Appends multiple arguments to this command line. The items are processed lazily during the execution phase. +Appends multiple arguments to this command line. The items are processed lazily during the execution phase. Most of the processing occurs over a list of arguments to be appended, as per the following steps: -1. Each directory `File` item is replaced by all `File` s recursively contained in that directory. -2. If `map_each` is given, it is applied to each item, and the resulting lists of strings are concatenated to form the initial argument list. Otherwise, the initial argument list is the result of applying the standard conversion to each item. -3. Each argument in the list is formatted with `format_each`, if present. -4. If `uniquify` is true, duplicate arguments are removed. The first occurrence is the one that remains. -5. If a `before_each` string is given, it is inserted as a new argument before each existing argument in the list. This effectively doubles the number of arguments to be appended by this point. -6. Except in the case that the list is empty and `omit_if_empty` is true (the default), the arg name and `terminate_with` are inserted as the first and last arguments, respectively, if they are given. +1. Each directory `File` item is replaced by all `File`s recursively contained in that directory. +2. If `map_each` is given, it is applied to each item, and the resulting lists of strings are concatenated to form the initial argument list. Otherwise, the initial argument list is the result of applying the standard conversion to each item.- Each argument in the list is formatted with `format_each`, if present.- If `uniquify` is true, duplicate arguments are removed. The first occurrence is the one that remains.- If a `before_each` string is given, it is inserted as a new argument before each existing argument in the list. This effectively doubles the number of arguments to be appended by this point.- Except in the case that the list is empty and `omit_if_empty` is true (the default), the arg name and `terminate_with` are inserted as the first and last arguments, respectively, if they are given. Note that empty strings are valid arguments that are subject to all these processing steps. - ### Parameters -ParameterDescription`arg_name_or_values` - required - - If two positional parameters are passed this is interpreted as the arg name. The arg name is added before the `values` as a separate argument without any processing. This arg name will not be added if `omit_if_empty` is true (the default) and no other items are appended (as happens if `values` is empty or all of its items are filtered). If only one positional parameter is passed, it is interpreted as `values` (see below). - `values`[sequence](../core/list.html); or [depset](../builtins/depset.html); - default is `unbound` - - The list, tuple, or depset whose items will be appended. - `map_each` - callable; or `None`; - default is `None` - - A function that converts each item to zero or more strings, which may be further processed before appending. If this param is not provided, the standard conversion is used. - -The function is passed either one or two positional arguments: the item to convert, followed by an optional [`DirectoryExpander`](../builtins/DirectoryExpander.html). The second argument will be passed only if the supplied function is user-defined (not built-in) and declares more than one parameter. - -The return value's type depends on how many arguments are to be produced for the item: - -- In the common case when each item turns into one string, the function should return that string. -- If the item is to be filtered out entirely, the function should return `None`. -- If the item turns into multiple strings, the function returns a list of those strings. - -Returning a single string or `None` has the same effect as returning a list of length 1 or length 0 respectively. However, it is more efficient and readable to avoid creating a list where it is not needed. - -Ordinarily, items that are directories are automatically expanded to their contents when `expand_directories=True` is set. However, this will not expand directories contained inside other values -- for instance, when the items are structs that have directories as fields. In this situation, the `DirectoryExpander` argument can be applied to manually obtain the files of a given directory. - -To avoid unintended retention of large analysis-phase data structures into the execution phase, the `map_each` function must be declared by a top-level `def` statement; it may not be a nested function closure by default. - -_Warning:_ [`print()`](../globals/all.html#print) statements that are executed during the call to `map_each` will not produce any visible output. - - -`format_each`[string](../core/string.html); or `None`; - default is `None` - - An optional format string pattern, applied to each string returned by the `map_each` function. The format string must have exactly one '%s' placeholder. - `before_each`[string](../core/string.html); or `None`; - default is `None` - - An optional argument to append before each argument derived from `values` is appended. - `omit_if_empty`[bool](../core/bool.html); - default is `True` - - If true, if there are no arguments derived from `values` to be appended, then all further processing is suppressed and the command line will be unchanged. If false, the arg name and `terminate_with`, if provided, will still be appended regardless of whether or not there are other arguments. - `uniquify`[bool](../core/bool.html); - default is `False` - - If true, duplicate arguments that are derived from `values` will be omitted. Only the first occurrence of each argument will remain. Usually this feature is not needed because depsets already omit duplicates, but it can be useful if `map_each` emits the same string for multiple items. - `expand_directories`[bool](../core/bool.html); - default is `True` - - If true, any directories in `values` will be expanded to a flat list of files. This happens before `map_each` is applied. - `terminate_with`[string](../core/string.html); or `None`; - default is `None` - - An optional argument to append after all other arguments. This argument will not be added if `omit_if_empty` is true (the default) and no other items are appended (as happens if `values` is empty or all of its items are filtered). - `allow_closure`[bool](../core/bool.html); - default is `False` - - If true, allows the use of closures in function parameters like `map_each`. Usually this isn't necessary and it risks retaining large analysis-phase data structures into the execution phase. - +| Parameter | Description | +| --- | --- | +| `arg_name_or_values` | required If two positional parameters are passed this is interpreted as the arg name. The arg name is added before the `values` as a separate argument without any processing. This arg name will not be added if `omit_if_empty` is true (the default) and no other items are appended (as happens if `values` is empty or all of its items are filtered). If only one positional parameter is passed, it is interpreted as `values` (see below). | +| `values` | [sequence](../core/list); or [depset](../builtins/depset); default is `unbound` The list, tuple, or depset whose items will be appended. | +| `map_each` | callable; or `None`; default is `None` A function that converts each item to zero or more strings, which may be further processed before appending. If this param is not provided, the standard conversion is used. The function is passed either one or two positional arguments: the item to convert, followed by an optional [`DirectoryExpander`](../builtins/DirectoryExpander). The second argument will be passed only if the supplied function is user-defined (not built-in) and declares more than one parameter. The return value's type depends on how many arguments are to be produced for the item: * In the common case when each item turns into one string, the function should return that string.* If the item is to be filtered out entirely, the function should return `None`.* If the item turns into multiple strings, the function returns a list of those strings. Returning a single string or `None` has the same effect as returning a list of length 1 or length 0 respectively. However, it is more efficient and readable to avoid creating a list where it is not needed. Ordinarily, items that are directories are automatically expanded to their contents when `expand_directories=True` is set. However, this will not expand directories contained inside other values -- for instance, when the items are structs that have directories as fields. In this situation, the `DirectoryExpander` argument can be applied to manually obtain the files of a given directory. To avoid unintended retention of large analysis-phase data structures into the execution phase, the `map_each` function must be declared by a top-level `def` statement; it may not be a nested function closure by default. *Warning:* [`print()`](../globals/all#print) statements that are executed during the call to `map_each` will not produce any visible output. | +| `format_each` | [string](../core/string); or `None`; default is `None` An optional format string pattern, applied to each string returned by the `map_each` function. The format string must have exactly one '%s' placeholder. | +| `before_each` | [string](../core/string); or `None`; default is `None` An optional argument to append before each argument derived from `values` is appended. | +| `omit_if_empty` | [bool](../core/bool); default is `True` If true, if there are no arguments derived from `values` to be appended, then all further processing is suppressed and the command line will be unchanged. If false, the arg name and `terminate_with`, if provided, will still be appended regardless of whether or not there are other arguments. | +| `uniquify` | [bool](../core/bool); default is `False` If true, duplicate arguments that are derived from `values` will be omitted. Only the first occurrence of each argument will remain. Usually this feature is not needed because depsets already omit duplicates, but it can be useful if `map_each` emits the same string for multiple items. | +| `expand_directories` | [bool](../core/bool); default is `True` If true, any directories in `values` will be expanded to a flat list of files. This happens before `map_each` is applied. | +| `terminate_with` | [string](../core/string); or `None`; default is `None` An optional argument to append after all other arguments. This argument will not be added if `omit_if_empty` is true (the default) and no other items are appended (as happens if `values` is empty or all of its items are filtered). | +| `allow_closure` | [bool](../core/bool); default is `False` If true, allows the use of closures in function parameters like `map_each`. Usually this isn't necessary and it risks retaining large analysis-phase data structures into the execution phase. | ## add\_joined @@ -171,57 +102,26 @@ _Warning:_ [`print()`](../globals/all.html#print) statements that are executed d Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False) ``` - Appends an argument to this command line by concatenating together multiple values using a separator. The items are processed lazily during the execution phase. +Appends an argument to this command line by concatenating together multiple values using a separator. The items are processed lazily during the execution phase. Processing is similar to [`add_all()`](#add_all), but the list of arguments derived from `values` is combined into a single argument as if by `join_with.join(...)`, and then formatted using the given `format_joined` string template. Unlike `add_all()`, there is no `before_each` or `terminate_with` parameter since these are not generally useful when the items are combined into a single argument. If after filtering there are no strings to join into an argument, and if `omit_if_empty` is true (the default), no processing is done. Otherwise if there are no strings to join but `omit_if_empty` is false, the joined string will be an empty string. - ### Parameters -ParameterDescription`arg_name_or_values` - required - - If two positional parameters are passed this is interpreted as the arg name. The arg name is added before `values` without any processing. This arg will not be added if `omit_if_empty` is true (the default) and there are no strings derived from `values` to join together (which can happen if `values` is empty or all of its items are filtered). If only one positional parameter is passed, it is interpreted as `values` (see below). - `values`[sequence](../core/list.html); or [depset](../builtins/depset.html); - default is `unbound` - - The list, tuple, or depset whose items will be joined. - `join_with`[string](../core/string.html); - required - - A delimiter string used to join together the strings obtained from applying `map_each` and `format_each`, in the same manner as [`string.join()`](../core/string.html#join). - `map_each` - callable; or `None`; - default is `None` - - Same as for [`add_all`](#add_all.map_each). - `format_each`[string](../core/string.html); or `None`; - default is `None` - - Same as for [`add_all`](#add_all.format_each). - `format_joined`[string](../core/string.html); or `None`; - default is `None` - - An optional format string pattern applied to the joined string. The format string must have exactly one '%s' placeholder. - `omit_if_empty`[bool](../core/bool.html); - default is `True` - - If true, if there are no strings to join together (either because `values` is empty or all its items are filtered), then all further processing is suppressed and the command line will be unchanged. If false, then even if there are no strings to join together, two arguments will be appended: the arg name followed by an empty string (which is the logical join of zero strings). - `uniquify`[bool](../core/bool.html); - default is `False` - - Same as for [`add_all`](#add_all.uniquify). - `expand_directories`[bool](../core/bool.html); - default is `True` - - Same as for [`add_all`](#add_all.expand_directories). - `allow_closure`[bool](../core/bool.html); - default is `False` - - Same as for [`add_all`](#add_all.allow_closure). - +| Parameter | Description | +| --- | --- | +| `arg_name_or_values` | required If two positional parameters are passed this is interpreted as the arg name. The arg name is added before `values` without any processing. This arg will not be added if `omit_if_empty` is true (the default) and there are no strings derived from `values` to join together (which can happen if `values` is empty or all of its items are filtered). If only one positional parameter is passed, it is interpreted as `values` (see below). | +| `values` | [sequence](../core/list); or [depset](../builtins/depset); default is `unbound` The list, tuple, or depset whose items will be joined. | +| `join_with` | [string](../core/string); required A delimiter string used to join together the strings obtained from applying `map_each` and `format_each`, in the same manner as [`string.join()`](../core/string#join). | +| `map_each` | callable; or `None`; default is `None` Same as for [`add_all`](#add_all.map_each). | +| `format_each` | [string](../core/string); or `None`; default is `None` Same as for [`add_all`](#add_all.format_each). | +| `format_joined` | [string](../core/string); or `None`; default is `None` An optional format string pattern applied to the joined string. The format string must have exactly one '%s' placeholder. | +| `omit_if_empty` | [bool](../core/bool); default is `True` If true, if there are no strings to join together (either because `values` is empty or all its items are filtered), then all further processing is suppressed and the command line will be unchanged. If false, then even if there are no strings to join together, two arguments will be appended: the arg name followed by an empty string (which is the logical join of zero strings). | +| `uniquify` | [bool](../core/bool); default is `False` Same as for [`add_all`](#add_all.uniquify). | +| `expand_directories` | [bool](../core/bool); default is `True` Same as for [`add_all`](#add_all.expand_directories). | +| `allow_closure` | [bool](../core/bool); default is `False` Same as for [`add_all`](#add_all.allow_closure). | ## set\_param\_file\_format @@ -229,22 +129,13 @@ ParameterDescription`arg_name_or_values` Args Args.set_param_file_format(format) ``` - Sets the format of the param file, if one is used - +Sets the format of the param file, if one is used ### Parameters -ParameterDescription`format`[string](../core/string.html); - required - - Must be one of: - -- "multiline": Each item (argument name or value) is written verbatim to the param file with a newline character following it. -- "shell": Same as "multiline", but the items are shell-quoted -- "flag\_per\_line": Same as "multiline", but (1) only flags (beginning with '--') are written to the param file, and (2) the values of the flags, if any, are written on the same line with a '=' separator. This is the format expected by the Abseil flags library. - -The format defaults to "shell" if not called. - +| Parameter | Description | +| --- | --- | +| `format` | [string](../core/string); required Must be one of: * "multiline": Each item (argument name or value) is written verbatim to the param file with a newline character following it. * "shell": Same as "multiline", but the items are shell-quoted * "flag\_per\_line": Same as "multiline", but (1) only flags (beginning with '--') are written to the param file, and (2) the values of the flags, if any, are written on the same line with a '=' separator. This is the format expected by the Abseil flags library. The format defaults to "shell" if not called. | ## use\_param\_file @@ -252,22 +143,13 @@ The format defaults to "shell" if not called. Args Args.use_param_file(param_file_arg, *, use_always=False) ``` - Spills the args to a params file, replacing them with a pointer to the param file. Use when your args may be too large for the system's command length limits. +Spills the args to a params file, replacing them with a pointer to the param file. Use when your args may be too large for the system's command length limits. Bazel may choose to elide writing the params file to the output tree during execution for efficiency. If you are debugging actions and want to inspect the param file, pass `--materialize_param_files` to your build. - ### Parameters -ParameterDescription`param_file_arg`[string](../core/string.html); - required - - A format string with a single "%s". If the args are spilled to a params file then they are replaced with an argument consisting of this string formatted with the path of the params file. - -For example, if the args are spilled to a params file "params.txt", then specifying "--file=%s" would cause the action command line to contain "--file=params.txt". - - -`use_always`[bool](../core/bool.html); - default is `False` - - Whether to always spill the args to a params file. If false, bazel will decide whether the arguments need to be spilled based on your system and arg length. +| Parameter | Description | +| --- | --- | +| `param_file_arg` | [string](../core/string); required A format string with a single "%s". If the args are spilled to a params file then they are replaced with an argument consisting of this string formatted with the path of the params file. For example, if the args are spilled to a params file "params.txt", then specifying "--file=%s" would cause the action command line to contain "--file=params.txt". | +| `use_always` | [bool](../core/bool); default is `False` Whether to always spill the args to a params file. If false, bazel will decide whether the arguments need to be spilled based on your system and arg length. | \ No newline at end of file diff --git a/rules/lib/builtins/Aspect.mdx b/rules/lib/builtins/Aspect.mdx index 535d0c15e..9c393f962 100644 --- a/rules/lib/builtins/Aspect.mdx +++ b/rules/lib/builtins/Aspect.mdx @@ -2,7 +2,5 @@ title: 'Aspect' --- - - For more information about Aspects, please consult the -[documentation of the aspect function](../globals/bzl.html#aspect) or the [introduction to Aspects](https://bazel.build/extending/aspects). +[documentation of the aspect function](../globals/bzl#aspect) or the [introduction to Aspects](https://bazel.build/extending/aspects). \ No newline at end of file diff --git a/rules/lib/builtins/Attribute.mdx b/rules/lib/builtins/Attribute.mdx index 2d1bde78c..18486c410 100644 --- a/rules/lib/builtins/Attribute.mdx +++ b/rules/lib/builtins/Attribute.mdx @@ -2,6 +2,4 @@ title: 'Attribute' --- - - -Representation of a definition of an attribute. Use the [attr](../toplevel/attr.html) module to create an Attribute. They are only for use with a [rule](../globals/bzl.html#rule) or an [aspect](../globals/bzl.html#aspect). +Representation of a definition of an attribute. Use the [attr](../toplevel/attr) module to create an Attribute. They are only for use with a [rule](../globals/bzl#rule) or an [aspect](../globals/bzl#aspect). \ No newline at end of file diff --git a/rules/lib/builtins/BuildSetting.mdx b/rules/lib/builtins/BuildSetting.mdx index 60756f78a..9198c8230 100644 --- a/rules/lib/builtins/BuildSetting.mdx +++ b/rules/lib/builtins/BuildSetting.mdx @@ -2,6 +2,4 @@ title: 'BuildSetting' --- - - -The descriptor for a single piece of configuration information. If configuration is a key-value map of settings like \{'cpu': 'ppc', 'copt': '-DFoo'\}, this describes a single entry in that map. +The descriptor for a single piece of configuration information. If configuration is a key-value map of settings like {'cpu': 'ppc', 'copt': '-DFoo'}, this describes a single entry in that map. \ No newline at end of file diff --git a/rules/lib/builtins/CcCompilationOutputs.mdx b/rules/lib/builtins/CcCompilationOutputs.mdx index 00a9a0d43..752e970d9 100644 --- a/rules/lib/builtins/CcCompilationOutputs.mdx +++ b/rules/lib/builtins/CcCompilationOutputs.mdx @@ -2,14 +2,12 @@ title: 'CcCompilationOutputs' --- - - Helper class containing CC compilation outputs. ## Members -- [objects](#objects) -- [pic\_objects](#pic_objects) +* [objects](#objects) +* [pic\_objects](#pic_objects) ## objects @@ -17,9 +15,7 @@ Helper class containing CC compilation outputs. sequence CcCompilationOutputs.objects ``` - Non-PIC object files. - - +Non-PIC object files. ## pic\_objects @@ -27,4 +23,4 @@ sequence CcCompilationOutputs.objects sequence CcCompilationOutputs.pic_objects ``` - PIC object files. +PIC object files. \ No newline at end of file diff --git a/rules/lib/builtins/CcLinkingOutputs.mdx b/rules/lib/builtins/CcLinkingOutputs.mdx index 001324056..3090803f1 100644 --- a/rules/lib/builtins/CcLinkingOutputs.mdx +++ b/rules/lib/builtins/CcLinkingOutputs.mdx @@ -2,14 +2,12 @@ title: 'CcLinkingOutputs' --- - - Helper class containing CC compilation outputs. ## Members -- [executable](#executable) -- [library\_to\_link](#library_to_link) +* [executable](#executable) +* [library\_to\_link](#library_to_link) ## executable @@ -17,10 +15,8 @@ Helper class containing CC compilation outputs. File CcLinkingOutputs.executable ``` - Represents the linked executable. - May return `None`. - - +Represents the linked executable. +May return `None`. ## library\_to\_link @@ -28,5 +24,5 @@ File CcLinkingOutputs.executable LibraryToLink CcLinkingOutputs.library_to_link ``` - `LibraryToLink` for including these outputs in further linking. - May return `None`. +`LibraryToLink` for including these outputs in further linking. +May return `None`. \ No newline at end of file diff --git a/rules/lib/builtins/CompilationContext.mdx b/rules/lib/builtins/CompilationContext.mdx index 46497facf..eb9b0323b 100644 --- a/rules/lib/builtins/CompilationContext.mdx +++ b/rules/lib/builtins/CompilationContext.mdx @@ -2,25 +2,23 @@ title: 'CompilationContext' --- - - Immutable store of information needed for C++ compilation that is aggregated across dependencies. ## Members -- [defines](#defines) -- [direct\_headers](#direct_headers) -- [direct\_private\_headers](#direct_private_headers) -- [direct\_public\_headers](#direct_public_headers) -- [direct\_textual\_headers](#direct_textual_headers) -- [external\_includes](#external_includes) -- [framework\_includes](#framework_includes) -- [headers](#headers) -- [includes](#includes) -- [local\_defines](#local_defines) -- [quote\_includes](#quote_includes) -- [system\_includes](#system_includes) -- [validation\_artifacts](#validation_artifacts) +* [defines](#defines) +* [direct\_headers](#direct_headers) +* [direct\_private\_headers](#direct_private_headers) +* [direct\_public\_headers](#direct_public_headers) +* [direct\_textual\_headers](#direct_textual_headers) +* [external\_includes](#external_includes) +* [framework\_includes](#framework_includes) +* [headers](#headers) +* [includes](#includes) +* [local\_defines](#local_defines) +* [quote\_includes](#quote_includes) +* [system\_includes](#system_includes) +* [validation\_artifacts](#validation_artifacts) ## defines @@ -28,9 +26,7 @@ Immutable store of information needed for C++ compilation that is aggregated acr depset CompilationContext.defines ``` - Returns the set of defines needed to compile this target. Each define is a string. These values are propagated to the target's transitive dependents, that is, any rules that depend on this target. - - +Returns the set of defines needed to compile this target. Each define is a string. These values are propagated to the target's transitive dependents, that is, any rules that depend on this target. ## direct\_headers @@ -38,9 +34,7 @@ depset CompilationContext.defines list CompilationContext.direct_headers ``` - Returns the list of modular headers that are declared by this target. This includes both public headers (such as those listed in "hdrs") and private headers (such as those listed in "srcs"). - - +Returns the list of modular headers that are declared by this target. This includes both public headers (such as those listed in "hdrs") and private headers (such as those listed in "srcs"). ## direct\_private\_headers @@ -48,9 +42,7 @@ list CompilationContext.direct_headers list CompilationContext.direct_private_headers ``` - Returns the list of modular private headers (those listed in "srcs") that are declared by this target. - - +Returns the list of modular private headers (those listed in "srcs") that are declared by this target. ## direct\_public\_headers @@ -58,9 +50,7 @@ list CompilationContext.direct_private_headers list CompilationContext.direct_public_headers ``` - Returns the list of modular public headers (those listed in "hdrs") that are declared by this target. - - +Returns the list of modular public headers (those listed in "hdrs") that are declared by this target. ## direct\_textual\_headers @@ -68,9 +58,7 @@ list CompilationContext.direct_public_headers list CompilationContext.direct_textual_headers ``` - Returns the list of textual headers that are declared by this target. - - +Returns the list of textual headers that are declared by this target. ## external\_includes @@ -78,9 +66,7 @@ list CompilationContext.direct_textual_headers depset CompilationContext.external_includes ``` - Returns the set of search paths (as strings) for external header files referenced by angle bracket. Usually passed with -isystem. - - +Returns the set of search paths (as strings) for external header files referenced by angle bracket. Usually passed with -isystem. ## framework\_includes @@ -88,9 +74,7 @@ depset CompilationContext.external_includes depset CompilationContext.framework_includes ``` - Returns the set of search paths (as strings) for framework header files. Usually passed with -F. - - +Returns the set of search paths (as strings) for framework header files. Usually passed with -F. ## headers @@ -98,9 +82,7 @@ depset CompilationContext.framework_includes depset CompilationContext.headers ``` - Returns the set of headers needed to compile this target. - - +Returns the set of headers needed to compile this target. ## includes @@ -108,9 +90,7 @@ depset CompilationContext.headers depset CompilationContext.includes ``` - Returns the set of search paths (as strings) for header files referenced both by angle bracket and quotes. Usually passed with -I. - - +Returns the set of search paths (as strings) for header files referenced both by angle bracket and quotes. Usually passed with -I. ## local\_defines @@ -118,9 +98,7 @@ depset CompilationContext.includes depset CompilationContext.local_defines ``` - Returns the set of defines needed to compile this target. Each define is a string. These values are not propagated to the target's transitive dependents. - - +Returns the set of defines needed to compile this target. Each define is a string. These values are not propagated to the target's transitive dependents. ## quote\_includes @@ -128,9 +106,7 @@ depset CompilationContext.local_defines depset CompilationContext.quote_includes ``` - Returns the set of search paths (as strings) for header files referenced by quotes, e.g. #include "foo/bar/header.h". They can be either relative to the exec root or absolute. Usually passed with -iquote. - - +Returns the set of search paths (as strings) for header files referenced by quotes, e.g. #include "foo/bar/header.h". They can be either relative to the exec root or absolute. Usually passed with -iquote. ## system\_includes @@ -138,9 +114,7 @@ depset CompilationContext.quote_includes depset CompilationContext.system_includes ``` - Returns the set of search paths (as strings) for header files referenced by angle brackets, e.g. #include <foo/bar/header.h>. They can be either relative to the exec root or absolute. Usually passed with -isystem. - - +Returns the set of search paths (as strings) for header files referenced by angle brackets, e.g. #include . They can be either relative to the exec root or absolute. Usually passed with -isystem. ## validation\_artifacts @@ -148,4 +122,4 @@ depset CompilationContext.system_includes depset CompilationContext.validation_artifacts ``` - Returns the set of validation artifacts. +Returns the set of validation artifacts. \ No newline at end of file diff --git a/rules/lib/builtins/DirectoryExpander.mdx b/rules/lib/builtins/DirectoryExpander.mdx index c41258a2b..8bf9ae69a 100644 --- a/rules/lib/builtins/DirectoryExpander.mdx +++ b/rules/lib/builtins/DirectoryExpander.mdx @@ -2,13 +2,11 @@ title: 'DirectoryExpander' --- - - -Expands directories created by [`ctx.actions.declare_directory`](../builtins/actions.html#declare_directory) during the execution phase. This is useful to expand directories in [`map_each`](../builtins/Args.html#add_all.map_each). +Expands directories created by [`ctx.actions.declare_directory`](../builtins/actions#declare_directory) during the execution phase. This is useful to expand directories in [`map_each`](../builtins/Args#add_all.map_each). ## Members -- [expand](#expand) +* [expand](#expand) ## expand @@ -16,12 +14,10 @@ Expands directories created by [`ctx.actions.declare_directory`](../builtins/act list DirectoryExpander.expand(file) ``` - If the given `File` is a directory, this returns a list of `File` s recursively underneath the directory. Otherwise, this returns a list containing just the given `File` itself. - +If the given `File` is a directory, this returns a list of `File`s recursively underneath the directory. Otherwise, this returns a list containing just the given `File` itself. ### Parameters -ParameterDescription`file`[File](../builtins/File.html); - required - - The directory or file to expand. +| Parameter | Description | +| --- | --- | +| `file` | [File](../builtins/File); required The directory or file to expand. | \ No newline at end of file diff --git a/rules/lib/builtins/DottedVersion.mdx b/rules/lib/builtins/DottedVersion.mdx index 188378185..f17cea85d 100644 --- a/rules/lib/builtins/DottedVersion.mdx +++ b/rules/lib/builtins/DottedVersion.mdx @@ -2,13 +2,11 @@ title: 'DottedVersion' --- - - A value representing a version with multiple components, separated by periods, such as 1.2.3.4. ## Members -- [compare\_to](#compare_to) +* [compare\_to](#compare_to) ## compare\_to @@ -16,12 +14,10 @@ A value representing a version with multiple components, separated by periods, s int DottedVersion.compare_to(other) ``` - Compares based on most significant (first) not-matching version component. So, for example, 1.2.3 < 1.2.4 - +Compares based on most significant (first) not-matching version component. So, for example, 1.2.3 < 1.2.4 ### Parameters -ParameterDescription`other`[DottedVersion](../builtins/DottedVersion.html); - required - - The other dotted version. +| Parameter | Description | +| --- | --- | +| `other` | [DottedVersion](../builtins/DottedVersion); required The other dotted version. | \ No newline at end of file diff --git a/rules/lib/builtins/ExecGroupCollection.mdx b/rules/lib/builtins/ExecGroupCollection.mdx index 6ef169f91..bc0238fb5 100644 --- a/rules/lib/builtins/ExecGroupCollection.mdx +++ b/rules/lib/builtins/ExecGroupCollection.mdx @@ -2,6 +2,4 @@ title: 'ExecGroupCollection' --- - - -Stores exec groups available to a given rule. +Stores exec groups available to a given rule. \ No newline at end of file diff --git a/rules/lib/builtins/ExecGroupContext.mdx b/rules/lib/builtins/ExecGroupContext.mdx index 949d9c9d2..562892c64 100644 --- a/rules/lib/builtins/ExecGroupContext.mdx +++ b/rules/lib/builtins/ExecGroupContext.mdx @@ -2,13 +2,11 @@ title: 'ExecGroupContext' --- - - Stores information about an exec group. ## Members -- [toolchains](#toolchains) +* [toolchains](#toolchains) ## toolchains @@ -16,4 +14,4 @@ Stores information about an exec group. ToolchainContext ExecGroupContext.toolchains ``` - Toolchains required for this exec group +Toolchains required for this exec group \ No newline at end of file diff --git a/rules/lib/builtins/ExecTransitionFactory.mdx b/rules/lib/builtins/ExecTransitionFactory.mdx index a29656092..3afda748d 100644 --- a/rules/lib/builtins/ExecTransitionFactory.mdx +++ b/rules/lib/builtins/ExecTransitionFactory.mdx @@ -2,6 +2,4 @@ title: 'ExecTransitionFactory' --- - - -an execution transition. +an execution transition. \ No newline at end of file diff --git a/rules/lib/builtins/ExpandedDirectory.mdx b/rules/lib/builtins/ExpandedDirectory.mdx index 65e06bcea..edbfbe2c3 100644 --- a/rules/lib/builtins/ExpandedDirectory.mdx +++ b/rules/lib/builtins/ExpandedDirectory.mdx @@ -2,14 +2,12 @@ title: 'ExpandedDirectory' --- - - Represents an expanded directory that makes the files within the it directly accessible. ## Members -- [children](#children) -- [directory](#directory) +* [children](#children) +* [directory](#directory) ## children @@ -17,9 +15,7 @@ Represents an expanded directory that makes the files within the it directly acc list ExpandedDirectory.children ``` - Contains the files within the directory. - - +Contains the files within the directory. ## directory @@ -27,4 +23,4 @@ list ExpandedDirectory.children File ExpandedDirectory.directory ``` - The input directory that was expanded. +The input directory that was expanded. \ No newline at end of file diff --git a/rules/lib/builtins/Facts.mdx b/rules/lib/builtins/Facts.mdx index fdb6d8858..f88937d4c 100644 --- a/rules/lib/builtins/Facts.mdx +++ b/rules/lib/builtins/Facts.mdx @@ -2,18 +2,15 @@ title: 'Facts' --- - - User-provided data attached to a module extension that is persisted across reevaluations of the extension. - -This type supports dict-like access (e.g. \`facts\["key"\]\` and \`facts.get("key")\`) as well as -membership tests (e.g. \`"key" in facts\`). It does not support iteration or methods like -\`keys()\`, \`items()\`, or \`len()\`. +This type supports dict-like access (e.g. `facts["key"]` and `facts.get("key")`) as well as +membership tests (e.g. `"key" in facts`). It does not support iteration or methods like +`keys()`, `items()`, or `len()`. ## Members -- [get](#get) +* [get](#get) ## get @@ -21,16 +18,11 @@ membership tests (e.g. \`"key" in facts\`). It does not support iteration or met unknown Facts.get(key, default=None) ``` - Returns the value for `key` if it exists, or `default`. - +Returns the value for `key` if it exists, or `default`. ### Parameters -ParameterDescription`key`[string](../core/string.html); - required - - The key to look up. - `default` - default is `None` - - The value to return if `key` is not present. +| Parameter | Description | +| --- | --- | +| `key` | [string](../core/string); required The key to look up. | +| `default` | default is `None` The value to return if `key` is not present. | \ No newline at end of file diff --git a/rules/lib/builtins/FeatureConfiguration.mdx b/rules/lib/builtins/FeatureConfiguration.mdx index 502cbda49..52445d777 100644 --- a/rules/lib/builtins/FeatureConfiguration.mdx +++ b/rules/lib/builtins/FeatureConfiguration.mdx @@ -2,6 +2,4 @@ title: 'FeatureConfiguration' --- - - -Class used to construct command lines from CROSSTOOL features. +Class used to construct command lines from CROSSTOOL features. \ No newline at end of file diff --git a/rules/lib/builtins/File.mdx b/rules/lib/builtins/File.mdx index 8c51b1de2..5a46a3f2b 100644 --- a/rules/lib/builtins/File.mdx +++ b/rules/lib/builtins/File.mdx @@ -2,25 +2,23 @@ title: 'File' --- - - This object is created during the analysis phase to represent a file or directory that will be read or written during the execution phase. It is not an open file handle, and cannot be used to directly read or write file contents. Rather, you use it to construct the action graph in a rule implementation function by passing it to action-creating functions. See the [Rules page](https://bazel.build/extending/rules#files) for more information. -When a `File` is passed to an [`Args`](../builtins/Args.html) object without using a `map_each` function, it is converted to a string by taking the value of its `path` field. +When a `File` is passed to an [`Args`](../builtins/Args) object without using a `map_each` function, it is converted to a string by taking the value of its `path` field. ## Members -- [basename](#basename) -- [dirname](#dirname) -- [extension](#extension) -- [is\_directory](#is_directory) -- [is\_source](#is_source) -- [is\_symlink](#is_symlink) -- [owner](#owner) -- [path](#path) -- [root](#root) -- [short\_path](#short_path) -- [tree\_relative\_path](#tree_relative_path) +* [basename](#basename) +* [dirname](#dirname) +* [extension](#extension) +* [is\_directory](#is_directory) +* [is\_source](#is_source) +* [is\_symlink](#is_symlink) +* [owner](#owner) +* [path](#path) +* [root](#root) +* [short\_path](#short_path) +* [tree\_relative\_path](#tree_relative_path) ## basename @@ -28,9 +26,7 @@ When a `File` is passed to an [`Args`](../builtins/Args.html) object without usi string File.basename ``` - The base name of this file. This is the name of the file inside the directory. - - +The base name of this file. This is the name of the file inside the directory. ## dirname @@ -38,9 +34,7 @@ string File.basename string File.dirname ``` - The name of the directory containing this file. It's taken from [path](#path) and is always relative to the execution directory. - - +The name of the directory containing this file. It's taken from [path](#path) and is always relative to the execution directory. ## extension @@ -48,9 +42,7 @@ string File.dirname string File.extension ``` - The file extension of this file, following (not including) the rightmost period. Empty string if the file's basename includes no periods. - - +The file extension of this file, following (not including) the rightmost period. Empty string if the file's basename includes no periods. ## is\_directory @@ -58,9 +50,7 @@ string File.extension bool File.is_directory ``` - Returns true if this is a directory. This reflects the type the file was declared as (i.e. ctx.actions.declare\_directory), not its type on the filesystem, which might differ. - - +Returns true if this is a directory. This reflects the type the file was declared as (i.e. ctx.actions.declare\_directory), not its type on the filesystem, which might differ. ## is\_source @@ -68,9 +58,7 @@ bool File.is_directory bool File.is_source ``` - Returns true if this is a source file, i.e. it is not generated. - - +Returns true if this is a source file, i.e. it is not generated. ## is\_symlink @@ -78,9 +66,7 @@ bool File.is_source bool File.is_symlink ``` - Returns true if this was declared as a symlink. This reflects the type the file was declared as (i.e. ctx.actions.declare\_symlink), not its type on the filesystem, which might differ. - - +Returns true if this was declared as a symlink. This reflects the type the file was declared as (i.e. ctx.actions.declare\_symlink), not its type on the filesystem, which might differ. ## owner @@ -88,10 +74,8 @@ bool File.is_symlink Label File.owner ``` - A label of a target that produces this File. - May return `None`. - - +A label of a target that produces this File. +May return `None`. ## path @@ -99,9 +83,7 @@ Label File.owner string File.path ``` - The execution path of this file, relative to the workspace's execution directory. It consists of two parts, an optional first part called the _root_ (see also the [root](../builtins/root.html) module), and the second part which is the `short_path`. The root may be empty, which it usually is for non-generated files. For generated files it usually contains a configuration-specific path fragment that encodes things like the target CPU architecture that was used while building said file. Use the `short_path` for the path under which the file is mapped if it's in the runfiles of a binary. - - +The execution path of this file, relative to the workspace's execution directory. It consists of two parts, an optional first part called the *root* (see also the [root](../builtins/root) module), and the second part which is the `short_path`. The root may be empty, which it usually is for non-generated files. For generated files it usually contains a configuration-specific path fragment that encodes things like the target CPU architecture that was used while building said file. Use the `short_path` for the path under which the file is mapped if it's in the runfiles of a binary. ## root @@ -109,9 +91,7 @@ string File.path root File.root ``` - The root beneath which this file resides. - - +The root beneath which this file resides. ## short\_path @@ -119,9 +99,7 @@ root File.root string File.short_path ``` - The path of this file relative to its root. This excludes the aforementioned _root_, i.e. configuration-specific fragments of the path. This is also the path under which the file is mapped if it's in the runfiles of a binary. - - +The path of this file relative to its root. This excludes the aforementioned *root*, i.e. configuration-specific fragments of the path. This is also the path under which the file is mapped if it's in the runfiles of a binary. ## tree\_relative\_path @@ -129,4 +107,4 @@ string File.short_path string File.tree_relative_path ``` - The path of this file relative to the root of the ancestor's tree, if the ancestor's [is\_directory](#is_directory) field is true. `tree_relative_path` is only available for expanded files of a directory in an action command, i.e. [Args.add\_all()](../builtins/Args.html#add_all). For other types of files, it is an error to access this field. +The path of this file relative to the root of the ancestor's tree, if the ancestor's [is\_directory](#is_directory) field is true. `tree_relative_path` is only available for expanded files of a directory in an action command, i.e. [Args.add\_all()](../builtins/Args#add_all). For other types of files, it is an error to access this field. \ No newline at end of file diff --git a/rules/lib/builtins/Label.mdx b/rules/lib/builtins/Label.mdx index 8d1b718a8..8e30c7cdc 100644 --- a/rules/lib/builtins/Label.mdx +++ b/rules/lib/builtins/Label.mdx @@ -2,8 +2,6 @@ title: 'Label' --- - - A BUILD target identifier. For every `Label` instance `l`, the string representation `str(l)` has the property that `Label(str(l)) == l`, regardless of where the `Label()` call occurs. @@ -12,14 +10,14 @@ When passed as positional arguments to `print()` or `fail()`, `Label` use a stri ## Members -- [Label](#Label) -- [name](#name) -- [package](#package) -- [relative](#relative) -- [repo\_name](#repo_name) -- [same\_package\_label](#same_package_label) -- [workspace\_name](#workspace_name) -- [workspace\_root](#workspace_root) +* [Label](#Label) +* [name](#name) +* [package](#package) +* [relative](#relative) +* [repo\_name](#repo_name) +* [same\_package\_label](#same_package_label) +* [workspace\_name](#workspace_name) +* [workspace\_root](#workspace_root) ## Label @@ -27,18 +25,15 @@ When passed as positional arguments to `print()` or `fail()`, `Label` use a stri Label Label(input) ``` - Converts a label string into a `Label` object, in the context of the package where the calling `.bzl` source file lives. If the given value is already a `Label`, it is returned unchanged. - -For macros, a related function, `native.package_relative_label()`, converts the input into a `Label` in the context of the package currently being constructed. For rule and aspect implementation functions, [`ctx.package_relative_label()`](ctx.html#package_relative_label) can be used for the same purpose. Use these functions to mimic the string-to-label conversion that is automatically done by label-valued rule attributes. +Converts a label string into a `Label` object, in the context of the package where the calling `.bzl` source file lives. If the given value is already a `Label`, it is returned unchanged. +For macros, a related function, `native.package_relative_label()`, converts the input into a `Label` in the context of the package currently being constructed. For rule and aspect implementation functions, [`ctx.package_relative_label()`](ctx#package_relative_label) can be used for the same purpose. Use these functions to mimic the string-to-label conversion that is automatically done by label-valued rule attributes. ### Parameters -ParameterDescription`input`[string](../core/string.html); or [Label](../builtins/Label.html); - required - - The input label string or Label object. If a Label object is passed, it's returned as is. - +| Parameter | Description | +| --- | --- | +| `input` | [string](../core/string); or [Label](../builtins/Label); required The input label string or Label object. If a Label object is passed, it's returned as is. | ## name @@ -46,7 +41,7 @@ ParameterDescription`input`[string](../core/string.html); or [Label](../builtins string Label.name ``` - The name of the target referred to by this label. For instance: +The name of the target referred to by this label. For instance: ``` Label("@@foo//pkg/foo:abc").name == "abc" @@ -58,7 +53,7 @@ Label("@@foo//pkg/foo:abc").name == "abc" string Label.package ``` - The name of the package containing the target referred to by this label, without the repository name. For instance: +The name of the package containing the target referred to by this label, without the repository name. For instance: ``` Label("@@repo//pkg/foo:abc").package == "pkg/foo" @@ -70,12 +65,10 @@ Label("@@repo//pkg/foo:abc").package == "pkg/foo" Label Label.relative(relName) ``` - **Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` - -**Deprecated.** This method behaves surprisingly when used with an argument containing an apparent repo name. Prefer [`Label.same_package_label()`](#same_package_label), [`native.package_relative_label()`](../toplevel/native.html#package_relative_label), [`ctx.package_relative_label()`](ctx.html#package_relative_label), or [`Label()`](#Label) instead. +**Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` +**Deprecated.** This method behaves surprisingly when used with an argument containing an apparent repo name. Prefer [`Label.same_package_label()`](#same_package_label), [`native.package_relative_label()`](../toplevel/native#package_relative_label), [`ctx.package_relative_label()`](ctx#package_relative_label), or [`Label()`](#Label) instead. Resolves a label that is either absolute (starts with `//`) or relative to the current package. If this label is in a remote repository, the argument will be resolved relative to that repository. If the argument contains a repository name, the current label is ignored and the argument is returned as-is, except that the repository name is rewritten if it is in the current repository mapping. Reserved labels will also be returned as-is. - For example: ``` @@ -84,23 +77,19 @@ Label("//foo/bar:baz").relative("//wiz:quux") == Label("//wiz:quux") Label("@repo//foo/bar:baz").relative("//wiz:quux") == Label("@repo//wiz:quux") Label("@repo//foo/bar:baz").relative("//visibility:public") == Label("//visibility:public") Label("@repo//foo/bar:baz").relative("@other//wiz:quux") == Label("@other//wiz:quux") - ``` If the repository mapping passed in is `{'@other' : '@remapped'}`, then the following remapping will take place: ``` Label("@repo//foo/bar:baz").relative("@other//wiz:quux") == Label("@remapped//wiz:quux") - ``` ### Parameters -ParameterDescription`relName`[string](../core/string.html); - required - - The label that will be resolved relative to this one. - +| Parameter | Description | +| --- | --- | +| `relName` | [string](../core/string); required | ## repo\_name @@ -108,7 +97,7 @@ ParameterDescription`relName`[string](../core/string.html); string Label.repo_name ``` - The canonical name of the repository containing the target referred to by this label, without any leading at-signs ( `@`). For instance, +The canonical name of the repository containing the target referred to by this label, without any leading at-signs (`@`). For instance, ``` Label("@@foo//bar:baz").repo_name == "foo" @@ -120,16 +109,13 @@ Label("@@foo//bar:baz").repo_name == "foo" Label Label.same_package_label(target_name) ``` - Creates a label in the same package as this label with the given target name. - +Creates a label in the same package as this label with the given target name. ### Parameters -ParameterDescription`target_name`[string](../core/string.html); - required - - The target name of the new label. - +| Parameter | Description | +| --- | --- | +| `target_name` | [string](../core/string); required | ## workspace\_name @@ -137,11 +123,10 @@ ParameterDescription`target_name`[string](../core/string.html); string Label.workspace_name ``` - **Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` - +**Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` **Deprecated.** The field name "workspace name" is a misnomer here; use the identically-behaving [`Label.repo_name`](#repo_name) instead. -The canonical name of the repository containing the target referred to by this label, without any leading at-signs ( `@`). For instance, +The canonical name of the repository containing the target referred to by this label, without any leading at-signs (`@`). For instance, ``` Label("@@foo//bar:baz").workspace_name == "foo" @@ -153,8 +138,8 @@ Label("@@foo//bar:baz").workspace_name == "foo" string Label.workspace_root ``` - Returns the execution root for the repository containing the target referred to by this label, relative to the execroot. For instance: +Returns the execution root for the repository containing the target referred to by this label, relative to the execroot. For instance: ``` Label("@repo//pkg/foo:abc").workspace_root == "external/repo" -``` +``` \ No newline at end of file diff --git a/rules/lib/builtins/LateBoundDefault.mdx b/rules/lib/builtins/LateBoundDefault.mdx index a9b278bb8..edd0010c3 100644 --- a/rules/lib/builtins/LateBoundDefault.mdx +++ b/rules/lib/builtins/LateBoundDefault.mdx @@ -2,8 +2,6 @@ title: 'LateBoundDefault' --- - - Represents a late-bound default attribute value of type 'Label'. The value of a LateBoundDefault is only resolvable in the context of a rule implementation function, and depends on the current build configuration. For example, a LateBoundDefault might represent the Label of the java toolchain in the current build configuration. -See [configuration\_field](../globals/bzl.html#configuration_field) for example usage. +See [configuration\_field](../globals/bzl#configuration_field) for example usage. \ No newline at end of file diff --git a/rules/lib/builtins/LibraryToLink.mdx b/rules/lib/builtins/LibraryToLink.mdx index abeee8028..319d27452 100644 --- a/rules/lib/builtins/LibraryToLink.mdx +++ b/rules/lib/builtins/LibraryToLink.mdx @@ -2,23 +2,21 @@ title: 'LibraryToLink' --- - - A library the user can link against. ## Members -- [alwayslink](#alwayslink) -- [dynamic\_library](#dynamic_library) -- [interface\_library](#interface_library) -- [lto\_bitcode\_files](#lto_bitcode_files) -- [objects](#objects) -- [pic\_lto\_bitcode\_files](#pic_lto_bitcode_files) -- [pic\_objects](#pic_objects) -- [pic\_static\_library](#pic_static_library) -- [resolved\_symlink\_dynamic\_library](#resolved_symlink_dynamic_library) -- [resolved\_symlink\_interface\_library](#resolved_symlink_interface_library) -- [static\_library](#static_library) +* [alwayslink](#alwayslink) +* [dynamic\_library](#dynamic_library) +* [interface\_library](#interface_library) +* [lto\_bitcode\_files](#lto_bitcode_files) +* [objects](#objects) +* [pic\_lto\_bitcode\_files](#pic_lto_bitcode_files) +* [pic\_objects](#pic_objects) +* [pic\_static\_library](#pic_static_library) +* [resolved\_symlink\_dynamic\_library](#resolved_symlink_dynamic_library) +* [resolved\_symlink\_interface\_library](#resolved_symlink_interface_library) +* [static\_library](#static_library) ## alwayslink @@ -26,9 +24,7 @@ A library the user can link against. bool LibraryToLink.alwayslink ``` - Whether to link the static library/objects in the --whole\_archive block. - - +Whether to link the static library/objects in the --whole\_archive block. ## dynamic\_library @@ -36,10 +32,8 @@ bool LibraryToLink.alwayslink File LibraryToLink.dynamic_library ``` - `Artifact` of dynamic library to be linked. Always used for runtime and used for linking if `interface_library` is not passed. - May return `None`. - - +`Artifact` of dynamic library to be linked. Always used for runtime and used for linking if `interface_library` is not passed. +May return `None`. ## interface\_library @@ -47,10 +41,8 @@ File LibraryToLink.dynamic_library File LibraryToLink.interface_library ``` - `Artifact` of interface library to be linked. - May return `None`. - - +`Artifact` of interface library to be linked. +May return `None`. ## lto\_bitcode\_files @@ -58,10 +50,8 @@ File LibraryToLink.interface_library sequence LibraryToLink.lto_bitcode_files ``` - `List` of LTO bitcode files in the library. - May return `None`. - - +`List` of LTO bitcode files in the library. +May return `None`. ## objects @@ -69,10 +59,8 @@ sequence LibraryToLink.lto_bitcode_files sequence LibraryToLink.objects ``` - `List` of object files in the library. - May return `None`. - - +`List` of object files in the library. +May return `None`. ## pic\_lto\_bitcode\_files @@ -80,10 +68,8 @@ sequence LibraryToLink.objects sequence LibraryToLink.pic_lto_bitcode_files ``` - `List` of pic LTO bitcode files in the library. - May return `None`. - - +`List` of pic LTO bitcode files in the library. +May return `None`. ## pic\_objects @@ -91,10 +77,8 @@ sequence LibraryToLink.pic_lto_bitcode_files sequence LibraryToLink.pic_objects ``` - `List` of pic object files in the library. - May return `None`. - - +`List` of pic object files in the library. +May return `None`. ## pic\_static\_library @@ -102,10 +86,8 @@ sequence LibraryToLink.pic_objects File LibraryToLink.pic_static_library ``` - `Artifact` of pic static library to be linked. - May return `None`. - - +`Artifact` of pic static library to be linked. +May return `None`. ## resolved\_symlink\_dynamic\_library @@ -113,10 +95,8 @@ File LibraryToLink.pic_static_library File LibraryToLink.resolved_symlink_dynamic_library ``` - The resolved `Artifact` of the dynamic library to be linked if `dynamic_library` is a symlink, otherwise this is None. - May return `None`. - - +The resolved `Artifact` of the dynamic library to be linked if `dynamic_library` is a symlink, otherwise this is None. +May return `None`. ## resolved\_symlink\_interface\_library @@ -124,10 +104,8 @@ File LibraryToLink.resolved_symlink_dynamic_library File LibraryToLink.resolved_symlink_interface_library ``` - The resolved `Artifact` of the interface library to be linked if `interface_library` is a symlink, otherwise this is None. - May return `None`. - - +The resolved `Artifact` of the interface library to be linked if `interface_library` is a symlink, otherwise this is None. +May return `None`. ## static\_library @@ -135,5 +113,5 @@ File LibraryToLink.resolved_symlink_interface_library File LibraryToLink.static_library ``` - `Artifact` of static library to be linked. - May return `None`. +`Artifact` of static library to be linked. +May return `None`. \ No newline at end of file diff --git a/rules/lib/builtins/License.mdx b/rules/lib/builtins/License.mdx index 2413249b1..c7c0027a5 100644 --- a/rules/lib/builtins/License.mdx +++ b/rules/lib/builtins/License.mdx @@ -2,6 +2,4 @@ title: 'License' --- - - -This API is deprecated and will be removed. Please do not depend on it. This object represents the value of a license attribute. +This API is deprecated and will be removed. Please do not depend on it. This object represents the value of a license attribute. \ No newline at end of file diff --git a/rules/lib/builtins/LinkerInput.mdx b/rules/lib/builtins/LinkerInput.mdx index c6fe3a5fb..41aa63a23 100644 --- a/rules/lib/builtins/LinkerInput.mdx +++ b/rules/lib/builtins/LinkerInput.mdx @@ -2,16 +2,14 @@ title: 'LinkerInput' --- - - Either libraries, flags or other files that may be passed to the linker as inputs. ## Members -- [additional\_inputs](#additional_inputs) -- [libraries](#libraries) -- [owner](#owner) -- [user\_link\_flags](#user_link_flags) +* [additional\_inputs](#additional_inputs) +* [libraries](#libraries) +* [owner](#owner) +* [user\_link\_flags](#user_link_flags) ## additional\_inputs @@ -19,9 +17,7 @@ Either libraries, flags or other files that may be passed to the linker as input sequence LinkerInput.additional_inputs ``` - Returns the depset of additional inputs, e.g.: linker scripts. - - +Returns the depset of additional inputs, e.g.: linker scripts. ## libraries @@ -29,9 +25,7 @@ sequence LinkerInput.additional_inputs sequence LinkerInput.libraries ``` - Returns the depset of `LibraryToLink`. May return a list but this is deprecated. See #8118. - - +Returns the depset of `LibraryToLink`. May return a list but this is deprecated. See #8118. ## owner @@ -39,9 +33,7 @@ sequence LinkerInput.libraries Label LinkerInput.owner ``` - Returns the owner of this LinkerInput. - - +Returns the owner of this LinkerInput. ## user\_link\_flags @@ -49,4 +41,4 @@ Label LinkerInput.owner sequence LinkerInput.user_link_flags ``` - Returns the list of user link flags passed as strings. +Returns the list of user link flags passed as strings. \ No newline at end of file diff --git a/rules/lib/builtins/LinkingContext.mdx b/rules/lib/builtins/LinkingContext.mdx index 24c9a9e3e..0ae74054c 100644 --- a/rules/lib/builtins/LinkingContext.mdx +++ b/rules/lib/builtins/LinkingContext.mdx @@ -2,13 +2,11 @@ title: 'LinkingContext' --- - - Immutable store of information needed for C++ linking that is aggregated across dependencies. ## Members -- [linker\_inputs](#linker_inputs) +* [linker\_inputs](#linker_inputs) ## linker\_inputs @@ -16,4 +14,4 @@ Immutable store of information needed for C++ linking that is aggregated across depset LinkingContext.linker_inputs ``` - Returns the depset of linker inputs. +Returns the depset of linker inputs. \ No newline at end of file diff --git a/rules/lib/builtins/Provider.mdx b/rules/lib/builtins/Provider.mdx index cf207e8f8..54b9cf36d 100644 --- a/rules/lib/builtins/Provider.mdx +++ b/rules/lib/builtins/Provider.mdx @@ -2,13 +2,10 @@ title: 'Provider' --- - - A constructor for simple value objects, known as provider instances. - This value has a dual purpose: -- It is a function that can be called to construct 'struct'-like values: +* It is a function that can be called to construct 'struct'-like values: ``` DataInfo = provider() @@ -16,8 +13,8 @@ This value has a dual purpose: print(d.x + d.y) # prints 5 ``` - Note: Some providers, defined internally, do not allow instance creation -- It is a _key_ to access a provider instance on a [Target](../builtins/Target.html) + Note: Some providers, defined internally, do not allow instance creation +* It is a *key* to access a provider instance on a [Target](../builtins/Target) ``` DataInfo = provider() @@ -25,5 +22,4 @@ This value has a dual purpose: ... ctx.attr.dep[DataInfo] ``` - -Create a new `Provider` using the [provider](../globals/bzl.html#provider) function. +Create a new `Provider` using the [provider](../globals/bzl#provider) function. \ No newline at end of file diff --git a/rules/lib/builtins/Subrule.mdx b/rules/lib/builtins/Subrule.mdx index 850479dd0..def7073c0 100644 --- a/rules/lib/builtins/Subrule.mdx +++ b/rules/lib/builtins/Subrule.mdx @@ -2,6 +2,4 @@ title: 'Subrule' --- - - -Experimental: a building block for writing rules with shared code. For more information, please see the subrule proposal: https://docs.google.com/document/d/1RbNC88QieKvBEwir7iV5zZU08AaMlOzxhVkPnmKDedQ +Experimental: a building block for writing rules with shared code. For more information, please see the subrule proposal: https://docs.google.com/document/d/1RbNC88QieKvBEwir7iV5zZU08AaMlOzxhVkPnmKDedQ \ No newline at end of file diff --git a/rules/lib/builtins/SymlinkEntry.mdx b/rules/lib/builtins/SymlinkEntry.mdx index 7b1bddd45..00e5464e6 100644 --- a/rules/lib/builtins/SymlinkEntry.mdx +++ b/rules/lib/builtins/SymlinkEntry.mdx @@ -2,14 +2,12 @@ title: 'SymlinkEntry' --- - - A single runfiles symlink represented by a link name and target. ## Members -- [path](#path) -- [target\_file](#target_file) +* [path](#path) +* [target\_file](#target_file) ## path @@ -17,9 +15,7 @@ A single runfiles symlink represented by a link name and target. string SymlinkEntry.path ``` - The path of the symlink in the runfiles tree - - +The path of the symlink in the runfiles tree ## target\_file @@ -27,4 +23,4 @@ string SymlinkEntry.path File SymlinkEntry.target_file ``` - Target file of the symlink +Target file of the symlink \ No newline at end of file diff --git a/rules/lib/builtins/Target.mdx b/rules/lib/builtins/Target.mdx index 53d89d2e3..6317a7ad8 100644 --- a/rules/lib/builtins/Target.mdx +++ b/rules/lib/builtins/Target.mdx @@ -2,17 +2,12 @@ title: 'Target' --- +The BUILD target for a dependency. Appears in the fields of `ctx.attr` corresponding to [dependency attributes](https://bazel.build/extending/rules#dependency_attributes) (`label` or `label_list`). Has the following fields: +* ### label -The BUILD target for a dependency. Appears in the fields of `ctx.attr` corresponding to [dependency attributes](https://bazel.build/extending/rules#dependency_attributes) ( `label` or `label_list`). Has the following fields: - -- ### label - - `Label Target.label` - - + `Label Target.label` The identifier of the target. -- ### Providers - +* ### Providers - The [providers](https://bazel.build/extending/rules#providers) of a rule target can be accessed by type using index notation ( `target[DefaultInfo]`). The presence of providers can be checked using the `in` operator ( `SomeInfo in target`). + The [providers](https://bazel.build/extending/rules#providers) of a rule target can be accessed by type using index notation (`target[DefaultInfo]`). The presence of providers can be checked using the `in` operator (`SomeInfo in target`). \ No newline at end of file diff --git a/rules/lib/builtins/TemplateDict.mdx b/rules/lib/builtins/TemplateDict.mdx index ee8265b32..5f18fd44c 100644 --- a/rules/lib/builtins/TemplateDict.mdx +++ b/rules/lib/builtins/TemplateDict.mdx @@ -2,14 +2,12 @@ title: 'TemplateDict' --- - - An Args-like structure for use in ctx.actions.expand\_template(), which allows for deferring evaluation of values till the execution phase. ## Members -- [add](#add) -- [add\_joined](#add_joined) +* [add](#add) +* [add\_joined](#add_joined) ## add @@ -17,20 +15,14 @@ An Args-like structure for use in ctx.actions.expand\_template(), which allows f TemplateDict TemplateDict.add(key, value) ``` - Add a String value - +Add a String value ### Parameters -ParameterDescription`key`[string](../core/string.html); - required - - A String key - `value`[string](../core/string.html); - required - - A String value - +| Parameter | Description | +| --- | --- | +| `key` | [string](../core/string); required A String key | +| `value` | [string](../core/string); required A String value | ## add\_joined @@ -38,37 +30,16 @@ ParameterDescription`key`[string](../core/string.html); TemplateDict TemplateDict.add_joined(key, values, *, join_with, map_each, uniquify=False, format_joined=None, allow_closure=False) ``` - Add depset of values - +Add depset of values ### Parameters -ParameterDescription`key`[string](../core/string.html); - required - - A String key - `values`[depset](../builtins/depset.html); - required - - The depset whose items will be joined. - `join_with`[string](../core/string.html); - required - - A delimiter string used to join together the strings obtained from applying `map_each`, in the same manner as [`string.join()`](../core/string.html#join). - `map_each` - callable; - required - - A Starlark function accepting a single argument and returning either a string, `None`, or a list of strings. This function is applied to each item of the depset specified in the `values` parameter - `uniquify`[bool](../core/bool.html); - default is `False` - - If true, duplicate strings derived from `values` will be omitted. Only the first occurrence of each string will remain. Usually this feature is not needed because depsets already omit duplicates, but it can be useful if `map_each` emits the same string for multiple items. - `format_joined`[string](../core/string.html); or `None`; - default is `None` - - An optional format string pattern applied to the joined string. The format string must have exactly one '%s' placeholder. - `allow_closure`[bool](../core/bool.html); - default is `False` - - If true, allows the use of closures in function parameters like `map_each`. Usually this isn't necessary and it risks retaining large analysis-phase data structures into the execution phase. +| Parameter | Description | +| --- | --- | +| `key` | [string](../core/string); required A String key | +| `values` | [depset](../builtins/depset); required The depset whose items will be joined. | +| `join_with` | [string](../core/string); required A delimiter string used to join together the strings obtained from applying `map_each`, in the same manner as [`string.join()`](../core/string#join). | +| `map_each` | callable; required A Starlark function accepting a single argument and returning either a string, `None`, or a list of strings. This function is applied to each item of the depset specified in the `values` parameter | +| `uniquify` | [bool](../core/bool); default is `False` If true, duplicate strings derived from `values` will be omitted. Only the first occurrence of each string will remain. Usually this feature is not needed because depsets already omit duplicates, but it can be useful if `map_each` emits the same string for multiple items. | +| `format_joined` | [string](../core/string); or `None`; default is `None` An optional format string pattern applied to the joined string. The format string must have exactly one '%s' placeholder. | +| `allow_closure` | [bool](../core/bool); default is `False` If true, allows the use of closures in function parameters like `map_each`. Usually this isn't necessary and it risks retaining large analysis-phase data structures into the execution phase. | \ No newline at end of file diff --git a/rules/lib/builtins/ToolchainContext.mdx b/rules/lib/builtins/ToolchainContext.mdx index 75862f1e9..d792e7e6c 100644 --- a/rules/lib/builtins/ToolchainContext.mdx +++ b/rules/lib/builtins/ToolchainContext.mdx @@ -2,6 +2,4 @@ title: 'ToolchainContext' --- - - -Holds toolchains available for a particular exec group. Toolchain targets are accessed by indexing with the toolchain type, as in `ctx.toolchains["//pkg:my_toolchain_type"]`. If the toolchain was optional and no toolchain was resolved, this will return `None`. Accessing toolchains of an aspect or rule via `ctx.toolchains` returns the indexed toolchain as a `ToolchainInfo` provider. While when using aspects, `ToolchainContext` is also used to hold the toolchains of the base target. It can be accessed by `ctx.rule.toolchains["//pkg:my_toolchain_type"]` and it returns the list of providers resulted from applying the aspects on these toolchain targets. +Holds toolchains available for a particular exec group. Toolchain targets are accessed by indexing with the toolchain type, as in `ctx.toolchains["//pkg:my_toolchain_type"]`. If the toolchain was optional and no toolchain was resolved, this will return `None`. Accessing toolchains of an aspect or rule via `ctx.toolchains` returns the indexed toolchain as a `ToolchainInfo` provider. While when using aspects, `ToolchainContext` is also used to hold the toolchains of the base target. It can be accessed by `ctx.rule.toolchains["//pkg:my_toolchain_type"]` and it returns the list of providers resulted from applying the aspects on these toolchain targets. \ No newline at end of file diff --git a/rules/lib/builtins/actions.mdx b/rules/lib/builtins/actions.mdx index 19d6bc236..374a9b1c3 100644 --- a/rules/lib/builtins/actions.mdx +++ b/rules/lib/builtins/actions.mdx @@ -2,24 +2,22 @@ title: 'actions' --- - - -Module providing functions to create actions. Access this module using [`ctx.actions`](../builtins/ctx.html#actions). +Module providing functions to create actions. Access this module using [`ctx.actions`](../builtins/ctx#actions). ## Members -- [args](#args) -- [declare\_directory](#declare_directory) -- [declare\_file](#declare_file) -- [declare\_symlink](#declare_symlink) -- [do\_nothing](#do_nothing) -- [expand\_template](#expand_template) -- [map\_directory](#map_directory) -- [run](#run) -- [run\_shell](#run_shell) -- [symlink](#symlink) -- [template\_dict](#template_dict) -- [write](#write) +* [args](#args) +* [declare\_directory](#declare_directory) +* [declare\_file](#declare_file) +* [declare\_symlink](#declare_symlink) +* [do\_nothing](#do_nothing) +* [expand\_template](#expand_template) +* [map\_directory](#map_directory) +* [run](#run) +* [run\_shell](#run_shell) +* [symlink](#symlink) +* [template\_dict](#template_dict) +* [write](#write) ## args @@ -27,9 +25,7 @@ Module providing functions to create actions. Access this module using [`ctx.act Args actions.args() ``` - Returns an Args object that can be used to build memory-efficient command lines. - - +Returns an Args object that can be used to build memory-efficient command lines. ## declare\_directory @@ -37,20 +33,14 @@ Args actions.args() File actions.declare_directory(filename, *, sibling=None) ``` - Declares that the rule or aspect creates a directory with the given name, in the current package. You must create an action that generates the directory. The contents of the directory are not directly accessible from Starlark, but can be expanded in an action command with [`Args.add_all()`](../builtins/Args.html#add_all). Only regular files and directories can be in the expanded contents of a declare\_directory. - +Declares that the rule or aspect creates a directory with the given name, in the current package. You must create an action that generates the directory. The contents of the directory are not directly accessible from Starlark, but can be expanded in an action command with [`Args.add_all()`](../builtins/Args#add_all). Only regular files and directories can be in the expanded contents of a declare\_directory. ### Parameters -ParameterDescription`filename`[string](../core/string.html); - required - - If no 'sibling' provided, path of the new directory, relative to the current package. Otherwise a base name for a file ('sibling' defines a directory). - `sibling`[File](../builtins/File.html); or `None`; - default is `None` - - A file that lives in the same directory as the newly declared directory. The file must be in the current package. - +| Parameter | Description | +| --- | --- | +| `filename` | [string](../core/string); required If no 'sibling' provided, path of the new directory, relative to the current package. Otherwise a base name for a file ('sibling' defines a directory). | +| `sibling` | [File](../builtins/File); or `None`; default is `None` A file that lives in the same directory as the newly declared directory. The file must be in the current package. | ## declare\_file @@ -58,24 +48,18 @@ ParameterDescription`filename`[string](../core/string.html); File actions.declare_file(filename, *, sibling=None) ``` - Declares that the rule or aspect creates a file with the given filename. If `sibling` is not specified, the file name is relative to the package directory, otherwise the file is in the same directory as `sibling`. Files cannot be created outside of the current package. +Declares that the rule or aspect creates a file with the given filename. If `sibling` is not specified, the file name is relative to the package directory, otherwise the file is in the same directory as `sibling`. Files cannot be created outside of the current package. Remember that in addition to declaring a file, you must separately create an action that emits the file. Creating that action will require passing the returned `File` object to the action's construction function. -Note that [predeclared output files](https://bazel.build/extending/rules#files) do not need to be (and cannot be) declared using this function. You can obtain their `File` objects from [`ctx.outputs`](../builtins/ctx.html#outputs) instead. [See example of use](https://github.com/bazelbuild/examples/tree/main/rules/computed_dependencies/hash.bzl). - +Note that [predeclared output files](https://bazel.build/extending/rules#files) do not need to be (and cannot be) declared using this function. You can obtain their `File` objects from [`ctx.outputs`](../builtins/ctx#outputs) instead. [See example of use](https://github.com/bazelbuild/examples/tree/main/rules/computed_dependencies/hash.bzl). ### Parameters -ParameterDescription`filename`[string](../core/string.html); - required - - If no 'sibling' provided, path of the new file, relative to the current package. Otherwise a base name for a file ('sibling' determines a directory). - `sibling`[File](../builtins/File.html); or `None`; - default is `None` - - A file that lives in the same directory as the newly created file. The file must be in the current package. - +| Parameter | Description | +| --- | --- | +| `filename` | [string](../core/string); required If no 'sibling' provided, path of the new file, relative to the current package. Otherwise a base name for a file ('sibling' determines a directory). | +| `sibling` | [File](../builtins/File); or `None`; default is `None` A file that lives in the same directory as the newly created file. The file must be in the current package. | ## declare\_symlink @@ -83,20 +67,14 @@ ParameterDescription`filename`[string](../core/string.html); File actions.declare_symlink(filename, *, sibling=None) ``` - Declares that the rule or aspect creates a symlink with the given name in the current package. You must create an action that generates this symlink. Bazel will never dereference this symlink and will transfer it verbatim to sandboxes or remote executors. Symlinks inside tree artifacts are not currently supported. - +Declares that the rule or aspect creates a symlink with the given name in the current package. You must create an action that generates this symlink. Bazel will never dereference this symlink and will transfer it verbatim to sandboxes or remote executors. Symlinks inside tree artifacts are not currently supported. ### Parameters -ParameterDescription`filename`[string](../core/string.html); - required - - If no 'sibling' provided, path of the new symlink, relative to the current package. Otherwise a base name for a file ('sibling' defines a directory). - `sibling`[File](../builtins/File.html); or `None`; - default is `None` - - A file that lives in the same directory as the newly declared symlink. - +| Parameter | Description | +| --- | --- | +| `filename` | [string](../core/string); required If no 'sibling' provided, path of the new symlink, relative to the current package. Otherwise a base name for a file ('sibling' defines a directory). | +| `sibling` | [File](../builtins/File); or `None`; default is `None` A file that lives in the same directory as the newly declared symlink. | ## do\_nothing @@ -104,20 +82,14 @@ ParameterDescription`filename`[string](../core/string.html); None actions.do_nothing(*, mnemonic, inputs=[]) ``` - Creates an empty action that neither executes a command nor produces any output, but that is useful for inserting 'extra actions'. - +Creates an empty action that neither executes a command nor produces any output, but that is useful for inserting 'extra actions'. ### Parameters -ParameterDescription`mnemonic`[string](../core/string.html); - required - - A one-word description of the action, for example, CppCompile or GoLink. - `inputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; or [depset](../builtins/depset.html); - default is `[]` - - List of the input files of the action. - +| Parameter | Description | +| --- | --- | +| `mnemonic` | [string](../core/string); required A one-word description of the action, for example, CppCompile or GoLink. | +| `inputs` | [sequence](../core/list) of [File](../builtins/File)s; or [depset](../builtins/depset); default is `[]` List of the input files of the action. | ## expand\_template @@ -125,32 +97,17 @@ ParameterDescription`mnemonic`[string](../core/string.html); None actions.expand_template(*, template, output, substitutions={}, is_executable=False, computed_substitutions=unbound) ``` - Creates a template expansion action. When the action is executed, it will generate a file based on a template. Parts of the template will be replaced using the `substitutions` dictionary, in the order the substitutions are specified. Whenever a key of the dictionary appears in the template (or a result of a previous substitution), it is replaced with the associated value. There is no special syntax for the keys. You may, for example, use curly braces to avoid conflicts (for example, `{KEY}`). [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/expand_template/hello.bzl). - +Creates a template expansion action. When the action is executed, it will generate a file based on a template. Parts of the template will be replaced using the `substitutions` dictionary, in the order the substitutions are specified. Whenever a key of the dictionary appears in the template (or a result of a previous substitution), it is replaced with the associated value. There is no special syntax for the keys. You may, for example, use curly braces to avoid conflicts (for example, `{KEY}`). [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/expand_template/hello.bzl). ### Parameters -ParameterDescription`template`[File](../builtins/File.html); - required - - The template file, which is a UTF-8 encoded text file. - `output`[File](../builtins/File.html); - required - - The output file, which is a UTF-8 encoded text file. - `substitutions`[dict](../core/dict.html); - default is `{}` - - Substitutions to make when expanding the template. - `is_executable`[bool](../core/bool.html); - default is `False` - - Whether the output file should be executable. - `computed_substitutions`[TemplateDict](../builtins/TemplateDict.html); - default is `unbound` - - Substitutions to make when expanding the template. - +| Parameter | Description | +| --- | --- | +| `template` | [File](../builtins/File); required The template file, which is a UTF-8 encoded text file. | +| `output` | [File](../builtins/File); required The output file, which is a UTF-8 encoded text file. | +| `substitutions` | [dict](../core/dict); default is `{}` Substitutions to make when expanding the template. | +| `is_executable` | [bool](../core/bool); default is `False` Whether the output file should be executable. | +| `computed_substitutions` | [TemplateDict](../builtins/TemplateDict); default is `unbound` Substitutions to make when expanding the template. | ## map\_directory @@ -158,100 +115,24 @@ ParameterDescription`template`[File](../builtins/File.html); None actions.map_directory(*, input_directories, additional_inputs={}, output_directories, tools, additional_params={}, execution_requirements=None, exec_group=None, toolchain=None, use_default_shell_env=False, env=None, mnemonic=None, implementation) ``` - Creates multiple actions based on the files within one or more input directories, to output one or more output directories. - +Creates multiple actions based on the files within one or more input directories, to output one or more output directories. ### Parameters -ParameterDescription`input_directories`[dict](../core/dict.html) of [File](../builtins/File.html) s; - required - - A dictionary mapping of strings to input directories, as declared by `ctx.actions.declare_directory()` (only directories are allowed as values here). The values specify the directories that we want expanded to access their files in the implementation function. The keys (strings) act as identifiers to easily reference a specific directory in the implementation function. - `additional_inputs`[dict](../core/dict.html); - default is `{}` - - A dictionary of mapping of strings to additional inputs (only files, FilesToRunProvider(s) and Depset(s) are allowed here). The values specify any additional inputs that we want to make accessible to actions created by the implementation function. The keys (strings) act as identifiers to easily reference a specific input from within the implementation function. - `output_directories`[dict](../core/dict.html) of [File](../builtins/File.html) s; - required - - A dictionary mapping of strings to output directories, as declared by `ctx.actions.declare_directory()`. The values specify the output directories that we want to generate by the actions created by the implementation function. The keys (strings) act as identifiers to easily reference a specific output directory from within the implementation function. - `tools`[dict](../core/dict.html); - required - - A dictionary mapping of strings to tools (only files, FilesToRunProvider(s) and Depset(s) are allowed here). The values specify the tools that we want to make accessible to actions created by the implementation function. The keys (strings) act as identifiers to easily reference a specific tool from within the implementation function. - `additional_params`[dict](../core/dict.html); - default is `{}` - - A dictionary mapping of strings to additional parameters. The values specify any additional parameters that we want to make accessible to the implementation function that could be used to influence its behavior. The keys (strings) act as identifiers to easily reference a specific parameter from within the implementation function. - `execution_requirements`[dict](../core/dict.html); or `None`; - default is `None` - - Information for scheduling the created actions. See [tags](/reference/be/common-definitions#common.tags) for useful keys. - `exec_group`[string](../core/string.html); or `None`; - default is `None` - - Run the created actions on the given exec group's execution platform. If none, uses the target's default execution platform. - `toolchain`[Label](../builtins/Label.html); or [string](../core/string.html); or `None`; - default is `None` - -Toolchain type of the executable or tools used by the created actions. - -If executable and tools are not coming from a toolchain, set this parameter to `None`. - -If executable and tools are coming from a toolchain, toolchain type must be set so that the created actions execute on the correct execution platform. - -Note that the rule which creates these actions needs to define this toolchain inside its 'rule()' function. - -When `toolchain` and `exec_group` parameters are both set, `exec_group` will be used. An error is raised in case the `exec_group` doesn't specify the same toolchain. - -`use_default_shell_env`[bool](../core/bool.html); - default is `False` - - Whether the created actions should use the default shell environment, which consists of a few OS-dependent variables as well as variables set via [`--action_env`](/reference/command-line-reference#flag--action_env). - -If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. - - -`env`[dict](../core/dict.html); or `None`; - default is `None` - - Sets the dictionary of environment variables. - -If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. - - -`mnemonic`[string](../core/string.html); or `None`; - default is `None` - - A one-word description of the created actions, for example, CppCompile or GoLink. - `implementation`[function](../core/function.html); - required - - A Starlark function that gets called after input directories have been built to generate actions -that output files to the specified output directories. This function is passed the following -arguments: - -- `template_ctx` (positional): A [`template_ctx`](../builtins/template_ctx.html) object that can be used to - create actions. -- `input_directories` (keyword-only): A dictionary mapping from the string keys of - the `input_directories` argument of `actions.map_directory()` to their - values' corresponding [`ExpandedDirectory`](../builtins/File.html) - objects. -- `output_directories` (keyword-only): The value of the - `output_directories` argument of `actions.map_directory()`; a - dictionary mapping from strings to output directories. -- `additional_inputs` (keyword-only): The value of the - `additional_inputs` argument of `actions.map_directory()`; a - dictionary mapping from strings to input files. -- `tools` (keyword-only): The value of the `tools` argument of - `actions.map_directory()`; a dictionary mapping from strings to tools. -- `additional_params` (keyword-only): The value of the - `additional_params` argument of `actions.map_directory()`; a - dictionary mapping from strings to strings, booleans, or integers. - -This function must be top-level, i.e. lambdas and nested functions are not allowed. - - +| Parameter | Description | +| --- | --- | +| `input_directories` | [dict](../core/dict) of [File](../builtins/File)s; required A dictionary mapping of strings to input directories, as declared by `ctx.actions.declare_directory()` (only directories are allowed as values here). The values specify the directories that we want expanded to access their files in the implementation function. The keys (strings) act as identifiers to easily reference a specific directory in the implementation function. | +| `additional_inputs` | [dict](../core/dict); default is `{}` A dictionary of mapping of strings to additional inputs (only files, FilesToRunProvider(s) and Depset(s) are allowed here). The values specify any additional inputs that we want to make accessible to actions created by the implementation function. The keys (strings) act as identifiers to easily reference a specific input from within the implementation function. | +| `output_directories` | [dict](../core/dict) of [File](../builtins/File)s; required A dictionary mapping of strings to output directories, as declared by `ctx.actions.declare_directory()`. The values specify the output directories that we want to generate by the actions created by the implementation function. The keys (strings) act as identifiers to easily reference a specific output directory from within the implementation function. | +| `tools` | [dict](../core/dict); required A dictionary mapping of strings to tools (only files, FilesToRunProvider(s) and Depset(s) are allowed here). The values specify the tools that we want to make accessible to actions created by the implementation function. The keys (strings) act as identifiers to easily reference a specific tool from within the implementation function. | +| `additional_params` | [dict](../core/dict); default is `{}` A dictionary mapping of strings to additional parameters. The values specify any additional parameters that we want to make accessible to the implementation function that could be used to influence its behavior. The keys (strings) act as identifiers to easily reference a specific parameter from within the implementation function. | +| `execution_requirements` | [dict](../core/dict); or `None`; default is `None` Information for scheduling the created actions. See [tags](/reference/be/common-definitions#common.tags) for useful keys. | +| `exec_group` | [string](../core/string); or `None`; default is `None` Run the created actions on the given exec group's execution platform. If none, uses the target's default execution platform. | +| `toolchain` | [Label](../builtins/Label); or [string](../core/string); or `None`; default is `None` Toolchain type of the executable or tools used by the created actions. If executable and tools are not coming from a toolchain, set this parameter to `None`. If executable and tools are coming from a toolchain, toolchain type must be set so that the created actions execute on the correct execution platform. Note that the rule which creates these actions needs to define this toolchain inside its 'rule()' function. When `toolchain` and `exec_group` parameters are both set, `exec_group` will be used. An error is raised in case the `exec_group` doesn't specify the same toolchain. | +| `use_default_shell_env` | [bool](../core/bool); default is `False` Whether the created actions should use the default shell environment, which consists of a few OS-dependent variables as well as variables set via [`--action_env`](/reference/command-line-reference#flag--action_env). If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. | +| `env` | [dict](../core/dict); or `None`; default is `None` Sets the dictionary of environment variables. If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. | +| `mnemonic` | [string](../core/string); or `None`; default is `None` A one-word description of the created actions, for example, CppCompile or GoLink. | +| `implementation` | [function](../core/function); required A Starlark function that gets called after input directories have been built to generate actions that output files to the specified output directories. This function is passed the following arguments: * `template_ctx` (positional): A [`template_ctx`](../builtins/template_ctx) object that can be used to create actions. * `input_directories` (keyword-only): A dictionary mapping from the string keys of the `input_directories` argument of `actions.map_directory()` to their values' corresponding [`ExpandedDirectory`](../builtins/File) objects. * `output_directories` (keyword-only): The value of the `output_directories` argument of `actions.map_directory()`; a dictionary mapping from strings to output directories. * `additional_inputs` (keyword-only): The value of the `additional_inputs` argument of `actions.map_directory()`; a dictionary mapping from strings to input files. * `tools` (keyword-only): The value of the `tools` argument of `actions.map_directory()`; a dictionary mapping from strings to tools. * `additional_params` (keyword-only): The value of the `additional_params` argument of `actions.map_directory()`; a dictionary mapping from strings to strings, booleans, or integers. This function must be top-level, i.e. lambdas and nested functions are not allowed. | ## run @@ -259,117 +140,28 @@ This function must be top-level, i.e. lambdas and nested functions are not allow None actions.run(*, outputs, inputs=[], unused_inputs_list=None, executable, tools=unbound, arguments=[], mnemonic=None, progress_message=None, use_default_shell_env=False, env=None, execution_requirements=None, input_manifests=None, exec_group=None, shadowed_action=None, resource_set=None, toolchain=unbound) ``` - Creates an action that runs an executable. [See example of use](https://github.com/bazelbuild/examples/tree/main/rules/actions_run/execute.bzl). - +Creates an action that runs an executable. [See example of use](https://github.com/bazelbuild/examples/tree/main/rules/actions_run/execute.bzl). ### Parameters -ParameterDescription`outputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; - required - - List of the output files of the action. - `inputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; or [depset](../builtins/depset.html); - default is `[]` - - List or depset of the input files of the action. - `unused_inputs_list`[File](../builtins/File.html); or `None`; - default is `None` - - File containing list of inputs unused by the action. - -The content of this file (generally one of the outputs of the action) corresponds to the list of input files that were not used during the whole action execution. Any change in those files must not affect in any way the outputs of the action. - - -`executable`[File](../builtins/File.html); or [string](../core/string.html); or [FilesToRunProvider](../providers/FilesToRunProvider.html); - required - - The executable file to be called by the action. - `tools`[sequence](../core/list.html); or [depset](../builtins/depset.html); - default is `unbound` - - List or [`depset`](../builtins/depset.html) of any tools needed by the action. Tools are executable inputs that may have their own runfiles which are automatically made available to the action. - -When a list is provided, it can be a heterogenous collection of: - -- `File` s -- `FilesToRunProvider` instances -- `depset` s of `File` s - -`File` s from [`ctx.executable`](../builtins/ctx#executable) and `FilesToRunProvider` s which are directly in the list will have their runfiles automatically added. All tools are implicitly added as inputs. - -`arguments`[sequence](../core/list.html); - default is `[]` - - Command line arguments of the action. Must be a list of strings or [`actions.args()`](#args) objects. - `mnemonic`[string](../core/string.html); or `None`; - default is `None` - - A one-word description of the action, for example, CppCompile or GoLink. - `progress_message`[string](../core/string.html); or `None`; - default is `None` - - Progress message to show to the user during the build, for example, "Compiling foo.cc to create foo.o". The message may contain `%{label}`, `%{input}`, or `%{output}` patterns, which are substituted with label string, first input, or output's path, respectively. Prefer to use patterns instead of static strings, because the former are more efficient. - `use_default_shell_env`[bool](../core/bool.html); - default is `False` - - Whether the action should use the default shell environment, which consists of a few OS-dependent variables as well as variables set via [`--action_env`](/reference/command-line-reference#flag--action_env). - -If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. - - -`env`[dict](../core/dict.html); or `None`; - default is `None` - - Sets the dictionary of environment variables. - -If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. - - -`execution_requirements`[dict](../core/dict.html); or `None`; - default is `None` - - Information for scheduling the action. See [tags](/reference/be/common-definitions#common.tags) for useful keys. - `input_manifests`[sequence](../core/list.html); or `None`; - default is `None` - - Legacy argument. Ignored. - `exec_group`[string](../core/string.html); or `None`; - default is `None` - - Runs the action on the given exec group's execution platform. If none, uses the target's default execution platform. - `shadowed_action`[Action](../builtins/Action.html); - default is `None` - - Runs the action using the given shadowed action's inputs and environment added to the action's inputs list and environment. The action environment can overwrite any of the shadowed action's environment variables. If none, uses only the action's inputs and given environment. - `resource_set` - callable; or `None`; - default is `None` - - A callback function that returns a resource set dictionary, used to estimate resource usage at execution time if this action is run locally. - -The function accepts two positional arguments: a string representing an OS name (e.g. "osx"), and an integer representing the number of inputs to the action. The returned dictionary may contain the following entries, each of which may be a float or an int: - -- "cpu": number of CPUs; default 1 -- "memory": in MB; default 250 -- "local\_test": number of local tests; default 1 - -If this parameter is set to `None` , the default values are used. - -The callback must be top-level (lambda and nested functions aren't allowed). - - -`toolchain`[Label](../builtins/Label.html); or [string](../core/string.html); or `None`; - default is `unbound` - -Toolchain type of the executable or tools used in this action. - -If executable and tools are not coming from a toolchain, set this parameter to \`None\`. - -If executable and tools are coming from a toolchain, toolchain type must be set so that the action executes on the correct execution platform. - -Note that the rule which creates this action needs to define this toolchain inside its 'rule()' function. - -When \`toolchain\` and \`exec\_group\` parameters are both set, \`exec\_group\` will be used. An error is raised in case the \`exec\_group\` doesn't specify the same toolchain. +| Parameter | Description | +| --- | --- | +| `outputs` | [sequence](../core/list) of [File](../builtins/File)s; required List of the output files of the action. | +| `inputs` | [sequence](../core/list) of [File](../builtins/File)s; or [depset](../builtins/depset); default is `[]` List or depset of the input files of the action. | +| `unused_inputs_list` | [File](../builtins/File); or `None`; default is `None` File containing list of inputs unused by the action. The content of this file (generally one of the outputs of the action) corresponds to the list of input files that were not used during the whole action execution. Any change in those files must not affect in any way the outputs of the action. | +| `executable` | [File](../builtins/File); or [string](../core/string); or [FilesToRunProvider](../providers/FilesToRunProvider); required The executable file to be called by the action. | +| `tools` | [sequence](../core/list); or [depset](../builtins/depset); default is `unbound` List or [`depset`](../builtins/depset) of any tools needed by the action. Tools are executable inputs that may have their own runfiles which are automatically made available to the action. When a list is provided, it can be a heterogenous collection of: * `File`s * `FilesToRunProvider` instances * `depset`s of `File`s `File`s from [`ctx.executable`](../builtins/ctx#executable) and `FilesToRunProvider`s which are directly in the list will have their runfiles automatically added. All tools are implicitly added as inputs. | +| `arguments` | [sequence](../core/list); default is `[]` Command line arguments of the action. Must be a list of strings or [`actions.args()`](#args) objects. | +| `mnemonic` | [string](../core/string); or `None`; default is `None` A one-word description of the action, for example, CppCompile or GoLink. | +| `progress_message` | [string](../core/string); or `None`; default is `None` Progress message to show to the user during the build, for example, "Compiling foo.cc to create foo.o". The message may contain `%{label}`, `%{input}`, or `%{output}` patterns, which are substituted with label string, first input, or output's path, respectively. Prefer to use patterns instead of static strings, because the former are more efficient. | +| `use_default_shell_env` | [bool](../core/bool); default is `False` Whether the action should use the default shell environment, which consists of a few OS-dependent variables as well as variables set via [`--action_env`](/reference/command-line-reference#flag--action_env). If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. | +| `env` | [dict](../core/dict); or `None`; default is `None` Sets the dictionary of environment variables. If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. | +| `execution_requirements` | [dict](../core/dict); or `None`; default is `None` Information for scheduling the action. See [tags](/reference/be/common-definitions#common.tags) for useful keys. | +| `input_manifests` | [sequence](../core/list); or `None`; default is `None` Legacy argument. Ignored. | +| `exec_group` | [string](../core/string); or `None`; default is `None` Runs the action on the given exec group's execution platform. If none, uses the target's default execution platform. | +| `shadowed_action` | [Action](../builtins/Action); default is `None` Runs the action using the given shadowed action's inputs and environment added to the action's inputs list and environment. The action environment can overwrite any of the shadowed action's environment variables. If none, uses only the action's inputs and given environment. | +| `resource_set` | callable; or `None`; default is `None` A callback function that returns a resource set dictionary, used to estimate resource usage at execution time if this action is run locally. The function accepts two positional arguments: a string representing an OS name (e.g. "osx"), and an integer representing the number of inputs to the action. The returned dictionary may contain the following entries, each of which may be a float or an int: * "cpu": number of CPUs; default 1* "memory": in MB; default 250* "local\_test": number of local tests; default 1 If this parameter is set to `None` , the default values are used. The callback must be top-level (lambda and nested functions aren't allowed). | +| `toolchain` | [Label](../builtins/Label); or [string](../core/string); or `None`; default is `unbound` Toolchain type of the executable or tools used in this action. If executable and tools are not coming from a toolchain, set this parameter to `None`. If executable and tools are coming from a toolchain, toolchain type must be set so that the action executes on the correct execution platform. Note that the rule which creates this action needs to define this toolchain inside its 'rule()' function. When `toolchain` and `exec\_group` parameters are both set, `exec\_group` will be used. An error is raised in case the `exec\_group` doesn't specify the same toolchain. | ## run\_shell @@ -377,111 +169,27 @@ When \`toolchain\` and \`exec\_group\` parameters are both set, \`exec\_group\` None actions.run_shell(*, outputs, inputs=[], tools=unbound, arguments=[], mnemonic=None, command, progress_message=None, use_default_shell_env=False, env=None, execution_requirements=None, input_manifests=None, exec_group=None, shadowed_action=None, resource_set=None, toolchain=unbound) ``` - Creates an action that runs a shell command. [See example of use](https://github.com/bazelbuild/examples/tree/main/rules/shell_command/rules.bzl). - +Creates an action that runs a shell command. [See example of use](https://github.com/bazelbuild/examples/tree/main/rules/shell_command/rules.bzl). ### Parameters -ParameterDescription`outputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; - required - - List of the output files of the action. - `inputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; or [depset](../builtins/depset.html); - default is `[]` - - List or depset of the input files of the action. - `tools`[sequence](../core/list.html) of [File](../builtins/File.html) s; or [depset](../builtins/depset.html); - default is `unbound` - - List or [`depset`](../builtins/depset.html) of any tools needed by the action. Tools are executable inputs that may have their own runfiles which are automatically made available to the action. - -When a list is provided, it can be a heterogenous collection of: - -- `File` s -- `FilesToRunProvider` instances -- `depset` s of `File` s - -`File` s from [`ctx.executable`](../builtins/ctx#executable) and `FilesToRunProvider` s which are directly in the list will have their runfiles automatically added. All tools are implicitly added as inputs. - -`arguments`[sequence](../core/list.html); - default is `[]` - - Command line arguments of the action. Must be a list of strings or [`actions.args()`](#args) objects. - -Bazel passes the elements in this attribute as arguments to the command.The command can access these arguments using shell variable substitutions such as `$1`, `$2`, etc. Note that since Args objects are flattened before indexing, if there is an Args object of unknown size then all subsequent strings will be at unpredictable indices. It may be useful to use `$@` (to retrieve all arguments) in conjunction with Args objects of indeterminate size. - -In the case where `command` is a list of strings, this parameter may not be used. - - -`mnemonic`[string](../core/string.html); or `None`; - default is `None` - - A one-word description of the action, for example, CppCompile or GoLink. - `command`[string](../core/string.html); or [sequence](../core/list.html) of [string](../core/string.html) s; - required - - Shell command to execute. This may either be a string (preferred) or a sequence of strings **(deprecated)**. - -If `command` is a string, then it is executed as if by `sh -c "" ` \-\- that is, the elements in `arguments` are made available to the command as `$1`, `$2` (or `%1`, `%2` if using Windows batch), etc. If `arguments` contains any [`actions.args()`](#args) objects, their contents are appended one by one to the command line, so `$` _i_ can refer to individual strings within an Args object. Note that if an Args object of unknown size is passed as part of `arguments`, then the strings will be at unknown indices; in this case the `$@` shell substitution (retrieve all arguments) may be useful. - -**(Deprecated)** If `command` is a sequence of strings, the first item is the executable to run and the remaining items are its arguments. If this form is used, the `arguments` parameter must not be supplied. _Note that this form is deprecated and will soon be removed. It is disabled with \`--incompatible\_run\_shell\_command\_string\`. Use this flag to verify your code is compatible._ - -Bazel uses the same shell to execute the command as it does for genrules. - - -`progress_message`[string](../core/string.html); or `None`; - default is `None` - - Progress message to show to the user during the build, for example, "Compiling foo.cc to create foo.o". The message may contain `%{label}`, `%{input}`, or `%{output}` patterns, which are substituted with label string, first input, or output's path, respectively. Prefer to use patterns instead of static strings, because the former are more efficient. - `use_default_shell_env`[bool](../core/bool.html); - default is `False` - - Whether the action should use the default shell environment, which consists of a few OS-dependent variables as well as variables set via [`--action_env`](/reference/command-line-reference#flag--action_env). - -If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. - - -`env`[dict](../core/dict.html); or `None`; - default is `None` - - Sets the dictionary of environment variables. - -If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. - - -`execution_requirements`[dict](../core/dict.html); or `None`; - default is `None` - - Information for scheduling the action. See [tags](/reference/be/common-definitions#common.tags) for useful keys. - `input_manifests`[sequence](../core/list.html); or `None`; - default is `None` - - Legacy argument. Ignored. - `exec_group`[string](../core/string.html); or `None`; - default is `None` - - Runs the action on the given exec group's execution platform. If none, uses the target's default execution platform. - `shadowed_action`[Action](../builtins/Action.html); - default is `None` - - Runs the action using the given shadowed action's discovered inputs added to the action's inputs list. If none, uses only the action's inputs. - `resource_set` - callable; or `None`; - default is `None` - - A callback function for estimating resource usage if run locally. See [`ctx.actions.run()`](#run.resource_set). - `toolchain`[Label](../builtins/Label.html); or [string](../core/string.html); or `None`; - default is `unbound` - -Toolchain type of the executable or tools used in this action. - -If executable and tools are not coming from a toolchain, set this parameter to \`None\`. - -If executable and tools are coming from a toolchain, toolchain type must be set so that the action executes on the correct execution platform. - -Note that the rule which creates this action needs to define this toolchain inside its 'rule()' function. - -When \`toolchain\` and \`exec\_group\` parameters are both set, \`exec\_group\` will be used. An error is raised in case the \`exec\_group\` doesn't specify the same toolchain. +| Parameter | Description | +| --- | --- | +| `outputs` | [sequence](../core/list) of [File](../builtins/File)s; required List of the output files of the action. | +| `inputs` | [sequence](../core/list) of [File](../builtins/File)s; or [depset](../builtins/depset); default is `[]` List or depset of the input files of the action. | +| `tools` | [sequence](../core/list) of [File](../builtins/File)s; or [depset](../builtins/depset); default is `unbound` List or [`depset`](../builtins/depset) of any tools needed by the action. Tools are executable inputs that may have their own runfiles which are automatically made available to the action. When a list is provided, it can be a heterogenous collection of: * `File`s * `FilesToRunProvider` instances * `depset`s of `File`s `File`s from [`ctx.executable`](../builtins/ctx#executable) and `FilesToRunProvider`s which are directly in the list will have their runfiles automatically added. All tools are implicitly added as inputs. | +| `arguments` | [sequence](../core/list); default is `[]` Command line arguments of the action. Must be a list of strings or [`actions.args()`](#args) objects. Bazel passes the elements in this attribute as arguments to the command.The command can access these arguments using shell variable substitutions such as `$1`, `$2`, etc. Note that since Args objects are flattened before indexing, if there is an Args object of unknown size then all subsequent strings will be at unpredictable indices. It may be useful to use `$@` (to retrieve all arguments) in conjunction with Args objects of indeterminate size. In the case where `command` is a list of strings, this parameter may not be used. | +| `mnemonic` | [string](../core/string); or `None`; default is `None` A one-word description of the action, for example, CppCompile or GoLink. | +| `command` | [string](../core/string); or [sequence](../core/list) of [string](../core/string)s; required Shell command to execute. This may either be a string (preferred) or a sequence of strings **(deprecated)**. If `command` is a string, then it is executed as if by `sh -c "" ` -- that is, the elements in `arguments` are made available to the command as `$1`, `$2` (or `%1`, `%2` if using Windows batch), etc. If `arguments` contains any [`actions.args()`](#args) objects, their contents are appended one by one to the command line, so `$`*i* can refer to individual strings within an Args object. Note that if an Args object of unknown size is passed as part of `arguments`, then the strings will be at unknown indices; in this case the `$@` shell substitution (retrieve all arguments) may be useful. **(Deprecated)** If `command` is a sequence of strings, the first item is the executable to run and the remaining items are its arguments. If this form is used, the `arguments` parameter must not be supplied. *Note that this form is deprecated and will soon be removed. It is disabled with `--incompatible\_run\_shell\_command\_string`. Use this flag to verify your code is compatible.* Bazel uses the same shell to execute the command as it does for genrules. | +| `progress_message` | [string](../core/string); or `None`; default is `None` Progress message to show to the user during the build, for example, "Compiling foo.cc to create foo.o". The message may contain `%{label}`, `%{input}`, or `%{output}` patterns, which are substituted with label string, first input, or output's path, respectively. Prefer to use patterns instead of static strings, because the former are more efficient. | +| `use_default_shell_env` | [bool](../core/bool); default is `False` Whether the action should use the default shell environment, which consists of a few OS-dependent variables as well as variables set via [`--action_env`](/reference/command-line-reference#flag--action_env). If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. | +| `env` | [dict](../core/dict); or `None`; default is `None` Sets the dictionary of environment variables. If both `use_default_shell_env` and `env` are set to `True`, values set in `env` will overwrite the default shell environment. | +| `execution_requirements` | [dict](../core/dict); or `None`; default is `None` Information for scheduling the action. See [tags](/reference/be/common-definitions#common.tags) for useful keys. | +| `input_manifests` | [sequence](../core/list); or `None`; default is `None` Legacy argument. Ignored. | +| `exec_group` | [string](../core/string); or `None`; default is `None` Runs the action on the given exec group's execution platform. If none, uses the target's default execution platform. | +| `shadowed_action` | [Action](../builtins/Action); default is `None` Runs the action using the given shadowed action's discovered inputs added to the action's inputs list. If none, uses only the action's inputs. | +| `resource_set` | callable; or `None`; default is `None` A callback function for estimating resource usage if run locally. See[`ctx.actions.run()`](#run.resource_set). | +| `toolchain` | [Label](../builtins/Label); or [string](../core/string); or `None`; default is `unbound` Toolchain type of the executable or tools used in this action. If executable and tools are not coming from a toolchain, set this parameter to `None`. If executable and tools are coming from a toolchain, toolchain type must be set so that the action executes on the correct execution platform. Note that the rule which creates this action needs to define this toolchain inside its 'rule()' function. When `toolchain` and `exec\_group` parameters are both set, `exec\_group` will be used. An error is raised in case the `exec\_group` doesn't specify the same toolchain. | ## symlink @@ -489,7 +197,7 @@ When \`toolchain\` and \`exec\_group\` parameters are both set, \`exec\_group\` None actions.symlink(*, output, target_file=None, target_path=None, target_type=None, is_executable=False, progress_message=None) ``` - Creates an action that writes a symlink in the file system. +Creates an action that writes a symlink in the file system. This function must be called with exactly one of `target_file` or `target_path` specified. @@ -499,38 +207,14 @@ Otherwise, when you use `target_path`, declare `output` with [`declare_symlink() ### Parameters -ParameterDescription`output`[File](../builtins/File.html); - required - - The output of this action. - `target_file`[File](../builtins/File.html); or `None`; - default is `None` - - The File that the output symlink will point to. - `target_path`[string](../core/string.html); or `None`; - default is `None` - - The exact path that the output symlink will point to. No normalization or other processing is applied. - `target_type`[string](../core/string.html); or `None`; - default is `None` - - May only be used with `target_path`, not `target_file`. If specified, it must be one of 'file' or 'directory', indicating the target path's expected type. - -On Windows, this determines which kind of filesystem object to create (junction for a directory, symlink for a file). It has no effect on other operating systems. - - -`is_executable`[bool](../core/bool.html); - default is `False` - - May only be used with `target_file`, not `target_path`. If true, when the action is executed, the `target_file`'s path is checked to confirm that it is executable, and an error is reported if it is not. Setting `is_executable` to False does not mean the target is not executable, just that no verification is done. - -This feature does not make sense for `target_path` because dangling symlinks might not exist at build time. - -`progress_message`[string](../core/string.html); or `None`; - default is `None` - - Progress message to show to the user during the build. - +| Parameter | Description | +| --- | --- | +| `output` | [File](../builtins/File); required The output of this action. | +| `target_file` | [File](../builtins/File); or `None`; default is `None` The File that the output symlink will point to. | +| `target_path` | [string](../core/string); or `None`; default is `None` The exact path that the output symlink will point to. No normalization or other processing is applied. | +| `target_type` | [string](../core/string); or `None`; default is `None` May only be used with `target_path`, not `target_file`. If specified, it must be one of 'file' or 'directory', indicating the target path's expected type. On Windows, this determines which kind of filesystem object to create (junction for a directory, symlink for a file). It has no effect on other operating systems. | +| `is_executable` | [bool](../core/bool); default is `False` May only be used with `target_file`, not `target_path`. If true, when the action is executed, the `target_file`'s path is checked to confirm that it is executable, and an error is reported if it is not. Setting `is_executable` to False does not mean the target is not executable, just that no verification is done. This feature does not make sense for `target_path` because dangling symlinks might not exist at build time. | +| `progress_message` | [string](../core/string); or `None`; default is `None` Progress message to show to the user during the build. | ## template\_dict @@ -538,9 +222,7 @@ This feature does not make sense for `target_path` because dangling symlinks mig TemplateDict actions.template_dict() ``` - Returns a TemplateDict object for memory-efficient template expansion. - - +Returns a TemplateDict object for memory-efficient template expansion. ## write @@ -548,28 +230,14 @@ TemplateDict actions.template_dict() None actions.write(output, content, is_executable=False, *, mnemonic=None, execution_requirements=None) ``` - Creates a file write action. When the action is executed, it will write the given content to a file. This is used to generate files using information available in the analysis phase. If the file is large and with a lot of static content, consider using [`expand_template`](#expand_template). - +Creates a file write action. When the action is executed, it will write the given content to a file. This is used to generate files using information available in the analysis phase. If the file is large and with a lot of static content, consider using [`expand_template`](#expand_template). ### Parameters -ParameterDescription`output`[File](../builtins/File.html); - required - - The output file. - `content`[string](../core/string.html); or [Args](../builtins/Args.html); - required - - the contents of the file. May be a either a string or an [`actions.args()`](#args) object. - `is_executable`[bool](../core/bool.html); - default is `False` - - Whether the output file should be executable. - `mnemonic`[string](../core/string.html); or `None`; - default is `None` - - A one-word description of the action, for example, CppCompile or GoLink. - `execution_requirements`[dict](../core/dict.html); or `None`; - default is `None` - - Information for scheduling the action. See [tags](/reference/be/common-definitions#common.tags) for useful keys. +| Parameter | Description | +| --- | --- | +| `output` | [File](../builtins/File); required The output file. | +| `content` | [string](../core/string); or [Args](../builtins/Args); required the contents of the file. May be a either a string or an [`actions.args()`](#args) object. | +| `is_executable` | [bool](../core/bool); default is `False` Whether the output file should be executable. | +| `mnemonic` | [string](../core/string); or `None`; default is `None` A one-word description of the action, for example, CppCompile or GoLink. | +| `execution_requirements` | [dict](../core/dict); or `None`; default is `None` Information for scheduling the action. See [tags](/reference/be/common-definitions#common.tags) for useful keys. | \ No newline at end of file diff --git a/rules/lib/builtins/apple_platform.mdx b/rules/lib/builtins/apple_platform.mdx index 5250c305b..ba2fc42ee 100644 --- a/rules/lib/builtins/apple_platform.mdx +++ b/rules/lib/builtins/apple_platform.mdx @@ -2,36 +2,33 @@ title: 'apple\_platform' --- - - Corresponds to Xcode's notion of a platform as would be found in `Xcode.app/Contents/Developer/Platforms`. Each platform represents an Apple platform type (such as iOS or tvOS) combined with one or more related CPU architectures. For example, the iOS simulator platform supports `x86_64` and `i386` architectures. -Specific instances of this type can be retrieved from the fields of the [apple\_common.platform](../toplevel/apple_common.html#platform) struct: +Specific instances of this type can be retrieved from the fields of the [apple\_common.platform](../toplevel/apple_common#platform) struct: -- `apple_common.platform.ios_device` -- `apple_common.platform.ios_simulator` -- `apple_common.platform.macos` -- `apple_common.platform.tvos_device` -- `apple_common.platform.tvos_simulator` -- `apple_common.platform.watchos_device` -- `apple_common.platform.watchos_simulator` +* `apple_common.platform.ios_device` +* `apple_common.platform.ios_simulator` +* `apple_common.platform.macos` +* `apple_common.platform.tvos_device` +* `apple_common.platform.tvos_simulator` +* `apple_common.platform.watchos_device` +* `apple_common.platform.watchos_simulator` -More commonly, however, the [apple](../fragments/apple.html) configuration fragment has fields/methods that allow rules to determine the platform for which a target is being built. +More commonly, however, the [apple](../fragments/apple) configuration fragment has fields/methods that allow rules to determine the platform for which a target is being built. Example: ``` p = apple_common.platform.ios_device print(p.name_in_plist) # 'iPhoneOS' - ``` ## Members -- [is\_device](#is_device) -- [name](#name) -- [name\_in\_plist](#name_in_plist) -- [platform\_type](#platform_type) +* [is\_device](#is_device) +* [name](#name) +* [name\_in\_plist](#name_in_plist) +* [platform\_type](#platform_type) ## is\_device @@ -39,9 +36,7 @@ print(p.name_in_plist) # 'iPhoneOS' bool apple_platform.is_device ``` - Returns `True` if this platform is a device platform or `False` if it is a simulator platform. - - +Returns `True` if this platform is a device platform or `False` if it is a simulator platform. ## name @@ -49,9 +44,7 @@ bool apple_platform.is_device string apple_platform.name ``` - Returns the name aka starlarkKey of this platform. - - +Returns the name aka starlarkKey of this platform. ## name\_in\_plist @@ -59,16 +52,13 @@ string apple_platform.name string apple_platform.name_in_plist ``` - The name of the platform as it appears in the `CFBundleSupportedPlatforms` entry of an Info.plist file and in Xcode's platforms directory, without the extension (for example, `iPhoneOS` or `iPhoneSimulator`). - +The name of the platform as it appears in the `CFBundleSupportedPlatforms` entry of an Info.plist file and in Xcode's platforms directory, without the extension (for example, `iPhoneOS` or `iPhoneSimulator`). This name, when converted to lowercase (e.g., `iphoneos`, `iphonesimulator`), can be passed to Xcode's command-line tools like `ibtool` and `actool` when they expect a platform name. - - ## platform\_type ``` string apple_platform.platform_type ``` - Returns the platform type of this platform. +Returns the platform type of this platform. \ No newline at end of file diff --git a/rules/lib/builtins/bazel_module.mdx b/rules/lib/builtins/bazel_module.mdx index bfcc129fa..9e1db64db 100644 --- a/rules/lib/builtins/bazel_module.mdx +++ b/rules/lib/builtins/bazel_module.mdx @@ -2,16 +2,14 @@ title: 'bazel\_module' --- - - Represents a Bazel module in the external dependency graph. ## Members -- [is\_root](#is_root) -- [name](#name) -- [tags](#tags) -- [version](#version) +* [is\_root](#is_root) +* [name](#name) +* [tags](#tags) +* [version](#version) ## is\_root @@ -19,9 +17,7 @@ Represents a Bazel module in the external dependency graph. bool bazel_module.is_root ``` - Whether this module is the root module. - - +Whether this module is the root module. ## name @@ -29,9 +25,7 @@ bool bazel_module.is_root string bazel_module.name ``` - The name of the module. - - +The name of the module. ## tags @@ -39,9 +33,7 @@ string bazel_module.name bazel_module_tags bazel_module.tags ``` - The tags in the module related to the module extension currently being processed. - - +The tags in the module related to the module extension currently being processed. ## version @@ -49,4 +41,4 @@ bazel_module_tags bazel_module.tags string bazel_module.version ``` - The version of the module. +The version of the module. \ No newline at end of file diff --git a/rules/lib/builtins/bazel_module_tags.mdx b/rules/lib/builtins/bazel_module_tags.mdx index 7c9bcda22..dcb92a6f2 100644 --- a/rules/lib/builtins/bazel_module_tags.mdx +++ b/rules/lib/builtins/bazel_module_tags.mdx @@ -2,8 +2,5 @@ title: 'bazel\_module\_tags' --- - - Contains the tags in a module for the module extension currently being processed. This object has a field for each tag class of the extension, and the value of the field is a list containing an object for each tag instance. This "tag instance" object in turn has a field for each attribute of the tag class. - -When passed as positional arguments to `print()` or `fail()`, tag instance objects turn into a meaningful string representation of the form "'install' tag at /home/user/workspace/MODULE.bazel:3:4". This can be used to construct error messages that point to the location of the tag in the module file, e.g. `fail("Conflict between", tag1, "and", tag2)`. +When passed as positional arguments to `print()` or `fail()`, tag instance objects turn into a meaningful string representation of the form "'install' tag at /home/user/workspace/MODULE.bazel:3:4". This can be used to construct error messages that point to the location of the tag in the module file, e.g. `fail("Conflict between", tag1, "and", tag2)`. \ No newline at end of file diff --git a/rules/lib/builtins/configuration.mdx b/rules/lib/builtins/configuration.mdx index 02f7cc5f5..4cfae1002 100644 --- a/rules/lib/builtins/configuration.mdx +++ b/rules/lib/builtins/configuration.mdx @@ -2,17 +2,15 @@ title: 'configuration' --- - - This object holds information about the environment in which the build is running. See the [Rules page](https://bazel.build/extending/rules#configurations) for more on the general concept of configurations. ## Members -- [coverage\_enabled](#coverage_enabled) -- [default\_shell\_env](#default_shell_env) -- [host\_path\_separator](#host_path_separator) -- [short\_id](#short_id) -- [test\_env](#test_env) +* [coverage\_enabled](#coverage_enabled) +* [default\_shell\_env](#default_shell_env) +* [host\_path\_separator](#host_path_separator) +* [short\_id](#short_id) +* [test\_env](#test_env) ## coverage\_enabled @@ -20,9 +18,7 @@ This object holds information about the environment in which the build is runnin bool configuration.coverage_enabled ``` - A boolean that tells whether code coverage is enabled for this run. Note that this does not compute whether a specific rule should be instrumented for code coverage data collection. For that, see the [`ctx.coverage_instrumented`](../builtins/ctx.html#coverage_instrumented) function. - - +A boolean that tells whether code coverage is enabled for this run. Note that this does not compute whether a specific rule should be instrumented for code coverage data collection. For that, see the [`ctx.coverage_instrumented`](../builtins/ctx#coverage_instrumented) function. ## default\_shell\_env @@ -30,9 +26,7 @@ bool configuration.coverage_enabled dict configuration.default_shell_env ``` - A dictionary representing the static local shell environment. It maps variables to their values (strings). - - +A dictionary representing the static local shell environment. It maps variables to their values (strings). ## host\_path\_separator @@ -40,9 +34,7 @@ dict configuration.default_shell_env string configuration.host_path_separator ``` - Returns the separator for PATH environment variable, which is ':' on Unix. - - +Returns the separator for PATH environment variable, which is ':' on Unix. ## short\_id @@ -50,12 +42,11 @@ string configuration.host_path_separator string configuration.short_id ``` - A short identifier for this configuration understood by the `config` and query subcommands. +A short identifier for this configuration understood by the `config` and query subcommands. Use this to distinguish different configurations for the same target in a way that is friendly to humans and tool usage, for example in an aspect used by an IDE. Keep in mind the following caveats: -- The value may differ across Bazel versions, including patch releases. -- The value encodes the value of **every** flag, including those that aren't otherwise relevant for the current target and may thus invalidate caches more frequently. +* The value may differ across Bazel versions, including patch releases.* The value encodes the value of **every** flag, including those that aren't otherwise relevant for the current target and may thus invalidate caches more frequently. ## test\_env @@ -63,4 +54,4 @@ Use this to distinguish different configurations for the same target in a way th dict configuration.test_env ``` - A dictionary containing user-specified test environment variables and their values, as set by the `--test_env` options. DO NOT USE! This is not the complete environment! +A dictionary containing user-specified test environment variables and their values, as set by the `--test_env` options. DO NOT USE! This is not the complete environment! \ No newline at end of file diff --git a/rules/lib/builtins/ctx.mdx b/rules/lib/builtins/ctx.mdx index a431cb283..192d89c98 100644 --- a/rules/lib/builtins/ctx.mdx +++ b/rules/lib/builtins/ctx.mdx @@ -2,8 +2,6 @@ title: 'ctx' --- - - A context object that is passed to the implementation function for a rule or aspect. It provides access to the information and methods needed to analyze the current target. In particular, it lets the implementation function access the current target's label, attributes, configuration, and the providers of its dependencies. It has methods for declaring output files and the actions that produce them. @@ -12,40 +10,40 @@ Context objects essentially live for the duration of the call to the implementat ## Members -- [actions](#actions) -- [aspect\_ids](#aspect_ids) -- [attr](#attr) -- [bin\_dir](#bin_dir) -- [build\_file\_path](#build_file_path) -- [build\_setting\_value](#build_setting_value) -- [configuration](#configuration) -- [coverage\_instrumented](#coverage_instrumented) -- [created\_actions](#created_actions) -- [disabled\_features](#disabled_features) -- [exec\_groups](#exec_groups) -- [executable](#executable) -- [expand\_location](#expand_location) -- [expand\_make\_variables](#expand_make_variables) -- [features](#features) -- [file](#file) -- [files](#files) -- [fragments](#fragments) -- [genfiles\_dir](#genfiles_dir) -- [info\_file](#info_file) -- [label](#label) -- [outputs](#outputs) -- [package\_relative\_label](#package_relative_label) -- [resolve\_command](#resolve_command) -- [resolve\_tools](#resolve_tools) -- [rule](#rule) -- [runfiles](#runfiles) -- [split\_attr](#split_attr) -- [super](#super) -- [target\_platform\_has\_constraint](#target_platform_has_constraint) -- [toolchains](#toolchains) -- [var](#var) -- [version\_file](#version_file) -- [workspace\_name](#workspace_name) +* [actions](#actions) +* [aspect\_ids](#aspect_ids) +* [attr](#attr) +* [bin\_dir](#bin_dir) +* [build\_file\_path](#build_file_path) +* [build\_setting\_value](#build_setting_value) +* [configuration](#configuration) +* [coverage\_instrumented](#coverage_instrumented) +* [created\_actions](#created_actions) +* [disabled\_features](#disabled_features) +* [exec\_groups](#exec_groups) +* [executable](#executable) +* [expand\_location](#expand_location) +* [expand\_make\_variables](#expand_make_variables) +* [features](#features) +* [file](#file) +* [files](#files) +* [fragments](#fragments) +* [genfiles\_dir](#genfiles_dir) +* [info\_file](#info_file) +* [label](#label) +* [outputs](#outputs) +* [package\_relative\_label](#package_relative_label) +* [resolve\_command](#resolve_command) +* [resolve\_tools](#resolve_tools) +* [rule](#rule) +* [runfiles](#runfiles) +* [split\_attr](#split_attr) +* [super](#super) +* [target\_platform\_has\_constraint](#target_platform_has_constraint) +* [toolchains](#toolchains) +* [var](#var) +* [version\_file](#version_file) +* [workspace\_name](#workspace_name) ## actions @@ -53,9 +51,7 @@ Context objects essentially live for the duration of the call to the implementat actions ctx.actions ``` - Contains methods for declaring output files and the actions that produce them. - - +Contains methods for declaring output files and the actions that produce them. ## aspect\_ids @@ -63,9 +59,7 @@ actions ctx.actions list ctx.aspect_ids ``` - A list of ids for all aspects applied to the target. Only available in aspect implementation functions. - - +A list of ids for all aspects applied to the target. Only available in aspect implementation functions. ## attr @@ -73,9 +67,7 @@ list ctx.aspect_ids struct ctx.attr ``` - A struct to access the values of the [attributes](https://bazel.build/extending/rules#attributes). The values are provided by the user (if not, a default value is used). The attributes of the struct and the types of their values correspond to the keys and values of the [`attrs` dict](../globals/bzl.html#rule.attrs) provided to the [`rule` function](../globals/bzl.html#rule). [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/attributes/printer.bzl). - - +A struct to access the values of the [attributes](https://bazel.build/extending/rules#attributes). The values are provided by the user (if not, a default value is used). The attributes of the struct and the types of their values correspond to the keys and values of the [`attrs` dict](../globals/bzl#rule.attrs) provided to the [`rule` function](../globals/bzl#rule). [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/attributes/printer.bzl). ## bin\_dir @@ -83,9 +75,7 @@ struct ctx.attr root ctx.bin_dir ``` - The root corresponding to bin directory. - - +The root corresponding to bin directory. ## build\_file\_path @@ -93,9 +83,7 @@ root ctx.bin_dir string ctx.build_file_path ``` - Deprecated: Use `ctx.label.package + '/BUILD'`. The path to the BUILD file for this rule, relative to the source root. - - +Deprecated: Use `ctx.label.package + '/BUILD'`. The path to the BUILD file for this rule, relative to the source root. ## build\_setting\_value @@ -103,9 +91,7 @@ string ctx.build_file_path unknown ctx.build_setting_value ``` - Value of the build setting represented by the current target. If this isn't the context for an instance of a rule that sets the [`build_setting`](https://bazel.build/extending/config#rule-parameter) attribute, reading this is an error. - - +Value of the build setting represented by the current target. If this isn't the context for an instance of a rule that sets the [`build_setting`](https://bazel.build/extending/config#rule-parameter) attribute, reading this is an error. ## configuration @@ -113,9 +99,7 @@ unknown ctx.build_setting_value configuration ctx.configuration ``` - The current target's build configuration. See the [Starlark configuration type](../builtins/configuration.html) and [configuration documentation](/extending/rules#configurations) for more details. - - +The current target's build configuration. See the [Starlark configuration type](../builtins/configuration) and [configuration documentation](/extending/rules#configurations) for more details. ## coverage\_instrumented @@ -123,16 +107,13 @@ configuration ctx.configuration bool ctx.coverage_instrumented(target=None) ``` - Returns whether code coverage instrumentation should be generated when performing compilation actions for this rule or, if `target` is provided, the rule specified by that Target. (If a non-rule or a Starlark rule Target is provided, this returns False.) Checks if the sources of the current rule (if no Target is provided) or the sources of Target should be instrumented based on the --instrumentation\_filter and --instrument\_test\_targets config settings. This differs from `coverage_enabled` in the [configuration](../builtins/configuration.html), which notes whether coverage data collection is enabled for the entire run, but not whether a specific target should be instrumented. - +Returns whether code coverage instrumentation should be generated when performing compilation actions for this rule or, if `target` is provided, the rule specified by that Target. (If a non-rule or a Starlark rule Target is provided, this returns False.) Checks if the sources of the current rule (if no Target is provided) or the sources of Target should be instrumented based on the --instrumentation\_filter and --instrument\_test\_targets config settings. This differs from `coverage_enabled` in the [configuration](../builtins/configuration), which notes whether coverage data collection is enabled for the entire run, but not whether a specific target should be instrumented. ### Parameters -ParameterDescription`target`[Target](../builtins/Target.html); or `None`; - default is `None` - - A Target specifying a rule. If not provided, defaults to the current rule. - +| Parameter | Description | +| --- | --- | +| `target` | [Target](../builtins/Target); or `None`; default is `None` A Target specifying a rule. If not provided, defaults to the current rule. | ## created\_actions @@ -140,21 +121,17 @@ ParameterDescription`target`[Target](../builtins/Target.html); or `None`; StarlarkValue ctx.created_actions() ``` - For rules with [\_skylark\_testable](../globals/bzl.html#rule._skylark_testable) set to `True`, this returns an `Actions` provider representing all actions created so far for the current rule. For all other rules, returns `None`. Note that the provider is not updated when subsequent actions are created, so you will have to call this function again if you wish to inspect them. +For rules with [\_skylark\_testable](../globals/bzl#rule._skylark_testable) set to `True`, this returns an `Actions` provider representing all actions created so far for the current rule. For all other rules, returns `None`. Note that the provider is not updated when subsequent actions are created, so you will have to call this function again if you wish to inspect them. This is intended to help write tests for rule-implementation helper functions, which may take in a `ctx` object and create actions on it. - - ## disabled\_features ``` list ctx.disabled_features ``` - The set of features that are explicitly disabled by the user for this rule. - - +The set of features that are explicitly disabled by the user for this rule. ## exec\_groups @@ -162,9 +139,7 @@ list ctx.disabled_features ExecGroupCollection ctx.exec_groups ``` - A collection of the execution groups available for this rule, indexed by their name. Access with `ctx.exec_groups[name_of_group]`. - - +A collection of the execution groups available for this rule, indexed by their name. Access with `ctx.exec_groups[name_of_group]`. ## executable @@ -172,9 +147,7 @@ ExecGroupCollection ctx.exec_groups struct ctx.executable ``` - A `struct` containing executable files defined in [label type attributes](../toplevel/attr.html#label) marked as [`executable=True`](../toplevel/attr.html#label.executable). The struct fields correspond to the attribute names. Each value in the struct is either a [`File`](../builtins/File.html) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `executable=True`, no corresponding struct field is generated. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/actions_run/execute.bzl). - - +A `struct` containing executable files defined in [label type attributes](../toplevel/attr#label) marked as [`executable=True`](../toplevel/attr#label.executable). The struct fields correspond to the attribute names. Each value in the struct is either a [`File`](../builtins/File) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `executable=True`, no corresponding struct field is generated. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/actions_run/execute.bzl). ## expand\_location @@ -182,27 +155,20 @@ struct ctx.executable string ctx.expand_location(input, targets=[]) ``` - Expands all `$(location ...)` templates in the given string by replacing `$(location //x)` with the path of the output file of target //x. Expansion only works for labels that point to direct dependencies of this rule or that are explicitly listed in the optional argument `targets`. +Expands all `$(location ...)` templates in the given string by replacing `$(location //x)` with the path of the output file of target //x. Expansion only works for labels that point to direct dependencies of this rule or that are explicitly listed in the optional argument `targets`. `$(location ...)` will cause an error if the referenced target has multiple outputs. In this case, please use `$(locations ...)` since it produces a space-separated list of output paths. It can be safely used for a single output file, too. This function is useful to let the user specify a command in a BUILD file (like for `genrule`). In other cases, it is often better to manipulate labels directly. - ### Parameters -ParameterDescription`input`[string](../core/string.html); - required - - String to be expanded. - `targets`[sequence](../core/list.html) of [Target](../builtins/Target.html) s; - default is `[]` - - List of targets for additional lookup information. These are expanded as follows: A target with a single file in `DefaultInfo.files` expands to that file. Other targets expand to their `DefaultInfo.executable` file if set and if `--incompatible_locations_prefers_executable` is enabled, otherwise they expand to `DefaultInfo.files`. - - May return `None`. - +| Parameter | Description | +| --- | --- | +| `input` | [string](../core/string); required String to be expanded. | +| `targets` | [sequence](../core/list) of [Target](../builtins/Target)s; default is `[]` List of targets for additional lookup information. These are expanded as follows: A target with a single file in `DefaultInfo.files` expands to that file. Other targets expand to their `DefaultInfo.executable` file if set and if `--incompatible_locations_prefers_executable` is enabled, otherwise they expand to `DefaultInfo.files`. | +May return `None`. ## expand\_make\_variables @@ -210,34 +176,23 @@ ParameterDescription`input`[string](../core/string.html); string ctx.expand_make_variables(attribute_name, command, additional_substitutions) ``` - **Deprecated.** Use [ctx.var](../builtins/ctx.html#var) to access the variables instead. - +**Deprecated.** Use [ctx.var](../builtins/ctx#var) to access the variables instead. Returns a string after expanding all references to "Make variables". The variables must have the following format: `$(VAR_NAME)`. Also, `$$VAR_NAME` expands to `$VAR_NAME`. Examples: ``` ctx.expand_make_variables("cmd", "$(MY_VAR)", {"MY_VAR": "Hi"}) # == "Hi" ctx.expand_make_variables("cmd", "$$PWD", {}) # == "$PWD" - ``` Additional variables may come from other places, such as configurations. Note that this function is experimental. - ### Parameters -ParameterDescription`attribute_name`[string](../core/string.html); - required - - The attribute name. Used for error reporting. - `command`[string](../core/string.html); - required - - The expression to expand. It can contain references to "Make variables". - `additional_substitutions`[dict](../core/dict.html); - required - - Additional substitutions to make beyond the default make variables. - +| Parameter | Description | +| --- | --- | +| `attribute_name` | [string](../core/string); required | +| `command` | [string](../core/string); required The expression to expand. It can contain references to "Make variables". | +| `additional_substitutions` | [dict](../core/dict); required Additional substitutions to make beyond the default make variables. | ## features @@ -245,9 +200,7 @@ ParameterDescription`attribute_name`[string](../core/string.html); list ctx.features ``` - The set of features that are explicitly enabled by the user for this rule. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/features/rule.bzl). - - +The set of features that are explicitly enabled by the user for this rule. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/features/rule.bzl). ## file @@ -255,7 +208,7 @@ list ctx.features struct ctx.file ``` - A `struct` containing files defined in [label type attributes](../toplevel/attr.html#label) marked as [`allow_single_file`](../toplevel/attr.html#label.allow_single_file). The struct fields correspond to the attribute names. The struct value is always a [`File`](../builtins/File.html) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `allow_single_file`, no corresponding struct field is generated. It is a shortcut for: +A `struct` containing files defined in [label type attributes](../toplevel/attr#label) marked as [`allow_single_file`](../toplevel/attr#label.allow_single_file). The struct fields correspond to the attribute names. The struct value is always a [`File`](../builtins/File) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `allow_single_file`, no corresponding struct field is generated. It is a shortcut for: ``` list(ctx.attr..files)[0] @@ -263,23 +216,19 @@ list(ctx.attr..files)[0] In other words, use `file` to access the (singular) [default output](https://bazel.build/extending/rules#requesting_output_files) of a dependency. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/expand_template/hello.bzl). - - ## files ``` struct ctx.files ``` - A `struct` containing files defined in [label](../toplevel/attr.html#label) or [label list](../toplevel/attr.html#label_list) type attributes. The struct fields correspond to the attribute names. The struct values are `list` of [`File`](../builtins/File.html) s. It is a shortcut for: +A `struct` containing files defined in [label](../toplevel/attr#label) or [label list](../toplevel/attr#label_list) type attributes. The struct fields correspond to the attribute names. The struct values are `list` of [`File`](../builtins/File)s. It is a shortcut for: ``` [f for t in ctx.attr. for f in t.files] ``` - In other words, use `files` to access the [default outputs](https://bazel.build/extending/rules#requesting_output_files) of a dependency. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/depsets/foo.bzl). - - +In other words, use `files` to access the [default outputs](https://bazel.build/extending/rules#requesting_output_files) of a dependency. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/depsets/foo.bzl). ## fragments @@ -287,9 +236,7 @@ struct ctx.files fragments ctx.fragments ``` - Allows access to configuration fragments in target configuration. - - +Allows access to configuration fragments in target configuration. ## genfiles\_dir @@ -297,9 +244,7 @@ fragments ctx.fragments root ctx.genfiles_dir ``` - The root corresponding to genfiles directory. - - +The root corresponding to genfiles directory. ## info\_file @@ -307,9 +252,7 @@ root ctx.genfiles_dir File ctx.info_file ``` - The file that is used to hold the non-volatile workspace status for the current build request. See documentation for --workspace\_status\_command for more information. - - +The file that is used to hold the non-volatile workspace status for the current build request. See documentation for --workspace\_status\_command for more information. ## label @@ -317,9 +260,7 @@ File ctx.info_file Label ctx.label ``` - The label of the target currently being analyzed. - - +The label of the target currently being analyzed. ## outputs @@ -327,16 +268,13 @@ Label ctx.label structure ctx.outputs ``` - A pseudo-struct containing all the predeclared output files, represented by [`File`](../builtins/File.html) objects. See the [Rules page](https://bazel.build/extending/rules#files) for more information and examples. +A pseudo-struct containing all the predeclared output files, represented by [`File`](../builtins/File) objects. See the [Rules page](https://bazel.build/extending/rules#files) for more information and examples. This field does not exist on aspect contexts, since aspects do not have predeclared outputs. The fields of this object are defined as follows. It is an error if two outputs produce the same field name or have the same label. -- If the rule declares an [`outputs`](../globals/bzl.html#rule.outputs) dict, then for every entry in the dict, there is a field whose name is the key and whose value is the corresponding `File`. -- For every attribute of type [`attr.output`](../toplevel/attr.html#output) that the rule declares, there is a field whose name is the attribute's name. If the target specified a label for that attribute, then the field value is the corresponding `File`; otherwise the field value is `None`. -- For every attribute of type [`attr.output_list`](../toplevel/attr.html#output_list) that the rule declares, there is a field whose name is the attribute's name. The field value is a list of `File` objects corresponding to the labels given for that attribute in the target, or an empty list if the attribute was not specified in the target. -- **(Deprecated)** If the rule is marked [`executable`](../globals/bzl.html#rule.executable) or [`test`](../globals/bzl.html#rule.test), there is a field named `"executable"`, which is the default executable. It is recommended that instead of using this, you pass another file (either predeclared or not) to the `executable` arg of [`DefaultInfo`](../providers/DefaultInfo.html). +* If the rule declares an [`outputs`](../globals/bzl#rule.outputs) dict, then for every entry in the dict, there is a field whose name is the key and whose value is the corresponding `File`.* For every attribute of type [`attr.output`](../toplevel/attr#output) that the rule declares, there is a field whose name is the attribute's name. If the target specified a label for that attribute, then the field value is the corresponding `File`; otherwise the field value is `None`.* For every attribute of type [`attr.output_list`](../toplevel/attr#output_list) that the rule declares, there is a field whose name is the attribute's name. The field value is a list of `File` objects corresponding to the labels given for that attribute in the target, or an empty list if the attribute was not specified in the target.* **(Deprecated)** If the rule is marked [`executable`](../globals/bzl#rule.executable) or [`test`](../globals/bzl#rule.test), there is a field named `"executable"`, which is the default executable. It is recommended that instead of using this, you pass another file (either predeclared or not) to the `executable` arg of [`DefaultInfo`](../providers/DefaultInfo). ## package\_relative\_label @@ -344,21 +282,17 @@ The fields of this object are defined as follows. It is an error if two outputs Label ctx.package_relative_label(input) ``` - Converts the input string into a [Label](../builtins/Label.html) object, in the context of the package of the target currently being analyzed. If the input is already a `Label`, it is returned unchanged. +Converts the input string into a [Label](../builtins/Label) object, in the context of the package of the target currently being analyzed. If the input is already a `Label`, it is returned unchanged. -The result of this function is the same `Label` value as would be produced by passing the given string to a label-valued attribute of the rule and accessing the corresponding [Label()](../builtins/Target.html#label>label
    field. -

    Usage note: The difference between this function and label field. +

    Usage note: The difference between this function and /_main/`, **not** the directory corresponding to the current target's repository. See [Runfiles symlinks](https://bazel.build/extending/rules#runfiles_symlinks) in the rules guide. - `root_symlinks`[dict](../core/dict.html); or [depset](../builtins/depset.html) of [SymlinkEntry](../builtins/SymlinkEntry.html) s; - default is `{}` - - Either a SymlinkEntry depset or a map of symlinks to be added to the runfiles. See [Runfiles symlinks](https://bazel.build/extending/rules#runfiles_symlinks) in the rules guide. - +| Parameter | Description | +| --- | --- | +| `files` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` The list of files to be added to the runfiles. | +| `transitive_files` | [depset](../builtins/depset) of [File](../builtins/File)s; or `None`; default is `None` The (transitive) set of files to be added to the runfiles. The depset should use the `default` order (which, as the name implies, is the default). | +| `collect_data` | [bool](../core/bool); default is `False` **Use of this parameter is not recommended. See [runfiles guide](https://bazel.build/extending/rules#runfiles)**. Whether to collect the data runfiles from the dependencies in srcs, data and deps attributes. | +| `collect_default` | [bool](../core/bool); default is `False` **Use of this parameter is not recommended. See [runfiles guide](https://bazel.build/extending/rules#runfiles)**. Whether to collect the default runfiles from the dependencies in srcs, data and deps attributes. | +| `symlinks` | [dict](../core/dict); or [depset](../builtins/depset) of [SymlinkEntry](../builtins/SymlinkEntry)s; default is `{}` Either a SymlinkEntry depset or the map of symlinks to be added to the runfiles. Symlinks are always added under the main workspace's runfiles directory (e.g. `/_main/`, **not** the directory corresponding to the current target's repository. See [Runfiles symlinks](https://bazel.build/extending/rules#runfiles_symlinks) in the rules guide. | +| `root_symlinks` | [dict](../core/dict); or [depset](../builtins/depset) of [SymlinkEntry](../builtins/SymlinkEntry)s; default is `{}` Either a SymlinkEntry depset or a map of symlinks to be added to the runfiles. See [Runfiles symlinks](https://bazel.build/extending/rules#runfiles_symlinks) in the rules guide. | ## split\_attr @@ -483,9 +364,7 @@ Whether to collect the default runfiles from the dependencies in srcs, data and struct ctx.split_attr ``` - A struct to access the values of attributes with split configurations. If the attribute is a label list, the value of split\_attr is a dict of the keys of the split (as strings) to lists of the ConfiguredTargets in that branch of the split. If the attribute is a label, then the value of split\_attr is a dict of the keys of the split (as strings) to single ConfiguredTargets. Attributes with split configurations still appear in the attr struct, but their values will be single lists with all the branches of the split merged together. - - +A struct to access the values of attributes with split configurations. If the attribute is a label list, the value of split\_attr is a dict of the keys of the split (as strings) to lists of the ConfiguredTargets in that branch of the split. If the attribute is a label, then the value of split\_attr is a dict of the keys of the split (as strings) to single ConfiguredTargets. Attributes with split configurations still appear in the attr struct, but their values will be single lists with all the branches of the split merged together. ## super @@ -493,9 +372,7 @@ struct ctx.split_attr unknown ctx.super() ``` - Experimental: Calls parent's implementation function and returns its providers - - +Experimental: Calls parent's implementation function and returns its providers ## target\_platform\_has\_constraint @@ -503,16 +380,13 @@ unknown ctx.super() bool ctx.target_platform_has_constraint(constraintValue) ``` - Returns true if the given constraint value is part of the current target platform. - +Returns true if the given constraint value is part of the current target platform. ### Parameters -ParameterDescription`constraintValue`[ConstraintValueInfo](../providers/ConstraintValueInfo.html); - required - - The constraint value to check the target platform against. - +| Parameter | Description | +| --- | --- | +| `constraintValue` | [ConstraintValueInfo](../providers/ConstraintValueInfo); required The constraint value to check the target platform against. | ## toolchains @@ -520,9 +394,7 @@ ParameterDescription`constraintValue`[ConstraintValueInfo](../providers/Constrai ToolchainContext ctx.toolchains ``` - Toolchains for the default exec group of this rule. - - +Toolchains for the default exec group of this rule. ## var @@ -530,9 +402,7 @@ ToolchainContext ctx.toolchains dict ctx.var ``` - Dictionary (String to String) of configuration variables. - - +Dictionary (String to String) of configuration variables. ## version\_file @@ -540,9 +410,7 @@ dict ctx.var File ctx.version_file ``` - The file that is used to hold the volatile workspace status for the current build request. See documentation for --workspace\_status\_command for more information. - - +The file that is used to hold the volatile workspace status for the current build request. See documentation for --workspace\_status\_command for more information. ## workspace\_name @@ -550,4 +418,4 @@ File ctx.version_file string ctx.workspace_name ``` - The name of the workspace, which is effectively the execution root name and runfiles prefix for the main repo. If `--enable_bzlmod` is on, this is the fixed string `_main`. Otherwise, this is the workspace name as defined in the WORKSPACE file. +The name of the workspace, which is effectively the execution root name and runfiles prefix for the main repo. If `--enable_bzlmod` is on, this is the fixed string `_main`. Otherwise, this is the workspace name as defined in the WORKSPACE file. \ No newline at end of file diff --git a/rules/lib/builtins/depset.mdx b/rules/lib/builtins/depset.mdx index 59d62408c..7baf77d35 100644 --- a/rules/lib/builtins/depset.mdx +++ b/rules/lib/builtins/depset.mdx @@ -2,8 +2,6 @@ title: 'depset' --- - - A specialized data structure that supports efficient merge operations and has a defined traversal order. Commonly used for accumulating data from transitive dependencies in rules and aspects. For more information see [here](/extending/depsets). @@ -20,26 +18,22 @@ When tested for truth (that is, when used in a Boolean context such as `if d:` w operation. Depsets are immutable. They should be created using their -[constructor function](../globals/bzl.html#depset) and merged or augmented with other +[constructor function](../globals/bzl#depset) and merged or augmented with other depsets via the `transitive` argument. The `order` parameter determines the kind of traversal that is done to convert the depset to an iterable. There are four possible values: -- `"default"` (formerly `"stable"`): Order is unspecified (but - deterministic). - -- `"postorder"` (formerly `"compile"`): A left-to-right post-ordering. - Precisely, this recursively traverses all children leftmost-first, then the direct elements - leftmost-first. - -- `"preorder"` (formerly `"naive_link"`): A left-to-right pre-ordering. - Precisely, this traverses the direct elements leftmost-first, then recursively traverses the - children leftmost-first. - -- `"topological"` (formerly `"link"`): A topological ordering from the root - down to the leaves. There is no left-to-right guarantee. - +* `"default"` (formerly `"stable"`): Order is unspecified (but + deterministic). +* `"postorder"` (formerly `"compile"`): A left-to-right post-ordering. + Precisely, this recursively traverses all children leftmost-first, then the direct elements + leftmost-first. +* `"preorder"` (formerly `"naive_link"`): A left-to-right pre-ordering. + Precisely, this traverses the direct elements leftmost-first, then recursively traverses the + children leftmost-first. +* `"topological"` (formerly `"link"`): A topological ordering from the root + down to the leaves. There is no left-to-right guarantee. Two depsets may only be merged if either both depsets have the same order, or one of them has `"default"` order. In the latter case the resulting depset's order will be the same as @@ -51,7 +45,7 @@ semantics. ## Members -- [to\_list](#to_list) +* [to\_list](#to_list) ## to\_list @@ -59,4 +53,4 @@ semantics. list depset.to_list() ``` - Returns a list of the elements, without duplicates, in the depset's traversal order. Note that order is unspecified (but deterministic) for elements that were added more than once to the depset. Order is also unspecified for `"default"`-ordered depsets, and for elements of child depsets whose order differs from that of the parent depset. The list is a copy; modifying it has no effect on the depset and vice versa. +Returns a list of the elements, without duplicates, in the depset's traversal order. Note that order is unspecified (but deterministic) for elements that were added more than once to the depset. Order is also unspecified for `"default"`-ordered depsets, and for elements of child depsets whose order differs from that of the parent depset. The list is a copy; modifying it has no effect on the depset and vice versa. \ No newline at end of file diff --git a/rules/lib/builtins/exec_result.mdx b/rules/lib/builtins/exec_result.mdx index a4d37fad6..afff773ab 100644 --- a/rules/lib/builtins/exec_result.mdx +++ b/rules/lib/builtins/exec_result.mdx @@ -2,15 +2,13 @@ title: 'exec\_result' --- - - A structure storing result of repository\_ctx.execute() method. It contains the standard output stream content, the standard error stream content and the execution return code. ## Members -- [return\_code](#return_code) -- [stderr](#stderr) -- [stdout](#stdout) +* [return\_code](#return_code) +* [stderr](#stderr) +* [stdout](#stdout) ## return\_code @@ -18,9 +16,7 @@ A structure storing result of repository\_ctx.execute() method. It contains the int exec_result.return_code ``` - The return code returned after the execution of the program. 256 if the process was terminated by a time out; values larger than 128 indicate termination by a signal. - - +The return code returned after the execution of the program. 256 if the process was terminated by a time out; values larger than 128 indicate termination by a signal. ## stderr @@ -28,9 +24,7 @@ int exec_result.return_code string exec_result.stderr ``` - The content of the standard error output returned by the execution. - - +The content of the standard error output returned by the execution. ## stdout @@ -38,4 +32,4 @@ string exec_result.stderr string exec_result.stdout ``` - The content of the standard output returned by the execution. +The content of the standard output returned by the execution. \ No newline at end of file diff --git a/rules/lib/builtins/extension_metadata.mdx b/rules/lib/builtins/extension_metadata.mdx index cb6b3b4e8..f530ba8dc 100644 --- a/rules/lib/builtins/extension_metadata.mdx +++ b/rules/lib/builtins/extension_metadata.mdx @@ -2,6 +2,4 @@ title: 'extension\_metadata' --- - - -Return values of this type from a module extension's implementation function to provide metadata about the repositories generated by the extension to Bazel. +Return values of this type from a module extension's implementation function to provide metadata about the repositories generated by the extension to Bazel. \ No newline at end of file diff --git a/rules/lib/builtins/fragments.mdx b/rules/lib/builtins/fragments.mdx index 0c6d48d49..30aa187b7 100644 --- a/rules/lib/builtins/fragments.mdx +++ b/rules/lib/builtins/fragments.mdx @@ -2,10 +2,8 @@ title: 'fragments' --- - - A collection of configuration fragments available in the current rule implementation context. Access a specific fragment by its field name. For example, `ctx.fragments.java` Only configuration fragments which are declared in the rule definition may be accessed in this collection. -See the [configuration fragment reference](../fragments.html) for a list of available fragments and the [rules documentation](https://bazel.build/extending/rules#configuration_fragments) for how to use them. +See the [configuration fragment reference](../fragments) for a list of available fragments and the [rules documentation](https://bazel.build/extending/rules#configuration_fragments) for how to use them. \ No newline at end of file diff --git a/rules/lib/builtins/java_annotation_processing.mdx b/rules/lib/builtins/java_annotation_processing.mdx index f2be555e4..8ae7aaedc 100644 --- a/rules/lib/builtins/java_annotation_processing.mdx +++ b/rules/lib/builtins/java_annotation_processing.mdx @@ -2,19 +2,17 @@ title: 'java\_annotation\_processing' --- - - Information about jars that are a result of annotation processing for a Java rule. ## Members -- [class\_jar](#class_jar) -- [enabled](#enabled) -- [processor\_classnames](#processor_classnames) -- [processor\_classpath](#processor_classpath) -- [source\_jar](#source_jar) -- [transitive\_class\_jars](#transitive_class_jars) -- [transitive\_source\_jars](#transitive_source_jars) +* [class\_jar](#class_jar) +* [enabled](#enabled) +* [processor\_classnames](#processor_classnames) +* [processor\_classpath](#processor_classpath) +* [source\_jar](#source_jar) +* [transitive\_class\_jars](#transitive_class_jars) +* [transitive\_source\_jars](#transitive_source_jars) ## class\_jar @@ -22,10 +20,8 @@ Information about jars that are a result of annotation processing for a Java rul File java_annotation_processing.class_jar ``` - Deprecated: Please use `JavaInfo.java_outputs.generated_class_jar` instead. - May return `None`. - - +Deprecated: Please use `JavaInfo.java_outputs.generated_class_jar` instead. +May return `None`. ## enabled @@ -33,9 +29,7 @@ File java_annotation_processing.class_jar bool java_annotation_processing.enabled ``` - Deprecated. Returns true if annotation processing was applied on this target. - - +Deprecated. Returns true if annotation processing was applied on this target. ## processor\_classnames @@ -43,9 +37,7 @@ bool java_annotation_processing.enabled list java_annotation_processing.processor_classnames ``` - Deprecated: Please use `JavaInfo.plugins` instead. Returns class names of annotation processors applied to this rule. - - +Deprecated: Please use `JavaInfo.plugins` instead. Returns class names of annotation processors applied to this rule. ## processor\_classpath @@ -53,9 +45,7 @@ list java_annotation_processing.processor_classnames depset java_annotation_processing.processor_classpath ``` - Deprecated: Please use `JavaInfo.plugins` instead. Returns a classpath of annotation processors applied to this rule. - - +Deprecated: Please use `JavaInfo.plugins` instead. Returns a classpath of annotation processors applied to this rule. ## source\_jar @@ -63,10 +53,8 @@ depset java_annotation_processing.processor_classpath File java_annotation_processing.source_jar ``` - Deprecated: Please use `JavaInfo.java_outputs.generated_source_jar` instead. - May return `None`. - - +Deprecated: Please use `JavaInfo.java_outputs.generated_source_jar` instead. +May return `None`. ## transitive\_class\_jars @@ -74,9 +62,7 @@ File java_annotation_processing.source_jar depset java_annotation_processing.transitive_class_jars ``` - Deprecated. Returns a transitive set of class file jars resulting from annotation processing of this rule and its dependencies. - - +Deprecated. Returns a transitive set of class file jars resulting from annotation processing of this rule and its dependencies. ## transitive\_source\_jars @@ -84,4 +70,4 @@ depset java_annotation_processing.transitive_class_jars depset java_annotation_processing.transitive_source_jars ``` - Deprecated. Returns a transitive set of source archives resulting from annotation processing of this rule and its dependencies. +Deprecated. Returns a transitive set of source archives resulting from annotation processing of this rule and its dependencies. \ No newline at end of file diff --git a/rules/lib/builtins/macro.mdx b/rules/lib/builtins/macro.mdx index 9ac9af732..7ddb3a71d 100644 --- a/rules/lib/builtins/macro.mdx +++ b/rules/lib/builtins/macro.mdx @@ -2,11 +2,9 @@ title: 'macro' --- - - A callable Starlark value representing a symbolic macro; in other words, the return value of -[`macro()`](../globals/bzl.html#macro). Invoking this value during package +[`macro()`](../globals/bzl#macro). Invoking this value during package construction time will instantiate the macro, and cause the macro's implementation function to be evaluated (in a separate context, different from the context in which the macro value was invoked), in most cases causing targets to be added to the package's target set. For more information, see -[Macros](https://bazel.build/extending/macros). +[Macros](https://bazel.build/extending/macros). \ No newline at end of file diff --git a/rules/lib/builtins/mapped_root.mdx b/rules/lib/builtins/mapped_root.mdx index c448abf3c..528d8ea2b 100644 --- a/rules/lib/builtins/mapped_root.mdx +++ b/rules/lib/builtins/mapped_root.mdx @@ -2,13 +2,11 @@ title: 'mapped\_root' --- - - A root for files that have been subject to path mapping ## Members -- [path](#path) +* [path](#path) ## path @@ -16,4 +14,4 @@ A root for files that have been subject to path mapping string mapped_root.path ``` - Returns the relative path from the exec root to the actual root. +Returns the relative path from the exec root to the actual root. \ No newline at end of file diff --git a/rules/lib/builtins/module_ctx.mdx b/rules/lib/builtins/module_ctx.mdx index 3ae3b1c0d..4b0b8b030 100644 --- a/rules/lib/builtins/module_ctx.mdx +++ b/rules/lib/builtins/module_ctx.mdx @@ -2,29 +2,27 @@ title: 'module\_ctx' --- - - The context of the module extension containing helper functions and information about pertinent tags across the dependency graph. You get a module\_ctx object as an argument to the `implementation` function when you create a module extension. ## Members -- [download](#download) -- [download\_and\_extract](#download_and_extract) -- [execute](#execute) -- [extension\_metadata](#extension_metadata) -- [extract](#extract) -- [facts](#facts) -- [file](#file) -- [getenv](#getenv) -- [is\_dev\_dependency](#is_dev_dependency) -- [modules](#modules) -- [os](#os) -- [path](#path) -- [read](#read) -- [report\_progress](#report_progress) -- [root\_module\_has\_non\_dev\_dependency](#root_module_has_non_dev_dependency) -- [watch](#watch) -- [which](#which) +* [download](#download) +* [download\_and\_extract](#download_and_extract) +* [execute](#execute) +* [extension\_metadata](#extension_metadata) +* [extract](#extract) +* [facts](#facts) +* [file](#file) +* [getenv](#getenv) +* [is\_dev\_dependency](#is_dev_dependency) +* [modules](#modules) +* [os](#os) +* [path](#path) +* [read](#read) +* [report\_progress](#report_progress) +* [root\_module\_has\_non\_dev\_dependency](#root_module_has_non_dev_dependency) +* [watch](#watch) +* [which](#which) ## download @@ -32,56 +30,22 @@ The context of the module extension containing helper functions and information unknown module_ctx.download(url, output='', sha256='', executable=False, allow_fail=False, canonical_id='', auth={}, headers={}, *, integrity='', block=True) ``` - Downloads a file to the output path for the provided url and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) +Downloads a file to the output path for the provided url and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) ### Parameters -ParameterDescription`url`[string](../core/string.html); or Iterable of [string](../core/string.html) s; - required - - List of mirror URLs referencing the same file. - `output`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - default is `''` - - path to the output file, relative to the repository directory. - `sha256`[string](../core/string.html); - default is `''` - - The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - - `executable`[bool](../core/bool.html); - default is `False` - - Set the executable flag on the created file, false by default. - `allow_fail`[bool](../core/bool.html); - default is `False` - - If set, indicate the error in the return value instead of raising an error for failed downloads. - - `canonical_id`[string](../core/string.html); - default is `''` - - If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum ( `sha256` or `integrity`). - - `auth`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying authentication information for some of the URLs. - `headers`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying http headers for all URLs. - `integrity`[string](../core/string.html); - default is `''` - - Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - - `block`[bool](../core/bool.html); - default is `True` - - If set to false, the call returns immediately and instead of the regular return value, it returns a token with one single method, wait(), which blocks until the download is finished and returns the usual return value or throws as usual. - - +| Parameter | Description | +| --- | --- | +| `url` | [string](../core/string); or Iterable of [string](../core/string)s; required List of mirror URLs referencing the same file. | +| `output` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); default is `''` path to the output file, relative to the repository directory. | +| `sha256` | [string](../core/string); default is `''` The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `executable` | [bool](../core/bool); default is `False` Set the executable flag on the created file, false by default. | +| `allow_fail` | [bool](../core/bool); default is `False` If set, indicate the error in the return value instead of raising an error for failed downloads. | +| `canonical_id` | [string](../core/string); default is `''` If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum (`sha256` or `integrity`). | +| `auth` | [dict](../core/dict); default is `{}` An optional dict specifying authentication information for some of the URLs. | +| `headers` | [dict](../core/dict); default is `{}` An optional dict specifying http headers for all URLs. | +| `integrity` | [string](../core/string); default is `''` Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `block` | [bool](../core/bool); default is `True` If set to false, the call returns immediately and instead of the regular return value, it returns a token with one single method, wait(), which blocks until the download is finished and returns the usual return value or throws as usual. | ## download\_and\_extract @@ -89,70 +53,23 @@ ParameterDescription`url`[string](../core/string.html); or Iterable of [string]( struct module_ctx.download_and_extract(url, output='', sha256='', type='', strip_prefix='', allow_fail=False, canonical_id='', auth={}, headers={}, *, integrity='', rename_files={}) ``` - Downloads a file to the output path for the provided url, extracts it, and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) +Downloads a file to the output path for the provided url, extracts it, and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) ### Parameters -ParameterDescription`url`[string](../core/string.html); or Iterable of [string](../core/string.html) s; - required - - List of mirror URLs referencing the same file. - `output`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - default is `''` - - Path to the directory where the archive will be unpacked, relative to the repository directory. - - `sha256`[string](../core/string.html); - default is `''` - - The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - - `type`[string](../core/string.html); - default is `''` - - The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. - `strip_prefix`[string](../core/string.html); - default is `''` - - A directory prefix to strip from the extracted files. Many 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 `build_file`, this field can -be used to strip it from extracted files. - -For compatibility, this parameter may also be used under the deprecated name -`stripPrefix`. - - - -`allow_fail`[bool](../core/bool.html); - default is `False` - - If set, indicate the error in the return value instead of raising an error for failed downloads. - - `canonical_id`[string](../core/string.html); - default is `''` - - If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum -( `sha256` or `integrity`). - - `auth`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying authentication information for some of the URLs. - `headers`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying http headers for all URLs. - `integrity`[string](../core/string.html); - default is `''` - - Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - `rename_files`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. - - +| Parameter | Description | +| --- | --- | +| `url` | [string](../core/string); or Iterable of [string](../core/string)s; required List of mirror URLs referencing the same file. | +| `output` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); default is `''` Path to the directory where the archive will be unpacked, relative to the repository directory. | +| `sha256` | [string](../core/string); default is `''` The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `type` | [string](../core/string); default is `''` The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. | +| `strip_prefix` | [string](../core/string); default is `''` A directory prefix to strip from the extracted files. Many 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 `build_file`, this field can be used to strip it from extracted files. For compatibility, this parameter may also be used under the deprecated name `stripPrefix`. | +| `allow_fail` | [bool](../core/bool); default is `False` If set, indicate the error in the return value instead of raising an error for failed downloads. | +| `canonical_id` | [string](../core/string); default is `''` If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum (`sha256` or `integrity`). | +| `auth` | [dict](../core/dict); default is `{}` An optional dict specifying authentication information for some of the URLs. | +| `headers` | [dict](../core/dict); default is `{}` An optional dict specifying http headers for all URLs. | +| `integrity` | [string](../core/string); default is `''` Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `rename_files` | [dict](../core/dict); default is `{}` An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. | ## execute @@ -160,38 +77,17 @@ For compatibility, this parameter may also be used under the deprecated name exec_result module_ctx.execute(arguments, timeout=600, environment={}, quiet=True, working_directory="") ``` - Executes the command given by the list of arguments. The execution time of the command is limited by `timeout` (in seconds, default 600 seconds). This method returns an `exec_result` structure containing the output of the command. The `environment` map can be used to override some environment variables to be passed to the process. - - +Executes the command given by the list of arguments. The execution time of the command is limited by `timeout` (in seconds, default 600 seconds). This method returns an `exec_result` structure containing the output of the command. The `environment` map can be used to override some environment variables to be passed to the process. ### Parameters -ParameterDescription`arguments`[sequence](../core/list.html); - required - - List of arguments, the first element should be the path to the program to execute. - - `timeout`[int](../core/int.html); - default is `600` - - Maximum duration of the command in seconds (default is 600 seconds). - `environment`[dict](../core/dict.html); - default is `{}` - - Force some environment variables to be set to be passed to the process. The value can be `None` to remove the environment variable. - - `quiet`[bool](../core/bool.html); - default is `True` - - If stdout and stderr should be printed to the terminal. - `working_directory`[string](../core/string.html); - default is `""` - - Working directory for command execution. -Can be relative to the repository root or absolute. -The default is the repository root. - - +| Parameter | Description | +| --- | --- | +| `arguments` | [sequence](../core/list); required List of arguments, the first element should be the path to the program to execute. | +| `timeout` | [int](../core/int); default is `600` Maximum duration of the command in seconds (default is 600 seconds). | +| `environment` | [dict](../core/dict); default is `{}` Force some environment variables to be set to be passed to the process. The value can be `None` to remove the environment variable. | +| `quiet` | [bool](../core/bool); default is `True` If stdout and stderr should be printed to the terminal. | +| `working_directory` | [string](../core/string); default is `""` Working directory for command execution. Can be relative to the repository root or absolute. The default is the repository root. | ## extension\_metadata @@ -199,58 +95,16 @@ The default is the repository root. extension_metadata module_ctx.extension_metadata(*, root_module_direct_deps=None, root_module_direct_dev_deps=None, reproducible=False, facts={}) ``` - Constructs an opaque object that can be returned from the module extension's implementation function to provide metadata about the repositories generated by the extension to Bazel. - +Constructs an opaque object that can be returned from the module extension's implementation function to provide metadata about the repositories generated by the extension to Bazel. ### Parameters -ParameterDescription`root_module_direct_deps`[sequence](../core/list.html) of [string](../core/string.html) s; or [string](../core/string.html); or `None`; - default is `None` - - The names of the repositories that the extension considers to be direct dependencies of the root module. If the root module imports additional repositories or does not import all of these repositories via [`use_repo`](../globals/module.html#use_repo), Bazel will print a warning when the extension is evaluated, instructing the user to run `bazel mod tidy` to fix the `use_repo` calls automatically. - -If one of `root_module_direct_deps` and will print a warning and a fixup command when the extension is evaluated. - -If one of `root_module_direct_deps` and `root_module_direct_dev_deps` is specified, the other has to be as well. The lists specified by these two parameters must be disjoint. - -Exactly one of `root_module_direct_deps` and `root_module_direct_dev_deps` can be set to the special value `"all"`, which is treated as if a list with the names of all repositories generated by the extension was specified as the value. - - -`root_module_direct_dev_deps`[sequence](../core/list.html) of [string](../core/string.html) s; or [string](../core/string.html); or `None`; - default is `None` - - The names of the repositories that the extension considers to be direct dev dependencies of the root module. If the root module imports additional repositories or does not import all of these repositories via [`use_repo`](../globals/module.html#use_repo) on an extension proxy created with `use_extension(..., dev_dependency = True)`, Bazel will print a warning when the extension is evaluated, instructing the user to run `bazel mod tidy` to fix the `use_repo` calls automatically. - -If one of `root_module_direct_deps` and `root_module_direct_dev_deps` is specified, the other has to be as well. The lists specified by these two parameters must be disjoint. - -Exactly one of `root_module_direct_deps` and `root_module_direct_dev_deps` can be set to the special value `"all"`, which is treated as if a list with the names of all repositories generated by the extension was specified as the value. - - -`reproducible`[bool](../core/bool.html); - default is `False` - - States that this module extension ensures complete reproducibility, thereby it should not be stored in the lockfile. - `facts`[dict](../core/dict.html) of [string](../core/string.html) s; - default is `{}` - - A JSON-like dict that is made available to future executions of this extension via -the \`module\_ctx.facts\` property. -This is useful for extensions that want to preserve universally true facts such as -the hashes of artifacts in an immutable repository. - -Bazel may shallowly merge multiple facts dicts returned by different versions of the -extension in order to resolve merge conflicts on the MODULE.bazel.lock file, as if -by applying the \`dict.update()\` method or the \`\|\` operator in Starlark. Extensions -should use facts for key-value storage only and ensure that the key uniquely -determines the value, although perhaps only via additional information and network -access. An extension can opt out of this merging by providing a dict with a single, -fixed top-level key and an arbitrary value. - -Note that the value provided here may be read back by a different version of the -extension, so either include a version number or use a schema that is unlikely to -result in ambiguities. - - +| Parameter | Description | +| --- | --- | +| `root_module_direct_deps` | [sequence](../core/list) of [string](../core/string)s; or [string](../core/string); or `None`; default is `None` The names of the repositories that the extension considers to be direct dependencies of the root module. If the root module imports additional repositories or does not import all of these repositories via [`use_repo`](../globals/module#use_repo), Bazel will print a warning when the extension is evaluated, instructing the user to run `bazel mod tidy` to fix the `use_repo` calls automatically. If one of `root_module_direct_deps` and will print a warning and a fixup command when the extension is evaluated. If one of `root_module_direct_deps` and `root_module_direct_dev_deps` is specified, the other has to be as well. The lists specified by these two parameters must be disjoint. Exactly one of `root_module_direct_deps` and `root_module_direct_dev_deps` can be set to the special value `"all"`, which is treated as if a list with the names of all repositories generated by the extension was specified as the value. | +| `root_module_direct_dev_deps` | [sequence](../core/list) of [string](../core/string)s; or [string](../core/string); or `None`; default is `None` The names of the repositories that the extension considers to be direct dev dependencies of the root module. If the root module imports additional repositories or does not import all of these repositories via [`use_repo`](../globals/module#use_repo) on an extension proxy created with `use_extension(..., dev_dependency = True)`, Bazel will print a warning when the extension is evaluated, instructing the user to run `bazel mod tidy` to fix the `use_repo` calls automatically. If one of `root_module_direct_deps` and `root_module_direct_dev_deps` is specified, the other has to be as well. The lists specified by these two parameters must be disjoint. Exactly one of `root_module_direct_deps` and `root_module_direct_dev_deps` can be set to the special value `"all"`, which is treated as if a list with the names of all repositories generated by the extension was specified as the value. | +| `reproducible` | [bool](../core/bool); default is `False` States that this module extension ensures complete reproducibility, thereby it should not be stored in the lockfile. | +| `facts` | [dict](../core/dict) of [string](../core/string)s; default is `{}` A JSON-like dict that is made available to future executions of this extension via the `module\_ctx.facts` property. This is useful for extensions that want to preserve universally true facts such as the hashes of artifacts in an immutable repository. Bazel may shallowly merge multiple facts dicts returned by different versions of the extension in order to resolve merge conflicts on the MODULE.bazel.lock file, as if by applying the `dict.update()` method or the `|` operator in Starlark. Extensions should use facts for key-value storage only and ensure that the key uniquely determines the value, although perhaps only via additional information and network access. An extension can opt out of this merging by providing a dict with a single, fixed top-level key and an arbitrary value. Note that the value provided here may be read back by a different version of the extension, so either include a version number or use a schema that is unlikely to result in ambiguities. | ## extract @@ -258,45 +112,18 @@ result in ambiguities. None module_ctx.extract(archive, output='', strip_prefix='', *, rename_files={}, watch_archive='auto', type='') ``` - Extract an archive to the repository directory. - +Extract an archive to the repository directory. ### Parameters -ParameterDescription`archive`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - path to the archive that will be unpacked, relative to the repository directory. - `output`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - default is `''` - - path to the directory where the archive will be unpacked, relative to the repository directory. - `strip_prefix`[string](../core/string.html); - default is `''` - - a directory prefix to strip from the extracted files. Many 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 `build_file`, this field can be -used to strip it from extracted files. - -For compatibility, this parameter may also be used under the deprecated name -`stripPrefix`. - - - -`rename_files`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. - `watch_archive`[string](../core/string.html); - default is `'auto'` - - whether to [watch](#watch) the archive file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. - `type`[string](../core/string.html); - default is `''` - - The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. - +| Parameter | Description | +| --- | --- | +| `archive` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required path to the archive that will be unpacked, relative to the repository directory. | +| `output` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); default is `''` path to the directory where the archive will be unpacked, relative to the repository directory. | +| `strip_prefix` | [string](../core/string); default is `''` a directory prefix to strip from the extracted files. Many 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 `build_file`, this field can be used to strip it from extracted files. For compatibility, this parameter may also be used under the deprecated name `stripPrefix`. | +| `rename_files` | [dict](../core/dict); default is `{}` An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. | +| `watch_archive` | [string](../core/string); default is `'auto'` whether to [watch](#watch) the archive file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. | +| `type` | [string](../core/string); default is `''` The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. | ## facts @@ -304,45 +131,30 @@ For compatibility, this parameter may also be used under the deprecated name Facts module_ctx.facts ``` - The JSON-like dict returned by a previous execution of this extension in the \`facts\` -parameter of \[\`extension\_metadata\`\](../builtins/module\_ctx#extension\_metadata) or else -\`{}\`. +The JSON-like dict returned by a previous execution of this extension in the `facts` +parameter of [`extension\_metadata`](../builtins/module\_ctx#extension\_metadata) or else +`{}`. This is useful for extensions that want to preserve universally true facts such as the hashes of artifacts in an immutable repository. Note that the returned value may have been created by a different version of the extension, which may have used a different schema. - - ## file ``` None module_ctx.file(path, content='', executable=True, legacy_utf8=False) ``` - Generates a file in the repository directory with the provided content. - +Generates a file in the repository directory with the provided content. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the file to create, relative to the repository directory. - `content`[string](../core/string.html); - default is `''` - - The content of the file to create, empty by default. - `executable`[bool](../core/bool.html); - default is `True` - - Set the executable flag on the created file, true by default. - `legacy_utf8`[bool](../core/bool.html); - default is `False` - - No-op. This parameter is deprecated and will be removed in a future version of Bazel. - - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the file to create, relative to the repository directory. | +| `content` | [string](../core/string); default is `''` The content of the file to create, empty by default. | +| `executable` | [bool](../core/bool); default is `True` Set the executable flag on the created file, true by default. | +| `legacy_utf8` | [bool](../core/bool); default is `False` No-op. This parameter is deprecated and will be removed in a future version of Bazel. | ## getenv @@ -350,26 +162,18 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ string module_ctx.getenv(name, default=None) ``` - Returns the value of an environment variable `name` as a string if exists, or `default` if it doesn't. +Returns the value of an environment variable `name` as a string if exists, or `default` if it doesn't. When building incrementally, any change to the value of the variable named by `name` will cause this repository to be re-fetched. - - ### Parameters -ParameterDescription`name`[string](../core/string.html); - required - - Name of desired environment variable. - `default`[string](../core/string.html); or `None`; - default is `None` - - Default value to return if `name` is not found. - - May return `None`. - +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); required Name of desired environment variable. | +| `default` | [string](../core/string); or `None`; default is `None` Default value to return if `name` is not found. | +May return `None`. ## is\_dev\_dependency @@ -377,17 +181,13 @@ ParameterDescription`name`[string](../core/string.html); bool module_ctx.is_dev_dependency(tag) ``` - Returns whether the given tag was specified on the result of a [use\_extension](../globals/module.html#use_extension) call with `devDependency = True`. - +Returns whether the given tag was specified on the result of a [use\_extension](../globals/module#use_extension) call with `devDependency = True`. ### Parameters -ParameterDescription`tag` - bazel\_module\_tag; - required - - A tag obtained from [bazel\_module.tags](../builtins/bazel_module.html#tags). - +| Parameter | Description | +| --- | --- | +| `tag` | bazel\_module\_tag; required A tag obtained from [bazel\_module.tags](../builtins/bazel_module#tags). | ## modules @@ -395,9 +195,7 @@ ParameterDescription`tag` list module_ctx.modules ``` - A list of all the Bazel modules in the external dependency graph that use this module extension, each of which is a [bazel\_module](../builtins/bazel_module.html) object that exposes all the tags it specified for this extension. The iteration order of this dictionary is guaranteed to be the same as breadth-first search starting from the root module. - - +A list of all the Bazel modules in the external dependency graph that use this module extension, each of which is a [bazel\_module](../builtins/bazel_module) object that exposes all the tags it specified for this extension. The iteration order of this dictionary is guaranteed to be the same as breadth-first search starting from the root module. ## os @@ -405,9 +203,7 @@ list module_ctx.modules repository_os module_ctx.os ``` - A struct to access information from the system. - - +A struct to access information from the system. ## path @@ -415,17 +211,13 @@ repository_os module_ctx.os path module_ctx.path(path) ``` - Returns a path from a string, label, or path. If this context is a `repository_ctx`, a relative path will resolve relative to the repository directory. If it is a `module_ctx`, a relative path will resolve relative to a temporary working directory for this module extension. If the path is a label, it will resolve to the path of the corresponding file. Note that remote repositories and module extensions are executed during the analysis phase and thus cannot depends on a target result (the label should point to a non-generated file). If path is a path, it will return that path as is. - - +Returns a path from a string, label, or path. If this context is a `repository_ctx`, a relative path will resolve relative to the repository directory. If it is a `module_ctx`, a relative path will resolve relative to a temporary working directory for this module extension. If the path is a label, it will resolve to the path of the corresponding file. Note that remote repositories and module extensions are executed during the analysis phase and thus cannot depends on a target result (the label should point to a non-generated file). If path is a path, it will return that path as is. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - -`string`, `Label` or `path` from which to create a path from. - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required `string`, `Label` or `path` from which to create a path from. | ## read @@ -433,21 +225,14 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ string module_ctx.read(path, *, watch='auto') ``` - Reads the content of a file on the filesystem. - +Reads the content of a file on the filesystem. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the file to read from. - `watch`[string](../core/string.html); - default is `'auto'` - - Whether to [watch](#watch) the file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. - - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the file to read from. | +| `watch` | [string](../core/string); default is `'auto'` Whether to [watch](#watch) the file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. | ## report\_progress @@ -455,16 +240,13 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ None module_ctx.report_progress(status='') ``` - Updates the progress status for the fetching of this repository or module extension. - +Updates the progress status for the fetching of this repository or module extension. ### Parameters -ParameterDescription`status`[string](../core/string.html); - default is `''` - -`string` describing the current status of the fetch progress. - +| Parameter | Description | +| --- | --- | +| `status` | [string](../core/string); default is `''` `string` describing the current status of the fetch progress. | ## root\_module\_has\_non\_dev\_dependency @@ -472,9 +254,7 @@ ParameterDescription`status`[string](../core/string.html); bool module_ctx.root_module_has_non_dev_dependency ``` - Whether the root module uses this extension as a non-dev dependency. - - +Whether the root module uses this extension as a non-dev dependency. ## watch @@ -482,21 +262,17 @@ bool module_ctx.root_module_has_non_dev_dependency None module_ctx.watch(path) ``` - Tells Bazel to watch for changes to the given path, whether or not it exists, or whether it's a file or a directory. Any changes to the file or directory will invalidate this repository or module extension, and cause it to be refetched or re-evaluated next time. +Tells Bazel to watch for changes to the given path, whether or not it exists, or whether it's a file or a directory. Any changes to the file or directory will invalidate this repository or module extension, and cause it to be refetched or re-evaluated next time. -"Changes" include changes to the contents of the file (if the path is a file); if the path was a file but is now a directory, or vice versa; and if the path starts or stops existing. Notably, this does _not_ include changes to any files under the directory if the path is a directory. For that, use [`path.readdir()`](path.html#readdir) instead. +"Changes" include changes to the contents of the file (if the path is a file); if the path was a file but is now a directory, or vice versa; and if the path starts or stops existing. Notably, this does *not* include changes to any files under the directory if the path is a directory. For that, use [`path.readdir()`](path#readdir) instead. Note that attempting to watch paths inside the repo currently being fetched, or inside the working directory of the current module extension, will result in an error. A module extension attempting to watch a path outside the current Bazel workspace will also result in an error. - - ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the file to watch. - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the file to watch. | ## which @@ -504,15 +280,12 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ path module_ctx.which(program) ``` - Returns the `path` of the corresponding program or `None` if there is no such program in the path. - - +Returns the `path` of the corresponding program or `None` if there is no such program in the path. ### Parameters -ParameterDescription`program`[string](../core/string.html); - required - - Program to find in the path. +| Parameter | Description | +| --- | --- | +| `program` | [string](../core/string); required Program to find in the path. | - May return `None`. +May return `None`. \ No newline at end of file diff --git a/rules/lib/builtins/path.mdx b/rules/lib/builtins/path.mdx index 1d1d36b6a..4fdf07f26 100644 --- a/rules/lib/builtins/path.mdx +++ b/rules/lib/builtins/path.mdx @@ -2,19 +2,17 @@ title: 'path' --- - - A structure representing a file to be used inside a repository. ## Members -- [basename](#basename) -- [dirname](#dirname) -- [exists](#exists) -- [get\_child](#get_child) -- [is\_dir](#is_dir) -- [readdir](#readdir) -- [realpath](#realpath) +* [basename](#basename) +* [dirname](#dirname) +* [exists](#exists) +* [get\_child](#get_child) +* [is\_dir](#is_dir) +* [readdir](#readdir) +* [realpath](#realpath) ## basename @@ -22,9 +20,7 @@ A structure representing a file to be used inside a repository. string path.basename ``` - A string giving the basename of the file. - - +A string giving the basename of the file. ## dirname @@ -32,10 +28,8 @@ string path.basename path path.dirname ``` - The parent directory of this file, or None if this file does not have a parent. - May return `None`. - - +The parent directory of this file, or None if this file does not have a parent. +May return `None`. ## exists @@ -43,11 +37,9 @@ path path.dirname bool path.exists ``` - Returns true if the file or directory denoted by this path exists. - -Note that accessing this field does _not_ cause the path to be watched. If you'd like the repo rule or module extension to be sensitive to the path's existence, use the `watch()` method on the context object. - +Returns true if the file or directory denoted by this path exists. +Note that accessing this field does *not* cause the path to be watched. If you'd like the repo rule or module extension to be sensitive to the path's existence, use the `watch()` method on the context object. ## get\_child @@ -55,17 +47,13 @@ Note that accessing this field does _not_ cause the path to be watched. If you'd path path.get_child(*relative_paths) ``` - Returns the path obtained by joining this path with the given relative paths. - +Returns the path obtained by joining this path with the given relative paths. ### Parameters -ParameterDescription`relative_paths` - required - - Zero or more relative path strings to append to this path with path separators added as needed. - - +| Parameter | Description | +| --- | --- | +| `relative_paths` | required Zero or more relative path strings to append to this path with path separators added as needed. | ## is\_dir @@ -73,11 +61,9 @@ ParameterDescription`relative_paths` bool path.is_dir ``` - Returns true if this path points to a directory. - -Note that accessing this field does _not_ cause the path to be watched. If you'd like the repo rule or module extension to be sensitive to whether the path is a directory or a file, use the `watch()` method on the context object. - +Returns true if this path points to a directory. +Note that accessing this field does *not* cause the path to be watched. If you'd like the repo rule or module extension to be sensitive to whether the path is a directory or a file, use the `watch()` method on the context object. ## readdir @@ -85,20 +71,13 @@ Note that accessing this field does _not_ cause the path to be watched. If you'd list path.readdir(*, watch='auto') ``` - Returns the list of entries in the directory denoted by this path. Each entry is a `path` object itself. - - +Returns the list of entries in the directory denoted by this path. Each entry is a `path` object itself. ### Parameters -ParameterDescription`watch`[string](../core/string.html); - default is `'auto'` - - whether Bazel should watch the list of entries in this directory and refetch the repository or re-evaluate the module extension next time when any changes are detected. Changes to detect include entry creation, deletion, and renaming. Note that this doesn't watch the _contents_ of any entries in the directory. - -Can be the string 'yes', 'no', or 'auto'. If set to 'auto', Bazel will only watch this directory when it is legal to do so (see [`repository_ctx.watch()`](repository_ctx.html#watch) docs for more information). - - +| Parameter | Description | +| --- | --- | +| `watch` | [string](../core/string); default is `'auto'` whether Bazel should watch the list of entries in this directory and refetch the repository or re-evaluate the module extension next time when any changes are detected. Changes to detect include entry creation, deletion, and renaming. Note that this doesn't watch the *contents* of any entries in the directory. Can be the string 'yes', 'no', or 'auto'. If set to 'auto', Bazel will only watch this directory when it is legal to do so (see [`repository_ctx.watch()`](repository_ctx#watch) docs for more information). | ## realpath @@ -106,4 +85,4 @@ Can be the string 'yes', 'no', or 'auto'. If set to 'auto', Bazel will only watc path path.realpath ``` - Returns the canonical path for this path by repeatedly replacing all symbolic links with their referents. +Returns the canonical path for this path by repeatedly replacing all symbolic links with their referents. \ No newline at end of file diff --git a/rules/lib/builtins/propagation_ctx.mdx b/rules/lib/builtins/propagation_ctx.mdx index 8e4b23c62..3d56db863 100644 --- a/rules/lib/builtins/propagation_ctx.mdx +++ b/rules/lib/builtins/propagation_ctx.mdx @@ -2,14 +2,12 @@ title: 'propagation\_ctx' --- - - A context object that is passed to the `propagation_predicate`, `attr_aspects` and `toolchains_aspects` functions of aspects. It provides access to the information needed to determine whether the aspect should be propagated to the target and what attributes or toolchain types it should be propagated to next. ## Members -- [attr](#attr) -- [rule](#rule) +* [attr](#attr) +* [rule](#rule) ## attr @@ -17,9 +15,7 @@ A context object that is passed to the `propagation_predicate`, `attr_aspects` a struct propagation_ctx.attr ``` - A struct to access only the public parameters of the aspect. The keys and values of the struct are the parameters names and values. - - +A struct to access only the public parameters of the aspect. The keys and values of the struct are the parameters names and values. ## rule @@ -27,4 +23,4 @@ struct propagation_ctx.attr StarlarkAspectPropagationRuleApi propagation_ctx.rule ``` - Allows access to the details of the rule. +Allows access to the details of the rule. \ No newline at end of file diff --git a/rules/lib/builtins/repo_metadata.mdx b/rules/lib/builtins/repo_metadata.mdx index ba364b5c2..0b28cbac2 100644 --- a/rules/lib/builtins/repo_metadata.mdx +++ b/rules/lib/builtins/repo_metadata.mdx @@ -2,6 +2,4 @@ title: 'repo\_metadata' --- - - -See [`repository_ctx.repo_metadata`](repository_ctx#repo_metadata). +See [`repository_ctx.repo_metadata`](repository_ctx#repo_metadata). \ No newline at end of file diff --git a/rules/lib/builtins/repository_ctx.mdx b/rules/lib/builtins/repository_ctx.mdx index 6147dfa29..3b4a33468 100644 --- a/rules/lib/builtins/repository_ctx.mdx +++ b/rules/lib/builtins/repository_ctx.mdx @@ -2,35 +2,33 @@ title: 'repository\_ctx' --- - - The context of the repository rule containing helper functions and information about attributes. You get a repository\_ctx object as an argument to the `implementation` function when you create a repository rule. ## Members -- [attr](#attr) -- [delete](#delete) -- [download](#download) -- [download\_and\_extract](#download_and_extract) -- [execute](#execute) -- [extract](#extract) -- [file](#file) -- [getenv](#getenv) -- [name](#name) -- [original\_name](#original_name) -- [os](#os) -- [patch](#patch) -- [path](#path) -- [read](#read) -- [rename](#rename) -- [repo\_metadata](#repo_metadata) -- [report\_progress](#report_progress) -- [symlink](#symlink) -- [template](#template) -- [watch](#watch) -- [watch\_tree](#watch_tree) -- [which](#which) -- [workspace\_root](#workspace_root) +* [attr](#attr) +* [delete](#delete) +* [download](#download) +* [download\_and\_extract](#download_and_extract) +* [execute](#execute) +* [extract](#extract) +* [file](#file) +* [getenv](#getenv) +* [name](#name) +* [original\_name](#original_name) +* [os](#os) +* [patch](#patch) +* [path](#path) +* [read](#read) +* [rename](#rename) +* [repo\_metadata](#repo_metadata) +* [report\_progress](#report_progress) +* [symlink](#symlink) +* [template](#template) +* [watch](#watch) +* [watch\_tree](#watch_tree) +* [which](#which) +* [workspace\_root](#workspace_root) ## attr @@ -38,9 +36,7 @@ The context of the repository rule containing helper functions and information a structure repository_ctx.attr ``` - A struct to access the values of the attributes. The values are provided by the user (if not, a default value is used). - - +A struct to access the values of the attributes. The values are provided by the user (if not, a default value is used). ## delete @@ -48,18 +44,13 @@ structure repository_ctx.attr bool repository_ctx.delete(path) ``` - Deletes a file or a directory. Returns a bool, indicating whether the file or directory was actually deleted by this call. - - +Deletes a file or a directory. Returns a bool, indicating whether the file or directory was actually deleted by this call. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [path](../builtins/path.html); - required - - Path of the file to delete, relative to the repository directory, or absolute. Can be a path or a string. - - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [path](../builtins/path); required Path of the file to delete, relative to the repository directory, or absolute. Can be a path or a string. | ## download @@ -67,56 +58,22 @@ ParameterDescription`path`[string](../core/string.html); or [path](../builtins/p unknown repository_ctx.download(url, output='', sha256='', executable=False, allow_fail=False, canonical_id='', auth={}, headers={}, *, integrity='', block=True) ``` - Downloads a file to the output path for the provided url and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) +Downloads a file to the output path for the provided url and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) ### Parameters -ParameterDescription`url`[string](../core/string.html); or Iterable of [string](../core/string.html) s; - required - - List of mirror URLs referencing the same file. - `output`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - default is `''` - - path to the output file, relative to the repository directory. - `sha256`[string](../core/string.html); - default is `''` - - The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - - `executable`[bool](../core/bool.html); - default is `False` - - Set the executable flag on the created file, false by default. - `allow_fail`[bool](../core/bool.html); - default is `False` - - If set, indicate the error in the return value instead of raising an error for failed downloads. - - `canonical_id`[string](../core/string.html); - default is `''` - - If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum ( `sha256` or `integrity`). - - `auth`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying authentication information for some of the URLs. - `headers`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying http headers for all URLs. - `integrity`[string](../core/string.html); - default is `''` - - Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - - `block`[bool](../core/bool.html); - default is `True` - - If set to false, the call returns immediately and instead of the regular return value, it returns a token with one single method, wait(), which blocks until the download is finished and returns the usual return value or throws as usual. - - +| Parameter | Description | +| --- | --- | +| `url` | [string](../core/string); or Iterable of [string](../core/string)s; required List of mirror URLs referencing the same file. | +| `output` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); default is `''` path to the output file, relative to the repository directory. | +| `sha256` | [string](../core/string); default is `''` The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `executable` | [bool](../core/bool); default is `False` Set the executable flag on the created file, false by default. | +| `allow_fail` | [bool](../core/bool); default is `False` If set, indicate the error in the return value instead of raising an error for failed downloads. | +| `canonical_id` | [string](../core/string); default is `''` If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum (`sha256` or `integrity`). | +| `auth` | [dict](../core/dict); default is `{}` An optional dict specifying authentication information for some of the URLs. | +| `headers` | [dict](../core/dict); default is `{}` An optional dict specifying http headers for all URLs. | +| `integrity` | [string](../core/string); default is `''` Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `block` | [bool](../core/bool); default is `True` If set to false, the call returns immediately and instead of the regular return value, it returns a token with one single method, wait(), which blocks until the download is finished and returns the usual return value or throws as usual. | ## download\_and\_extract @@ -124,70 +81,23 @@ ParameterDescription`url`[string](../core/string.html); or Iterable of [string]( struct repository_ctx.download_and_extract(url, output='', sha256='', type='', strip_prefix='', allow_fail=False, canonical_id='', auth={}, headers={}, *, integrity='', rename_files={}) ``` - Downloads a file to the output path for the provided url, extracts it, and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) +Downloads a file to the output path for the provided url, extracts it, and returns a struct containing `success`, a flag which is `true` if the download completed successfully, and if successful, a hash of the file with the fields `sha256` and `integrity`. When `sha256` or `integrity` is user specified, setting an explicit `canonical_id` is highly recommended. e.g. [`get_default_canonical_id`](/rules/lib/repo/cache#get_default_canonical_id) ### Parameters -ParameterDescription`url`[string](../core/string.html); or Iterable of [string](../core/string.html) s; - required - - List of mirror URLs referencing the same file. - `output`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - default is `''` - - Path to the directory where the archive will be unpacked, relative to the repository directory. - - `sha256`[string](../core/string.html); - default is `''` - - The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - - `type`[string](../core/string.html); - default is `''` - - The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. - `strip_prefix`[string](../core/string.html); - default is `''` - - A directory prefix to strip from the extracted files. Many 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 `build_file`, this field can -be used to strip it from extracted files. - -For compatibility, this parameter may also be used under the deprecated name -`stripPrefix`. - - - -`allow_fail`[bool](../core/bool.html); - default is `False` - - If set, indicate the error in the return value instead of raising an error for failed downloads. - - `canonical_id`[string](../core/string.html); - default is `''` - - If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum -( `sha256` or `integrity`). - - `auth`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying authentication information for some of the URLs. - `headers`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying http headers for all URLs. - `integrity`[string](../core/string.html); - default is `''` - - Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. - `rename_files`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. - - +| Parameter | Description | +| --- | --- | +| `url` | [string](../core/string); or Iterable of [string](../core/string)s; required List of mirror URLs referencing the same file. | +| `output` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); default is `''` Path to the directory where the archive will be unpacked, relative to the repository directory. | +| `sha256` | [string](../core/string); default is `''` The expected SHA-256 hash of the file downloaded. This must match the SHA-256 hash of the file downloaded. It is a security risk to omit the SHA-256 as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given hash; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `type` | [string](../core/string); default is `''` The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. | +| `strip_prefix` | [string](../core/string); default is `''` A directory prefix to strip from the extracted files. Many 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 `build_file`, this field can be used to strip it from extracted files. For compatibility, this parameter may also be used under the deprecated name `stripPrefix`. | +| `allow_fail` | [bool](../core/bool); default is `False` If set, indicate the error in the return value instead of raising an error for failed downloads. | +| `canonical_id` | [string](../core/string); default is `''` If set, restrict cache hits to those cases where the file was added to the cache with the same canonical id. By default caching uses the checksum (`sha256` or `integrity`). | +| `auth` | [dict](../core/dict); default is `{}` An optional dict specifying authentication information for some of the URLs. | +| `headers` | [dict](../core/dict); default is `{}` An optional dict specifying http headers for all URLs. | +| `integrity` | [string](../core/string); default is `''` Expected checksum of the file downloaded, in Subresource Integrity format. This must match the checksum of the file downloaded. It is a security risk to omit the checksum as remote files can change. At best omitting this field will make your build non-hermetic. It is optional to make development easier but should be set before shipping. If provided, the repository cache will first be checked for a file with the given checksum; a download will only be attempted if the file was not found in the cache. After a successful download, the file will be added to the cache. | +| `rename_files` | [dict](../core/dict); default is `{}` An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. | ## execute @@ -195,38 +105,17 @@ For compatibility, this parameter may also be used under the deprecated name exec_result repository_ctx.execute(arguments, timeout=600, environment={}, quiet=True, working_directory="") ``` - Executes the command given by the list of arguments. The execution time of the command is limited by `timeout` (in seconds, default 600 seconds). This method returns an `exec_result` structure containing the output of the command. The `environment` map can be used to override some environment variables to be passed to the process. - - +Executes the command given by the list of arguments. The execution time of the command is limited by `timeout` (in seconds, default 600 seconds). This method returns an `exec_result` structure containing the output of the command. The `environment` map can be used to override some environment variables to be passed to the process. ### Parameters -ParameterDescription`arguments`[sequence](../core/list.html); - required - - List of arguments, the first element should be the path to the program to execute. - - `timeout`[int](../core/int.html); - default is `600` - - Maximum duration of the command in seconds (default is 600 seconds). - `environment`[dict](../core/dict.html); - default is `{}` - - Force some environment variables to be set to be passed to the process. The value can be `None` to remove the environment variable. - - `quiet`[bool](../core/bool.html); - default is `True` - - If stdout and stderr should be printed to the terminal. - `working_directory`[string](../core/string.html); - default is `""` - - Working directory for command execution. -Can be relative to the repository root or absolute. -The default is the repository root. - - +| Parameter | Description | +| --- | --- | +| `arguments` | [sequence](../core/list); required List of arguments, the first element should be the path to the program to execute. | +| `timeout` | [int](../core/int); default is `600` Maximum duration of the command in seconds (default is 600 seconds). | +| `environment` | [dict](../core/dict); default is `{}` Force some environment variables to be set to be passed to the process. The value can be `None` to remove the environment variable. | +| `quiet` | [bool](../core/bool); default is `True` If stdout and stderr should be printed to the terminal. | +| `working_directory` | [string](../core/string); default is `""` Working directory for command execution. Can be relative to the repository root or absolute. The default is the repository root. | ## extract @@ -234,45 +123,18 @@ The default is the repository root. None repository_ctx.extract(archive, output='', strip_prefix='', *, rename_files={}, watch_archive='auto', type='') ``` - Extract an archive to the repository directory. - +Extract an archive to the repository directory. ### Parameters -ParameterDescription`archive`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - path to the archive that will be unpacked, relative to the repository directory. - `output`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - default is `''` - - path to the directory where the archive will be unpacked, relative to the repository directory. - `strip_prefix`[string](../core/string.html); - default is `''` - - a directory prefix to strip from the extracted files. Many 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 `build_file`, this field can be -used to strip it from extracted files. - -For compatibility, this parameter may also be used under the deprecated name -`stripPrefix`. - - - -`rename_files`[dict](../core/dict.html); - default is `{}` - - An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. - `watch_archive`[string](../core/string.html); - default is `'auto'` - - whether to [watch](#watch) the archive file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. - `type`[string](../core/string.html); - default is `''` - - The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. - +| Parameter | Description | +| --- | --- | +| `archive` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required path to the archive that will be unpacked, relative to the repository directory. | +| `output` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); default is `''` path to the directory where the archive will be unpacked, relative to the repository directory. | +| `strip_prefix` | [string](../core/string); default is `''` a directory prefix to strip from the extracted files. Many 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 `build_file`, this field can be used to strip it from extracted files. For compatibility, this parameter may also be used under the deprecated name `stripPrefix`. | +| `rename_files` | [dict](../core/dict); default is `{}` An optional dict specifying files to rename during the extraction. Archive entries with names exactly matching a key will be renamed to the value, prior to any directory prefix adjustment. This can be used to extract archives that contain non-Unicode filenames, or which have files that would extract to the same path on case-insensitive filesystems. | +| `watch_archive` | [string](../core/string); default is `'auto'` whether to [watch](#watch) the archive file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. | +| `type` | [string](../core/string); default is `''` The archive type of the downloaded file. By default, the archive type is determined from the file extension of the URL. If the file has no extension, you can explicitly specify either "zip", "jar", "war", "aar", "nupkg", "whl", "tar", "tar.gz", "tgz", "gz", "tar.xz", "txz", "xz", "tar.zst", "tzst", "zst", "tar.bz2", "tbz", "bz2", "ar", "deb" or "7z" here. | ## file @@ -280,29 +142,16 @@ For compatibility, this parameter may also be used under the deprecated name None repository_ctx.file(path, content='', executable=True, legacy_utf8=False) ``` - Generates a file in the repository directory with the provided content. - +Generates a file in the repository directory with the provided content. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the file to create, relative to the repository directory. - `content`[string](../core/string.html); - default is `''` - - The content of the file to create, empty by default. - `executable`[bool](../core/bool.html); - default is `True` - - Set the executable flag on the created file, true by default. - `legacy_utf8`[bool](../core/bool.html); - default is `False` - - No-op. This parameter is deprecated and will be removed in a future version of Bazel. - - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the file to create, relative to the repository directory. | +| `content` | [string](../core/string); default is `''` The content of the file to create, empty by default. | +| `executable` | [bool](../core/bool); default is `True` Set the executable flag on the created file, true by default. | +| `legacy_utf8` | [bool](../core/bool); default is `False` No-op. This parameter is deprecated and will be removed in a future version of Bazel. | ## getenv @@ -310,26 +159,18 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ string repository_ctx.getenv(name, default=None) ``` - Returns the value of an environment variable `name` as a string if exists, or `default` if it doesn't. +Returns the value of an environment variable `name` as a string if exists, or `default` if it doesn't. When building incrementally, any change to the value of the variable named by `name` will cause this repository to be re-fetched. - - ### Parameters -ParameterDescription`name`[string](../core/string.html); - required - - Name of desired environment variable. - `default`[string](../core/string.html); or `None`; - default is `None` - - Default value to return if `name` is not found. - - May return `None`. - +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); required Name of desired environment variable. | +| `default` | [string](../core/string); or `None`; default is `None` Default value to return if `name` is not found. | +May return `None`. ## name @@ -337,9 +178,7 @@ ParameterDescription`name`[string](../core/string.html); string repository_ctx.name ``` - The canonical name of the external repository created by this rule. This name is guaranteed to be unique among all external repositories, but its exact format is not specified. Use [`original_name`](#original_name) instead to get the name that was originally specified as the `name` when this repository rule was instantiated. - - +The canonical name of the external repository created by this rule. This name is guaranteed to be unique among all external repositories, but its exact format is not specified. Use [`original_name`](#original_name) instead to get the name that was originally specified as the `name` when this repository rule was instantiated. ## original\_name @@ -347,9 +186,7 @@ string repository_ctx.name string repository_ctx.original_name ``` - The name that was originally specified as the `name` attribute when this repository rule was instantiated. This name is not necessarily unique among external repositories. Use [`name`](#name) instead to get the canonical name of the external repository. - - +The name that was originally specified as the `name` attribute when this repository rule was instantiated. This name is not necessarily unique among external repositories. Use [`name`](#name) instead to get the canonical name of the external repository. ## os @@ -357,9 +194,7 @@ string repository_ctx.original_name repository_os repository_ctx.os ``` - A struct to access information from the system. - - +A struct to access information from the system. ## patch @@ -367,27 +202,15 @@ repository_os repository_ctx.os None repository_ctx.patch(patch_file, strip=0, *, watch_patch='auto') ``` - Apply a patch file to the root directory of external repository. The patch file should be a standard [unified diff format](https://en.wikipedia.org/wiki/Diff#Unified_format) file. The Bazel-native patch implementation doesn't support fuzz match and binary patch like the patch command line tool. - - +Apply a patch file to the root directory of external repository. The patch file should be a standard [unified diff format](https://en.wikipedia.org/wiki/Diff#Unified_format) file. The Bazel-native patch implementation doesn't support fuzz match and binary patch like the patch command line tool. ### Parameters -ParameterDescription`patch_file`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - The patch file to apply, it can be label, relative path or absolute path. If it's a relative path, it will resolve to the repository directory. - - `strip`[int](../core/int.html); - default is `0` - - Strip the specified number of leading components from file names. - `watch_patch`[string](../core/string.html); - default is `'auto'` - - Whether to [watch](#watch) the patch file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. - - +| Parameter | Description | +| --- | --- | +| `patch_file` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required The patch file to apply, it can be label, relative path or absolute path. If it's a relative path, it will resolve to the repository directory. | +| `strip` | [int](../core/int); default is `0` Strip the specified number of leading components from file names. | +| `watch_patch` | [string](../core/string); default is `'auto'` Whether to [watch](#watch) the patch file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. | ## path @@ -395,17 +218,13 @@ ParameterDescription`patch_file`[string](../core/string.html); or [Label](../bui path repository_ctx.path(path) ``` - Returns a path from a string, label, or path. If this context is a `repository_ctx`, a relative path will resolve relative to the repository directory. If it is a `module_ctx`, a relative path will resolve relative to a temporary working directory for this module extension. If the path is a label, it will resolve to the path of the corresponding file. Note that remote repositories and module extensions are executed during the analysis phase and thus cannot depends on a target result (the label should point to a non-generated file). If path is a path, it will return that path as is. - - +Returns a path from a string, label, or path. If this context is a `repository_ctx`, a relative path will resolve relative to the repository directory. If it is a `module_ctx`, a relative path will resolve relative to a temporary working directory for this module extension. If the path is a label, it will resolve to the path of the corresponding file. Note that remote repositories and module extensions are executed during the analysis phase and thus cannot depends on a target result (the label should point to a non-generated file). If path is a path, it will return that path as is. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - -`string`, `Label` or `path` from which to create a path from. - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required `string`, `Label` or `path` from which to create a path from. | ## read @@ -413,21 +232,14 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ string repository_ctx.read(path, *, watch='auto') ``` - Reads the content of a file on the filesystem. - +Reads the content of a file on the filesystem. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the file to read from. - `watch`[string](../core/string.html); - default is `'auto'` - - Whether to [watch](#watch) the file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. - - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the file to read from. | +| `watch` | [string](../core/string); default is `'auto'` Whether to [watch](#watch) the file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. | ## rename @@ -435,26 +247,15 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ None repository_ctx.rename(src, dst) ``` - Renames the file or directory from `src` to `dst`. Parent directories are created as needed. Fails if the destination path +Renames the file or directory from `src` to `dst`. Parent directories are created as needed. Fails if the destination path already exists. Both paths must be located within the repository. - - ### Parameters -ParameterDescription`src`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - The path of the existing file or directory to rename, relative -to the repository directory. - - `dst`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - The new name to which the file or directory will be renamed to, -relative to the repository directory. - - +| Parameter | Description | +| --- | --- | +| `src` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required The path of the existing file or directory to rename, relative to the repository directory. | +| `dst` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required The new name to which the file or directory will be renamed to, relative to the repository directory. | ## repo\_metadata @@ -462,27 +263,14 @@ relative to the repository directory. repo_metadata repository_ctx.repo_metadata(*, reproducible=False, attrs_for_reproducibility={}) ``` - Constructs an opaque object that can be returned from the repo rule's implementation function to provide metadata about its reproducibility. - - +Constructs an opaque object that can be returned from the repo rule's implementation function to provide metadata about its reproducibility. ### Parameters -ParameterDescription`reproducible`[bool](../core/bool.html); - default is `False` - - States that this repo can be reproducibly refetched; that is, if it were fetched another time with exactly the same input attributes, repo rule definition, watched files and environment variables, etc., then exactly the same output would be produced. This property needs to hold even if other untracked conditions change, such as information from the internet, the path of the workspace root, output from running arbitrary executables, etc. If set to True, this allows the fetched repo contents to be cached across workspaces. - -Note that setting this to True does not guarantee caching in the repo contents cache; for example, local repo rules are never cached. - - - -`attrs_for_reproducibility`[dict](../core/dict.html); - default is `{}` - - If `reproducible` is False, this can be specified to tell Bazel which attributes of the original repo rule to change to make it reproducible. - - +| Parameter | Description | +| --- | --- | +| `reproducible` | [bool](../core/bool); default is `False` States that this repo can be reproducibly refetched; that is, if it were fetched another time with exactly the same input attributes, repo rule definition, watched files and environment variables, etc., then exactly the same output would be produced. This property needs to hold even if other untracked conditions change, such as information from the internet, the path of the workspace root, output from running arbitrary executables, etc. If set to True, this allows the fetched repo contents to be cached across workspaces. Note that setting this to True does not guarantee caching in the repo contents cache; for example, local repo rules are never cached. | +| `attrs_for_reproducibility` | [dict](../core/dict); default is `{}` If `reproducible` is False, this can be specified to tell Bazel which attributes of the original repo rule to change to make it reproducible. | ## report\_progress @@ -490,16 +278,13 @@ Note that setting this to True does not guarantee caching in the repo contents c None repository_ctx.report_progress(status='') ``` - Updates the progress status for the fetching of this repository or module extension. - +Updates the progress status for the fetching of this repository or module extension. ### Parameters -ParameterDescription`status`[string](../core/string.html); - default is `''` - -`string` describing the current status of the fetch progress. - +| Parameter | Description | +| --- | --- | +| `status` | [string](../core/string); default is `''` `string` describing the current status of the fetch progress. | ## symlink @@ -507,20 +292,14 @@ ParameterDescription`status`[string](../core/string.html); None repository_ctx.symlink(target, link_name) ``` - Creates a symlink on the filesystem. - +Creates a symlink on the filesystem. ### Parameters -ParameterDescription`target`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - The path that the symlink should point to. - `link_name`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - The path of the symlink to create. - +| Parameter | Description | +| --- | --- | +| `target` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required The path that the symlink should point to. | +| `link_name` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required The path of the symlink to create. | ## template @@ -528,34 +307,17 @@ ParameterDescription`target`[string](../core/string.html); or [Label](../builtin None repository_ctx.template(path, template, substitutions={}, executable=True, *, watch_template='auto') ``` - Generates a new file using a `template`. Every occurrence in `template` of a key of `substitutions` will be replaced by the corresponding value. The result is written in `path`. An optional `executable` argument (default to true) can be set to turn on or off the executable bit. - - +Generates a new file using a `template`. Every occurrence in `template` of a key of `substitutions` will be replaced by the corresponding value. The result is written in `path`. An optional `executable` argument (default to true) can be set to turn on or off the executable bit. ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the file to create, relative to the repository directory. - `template`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path to the template file. - `substitutions`[dict](../core/dict.html); - default is `{}` - - Substitutions to make when expanding the template. - `executable`[bool](../core/bool.html); - default is `True` - - Set the executable flag on the created file, true by default. - `watch_template`[string](../core/string.html); - default is `'auto'` - - Whether to [watch](#watch) the template file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. - - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the file to create, relative to the repository directory. | +| `template` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path to the template file. | +| `substitutions` | [dict](../core/dict); default is `{}` Substitutions to make when expanding the template. | +| `executable` | [bool](../core/bool); default is `True` Set the executable flag on the created file, true by default. | +| `watch_template` | [string](../core/string); default is `'auto'` Whether to [watch](#watch) the template file. Can be the string 'yes', 'no', or 'auto'. Passing 'yes' is equivalent to immediately invoking the [`watch()`](#watch) method; passing 'no' does not attempt to watch the file; passing 'auto' will only attempt to watch the file when it is legal to do so (see `watch()` docs for more information. | ## watch @@ -563,21 +325,17 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ None repository_ctx.watch(path) ``` - Tells Bazel to watch for changes to the given path, whether or not it exists, or whether it's a file or a directory. Any changes to the file or directory will invalidate this repository or module extension, and cause it to be refetched or re-evaluated next time. +Tells Bazel to watch for changes to the given path, whether or not it exists, or whether it's a file or a directory. Any changes to the file or directory will invalidate this repository or module extension, and cause it to be refetched or re-evaluated next time. -"Changes" include changes to the contents of the file (if the path is a file); if the path was a file but is now a directory, or vice versa; and if the path starts or stops existing. Notably, this does _not_ include changes to any files under the directory if the path is a directory. For that, use [`path.readdir()`](path.html#readdir) instead. +"Changes" include changes to the contents of the file (if the path is a file); if the path was a file but is now a directory, or vice versa; and if the path starts or stops existing. Notably, this does *not* include changes to any files under the directory if the path is a directory. For that, use [`path.readdir()`](path#readdir) instead. Note that attempting to watch paths inside the repo currently being fetched, or inside the working directory of the current module extension, will result in an error. A module extension attempting to watch a path outside the current Bazel workspace will also result in an error. - - ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the file to watch. - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the file to watch. | ## watch\_tree @@ -585,19 +343,15 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ None repository_ctx.watch_tree(path) ``` - Tells Bazel to watch for changes to any files or directories transitively under the given path. Any changes to the contents of files, the existence of files or directories, file names or directory names, will cause this repo to be refetched. +Tells Bazel to watch for changes to any files or directories transitively under the given path. Any changes to the contents of files, the existence of files or directories, file names or directory names, will cause this repo to be refetched. Note that attempting to watch paths inside the repo currently being fetched will result in an error. - - ### Parameters -ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/Label.html); or [path](../builtins/path.html); - required - - Path of the directory tree to watch. - +| Parameter | Description | +| --- | --- | +| `path` | [string](../core/string); or [Label](../builtins/Label); or [path](../builtins/path); required Path of the directory tree to watch. | ## which @@ -605,20 +359,15 @@ ParameterDescription`path`[string](../core/string.html); or [Label](../builtins/ path repository_ctx.which(program) ``` - Returns the `path` of the corresponding program or `None` if there is no such program in the path. - - +Returns the `path` of the corresponding program or `None` if there is no such program in the path. ### Parameters -ParameterDescription`program`[string](../core/string.html); - required - - Program to find in the path. - - May return `None`. - +| Parameter | Description | +| --- | --- | +| `program` | [string](../core/string); required Program to find in the path. | +May return `None`. ## workspace\_root @@ -626,4 +375,4 @@ ParameterDescription`program`[string](../core/string.html); path repository_ctx.workspace_root ``` - The path to the root workspace of the bazel invocation. +The path to the root workspace of the bazel invocation. \ No newline at end of file diff --git a/rules/lib/builtins/repository_os.mdx b/rules/lib/builtins/repository_os.mdx index 9514f13bd..e546c63c5 100644 --- a/rules/lib/builtins/repository_os.mdx +++ b/rules/lib/builtins/repository_os.mdx @@ -2,15 +2,13 @@ title: 'repository\_os' --- - - Various data about the current platform Bazel is running on. ## Members -- [arch](#arch) -- [environ](#environ) -- [name](#name) +* [arch](#arch) +* [environ](#environ) +* [name](#name) ## arch @@ -18,9 +16,7 @@ Various data about the current platform Bazel is running on. string repository_os.arch ``` - A string identifying the architecture Bazel is running on (the value of the `"os.arch"` Java property converted to lower case). - - +A string identifying the architecture Bazel is running on (the value of the `"os.arch"` Java property converted to lower case). ## environ @@ -28,16 +24,14 @@ string repository_os.arch dict repository_os.environ ``` - The dictionary of environment variables. +The dictionary of environment variables. **NOTE**: Retrieving an environment variable from this dictionary does not establish a dependency from a repository rule or module extension to the environment variable. To establish a dependency when looking up an environment variable, use either `repository_ctx.getenv` or `module_ctx.getenv` instead. - - ## name ``` string repository_os.name ``` - A string identifying the operating system Bazel is running on (the value of the `"os.name"` Java property converted to lower case). +A string identifying the operating system Bazel is running on (the value of the `"os.name"` Java property converted to lower case). \ No newline at end of file diff --git a/rules/lib/builtins/repository_rule.mdx b/rules/lib/builtins/repository_rule.mdx index 935811a4b..4fe584612 100644 --- a/rules/lib/builtins/repository_rule.mdx +++ b/rules/lib/builtins/repository_rule.mdx @@ -2,6 +2,4 @@ title: 'repository\_rule' --- - - -A callable value that may be invoked within the implementation function of a module extension to instantiate and return a repository rule. Created by [`repository_rule()`](../globals/bzl.html#repository_rule). +A callable value that may be invoked within the implementation function of a module extension to instantiate and return a repository rule. Created by [`repository_rule()`](../globals/bzl#repository_rule). \ No newline at end of file diff --git a/rules/lib/builtins/root.mdx b/rules/lib/builtins/root.mdx index fe266c68c..00c990dd7 100644 --- a/rules/lib/builtins/root.mdx +++ b/rules/lib/builtins/root.mdx @@ -2,13 +2,11 @@ title: 'root' --- - - A root for files. The roots are the directories containing files, and they are mapped together into a single directory tree to form the execution environment. ## Members -- [path](#path) +* [path](#path) ## path @@ -16,4 +14,4 @@ A root for files. The roots are the directories containing files, and they are m string root.path ``` - Returns the relative path from the exec root to the actual root. +Returns the relative path from the exec root to the actual root. \ No newline at end of file diff --git a/rules/lib/builtins/rule.mdx b/rules/lib/builtins/rule.mdx index e2550b7ee..b8e7291b2 100644 --- a/rules/lib/builtins/rule.mdx +++ b/rules/lib/builtins/rule.mdx @@ -2,10 +2,8 @@ title: 'rule' --- - - A callable value representing the type of a native or Starlark rule (created by -[`rule()`](../globals/bzl.html#rule)). Calling the value during +[`rule()`](../globals/bzl#rule)). Calling the value during evaluation of a package's BUILD file creates an instance of the rule and adds it to the package's target set. For more information, visit this page about -[Rules](https://bazel.build/extending/rules). +[Rules](https://bazel.build/extending/rules). \ No newline at end of file diff --git a/rules/lib/builtins/rule_attributes.mdx b/rules/lib/builtins/rule_attributes.mdx index 0b2cbd1f9..37f0b8abb 100644 --- a/rules/lib/builtins/rule_attributes.mdx +++ b/rules/lib/builtins/rule_attributes.mdx @@ -2,20 +2,18 @@ title: 'rule\_attributes' --- - - Information about attributes of a rule an aspect is applied to. ## Members -- [attr](#attr) -- [exec\_groups](#exec_groups) -- [executable](#executable) -- [file](#file) -- [files](#files) -- [kind](#kind) -- [toolchains](#toolchains) -- [var](#var) +* [attr](#attr) +* [exec\_groups](#exec_groups) +* [executable](#executable) +* [file](#file) +* [files](#files) +* [kind](#kind) +* [toolchains](#toolchains) +* [var](#var) ## attr @@ -23,9 +21,7 @@ Information about attributes of a rule an aspect is applied to. struct rule_attributes.attr ``` - A struct to access the values of the [attributes](https://bazel.build/extending/rules#attributes). The values are provided by the user (if not, a default value is used). The attributes of the struct and the types of their values correspond to the keys and values of the [`attrs` dict](../globals/bzl.html#rule.attrs) provided to the [`rule` function](../globals/bzl.html#rule). [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/attributes/printer.bzl). - - +A struct to access the values of the [attributes](https://bazel.build/extending/rules#attributes). The values are provided by the user (if not, a default value is used). The attributes of the struct and the types of their values correspond to the keys and values of the [`attrs` dict](../globals/bzl#rule.attrs) provided to the [`rule` function](../globals/bzl#rule). [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/attributes/printer.bzl). ## exec\_groups @@ -33,9 +29,7 @@ struct rule_attributes.attr ExecGroupCollection rule_attributes.exec_groups ``` - A collection of the execution groups available for the rule the aspect is applied to, indexed by their names. - - +A collection of the execution groups available for the rule the aspect is applied to, indexed by their names. ## executable @@ -43,9 +37,7 @@ ExecGroupCollection rule_attributes.exec_groups struct rule_attributes.executable ``` - A `struct` containing executable files defined in [label type attributes](../toplevel/attr.html#label) marked as [`executable=True`](../toplevel/attr.html#label.executable). The struct fields correspond to the attribute names. Each value in the struct is either a [`File`](../builtins/File.html) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `executable=True`, no corresponding struct field is generated. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/actions_run/execute.bzl). - - +A `struct` containing executable files defined in [label type attributes](../toplevel/attr#label) marked as [`executable=True`](../toplevel/attr#label.executable). The struct fields correspond to the attribute names. Each value in the struct is either a [`File`](../builtins/File) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `executable=True`, no corresponding struct field is generated. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/actions_run/execute.bzl). ## file @@ -53,7 +45,7 @@ struct rule_attributes.executable struct rule_attributes.file ``` - A `struct` containing files defined in [label type attributes](../toplevel/attr.html#label) marked as [`allow_single_file`](../toplevel/attr.html#label.allow_single_file). The struct fields correspond to the attribute names. The struct value is always a [`File`](../builtins/File.html) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `allow_single_file`, no corresponding struct field is generated. It is a shortcut for: +A `struct` containing files defined in [label type attributes](../toplevel/attr#label) marked as [`allow_single_file`](../toplevel/attr#label.allow_single_file). The struct fields correspond to the attribute names. The struct value is always a [`File`](../builtins/File) or `None`. If an optional attribute is not specified in the rule then the corresponding struct value is `None`. If a label type is not marked as `allow_single_file`, no corresponding struct field is generated. It is a shortcut for: ``` list(ctx.attr..files)[0] @@ -61,23 +53,19 @@ list(ctx.attr..files)[0] In other words, use `file` to access the (singular) [default output](https://bazel.build/extending/rules#requesting_output_files) of a dependency. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/expand_template/hello.bzl). - - ## files ``` struct rule_attributes.files ``` - A `struct` containing files defined in [label](../toplevel/attr.html#label) or [label list](../toplevel/attr.html#label_list) type attributes. The struct fields correspond to the attribute names. The struct values are `list` of [`File`](../builtins/File.html) s. It is a shortcut for: +A `struct` containing files defined in [label](../toplevel/attr#label) or [label list](../toplevel/attr#label_list) type attributes. The struct fields correspond to the attribute names. The struct values are `list` of [`File`](../builtins/File)s. It is a shortcut for: ``` [f for t in ctx.attr. for f in t.files] ``` - In other words, use `files` to access the [default outputs](https://bazel.build/extending/rules#requesting_output_files) of a dependency. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/depsets/foo.bzl). - - +In other words, use `files` to access the [default outputs](https://bazel.build/extending/rules#requesting_output_files) of a dependency. [See example of use](https://github.com/bazelbuild/examples/blob/main/rules/depsets/foo.bzl). ## kind @@ -85,9 +73,7 @@ struct rule_attributes.files string rule_attributes.kind ``` - The kind of a rule, such as 'cc\_library' - - +The kind of a rule, such as 'cc\_library' ## toolchains @@ -95,9 +81,7 @@ string rule_attributes.kind ToolchainContext rule_attributes.toolchains ``` - Toolchains for the default exec group of the rule the aspect is applied to. - - +Toolchains for the default exec group of the rule the aspect is applied to. ## var @@ -105,4 +89,4 @@ ToolchainContext rule_attributes.toolchains dict rule_attributes.var ``` - Dictionary (String to String) of configuration variables. +Dictionary (String to String) of configuration variables. \ No newline at end of file diff --git a/rules/lib/builtins/runfiles.mdx b/rules/lib/builtins/runfiles.mdx index 0dc5844bb..1e3acd238 100644 --- a/rules/lib/builtins/runfiles.mdx +++ b/rules/lib/builtins/runfiles.mdx @@ -2,20 +2,18 @@ title: 'runfiles' --- - - -A container of information regarding a set of files required at runtime by an executable. This object should be passed via [`DefaultInfo`](../providers/DefaultInfo.html) in order to tell the build system about the runfiles needed by the outputs produced by the rule. +A container of information regarding a set of files required at runtime by an executable. This object should be passed via [`DefaultInfo`](../providers/DefaultInfo) in order to tell the build system about the runfiles needed by the outputs produced by the rule. See [runfiles guide](https://bazel.build/extending/rules#runfiles) for details. ## Members -- [empty\_filenames](#empty_filenames) -- [files](#files) -- [merge](#merge) -- [merge\_all](#merge_all) -- [root\_symlinks](#root_symlinks) -- [symlinks](#symlinks) +* [empty\_filenames](#empty_filenames) +* [files](#files) +* [merge](#merge) +* [merge\_all](#merge_all) +* [root\_symlinks](#root_symlinks) +* [symlinks](#symlinks) ## empty\_filenames @@ -23,9 +21,7 @@ See [runfiles guide](https://bazel.build/extending/rules#runfiles) for details. depset runfiles.empty_filenames ``` - Returns names of empty files to create. - - +Returns names of empty files to create. ## files @@ -33,9 +29,7 @@ depset runfiles.empty_filenames depset runfiles.files ``` - Returns the set of runfiles as files. - - +Returns the set of runfiles as files. ## merge @@ -43,17 +37,15 @@ depset runfiles.files runfiles runfiles.merge(other) ``` - Returns a new runfiles object that includes all the contents of this one and the argument. +Returns a new runfiles object that includes all the contents of this one and the argument. -_Note:_ When you have many runfiles objects to merge, use [`merge_all()`](#merge_all) rather than calling `merge` in a loop. This avoids constructing deep depset structures which can cause build failures. +*Note:* When you have many runfiles objects to merge, use [`merge_all()`](#merge_all) rather than calling `merge` in a loop. This avoids constructing deep depset structures which can cause build failures. ### Parameters -ParameterDescription`other`[runfiles](../builtins/runfiles.html); - required - - The runfiles object to merge into this. - +| Parameter | Description | +| --- | --- | +| `other` | [runfiles](../builtins/runfiles); required The runfiles object to merge into this. | ## merge\_all @@ -61,17 +53,13 @@ ParameterDescription`other`[runfiles](../builtins/runfiles.html); runfiles runfiles.merge_all(other) ``` - Returns a new runfiles object that includes all the contents of this one and of the runfiles objects in the argument. - - +Returns a new runfiles object that includes all the contents of this one and of the runfiles objects in the argument. ### Parameters -ParameterDescription`other`[sequence](../core/list.html) of [runfiles](../builtins/runfiles.html) s; - required - - The sequence of runfiles objects to merge into this. - +| Parameter | Description | +| --- | --- | +| `other` | [sequence](../core/list) of [runfiles](../builtins/runfiles)s; required The sequence of runfiles objects to merge into this. | ## root\_symlinks @@ -79,9 +67,7 @@ ParameterDescription`other`[sequence](../core/list.html) of [runfiles](../builti depset runfiles.root_symlinks ``` - Returns the set of root symlinks. - - +Returns the set of root symlinks. ## symlinks @@ -89,4 +75,4 @@ depset runfiles.root_symlinks depset runfiles.symlinks ``` - Returns the set of symlinks. +Returns the set of symlinks. \ No newline at end of file diff --git a/rules/lib/builtins/struct.mdx b/rules/lib/builtins/struct.mdx index deaa93988..bf9245131 100644 --- a/rules/lib/builtins/struct.mdx +++ b/rules/lib/builtins/struct.mdx @@ -2,15 +2,13 @@ title: 'struct' --- - - A generic object with fields. Structs fields cannot be reassigned once the struct is created. Two structs are equal if they have the same fields and if corresponding field values are equal. ## Members -- [struct](#struct) +* [struct](#struct) ## struct @@ -18,7 +16,7 @@ Structs fields cannot be reassigned once the struct is created. Two structs are struct struct(**kwargs) ``` - Creates an immutable struct using the keyword arguments as attributes. It is used to group multiple values together. Example: +Creates an immutable struct using the keyword arguments as attributes. It is used to group multiple values together. Example: ``` s = struct(x = 2, y = 3) @@ -27,7 +25,6 @@ return s.x + getattr(s, "y") # returns 5 ### Parameters -ParameterDescription`kwargs` - default is `{}` - - Dictionary of arguments. +| Parameter | Description | +| --- | --- | +| `kwargs` | default is `{}` | \ No newline at end of file diff --git a/rules/lib/builtins/subrule_ctx.mdx b/rules/lib/builtins/subrule_ctx.mdx index 378307677..02d34e791 100644 --- a/rules/lib/builtins/subrule_ctx.mdx +++ b/rules/lib/builtins/subrule_ctx.mdx @@ -2,16 +2,14 @@ title: 'subrule\_ctx' --- - - A context object passed to the implementation function of a subrule. ## Members -- [actions](#actions) -- [fragments](#fragments) -- [label](#label) -- [toolchains](#toolchains) +* [actions](#actions) +* [fragments](#fragments) +* [label](#label) +* [toolchains](#toolchains) ## actions @@ -19,9 +17,7 @@ A context object passed to the implementation function of a subrule. actions subrule_ctx.actions ``` - Contains methods for declaring output files and the actions that produce them - - +Contains methods for declaring output files and the actions that produce them ## fragments @@ -29,9 +25,7 @@ actions subrule_ctx.actions fragments subrule_ctx.fragments ``` - Allows access to configuration fragments in target configuration. - - +Allows access to configuration fragments in target configuration. ## label @@ -39,9 +33,7 @@ fragments subrule_ctx.fragments Label subrule_ctx.label ``` - The label of the target currently being analyzed - - +The label of the target currently being analyzed ## toolchains @@ -49,4 +41,4 @@ Label subrule_ctx.label ToolchainContext subrule_ctx.toolchains ``` - Contains methods for declaring output files and the actions that produce them +Contains methods for declaring output files and the actions that produce them \ No newline at end of file diff --git a/rules/lib/builtins/tag_class.mdx b/rules/lib/builtins/tag_class.mdx index b8830d6ef..7d4349d09 100644 --- a/rules/lib/builtins/tag_class.mdx +++ b/rules/lib/builtins/tag_class.mdx @@ -2,6 +2,4 @@ title: 'tag\_class' --- - - -Defines a schema of attributes for a tag, created by [`tag_class()`](../globals/bzl.html#tag_class). +Defines a schema of attributes for a tag, created by [`tag_class()`](../globals/bzl#tag_class). \ No newline at end of file diff --git a/rules/lib/builtins/template_ctx.mdx b/rules/lib/builtins/template_ctx.mdx index fb004a09f..ece4b863a 100644 --- a/rules/lib/builtins/template_ctx.mdx +++ b/rules/lib/builtins/template_ctx.mdx @@ -2,16 +2,14 @@ title: 'template\_ctx' --- - - A context object that is passed to the action template expansion function. ## Members -- [args](#args) -- [declare\_file](#declare_file) -- [declare\_subdirectory](#declare_subdirectory) -- [run](#run) +* [args](#args) +* [declare\_file](#declare_file) +* [declare\_subdirectory](#declare_subdirectory) +* [run](#run) ## args @@ -19,9 +17,7 @@ A context object that is passed to the action template expansion function. Args template_ctx.args() ``` - Returns an Args object that can be used to build memory-efficient command lines. - - +Returns an Args object that can be used to build memory-efficient command lines. ## declare\_file @@ -29,22 +25,16 @@ Args template_ctx.args() File template_ctx.declare_file(filename, *, directory) ``` - Declares that implementation creates a file with the given filename within the specified directory. +Declares that implementation creates a file with the given filename within the specified directory. Remember that in addition to declaring a file, you must separately create an action that emits the file. Creating that action will require passing the returned `File` object to the action's construction function. - ### Parameters -ParameterDescription`filename`[string](../core/string.html); - required - - The relative path of the file within the directory. - `directory`[File](../builtins/File.html); - required - - The directory in which the file should be created. - +| Parameter | Description | +| --- | --- | +| `filename` | [string](../core/string); required The relative path of the file within the directory. | +| `directory` | [File](../builtins/File); required The directory in which the file should be created. | ## declare\_subdirectory @@ -52,22 +42,16 @@ ParameterDescription`filename`[string](../core/string.html); File template_ctx.declare_subdirectory(subdirectory, *, directory) ``` - Declares that implementation creates a subdirectory with the given name within the specified directory. +Declares that implementation creates a subdirectory with the given name within the specified directory. Remember that in addition to declaring a subdirectory, you must separately create an action that emits the subdirectory. Creating that action will require passing the returned `File` object to the action's construction function. - ### Parameters -ParameterDescription`subdirectory`[string](../core/string.html); - required - - The relative path of the subdirectory within the directory. - `directory`[File](../builtins/File.html); - required - - The directory in which the subdirectory should be created. - +| Parameter | Description | +| --- | --- | +| `subdirectory` | [string](../core/string); required The relative path of the subdirectory within the directory. | +| `directory` | [File](../builtins/File); required The directory in which the subdirectory should be created. | ## run @@ -75,41 +59,15 @@ ParameterDescription`subdirectory`[string](../core/string.html); None template_ctx.run(*, outputs, inputs=[], executable, tools=None, arguments=[], progress_message=None) ``` - Creates an action that runs an executable. - +Creates an action that runs an executable. ### Parameters -ParameterDescription`outputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; - required - - List of the output files of the action. - `inputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; or [depset](../builtins/depset.html); - default is `[]` - - List or depset of the input files of the action. - `executable`[File](../builtins/File.html); or [string](../core/string.html); or [FilesToRunProvider](../providers/FilesToRunProvider.html); - required - - The executable file to be called by the action. - `tools`[sequence](../core/list.html); or [depset](../builtins/depset.html); or `None`; - default is `None` - - List or [`depset`](../builtins/depset.html) of any tools needed by the action. Tools are executable inputs that may have their own runfiles which are automatically made available to the action. - -When a list is provided, it can be a heterogenous collection of: - -- `File` s -- `FilesToRunProvider` instances -- `depset` s of `File` s - -`File` s from [`ctx.executable`](../builtins/ctx#executable) and `FilesToRunProvider` s which are directly in the list will have their runfiles automatically added. All tools are implicitly added as inputs. - -`arguments`[sequence](../core/list.html); - default is `[]` - - Command line arguments of the action. Must be a list of strings or [`actions.args()`](#args) objects. - `progress_message`[string](../core/string.html); or `None`; - default is `None` - - Progress message to show to the user during the build. +| Parameter | Description | +| --- | --- | +| `outputs` | [sequence](../core/list) of [File](../builtins/File)s; required List of the output files of the action. | +| `inputs` | [sequence](../core/list) of [File](../builtins/File)s; or [depset](../builtins/depset); default is `[]` List or depset of the input files of the action. | +| `executable` | [File](../builtins/File); or [string](../core/string); or [FilesToRunProvider](../providers/FilesToRunProvider); required The executable file to be called by the action. | +| `tools` | [sequence](../core/list); or [depset](../builtins/depset); or `None`; default is `None` List or [`depset`](../builtins/depset) of any tools needed by the action. Tools are executable inputs that may have their own runfiles which are automatically made available to the action. When a list is provided, it can be a heterogenous collection of: * `File`s * `FilesToRunProvider` instances * `depset`s of `File`s `File`s from [`ctx.executable`](../builtins/ctx#executable) and `FilesToRunProvider`s which are directly in the list will have their runfiles automatically added. All tools are implicitly added as inputs. | +| `arguments` | [sequence](../core/list); default is `[]` Command line arguments of the action. Must be a list of strings or [`actions.args()`](#args) objects. | +| `progress_message` | [string](../core/string); or `None`; default is `None` Progress message to show to the user during the build. | \ No newline at end of file diff --git a/rules/lib/builtins/toolchain_type.mdx b/rules/lib/builtins/toolchain_type.mdx index abcf4b1fa..6d36a0ed0 100644 --- a/rules/lib/builtins/toolchain_type.mdx +++ b/rules/lib/builtins/toolchain_type.mdx @@ -2,14 +2,12 @@ title: 'toolchain\_type' --- - - A data type describing a dependency on a specific toolchain type. ## Members -- [mandatory](#mandatory) -- [toolchain\_type](#toolchain_type) +* [mandatory](#mandatory) +* [toolchain\_type](#toolchain_type) ## mandatory @@ -17,9 +15,7 @@ A data type describing a dependency on a specific toolchain type. bool toolchain_type.mandatory ``` - Whether the toolchain type is mandatory or optional. - - +Whether the toolchain type is mandatory or optional. ## toolchain\_type @@ -27,4 +23,4 @@ bool toolchain_type.mandatory Label toolchain_type.toolchain_type ``` - The toolchain type that is required. +The toolchain type that is required. \ No newline at end of file diff --git a/rules/lib/builtins/transition.mdx b/rules/lib/builtins/transition.mdx index e1049064d..2c90d135f 100644 --- a/rules/lib/builtins/transition.mdx +++ b/rules/lib/builtins/transition.mdx @@ -2,13 +2,11 @@ title: 'transition' --- - - Represents a configuration transition across a dependency edge. For example, if `//package:foo` depends on `//package:bar` with a configuration transition, then the configuration of `//package:bar` (and its dependencies) will be `//package:foo`'s configuration plus the changes specified by the transition function. ## Members -- [transition](#transition) +* [transition](#transition) ## transition @@ -16,7 +14,7 @@ Represents a configuration transition across a dependency edge. For example, if transition transition(*, implementation, inputs, outputs) ``` - A transition that reads a set of input build settings and writes a set of output build settings. +A transition that reads a set of input build settings and writes a set of output build settings. Example: @@ -38,22 +36,8 @@ For more details see [here](https://bazel.build/rules/config#user-defined-transi ### Parameters -ParameterDescription`implementation` - callable; - required - - The function implementing this transition. This function always has two parameters: `settings` and `attr`. The `settings` param is a dictionary whose set of keys is defined by the inputs parameter. So, for each build setting `--//foo=bar`, if `inputs` contains `//foo`, `settings` will have an entry `settings['//foo']='bar'`. - -The `attr` param is a reference to `ctx.attr`. This gives the implementation function access to the rule's attributes to make attribute-parameterized transitions possible. - -This function must return a `dict` from build setting identifier to build setting value; this represents the configuration transition: for each entry in the returned `dict`, the transition updates that setting to the new value. All other settings are unchanged. This function can also return a `list` of `dict` s or a `dict` of `dict` s in the case of a split transition. - - -`inputs`[sequence](../core/list.html) of [string](../core/string.html) s; - required - - List of build settings that can be read by this transition. This becomes the key set of the settings parameter of the implementation function parameter. - `outputs`[sequence](../core/list.html) of [string](../core/string.html) s; - required - - List of build settings that can be written by this transition. This must be a superset of the key set of the dictionary returned by this transition. +| Parameter | Description | +| --- | --- | +| `implementation` | callable; required The function implementing this transition. This function always has two parameters: `settings` and `attr`. The `settings` param is a dictionary whose set of keys is defined by the inputs parameter. So, for each build setting `--//foo=bar`, if `inputs` contains `//foo`, `settings` will have an entry `settings['//foo']='bar'`. The `attr` param is a reference to `ctx.attr`. This gives the implementation function access to the rule's attributes to make attribute-parameterized transitions possible. This function must return a `dict` from build setting identifier to build setting value; this represents the configuration transition: for each entry in the returned `dict`, the transition updates that setting to the new value. All other settings are unchanged. This function can also return a `list` of `dict`s or a `dict` of `dict`s in the case of a split transition. | +| `inputs` | [sequence](../core/list) of [string](../core/string)s; required List of build settings that can be read by this transition. This becomes the key set of the settings parameter of the implementation function parameter. | +| `outputs` | [sequence](../core/list) of [string](../core/string)s; required List of build settings that can be written by this transition. This must be a superset of the key set of the dictionary returned by this transition. | \ No newline at end of file diff --git a/rules/lib/builtins/wasm_exec_result.mdx b/rules/lib/builtins/wasm_exec_result.mdx index f3e164263..3c857ce5f 100644 --- a/rules/lib/builtins/wasm_exec_result.mdx +++ b/rules/lib/builtins/wasm_exec_result.mdx @@ -2,8 +2,6 @@ title: 'wasm\_exec\_result' --- - - The result of executing a WebAssembly function with `repository_ctx.execute_wasm()`. It contains the function's return value and output buffer. @@ -13,9 +11,9 @@ and the `error_message` field will be set. ## Members -- [error\_message](#error_message) -- [output](#output) -- [return\_code](#return_code) +* [error\_message](#error_message) +* [output](#output) +* [return\_code](#return_code) ## error\_message @@ -23,9 +21,7 @@ and the `error_message` field will be set. string wasm_exec_result.error_message ``` - Contains an error message if execution failed before the function returned. - - +Contains an error message if execution failed before the function returned. ## output @@ -33,9 +29,7 @@ string wasm_exec_result.error_message string wasm_exec_result.output ``` - The content of the output buffer returned by the WebAssembly function. - - +The content of the output buffer returned by the WebAssembly function. ## return\_code @@ -43,5 +37,5 @@ string wasm_exec_result.output long wasm_exec_result.return_code ``` - The return value of the WebAssembly function, or a negative value if execution -was terminated before the function returned. +The return value of the WebAssembly function, or a negative value if execution +was terminated before the function returned. \ No newline at end of file diff --git a/rules/lib/builtins/wasm_module.mdx b/rules/lib/builtins/wasm_module.mdx index bfcf852e5..7c91e80d9 100644 --- a/rules/lib/builtins/wasm_module.mdx +++ b/rules/lib/builtins/wasm_module.mdx @@ -2,13 +2,11 @@ title: 'wasm\_module' --- - - A WebAssembly module loaded by `repository_ctx.load_wasm()`. ## Members -- [path](#path) +* [path](#path) ## path @@ -16,4 +14,4 @@ A WebAssembly module loaded by `repository_ctx.load_wasm()`. unknown wasm_module.path ``` - The path this WebAssembly module was loaded from. +The path this WebAssembly module was loaded from. \ No newline at end of file diff --git a/rules/lib/core.mdx b/rules/lib/core.mdx index 91481d588..0d6adc454 100644 --- a/rules/lib/core.mdx +++ b/rules/lib/core.mdx @@ -2,18 +2,17 @@ title: 'Core Starlark data types' --- - This section lists the data types of the [Starlark core language](https://github.com/bazelbuild/starlark/blob/master/spec.md#built-in-constants-and-functions). With some exceptions, these type names are not valid Starlark symbols; instances of them may be acquired through different means. -- [bool](/rules/lib/core/bool) -- [builtin\_function\_or\_method](/rules/lib/core/builtin_function_or_method) -- [dict](/rules/lib/core/dict) -- [float](/rules/lib/core/float) -- [function](/rules/lib/core/function) -- [int](/rules/lib/core/int) -- [json](/rules/lib/core/json) -- [list](/rules/lib/core/list) -- [range](/rules/lib/core/range) -- [set](/rules/lib/core/set) -- [string](/rules/lib/core/string) -- [tuple](/rules/lib/core/tuple) +* [bool](/rules/lib/core/bool) +* [builtin\_function\_or\_method](/rules/lib/core/builtin_function_or_method) +* [dict](/rules/lib/core/dict) +* [float](/rules/lib/core/float) +* [function](/rules/lib/core/function) +* [int](/rules/lib/core/int) +* [json](/rules/lib/core/json) +* [list](/rules/lib/core/list) +* [range](/rules/lib/core/range) +* [set](/rules/lib/core/set) +* [string](/rules/lib/core/string) +* [tuple](/rules/lib/core/tuple) \ No newline at end of file diff --git a/rules/lib/core/bool.mdx b/rules/lib/core/bool.mdx index 5d7ec2ec7..52be36642 100644 --- a/rules/lib/core/bool.mdx +++ b/rules/lib/core/bool.mdx @@ -2,6 +2,4 @@ title: 'bool' --- - - -A type to represent booleans. There are only two possible values: True and False. Any value can be converted to a boolean using the [bool](../globals/all.html#bool) function. +A type to represent booleans. There are only two possible values: True and False. Any value can be converted to a boolean using the [bool](../globals/all#bool) function. \ No newline at end of file diff --git a/rules/lib/core/builtin_function_or_method.mdx b/rules/lib/core/builtin_function_or_method.mdx index d1fa73cdf..9f0aa8c52 100644 --- a/rules/lib/core/builtin_function_or_method.mdx +++ b/rules/lib/core/builtin_function_or_method.mdx @@ -2,6 +2,4 @@ title: 'builtin\_function\_or\_method' --- - - -The type of a built-in function, defined by Java code. +The type of a built-in function, defined by Java code. \ No newline at end of file diff --git a/rules/lib/core/dict.mdx b/rules/lib/core/dict.mdx index 9f0e27f9a..9005668ca 100644 --- a/rules/lib/core/dict.mdx +++ b/rules/lib/core/dict.mdx @@ -2,9 +2,7 @@ title: 'dict' --- - - -dict is a built-in type representing an associative mapping or _dictionary_. A dictionary supports indexing using `d[k]` and key membership testing using `k in d`; both operations take constant time. Unfrozen dictionaries are mutable, and may be updated by assigning to `d[k]` or by calling certain methods. Dictionaries are iterable; iteration yields the sequence of keys in insertion order. Iteration order is unaffected by updating the value associated with an existing key, but is affected by removing then reinserting a key. +dict is a built-in type representing an associative mapping or *dictionary*. A dictionary supports indexing using `d[k]` and key membership testing using `k in d`; both operations take constant time. Unfrozen dictionaries are mutable, and may be updated by assigning to `d[k]` or by calling certain methods. Dictionaries are iterable; iteration yields the sequence of keys in insertion order. Iteration order is unaffected by updating the value associated with an existing key, but is affected by removing then reinserting a key. ``` d = {0: "x", 2: "z", 1: "y"} @@ -13,48 +11,38 @@ d.pop(2) d[0], d[2] = "a", "b" 0 in d, "a" in d # (True, False) [(k, v) for k, v in d.items()] # [(0, "a"), (1, "y"), (2, "b")] - ``` There are four ways to construct a dictionary: -1. A dictionary expression `{k: v, ...}` yields a new dictionary with the specified key/value entries, inserted in the order they appear in the expression. Evaluation fails if any two key expressions yield the same value. - -2. A dictionary comprehension `{k: v for vars in seq}` yields a new dictionary into which each key/value pair is inserted in loop iteration order. Duplicates are permitted: the first insertion of a given key determines its position in the sequence, and the last determines its associated value. - - - ``` - {k: v for k, v in (("a", 0), ("b", 1), ("a", 2))} # {"a": 2, "b": 1} - {i: 2*i for i in range(3)} # {0: 0, 1: 2, 2: 4} - - ``` - -3. A call to the built-in [dict](../globals/all.html#dict) function returns a dictionary containing the specified entries, which are inserted in argument order, positional arguments before named. As with comprehensions, duplicate keys are permitted. +1. A dictionary expression `{k: v, ...}` yields a new dictionary with the specified key/value entries, inserted in the order they appear in the expression. Evaluation fails if any two key expressions yield the same value.- A dictionary comprehension `{k: v for vars in seq}` yields a new dictionary into which each key/value pair is inserted in loop iteration order. Duplicates are permitted: the first insertion of a given key determines its position in the sequence, and the last determines its associated value. -4. The union expression `x | y` yields a new dictionary by combining two existing dictionaries. If the two dictionaries have a key `k` in common, the right hand side dictionary's value of the key (in other words, `y[k]`) wins. The `|=` variant of the union operator modifies a dictionary in-place. Example: + ``` + {k: v for k, v in (("a", 0), ("b", 1), ("a", 2))} # {"a": 2, "b": 1} + {i: 2*i for i in range(3)} # {0: 0, 1: 2, 2: 4} + ``` + - A call to the built-in [dict](../globals/all#dict) function returns a dictionary containing the specified entries, which are inserted in argument order, positional arguments before named. As with comprehensions, duplicate keys are permitted.- The union expression `x | y` yields a new dictionary by combining two existing dictionaries. If the two dictionaries have a key `k` in common, the right hand side dictionary's value of the key (in other words, `y[k]`) wins. The `|=` variant of the union operator modifies a dictionary in-place. Example: - - ``` - d = \{"foo": "FOO", "bar": "BAR"\} | \{"foo": "FOO2", "baz": "BAZ"\} - # d == \{"foo": "FOO2", "bar": "BAR", "baz": "BAZ"\} - d = {"a": 1, "b": 2} - d |= {"b": 3, "c": 4} - # d == {"a": 1, "b": 3, "c": 4} - ``` - + ``` + d = {"foo": "FOO", "bar": "BAR"} | {"foo": "FOO2", "baz": "BAZ"} + # d == {"foo": "FOO2", "bar": "BAR", "baz": "BAZ"} + d = {"a": 1, "b": 2} + d |= {"b": 3, "c": 4} + # d == {"a": 1, "b": 3, "c": 4} + ``` ## Members -- [clear](#clear) -- [get](#get) -- [items](#items) -- [keys](#keys) -- [pop](#pop) -- [popitem](#popitem) -- [setdefault](#setdefault) -- [update](#update) -- [values](#values) +* [clear](#clear) +* [get](#get) +* [items](#items) +* [keys](#keys) +* [pop](#pop) +* [popitem](#popitem) +* [setdefault](#setdefault) +* [update](#update) +* [values](#values) ## clear @@ -62,9 +50,7 @@ There are four ways to construct a dictionary: None dict.clear() ``` - Remove all items from the dictionary. - - +Remove all items from the dictionary. ## get @@ -72,20 +58,14 @@ None dict.clear() unknown dict.get(key, default=None) ``` - Returns the value for `key` if `key` is in the dictionary, else `default`. If `default` is not given, it defaults to `None`, so that this method never throws an error. - +Returns the value for `key` if `key` is in the dictionary, else `default`. If `default` is not given, it defaults to `None`, so that this method never throws an error. ### Parameters -ParameterDescription`key` - required - - The key to look for. - `default` - default is `None` - - The default value to use (instead of None) if the key is not found. - +| Parameter | Description | +| --- | --- | +| `key` | required | +| `default` | default is `None` The default value to use (instead of None) if the key is not found. | ## items @@ -93,7 +73,7 @@ ParameterDescription`key` list dict.items() ``` - Returns the list of key-value tuples: +Returns the list of key-value tuples: ``` {2: "a", 4: "b", 1: "c"}.items() == [(2, "a"), (4, "b"), (1, "c")] @@ -105,7 +85,7 @@ list dict.items() list dict.keys() ``` - Returns the list of keys: +Returns the list of keys: ``` {2: "a", 4: "b", 1: "c"}.keys() == [2, 4, 1] @@ -117,20 +97,14 @@ list dict.keys() unknown dict.pop(key, default=unbound) ``` - Removes a `key` from the dict, and returns the associated value. If no entry with that key was found, remove nothing and return the specified `default` value; if no default value was specified, fail instead. - +Removes a `key` from the dict, and returns the associated value. If no entry with that key was found, remove nothing and return the specified `default` value; if no default value was specified, fail instead. ### Parameters -ParameterDescription`key` - required - - The key. - `default` - default is `unbound` - - a default value if the key is absent. - +| Parameter | Description | +| --- | --- | +| `key` | required The key. | +| `default` | default is `unbound` a default value if the key is absent. | ## popitem @@ -138,9 +112,7 @@ ParameterDescription`key` tuple dict.popitem() ``` - Remove and return the first `(key, value)` pair from the dictionary. `popitem` is useful to destructively iterate over a dictionary, as often used in set algorithms. If the dictionary is empty, the `popitem` call fails. - - +Remove and return the first `(key, value)` pair from the dictionary. `popitem` is useful to destructively iterate over a dictionary, as often used in set algorithms. If the dictionary is empty, the `popitem` call fails. ## setdefault @@ -148,20 +120,14 @@ tuple dict.popitem() unknown dict.setdefault(key, default=None) ``` - If `key` is in the dictionary, return its value. If not, insert key with a value of `default` and return `default`. `default` defaults to `None`. - +If `key` is in the dictionary, return its value. If not, insert key with a value of `default` and return `default`. `default` defaults to `None`. ### Parameters -ParameterDescription`key` - required - - The key. - `default` - default is `None` - - a default value if the key is absent. - +| Parameter | Description | +| --- | --- | +| `key` | required The key. | +| `default` | default is `None` a default value if the key is absent. | ## update @@ -169,23 +135,17 @@ ParameterDescription`key` None dict.update(pairs=[], **kwargs) ``` - Updates the dictionary first with the optional positional argument, `pairs`, then with the optional keyword arguments +Updates the dictionary first with the optional positional argument, `pairs`, then with the optional keyword arguments If the positional argument is present, it must be a dict, iterable, or None. If it is a dict, then its key/value pairs are inserted into this dict. If it is an iterable, it must provide a sequence of pairs (or other iterables of length 2), each of which is treated as a key/value pair to be inserted. Each keyword argument `name=value` causes the name/value pair to be inserted into this dict. - ### Parameters -ParameterDescription`pairs` - default is `[]` - - Either a dictionary or a list of entries. Entries must be tuples or lists with exactly two elements: key, value. - `kwargs` - required - - Dictionary of additional entries. - +| Parameter | Description | +| --- | --- | +| `pairs` | default is `[]` Either a dictionary or a list of entries. Entries must be tuples or lists with exactly two elements: key, value. | +| `kwargs` | required Dictionary of additional entries. | ## values @@ -193,8 +153,8 @@ ParameterDescription`pairs` list dict.values() ``` - Returns the list of values: +Returns the list of values: ``` {2: "a", 4: "b", 1: "c"}.values() == ["a", "b", "c"] -``` +``` \ No newline at end of file diff --git a/rules/lib/core/float.mdx b/rules/lib/core/float.mdx index bcc063fe0..0d507d52f 100644 --- a/rules/lib/core/float.mdx +++ b/rules/lib/core/float.mdx @@ -2,6 +2,4 @@ title: 'float' --- - - -The type of floating-point numbers in Starlark. +The type of floating-point numbers in Starlark. \ No newline at end of file diff --git a/rules/lib/core/function.mdx b/rules/lib/core/function.mdx index c0af505d7..565b6239e 100644 --- a/rules/lib/core/function.mdx +++ b/rules/lib/core/function.mdx @@ -2,6 +2,4 @@ title: 'function' --- - - -The type of functions declared in Starlark. +The type of functions declared in Starlark. \ No newline at end of file diff --git a/rules/lib/core/int.mdx b/rules/lib/core/int.mdx index 90cb450b1..1d14f5c3e 100644 --- a/rules/lib/core/int.mdx +++ b/rules/lib/core/int.mdx @@ -2,8 +2,6 @@ title: 'int' --- - - The type of integers in Starlark. Starlark integers may be of any magnitude; arithmetic is exact. Examples of integer expressions: ``` @@ -14,5 +12,4 @@ The type of integers in Starlark. Starlark integers may be of any magnitude; ari 100 / -7 100 % -7 # -5 (unlike in some other languages) int("18") - -``` +``` \ No newline at end of file diff --git a/rules/lib/core/json.mdx b/rules/lib/core/json.mdx index e38d8809a..54c117b44 100644 --- a/rules/lib/core/json.mdx +++ b/rules/lib/core/json.mdx @@ -2,16 +2,14 @@ title: 'json' --- - - Module json is a Starlark module of JSON-related functions. ## Members -- [decode](#decode) -- [encode](#encode) -- [encode\_indent](#encode_indent) -- [indent](#indent) +* [decode](#decode) +* [encode](#encode) +* [encode\_indent](#encode_indent) +* [indent](#indent) ## decode @@ -19,33 +17,20 @@ Module json is a Starlark module of JSON-related functions. unknown json.decode(x, default=unbound) ``` - The decode function has one required positional parameter: a JSON string. +The decode function has one required positional parameter: a JSON string. It returns the Starlark value that the string denotes. -- `"null"`, `"true"` and `"false"` are parsed as `None`, `True`, and `False`. - -- Numbers are parsed as int, or as a float if they contain a decimal point or an exponent. Although JSON has no syntax for non-finite values, very large values may be decoded as infinity. - -- a JSON object is parsed as a new unfrozen Starlark dict. If the same key string occurs more than once in the object, the last value for the key is kept. - -- a JSON array is parsed as new unfrozen Starlark list. - +* `"null"`, `"true"` and `"false"` are parsed as `None`, `True`, and `False`.* Numbers are parsed as int, or as a float if they contain a decimal point or an exponent. Although JSON has no syntax for non-finite values, very large values may be decoded as infinity.* a JSON object is parsed as a new unfrozen Starlark dict. If the same key string occurs more than once in the object, the last value for the key is kept.* a JSON array is parsed as new unfrozen Starlark list. If `x` is not a valid JSON encoding and the optional `default` parameter is specified (including specified as `None`), this function returns the `default` value. -If `x` is not a valid JSON encoding and the optional `default` parameter is _not_ specified, this function fails. - +If `x` is not a valid JSON encoding and the optional `default` parameter is *not* specified, this function fails. ### Parameters -ParameterDescription`x`[string](../core/string.html); - required - - JSON string to decode. - `default` - default is `unbound` - - If specified, the value to return when `x` cannot be decoded. - +| Parameter | Description | +| --- | --- | +| `x` | [string](../core/string); required JSON string to decode. | +| `default` | default is `unbound` If specified, the value to return when `x` cannot be decoded. | ## encode @@ -55,30 +40,16 @@ string json.encode(x) The encode function accepts one required positional argument, which it converts to JSON by cases: -- None, True, and False are converted to 'null', 'true', and 'false', respectively. - -- An int, no matter how large, is encoded as a decimal integer. Some decoders may not be able to decode very large integers. - -- A float is encoded using a decimal point or an exponent or both, even if its numeric value is an integer. It is an error to encode a non-finite floating-point value. - -- A string value is encoded as a JSON string literal that denotes the value. Each unpaired surrogate is replaced by U+FFFD. - -- A dict is encoded as a JSON object, in lexicographical key order. It is an error if any key is not a string. - -- A list or tuple is encoded as a JSON array. - -- A struct-like value is encoded as a JSON object, in field name order. - +* None, True, and False are converted to 'null', 'true', and 'false', respectively.* An int, no matter how large, is encoded as a decimal integer. Some decoders may not be able to decode very large integers.* A float is encoded using a decimal point or an exponent or both, even if its numeric value is an integer. It is an error to encode a non-finite floating-point value.* A string value is encoded as a JSON string literal that denotes the value. Each unpaired surrogate is replaced by U+FFFD.* A dict is encoded as a JSON object, in lexicographical key order. It is an error if any key is not a string.* A list or tuple is encoded as a JSON array.* A struct-like value is encoded as a JSON object, in field name order. An application-defined type may define its own JSON encoding. Encoding any other value yields an error. - - ### Parameters -ParameterDescription`x` - required +| Parameter | Description | +| --- | --- | +| `x` | required | ## encode\_indent @@ -86,19 +57,15 @@ ParameterDescription`x` string json.encode_indent(x, *, prefix='', indent='\t') ``` - The encode\_indent function is equivalent to `json.indent(json.encode(x), ...)`. See `indent` for description of formatting parameters. - +The encode\_indent function is equivalent to `json.indent(json.encode(x), ...)`. See `indent` for description of formatting parameters. ### Parameters -ParameterDescription`x` - required - -`prefix`[string](../core/string.html); - default is `''` - -`indent`[string](../core/string.html); - default is `'\t'` +| Parameter | Description | +| --- | --- | +| `x` | required | +| `prefix` | [string](../core/string); default is `''` | +| `indent` | [string](../core/string); default is `'\t'` | ## indent @@ -106,22 +73,17 @@ ParameterDescription`x` string json.indent(s, *, prefix='', indent='\t') ``` - The indent function returns the indented form of a valid JSON-encoded string. +The indent function returns the indented form of a valid JSON-encoded string. Each array element or object field appears on a new line, beginning with the prefix string followed by one or more copies of the indent string, according to its nesting depth. The function accepts one required positional parameter, the JSON string, and two optional keyword-only string parameters, prefix and indent, that specify a prefix of each new line, and the unit of indentation. If the input is not valid, the function may fail or return invalid output. - - ### Parameters -ParameterDescription`s`[string](../core/string.html); - required - -`prefix`[string](../core/string.html); - default is `''` - -`indent`[string](../core/string.html); - default is `'\t'` +| Parameter | Description | +| --- | --- | +| `s` | [string](../core/string); required | +| `prefix` | [string](../core/string); default is `''` | +| `indent` | [string](../core/string); default is `'\t'` | \ No newline at end of file diff --git a/rules/lib/core/list.mdx b/rules/lib/core/list.mdx index c00b5c62f..e421cbaf0 100644 --- a/rules/lib/core/list.mdx +++ b/rules/lib/core/list.mdx @@ -2,8 +2,6 @@ title: 'list' --- - - The built-in list type. Example list expressions: ``` @@ -36,13 +34,13 @@ Lists are mutable, as in Python. ## Members -- [append](#append) -- [clear](#clear) -- [extend](#extend) -- [index](#index) -- [insert](#insert) -- [pop](#pop) -- [remove](#remove) +* [append](#append) +* [clear](#clear) +* [extend](#extend) +* [index](#index) +* [insert](#insert) +* [pop](#pop) +* [remove](#remove) ## append @@ -50,16 +48,13 @@ Lists are mutable, as in Python. None list.append(item) ``` - Adds an item to the end of the list. - +Adds an item to the end of the list. ### Parameters -ParameterDescription`item` - required - - Item to add at the end. - +| Parameter | Description | +| --- | --- | +| `item` | required | ## clear @@ -67,9 +62,7 @@ ParameterDescription`item` None list.clear() ``` - Removes all the elements of the list. - - +Removes all the elements of the list. ## extend @@ -77,17 +70,13 @@ None list.clear() None list.extend(items) ``` - Adds all items to the end of the list. - +Adds all items to the end of the list. ### Parameters -ParameterDescription`items` - iterable; - required - - Items to add at the end. - +| Parameter | Description | +| --- | --- | +| `items` | iterable; required | ## index @@ -95,24 +84,15 @@ ParameterDescription`items` int list.index(x, start=unbound, end=unbound) ``` - Returns the index in the list of the first item whose value is x. It is an error if there is no such item. If `start` and `end` are given, they restrict the range searched in the same manner as slicing. - +Returns the index in the list of the first item whose value is x. It is an error if there is no such item. If `start` and `end` are given, they restrict the range searched in the same manner as slicing. ### Parameters -ParameterDescription`x` - required - - The object to search. - `start`[int](../core/int.html); - default is `unbound` - - The start index of the list portion to inspect. - `end`[int](../core/int.html); - default is `unbound` - - The end index of the list portion to inspect. - +| Parameter | Description | +| --- | --- | +| `x` | required | +| `start` | [int](../core/int); default is `unbound` The start index of the list portion to inspect. | +| `end` | [int](../core/int); default is `unbound` The end index of the list portion to inspect. | ## insert @@ -120,20 +100,14 @@ ParameterDescription`x` None list.insert(index, item) ``` - Inserts an item at a given position. - +Inserts an item at a given position. ### Parameters -ParameterDescription`index`[int](../core/int.html); - required - - The index the item will be at after insertion. If the index is out of range, it's transformed into an effective index in the range from 0 to the list's previous length, inclusive, in the same manner as for the start index of a slice operator. - `item` - required - - The item. - +| Parameter | Description | +| --- | --- | +| `index` | [int](../core/int); required The index the item will be at after insertion. If the index is out of range, it's transformed into an effective index in the range from 0 to the list's previous length, inclusive, in the same manner as for the start index of a slice operator. | +| `item` | required The item. | ## pop @@ -141,16 +115,13 @@ ParameterDescription`index`[int](../core/int.html); unknown list.pop(i=-1) ``` - Removes the item at the given position in the list, and returns it. If no `index` is specified, it removes and returns the last item in the list. - +Removes the item at the given position in the list, and returns it. If no `index` is specified, it removes and returns the last item in the list. ### Parameters -ParameterDescription`i`[int](../core/int.html); - default is `-1` - - The index of the item. - +| Parameter | Description | +| --- | --- | +| `i` | [int](../core/int); default is `-1` The index of the item. | ## remove @@ -158,12 +129,10 @@ ParameterDescription`i`[int](../core/int.html); None list.remove(x) ``` - Removes the first item from the list whose value is x. It is an error if there is no such item. - +Removes the first item from the list whose value is x. It is an error if there is no such item. ### Parameters -ParameterDescription`x` - required - - The object to remove. +| Parameter | Description | +| --- | --- | +| `x` | required The object to remove. | \ No newline at end of file diff --git a/rules/lib/core/range.mdx b/rules/lib/core/range.mdx index 5f5ccbaca..05a1731f1 100644 --- a/rules/lib/core/range.mdx +++ b/rules/lib/core/range.mdx @@ -2,8 +2,6 @@ title: 'range' --- - - A language built-in type to support ranges. Example of range literal: ``` @@ -24,4 +22,4 @@ range(10)[::2] # range(0, 10, 2) range(10)[3:0:-1] # range(3, 0, -1) ``` -Ranges are immutable, as in Python 3. +Ranges are immutable, as in Python 3. \ No newline at end of file diff --git a/rules/lib/core/set.mdx b/rules/lib/core/set.mdx index 14ba6dfc4..860c43629 100644 --- a/rules/lib/core/set.mdx +++ b/rules/lib/core/set.mdx @@ -2,10 +2,8 @@ title: 'set' --- - - The built-in set type. A set is a mutable collection of unique values – the set's -_elements_. The [type name](../globals/all#type) of a set is `"set"`. +*elements*. The [type name](../globals/all#type) of a set is `"set"`. Sets provide constant-time operations to insert, remove, or check for the presence of a value. Sets are implemented using a hash table, and therefore, just like keys of a @@ -24,7 +22,6 @@ set: s = set(["a", "b", "c"]) "a" in s # True "z" in s # False - ``` A set is iterable, and thus may be used as the operand of a `for` loop, a list @@ -39,7 +36,6 @@ s.add("x") len(s) # prints 3 for e in s: print e # prints "z", "y", "x" - ``` A set used in Boolean context is true if and only if it is non-empty. @@ -49,12 +45,11 @@ s = set() "non-empty" if s else "empty" # "empty" t = set(["x", "y"]) "non-empty" if t else "empty" # "non-empty" - ``` Sets may be compared for equality or inequality using `==` and `!=`. A set `s` is equal to `t` if and only if `t` is a set containing the same -elements; iteration order is not significant. In particular, a set is _not_ equal to the list +elements; iteration order is not significant. In particular, a set is *not* equal to the list of its elements. Sets are not ordered with respect to other sets, and an attempt to compare two sets using `<`, `<=`, `>`, `>=`, or to sort a sequence of sets, will fail. @@ -64,7 +59,6 @@ set() == set() # True set() != [] # True set([1, 2]) == set([2, 1]) # True set([1, 2]) != [1, 2] # True - ``` The `|` operation on two sets returns the union of the two sets: a set containing the @@ -72,7 +66,6 @@ elements found in either one or both of the original sets. ``` set([1, 2]) | set([3, 2]) # set([1, 2, 3]) - ``` The `&` operation on two sets returns the intersection of the two sets: a set @@ -81,7 +74,6 @@ containing only the elements found in both of the original sets. ``` set([1, 2]) & set([2, 3]) # set([2]) set([1, 2]) & set([3, 4]) # set() - ``` The `-` operation on two sets returns the difference of the two sets: a set containing @@ -90,7 +82,6 @@ the elements found in the left-hand side set but not the right-hand side set. ``` set([1, 2]) - set([2, 3]) # set([1]) set([1, 2]) - set([3, 4]) # set([1, 2]) - ``` The `^` operation on two sets returns the symmetric difference of the two sets: a set @@ -99,7 +90,6 @@ containing the elements found in exactly one of the two original sets, but not i ``` set([1, 2]) ^ set([2, 3]) # set([1, 3]) set([1, 2]) ^ set([3, 4]) # set([1, 2, 3, 4]) - ``` In each of the above operations, the elements of the resulting set retain their order from the @@ -115,7 +105,6 @@ s |= set([2, 3, 4]) # s now equals set([1, 2, 3, 4]) s &= set([0, 1, 2, 3]) # s now equals set([1, 2, 3]) s -= set([0, 1]) # s now equals set([2, 3]) s ^= set([3, 4]) # s now equals set([2, 4]) - ``` Like all mutable values in Starlark, a set can be frozen, and once frozen, all subsequent @@ -123,22 +112,22 @@ operations that attempt to update it will fail. ## Members -- [add](#add) -- [clear](#clear) -- [difference](#difference) -- [difference\_update](#difference_update) -- [discard](#discard) -- [intersection](#intersection) -- [intersection\_update](#intersection_update) -- [isdisjoint](#isdisjoint) -- [issubset](#issubset) -- [issuperset](#issuperset) -- [pop](#pop) -- [remove](#remove) -- [symmetric\_difference](#symmetric_difference) -- [symmetric\_difference\_update](#symmetric_difference_update) -- [union](#union) -- [update](#update) +* [add](#add) +* [clear](#clear) +* [difference](#difference) +* [difference\_update](#difference_update) +* [discard](#discard) +* [intersection](#intersection) +* [intersection\_update](#intersection_update) +* [isdisjoint](#isdisjoint) +* [issubset](#issubset) +* [issuperset](#issuperset) +* [pop](#pop) +* [remove](#remove) +* [symmetric\_difference](#symmetric_difference) +* [symmetric\_difference\_update](#symmetric_difference_update) +* [union](#union) +* [update](#update) ## add @@ -146,7 +135,7 @@ operations that attempt to update it will fail. None set.add(element) ``` - Adds an element to the set. +Adds an element to the set. It is permissible to `add` a value already present in the set; this leaves the set unchanged. @@ -154,15 +143,11 @@ unchanged. If you need to add multiple elements to a set, see [`update`](#update) or the `|=` augmented assignment operation. - - ### Parameters -ParameterDescription`element` - required - - Element to add. - +| Parameter | Description | +| --- | --- | +| `element` | required Element to add. | ## clear @@ -170,9 +155,7 @@ ParameterDescription`element` None set.clear() ``` - Removes all the elements of the set. - - +Removes all the elements of the set. ## difference @@ -180,7 +163,7 @@ None set.clear() set set.difference(*others) ``` - Returns a new mutable set containing the difference of this set with others. +Returns a new mutable set containing the difference of this set with others. If `s` and `t` are sets, `s.difference(t)` is equivalent to `s - t`; however, note that the `-` operation requires both sides to be sets, @@ -194,16 +177,13 @@ For example, ``` set([1, 2, 3]).difference([2]) # set([1, 3]) set([1, 2, 3]).difference([0, 1], [3, 4]) # set([2]) - ``` ### Parameters -ParameterDescription`others` - required - - Collections of hashable elements. - +| Parameter | Description | +| --- | --- | +| `others` | required Collections of hashable elements. | ## difference\_update @@ -211,7 +191,7 @@ ParameterDescription`others` None set.difference_update(*others) ``` - Removes any elements found in any others from this set. +Removes any elements found in any others from this set. If `s` and `t` are sets, `s.difference_update(t)` is equivalent to `s -= t`; however, note that the `-=` augmented assignment requires both @@ -226,16 +206,13 @@ For example, s = set([1, 2, 3, 4]) s.difference_update([2]) # None; s is set([1, 3, 4]) s.difference_update([0, 1], [4, 5]) # None; s is set([3]) - ``` ### Parameters -ParameterDescription`others` - required - - Collections of hashable elements. - +| Parameter | Description | +| --- | --- | +| `others` | required Collections of hashable elements. | ## discard @@ -243,7 +220,7 @@ ParameterDescription`others` None set.discard(element) ``` - Removes an element from the set if it is present. +Removes an element from the set if it is present. It is permissible to `discard` a value not present in the set; this leaves the set unchanged. If you want to fail on an attempt to remove a non-present element, use @@ -257,16 +234,13 @@ For example, s = set(["x", "y"]) s.discard("y") # None; s == set(["x"]) s.discard("y") # None; s == set(["x"]) - ``` ### Parameters -ParameterDescription`element` - required - - Element to discard. Must be hashable. - +| Parameter | Description | +| --- | --- | +| `element` | required Element to discard. Must be hashable. | ## intersection @@ -274,7 +248,7 @@ ParameterDescription`element` set set.intersection(*others) ``` - Returns a new mutable set containing the intersection of this set with others. +Returns a new mutable set containing the intersection of this set with others. If `s` and `t` are sets, `s.intersection(t)` is equivalent to `s & t`; however, note that the `&` operation requires both sides to @@ -288,16 +262,13 @@ For example, ``` set([1, 2]).intersection([2, 3]) # set([2]) set([1, 2, 3]).intersection([0, 1], [1, 2]) # set([1]) - ``` ### Parameters -ParameterDescription`others` - required - - Collections of hashable elements. - +| Parameter | Description | +| --- | --- | +| `others` | required Collections of hashable elements. | ## intersection\_update @@ -305,7 +276,7 @@ ParameterDescription`others` None set.intersection_update(*others) ``` - Removes any elements not found in all others from this set. +Removes any elements not found in all others from this set. If `s` and `t` are sets, `s.intersection_update(t)` is equivalent to `s &= t`; however, note that the `&=` augmented @@ -321,16 +292,13 @@ For example, s = set([1, 2, 3, 4]) s.intersection_update([0, 1, 2]) # None; s is set([1, 2]) s.intersection_update([0, 1], [1, 2]) # None; s is set([1]) - ``` ### Parameters -ParameterDescription`others` - required - - Collections of hashable elements. - +| Parameter | Description | +| --- | --- | +| `others` | required Collections of hashable elements. | ## isdisjoint @@ -338,7 +306,7 @@ ParameterDescription`others` bool set.isdisjoint(other) ``` - Returns true if this set has no elements in common with another. +Returns true if this set has no elements in common with another. For example, @@ -346,16 +314,13 @@ For example, set([1, 2]).isdisjoint([3, 4]) # True set().isdisjoint(set()) # True set([1, 2]).isdisjoint([2, 3]) # False - ``` ### Parameters -ParameterDescription`other` - required - - A collection of hashable elements. - +| Parameter | Description | +| --- | --- | +| `other` | required A collection of hashable elements. | ## issubset @@ -363,7 +328,7 @@ ParameterDescription`other` bool set.issubset(other) ``` - Returns true of this set is a subset of another. +Returns true of this set is a subset of another. Note that a set is always considered to be a subset of itself. @@ -373,16 +338,13 @@ For example, set([1, 2]).issubset([1, 2, 3]) # True set([1, 2]).issubset([1, 2]) # True set([1, 2]).issubset([2, 3]) # False - ``` ### Parameters -ParameterDescription`other` - required - - A collection of hashable elements. - +| Parameter | Description | +| --- | --- | +| `other` | required A collection of hashable elements. | ## issuperset @@ -390,7 +352,7 @@ ParameterDescription`other` bool set.issuperset(other) ``` - Returns true of this set is a superset of another. +Returns true of this set is a superset of another. Note that a set is always considered to be a superset of itself. @@ -400,16 +362,13 @@ For example, set([1, 2, 3]).issuperset([1, 2]) # True set([1, 2, 3]).issuperset([1, 2, 3]) # True set([1, 2, 3]).issuperset([2, 3, 4]) # False - ``` ### Parameters -ParameterDescription`other` - required - - A collection of hashable elements. - +| Parameter | Description | +| --- | --- | +| `other` | required A collection of hashable elements. | ## pop @@ -417,7 +376,7 @@ ParameterDescription`other` unknown set.pop() ``` - Removes and returns the first element of the set (in iteration order, which is the order in which +Removes and returns the first element of the set (in iteration order, which is the order in which elements were first added to the set). Fails if the set is empty. @@ -430,7 +389,6 @@ s.pop() # 3; s == set([1, 2]) s.pop() # 1; s == set([2]) s.pop() # 2; s == set() s.pop() # error: empty set - ``` ## remove @@ -439,7 +397,7 @@ s.pop() # error: empty set None set.remove(element) ``` - Removes an element, which must be present in the set, from the set. +Removes an element, which must be present in the set, from the set. `remove` fails if the element was not present in the set. If you don't want to fail on an attempt to remove a non-present element, use [`discard`](#discard) instead. @@ -447,15 +405,11 @@ If you need to remove multiple elements from a set, see [`difference_update`](#difference_update) or the `-=` augmented assignment operation. - - ### Parameters -ParameterDescription`element` - required - - Element to remove. Must be an element of the set (and hashable). - +| Parameter | Description | +| --- | --- | +| `element` | required Element to remove. Must be an element of the set (and hashable). | ## symmetric\_difference @@ -463,7 +417,7 @@ ParameterDescription`element` set set.symmetric_difference(other) ``` - Returns a new mutable set containing the symmetric difference of this set with another collection of +Returns a new mutable set containing the symmetric difference of this set with another collection of hashable elements. If `s` and `t` are sets, `s.symmetric_difference(t)` is @@ -475,16 +429,13 @@ For example, ``` set([1, 2]).symmetric_difference([2, 3]) # set([1, 3]) - ``` ### Parameters -ParameterDescription`other` - required - - A collection of hashable elements. - +| Parameter | Description | +| --- | --- | +| `other` | required A collection of hashable elements. | ## symmetric\_difference\_update @@ -492,11 +443,11 @@ ParameterDescription`other` None set.symmetric_difference_update(other) ``` - Returns a new mutable set containing the symmetric difference of this set with another collection of +Returns a new mutable set containing the symmetric difference of this set with another collection of hashable elements. If `s` and `t` are sets, `s.symmetric_difference_update(t)` is -equivalent to \`s ^= t `; however, note that the ` ^=\` augmented assignment requires both +equivalent to `s ^= t`; however, note that the` ^=` augmented assignment requires both sides to be sets, while the `symmetric_difference_update` method also accepts a sequence or a dict. @@ -505,16 +456,13 @@ For example, ``` s = set([1, 2]) s.symmetric_difference_update([2, 3]) # None; s == set([1, 3]) - ``` ### Parameters -ParameterDescription`other` - required - - A collection of hashable elements. - +| Parameter | Description | +| --- | --- | +| `other` | required A collection of hashable elements. | ## union @@ -522,7 +470,7 @@ ParameterDescription`other` set set.union(*others) ``` - Returns a new mutable set containing the union of this set with others. +Returns a new mutable set containing the union of this set with others. If `s` and `t` are sets, `s.union(t)` is equivalent to `s | t`; however, note that the `|` operation requires both sides to be sets, @@ -536,16 +484,13 @@ For example, ``` set([1, 2]).union([2, 3]) # set([1, 2, 3]) set([1, 2]).union([2, 3], {3: "a", 4: "b"}) # set([1, 2, 3, 4]) - ``` ### Parameters -ParameterDescription`others` - required - - Collections of hashable elements. - +| Parameter | Description | +| --- | --- | +| `others` | required Collections of hashable elements. | ## update @@ -553,7 +498,7 @@ ParameterDescription`others` None set.update(*others) ``` - Adds the elements found in others to this set. +Adds the elements found in others to this set. For example, @@ -561,7 +506,6 @@ For example, s = set() s.update([1, 2]) # None; s is set([1, 2]) s.update([2, 3], [3, 4]) # None; s is set([1, 2, 3, 4]) - ``` If `s` and `t` are sets, `s.update(t)` is equivalent to @@ -571,11 +515,8 @@ to be sets, while the `update` method also accepts sequences and dicts. It is permissible to call `update` without any arguments; this leaves the set unchanged. - - ### Parameters -ParameterDescription`others` - required - - Collections of hashable elements. +| Parameter | Description | +| --- | --- | +| `others` | required Collections of hashable elements. | \ No newline at end of file diff --git a/rules/lib/core/string.mdx b/rules/lib/core/string.mdx index 5ff78dcc3..691cd5451 100644 --- a/rules/lib/core/string.mdx +++ b/rules/lib/core/string.mdx @@ -2,8 +2,6 @@ title: 'string' --- - - A language built-in type to support strings. Examples of string literals: ``` @@ -18,7 +16,6 @@ z = "hello"[:4] # "hell" # Slice steps can be used, too: s = "hello"[::2] # "hlo" t = "hello"[3:0:-1] # "lle" - ``` Strings are not directly iterable, use the `.elems()` method to iterate over their characters. Examples: @@ -32,38 +29,38 @@ Implicit concatenation of strings is not allowed; use the `+` operator instead. ## Members -- [capitalize](#capitalize) -- [count](#count) -- [elems](#elems) -- [endswith](#endswith) -- [find](#find) -- [format](#format) -- [index](#index) -- [isalnum](#isalnum) -- [isalpha](#isalpha) -- [isdigit](#isdigit) -- [islower](#islower) -- [isspace](#isspace) -- [istitle](#istitle) -- [isupper](#isupper) -- [join](#join) -- [lower](#lower) -- [lstrip](#lstrip) -- [partition](#partition) -- [removeprefix](#removeprefix) -- [removesuffix](#removesuffix) -- [replace](#replace) -- [rfind](#rfind) -- [rindex](#rindex) -- [rpartition](#rpartition) -- [rsplit](#rsplit) -- [rstrip](#rstrip) -- [split](#split) -- [splitlines](#splitlines) -- [startswith](#startswith) -- [strip](#strip) -- [title](#title) -- [upper](#upper) +* [capitalize](#capitalize) +* [count](#count) +* [elems](#elems) +* [endswith](#endswith) +* [find](#find) +* [format](#format) +* [index](#index) +* [isalnum](#isalnum) +* [isalpha](#isalpha) +* [isdigit](#isdigit) +* [islower](#islower) +* [isspace](#isspace) +* [istitle](#istitle) +* [isupper](#isupper) +* [join](#join) +* [lower](#lower) +* [lstrip](#lstrip) +* [partition](#partition) +* [removeprefix](#removeprefix) +* [removesuffix](#removesuffix) +* [replace](#replace) +* [rfind](#rfind) +* [rindex](#rindex) +* [rpartition](#rpartition) +* [rsplit](#rsplit) +* [rstrip](#rstrip) +* [split](#split) +* [splitlines](#splitlines) +* [startswith](#startswith) +* [strip](#strip) +* [title](#title) +* [upper](#upper) ## capitalize @@ -71,9 +68,7 @@ Implicit concatenation of strings is not allowed; use the `+` operator instead. string string.capitalize() ``` - Returns a copy of the string with its first character (if any) capitalized and the rest lowercased. This method does not support non-ascii characters. - - +Returns a copy of the string with its first character (if any) capitalized and the rest lowercased. This method does not support non-ascii characters. ## count @@ -81,24 +76,15 @@ string string.capitalize() int string.count(sub, start=0, end=None) ``` - Returns the number of (non-overlapping) occurrences of substring `sub` in string, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. - +Returns the number of (non-overlapping) occurrences of substring `sub` in string, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. ### Parameters -ParameterDescription`sub`[string](../core/string.html); - required - - The substring to count. - `start`[int](../core/int.html); or `None`; - default is `0` - - Restrict to search from this position. - `end`[int](../core/int.html); or `None`; - default is `None` - - optional position before which to restrict to search. - +| Parameter | Description | +| --- | --- | +| `sub` | [string](../core/string); required | +| `start` | [int](../core/int); or `None`; default is `0` | +| `end` | [int](../core/int); or `None`; default is `None` optional position before which to restrict to search. | ## elems @@ -106,9 +92,7 @@ ParameterDescription`sub`[string](../core/string.html); sequence string.elems() ``` - Returns an iterable value containing successive 1-element substrings of the string. Equivalent to `[s[i] for i in range(len(s))]`, except that the returned value might not be a list. - - +Returns an iterable value containing successive 1-element substrings of the string. Equivalent to `[s[i] for i in range(len(s))]`, except that the returned value might not be a list. ## endswith @@ -116,24 +100,15 @@ sequence string.elems() bool string.endswith(sub, start=0, end=None) ``` - Returns True if the string ends with `sub`, otherwise False, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. - +Returns True if the string ends with `sub`, otherwise False, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. ### Parameters -ParameterDescription`sub`[string](../core/string.html); or [tuple](../core/tuple.html) of [string](../core/string.html) s; - required - - The suffix (or tuple of alternative suffixes) to match. - `start`[int](../core/int.html); or `None`; - default is `0` - - Test beginning at this position. - `end`[int](../core/int.html); or `None`; - default is `None` - - optional position at which to stop comparing. - +| Parameter | Description | +| --- | --- | +| `sub` | [string](../core/string); or [tuple](../core/tuple) of [string](../core/string)s; required The suffix (or tuple of alternative suffixes) to match. | +| `start` | [int](../core/int); or `None`; default is `0` Test beginning at this position. | +| `end` | [int](../core/int); or `None`; default is `None` optional position at which to stop comparing. | ## find @@ -141,24 +116,15 @@ ParameterDescription`sub`[string](../core/string.html); or [tuple](../core/tuple int string.find(sub, start=0, end=None) ``` - Returns the first index where `sub` is found, or -1 if no such index exists, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. - +Returns the first index where `sub` is found, or -1 if no such index exists, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. ### Parameters -ParameterDescription`sub`[string](../core/string.html); - required - - The substring to find. - `start`[int](../core/int.html); or `None`; - default is `0` - - Restrict to search from this position. - `end`[int](../core/int.html); or `None`; - default is `None` - - optional position before which to restrict to search. - +| Parameter | Description | +| --- | --- | +| `sub` | [string](../core/string); required The substring to find. | +| `start` | [int](../core/int); or `None`; default is `0` Restrict to search from this position. | +| `end` | [int](../core/int); or `None`; default is `None` optional position before which to restrict to search. | ## format @@ -166,7 +132,7 @@ ParameterDescription`sub`[string](../core/string.html); string string.format(*args, **kwargs) ``` - Perform string interpolation. Format strings contain replacement fields surrounded by curly braces `{}`. Anything that is not contained in braces is considered literal text, which is copied unchanged to the output.If you need to include a brace character in the literal text, it can be escaped by doubling: `{{` and `}}` A replacement field can be either a name, a number, or empty. Values are converted to strings using the [str](../globals/all.html#str) function. +Perform string interpolation. Format strings contain replacement fields surrounded by curly braces `{}`. Anything that is not contained in braces is considered literal text, which is copied unchanged to the output.If you need to include a brace character in the literal text, it can be escaped by doubling: `{{` and `}}`A replacement field can be either a name, a number, or empty. Values are converted to strings using the [str](../globals/all#str) function. ``` # Access in order: @@ -179,15 +145,10 @@ string string.format(*args, **kwargs) ### Parameters -ParameterDescription`args` - default is `()` - - List of arguments. - `kwargs` - default is `{}` - - Dictionary of arguments. - +| Parameter | Description | +| --- | --- | +| `args` | default is `()` List of arguments. | +| `kwargs` | default is `{}` Dictionary of arguments. | ## index @@ -195,24 +156,15 @@ ParameterDescription`args` int string.index(sub, start=0, end=None) ``` - Returns the first index where `sub` is found, or raises an error if no such index exists, optionally restricting to `[start:end]` `start` being inclusive and `end` being exclusive. - +Returns the first index where `sub` is found, or raises an error if no such index exists, optionally restricting to `[start:end]``start` being inclusive and `end` being exclusive. ### Parameters -ParameterDescription`sub`[string](../core/string.html); - required - - The substring to find. - `start`[int](../core/int.html); or `None`; - default is `0` - - Restrict to search from this position. - `end`[int](../core/int.html); or `None`; - default is `None` - - optional position before which to restrict to search. - +| Parameter | Description | +| --- | --- | +| `sub` | [string](../core/string); required The substring to find. | +| `start` | [int](../core/int); or `None`; default is `0` Restrict to search from this position. | +| `end` | [int](../core/int); or `None`; default is `None` optional position before which to restrict to search. | ## isalnum @@ -220,9 +172,7 @@ ParameterDescription`sub`[string](../core/string.html); bool string.isalnum() ``` - Returns True if all characters in the string are alphanumeric (\[a-zA-Z0-9\]) and there is at least one character. - - +Returns True if all characters in the string are alphanumeric ([a-zA-Z0-9]) and there is at least one character. ## isalpha @@ -230,9 +180,7 @@ bool string.isalnum() bool string.isalpha() ``` - Returns True if all characters in the string are alphabetic (\[a-zA-Z\]) and there is at least one character. - - +Returns True if all characters in the string are alphabetic ([a-zA-Z]) and there is at least one character. ## isdigit @@ -240,9 +188,7 @@ bool string.isalpha() bool string.isdigit() ``` - Returns True if all characters in the string are digits (\[0-9\]) and there is at least one character. - - +Returns True if all characters in the string are digits ([0-9]) and there is at least one character. ## islower @@ -250,9 +196,7 @@ bool string.isdigit() bool string.islower() ``` - Returns True if all cased characters in the string are lowercase and there is at least one character. - - +Returns True if all cased characters in the string are lowercase and there is at least one character. ## isspace @@ -260,9 +204,7 @@ bool string.islower() bool string.isspace() ``` - Returns True if all characters are white space characters and the string contains at least one character. - - +Returns True if all characters are white space characters and the string contains at least one character. ## istitle @@ -270,9 +212,7 @@ bool string.isspace() bool string.istitle() ``` - Returns True if the string is in title case and it contains at least one character. This means that every uppercase character must follow an uncased one (e.g. whitespace) and every lowercase character must follow a cased one (e.g. uppercase or lowercase). - - +Returns True if the string is in title case and it contains at least one character. This means that every uppercase character must follow an uncased one (e.g. whitespace) and every lowercase character must follow a cased one (e.g. uppercase or lowercase). ## isupper @@ -280,9 +220,7 @@ bool string.istitle() bool string.isupper() ``` - Returns True if all cased characters in the string are uppercase and there is at least one character. - - +Returns True if all cased characters in the string are uppercase and there is at least one character. ## join @@ -290,7 +228,7 @@ bool string.isupper() string string.join(elements) ``` - Returns a string in which the string elements of the argument have been joined by this string as a separator. Example: +Returns a string in which the string elements of the argument have been joined by this string as a separator. Example: ``` "|".join(["a", "b", "c"]) == "a|b|c" @@ -298,12 +236,9 @@ string string.join(elements) ### Parameters -ParameterDescription`elements` - iterable of [string](../core/string.html) s; - required - - The objects to join. - +| Parameter | Description | +| --- | --- | +| `elements` | iterable of [string](../core/string)s; required | ## lower @@ -311,9 +246,7 @@ ParameterDescription`elements` string string.lower() ``` - Returns the lower case version of this string. - - +Returns the lower case version of this string. ## lstrip @@ -321,7 +254,7 @@ string string.lower() string string.lstrip(chars=None) ``` - Returns a copy of the string where leading characters that appear in `chars` are removed. Note that `chars` is not a prefix: all combinations of its value are removed: +Returns a copy of the string where leading characters that appear in `chars` are removed. Note that `chars` is not a prefix: all combinations of its value are removed: ``` "abcba".lstrip("ba") == "cba" @@ -329,11 +262,9 @@ string string.lstrip(chars=None) ### Parameters -ParameterDescription`chars`[string](../core/string.html); or `None`; - default is `None` - - The characters to remove, or all whitespace if None. - +| Parameter | Description | +| --- | --- | +| `chars` | [string](../core/string); or `None`; default is `None` The characters to remove, or all whitespace if None. | ## partition @@ -341,16 +272,13 @@ ParameterDescription`chars`[string](../core/string.html); or `None`; tuple string.partition(sep) ``` - Splits the input string at the first occurrence of the separator `sep` and returns the resulting partition as a three-element tuple of the form (before, separator, after). If the input string does not contain the separator, partition returns (self, '', ''). - +Splits the input string at the first occurrence of the separator `sep` and returns the resulting partition as a three-element tuple of the form (before, separator, after). If the input string does not contain the separator, partition returns (self, '', ''). ### Parameters -ParameterDescription`sep`[string](../core/string.html); - required - - The string to split on. - +| Parameter | Description | +| --- | --- | +| `sep` | [string](../core/string); required The string to split on. | ## removeprefix @@ -358,16 +286,13 @@ ParameterDescription`sep`[string](../core/string.html); string string.removeprefix(prefix) ``` - If the string starts with `prefix`, returns a new string with the prefix removed. Otherwise, returns the string. - +If the string starts with `prefix`, returns a new string with the prefix removed. Otherwise, returns the string. ### Parameters -ParameterDescription`prefix`[string](../core/string.html); - required - - The prefix to remove if present. - +| Parameter | Description | +| --- | --- | +| `prefix` | [string](../core/string); required The prefix to remove if present. | ## removesuffix @@ -375,16 +300,13 @@ ParameterDescription`prefix`[string](../core/string.html); string string.removesuffix(suffix) ``` - If the string ends with `suffix`, returns a new string with the suffix removed. Otherwise, returns the string. - +If the string ends with `suffix`, returns a new string with the suffix removed. Otherwise, returns the string. ### Parameters -ParameterDescription`suffix`[string](../core/string.html); - required - - The suffix to remove if present. - +| Parameter | Description | +| --- | --- | +| `suffix` | [string](../core/string); required The suffix to remove if present. | ## replace @@ -392,24 +314,15 @@ ParameterDescription`suffix`[string](../core/string.html); string string.replace(old, new, count=-1) ``` - Returns a copy of the string in which the occurrences of `old` have been replaced with `new`, optionally restricting the number of replacements to `count`. - +Returns a copy of the string in which the occurrences of `old` have been replaced with `new`, optionally restricting the number of replacements to `count`. ### Parameters -ParameterDescription`old`[string](../core/string.html); - required - - The string to be replaced. - `new`[string](../core/string.html); - required - - The string to replace with. - `count`[int](../core/int.html); - default is `-1` - - The maximum number of replacements. If omitted, or if the value is negative, there is no limit. - +| Parameter | Description | +| --- | --- | +| `old` | [string](../core/string); required The string to be replaced. | +| `new` | [string](../core/string); required The string to replace with. | +| `count` | [int](../core/int); default is `-1` The maximum number of replacements. If omitted, or if the value is negative, there is no limit. | ## rfind @@ -417,24 +330,15 @@ ParameterDescription`old`[string](../core/string.html); int string.rfind(sub, start=0, end=None) ``` - Returns the last index where `sub` is found, or -1 if no such index exists, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. - +Returns the last index where `sub` is found, or -1 if no such index exists, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. ### Parameters -ParameterDescription`sub`[string](../core/string.html); - required - - The substring to find. - `start`[int](../core/int.html); or `None`; - default is `0` - - Restrict to search from this position. - `end`[int](../core/int.html); or `None`; - default is `None` - - optional position before which to restrict to search. - +| Parameter | Description | +| --- | --- | +| `sub` | [string](../core/string); required The substring to find. | +| `start` | [int](../core/int); or `None`; default is `0` Restrict to search from this position. | +| `end` | [int](../core/int); or `None`; default is `None` optional position before which to restrict to search. | ## rindex @@ -442,24 +346,15 @@ ParameterDescription`sub`[string](../core/string.html); int string.rindex(sub, start=0, end=None) ``` - Returns the last index where `sub` is found, or raises an error if no such index exists, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. - +Returns the last index where `sub` is found, or raises an error if no such index exists, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. ### Parameters -ParameterDescription`sub`[string](../core/string.html); - required - - The substring to find. - `start`[int](../core/int.html); or `None`; - default is `0` - - Restrict to search from this position. - `end`[int](../core/int.html); or `None`; - default is `None` - - optional position before which to restrict to search. - +| Parameter | Description | +| --- | --- | +| `sub` | [string](../core/string); required The substring to find. | +| `start` | [int](../core/int); or `None`; default is `0` Restrict to search from this position. | +| `end` | [int](../core/int); or `None`; default is `None` optional position before which to restrict to search. | ## rpartition @@ -467,16 +362,13 @@ ParameterDescription`sub`[string](../core/string.html); tuple string.rpartition(sep) ``` - Splits the input string at the last occurrence of the separator `sep` and returns the resulting partition as a three-element tuple of the form (before, separator, after). If the input string does not contain the separator, rpartition returns ('', '', self). - +Splits the input string at the last occurrence of the separator `sep` and returns the resulting partition as a three-element tuple of the form (before, separator, after). If the input string does not contain the separator, rpartition returns ('', '', self). ### Parameters -ParameterDescription`sep`[string](../core/string.html); - required - - The string to split on. - +| Parameter | Description | +| --- | --- | +| `sep` | [string](../core/string); required The string to split on. | ## rsplit @@ -484,20 +376,14 @@ ParameterDescription`sep`[string](../core/string.html); list string.rsplit(sep, maxsplit=unbound) ``` - Returns a list of all the words in the string, using `sep` as the separator, optionally limiting the number of splits to `maxsplit`. Except for splitting from the right, this method behaves like split(). - +Returns a list of all the words in the string, using `sep` as the separator, optionally limiting the number of splits to `maxsplit`. Except for splitting from the right, this method behaves like split(). ### Parameters -ParameterDescription`sep`[string](../core/string.html); - required - - The string to split on. - `maxsplit`[int](../core/int.html); - default is `unbound` - - The maximum number of splits. - +| Parameter | Description | +| --- | --- | +| `sep` | [string](../core/string); required The string to split on. | +| `maxsplit` | [int](../core/int); default is `unbound` The maximum number of splits. | ## rstrip @@ -505,7 +391,7 @@ ParameterDescription`sep`[string](../core/string.html); string string.rstrip(chars=None) ``` - Returns a copy of the string where trailing characters that appear in `chars` are removed. Note that `chars` is not a suffix: all combinations of its value are removed: +Returns a copy of the string where trailing characters that appear in `chars` are removed. Note that `chars` is not a suffix: all combinations of its value are removed: ``` "abcbaa".rstrip("ab") == "abc" @@ -513,11 +399,9 @@ string string.rstrip(chars=None) ### Parameters -ParameterDescription`chars`[string](../core/string.html); or `None`; - default is `None` - - The characters to remove, or all whitespace if None. - +| Parameter | Description | +| --- | --- | +| `chars` | [string](../core/string); or `None`; default is `None` The characters to remove, or all whitespace if None. | ## split @@ -525,20 +409,14 @@ ParameterDescription`chars`[string](../core/string.html); or `None`; list string.split(sep, maxsplit=unbound) ``` - Returns a list of all the words in the string, using `sep` as the separator, optionally limiting the number of splits to `maxsplit`. - +Returns a list of all the words in the string, using `sep` as the separator, optionally limiting the number of splits to `maxsplit`. ### Parameters -ParameterDescription`sep`[string](../core/string.html); - required - - The string to split on. - `maxsplit`[int](../core/int.html); - default is `unbound` - - The maximum number of splits. - +| Parameter | Description | +| --- | --- | +| `sep` | [string](../core/string); required The string to split on. | +| `maxsplit` | [int](../core/int); default is `unbound` The maximum number of splits. | ## splitlines @@ -546,16 +424,13 @@ ParameterDescription`sep`[string](../core/string.html); sequence string.splitlines(keepends=False) ``` - Splits the string at line boundaries ('\\n', '\\r\\n', '\\r') and returns the result as a new mutable list. - +Splits the string at line boundaries ('\n', '\r\n', '\r') and returns the result as a new mutable list. ### Parameters -ParameterDescription`keepends`[bool](../core/bool.html); - default is `False` - - Whether the line breaks should be included in the resulting list. - +| Parameter | Description | +| --- | --- | +| `keepends` | [bool](../core/bool); default is `False` Whether the line breaks should be included in the resulting list. | ## startswith @@ -563,24 +438,15 @@ ParameterDescription`keepends`[bool](../core/bool.html); bool string.startswith(sub, start=0, end=None) ``` - Returns True if the string starts with `sub`, otherwise False, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. - +Returns True if the string starts with `sub`, otherwise False, optionally restricting to `[start:end]`, `start` being inclusive and `end` being exclusive. ### Parameters -ParameterDescription`sub`[string](../core/string.html); or [tuple](../core/tuple.html) of [string](../core/string.html) s; - required - - The prefix (or tuple of alternative prefixes) to match. - `start`[int](../core/int.html); or `None`; - default is `0` - - Test beginning at this position. - `end`[int](../core/int.html); or `None`; - default is `None` - - Stop comparing at this position. - +| Parameter | Description | +| --- | --- | +| `sub` | [string](../core/string); or [tuple](../core/tuple) of [string](../core/string)s; required The prefix (or tuple of alternative prefixes) to match. | +| `start` | [int](../core/int); or `None`; default is `0` Test beginning at this position. | +| `end` | [int](../core/int); or `None`; default is `None` Stop comparing at this position. | ## strip @@ -588,7 +454,7 @@ ParameterDescription`sub`[string](../core/string.html); or [tuple](../core/tuple string string.strip(chars=None) ``` - Returns a copy of the string where leading or trailing characters that appear in `chars` are removed. Note that `chars` is neither a prefix nor a suffix: all combinations of its value are removed: +Returns a copy of the string where leading or trailing characters that appear in `chars` are removed. Note that `chars` is neither a prefix nor a suffix: all combinations of its value are removed: ``` "aabcbcbaa".strip("ab") == "cbc" @@ -596,11 +462,9 @@ string string.strip(chars=None) ### Parameters -ParameterDescription`chars`[string](../core/string.html); or `None`; - default is `None` - - The characters to remove, or all whitespace if None. - +| Parameter | Description | +| --- | --- | +| `chars` | [string](../core/string); or `None`; default is `None` The characters to remove, or all whitespace if None. | ## title @@ -608,9 +472,7 @@ ParameterDescription`chars`[string](../core/string.html); or `None`; string string.title() ``` - Converts the input string into title case, i.e. every word starts with an uppercase letter while the remaining letters are lowercase. In this context, a word means strictly a sequence of letters. This method does not support supplementary Unicode characters. - - +Converts the input string into title case, i.e. every word starts with an uppercase letter while the remaining letters are lowercase. In this context, a word means strictly a sequence of letters. This method does not support supplementary Unicode characters. ## upper @@ -618,4 +480,4 @@ string string.title() string string.upper() ``` - Returns the upper case version of this string. +Returns the upper case version of this string. \ No newline at end of file diff --git a/rules/lib/core/tuple.mdx b/rules/lib/core/tuple.mdx index 83e21c1d1..cdec32130 100644 --- a/rules/lib/core/tuple.mdx +++ b/rules/lib/core/tuple.mdx @@ -2,8 +2,6 @@ title: 'tuple' --- - - The built-in tuple type. Example tuple expressions: ``` @@ -32,4 +30,4 @@ Similar to lists, tuples support slice operations: ('a', 'b', 'c', 'd')[3:0:-1] # ('d', 'c', 'b') ``` -Tuples are immutable, therefore `x[1] = "a"` is not supported. +Tuples are immutable, therefore `x[1] = "a"` is not supported. \ No newline at end of file diff --git a/rules/lib/fragments.mdx b/rules/lib/fragments.mdx index 36ab72b03..128ba7b0b 100644 --- a/rules/lib/fragments.mdx +++ b/rules/lib/fragments.mdx @@ -2,17 +2,16 @@ title: 'Configuration Fragments' --- - -Configuration fragments give rules access to language-specific parts of [configuration](builtins/configuration.html). +Configuration fragments give rules access to language-specific parts of [configuration](builtins/configuration). Rule implementations can get them using `ctx.fragments.[fragment name]` -- [apple](/rules/lib/fragments/apple) -- [bazel\_android](/rules/lib/fragments/bazel_android) -- [coverage](/rules/lib/fragments/coverage) -- [cpp](/rules/lib/fragments/cpp) -- [j2objc](/rules/lib/fragments/j2objc) -- [java](/rules/lib/fragments/java) -- [objc](/rules/lib/fragments/objc) -- [platform](/rules/lib/fragments/platform) -- [proto](/rules/lib/fragments/proto) +* [apple](/rules/lib/fragments/apple) +* [bazel\_android](/rules/lib/fragments/bazel_android) +* [coverage](/rules/lib/fragments/coverage) +* [cpp](/rules/lib/fragments/cpp) +* [j2objc](/rules/lib/fragments/j2objc) +* [java](/rules/lib/fragments/java) +* [objc](/rules/lib/fragments/objc) +* [platform](/rules/lib/fragments/platform) +* [proto](/rules/lib/fragments/proto) \ No newline at end of file diff --git a/rules/lib/fragments/apple.mdx b/rules/lib/fragments/apple.mdx index 3a246b8b2..852f2ab08 100644 --- a/rules/lib/fragments/apple.mdx +++ b/rules/lib/fragments/apple.mdx @@ -2,14 +2,12 @@ title: 'apple' --- - - A configuration fragment for Apple platforms. ## Members -- [single\_arch\_cpu](#single_arch_cpu) -- [single\_arch\_platform](#single_arch_platform) +* [single\_arch\_cpu](#single_arch_cpu) +* [single\_arch\_platform](#single_arch_platform) ## single\_arch\_cpu @@ -17,9 +15,7 @@ A configuration fragment for Apple platforms. string apple.single_arch_cpu ``` - The single "effective" architecture for this configuration (e.g., `i386` or `arm64`) in the context of rule logic that is only concerned with a single architecture (such as `objc_library`, which registers single-architecture compile actions). - - +The single "effective" architecture for this configuration (e.g., `i386` or `arm64`) in the context of rule logic that is only concerned with a single architecture (such as `objc_library`, which registers single-architecture compile actions). ## single\_arch\_platform @@ -27,4 +23,4 @@ string apple.single_arch_cpu apple_platform apple.single_arch_platform ``` - The platform of the current configuration. This should only be invoked in a context where only a single architecture may be supported; consider [multi\_arch\_platform](#multi_arch_platform) for other cases. +The platform of the current configuration. This should only be invoked in a context where only a single architecture may be supported; consider [multi\_arch\_platform](#multi_arch_platform) for other cases. \ No newline at end of file diff --git a/rules/lib/fragments/bazel_android.mdx b/rules/lib/fragments/bazel_android.mdx index 44b9b69d0..cf269a038 100644 --- a/rules/lib/fragments/bazel_android.mdx +++ b/rules/lib/fragments/bazel_android.mdx @@ -2,11 +2,9 @@ title: 'bazel\_android' --- - - ## Members -- [merge\_android\_manifest\_permissions](#merge_android_manifest_permissions) +* [merge\_android\_manifest\_permissions](#merge_android_manifest_permissions) ## merge\_android\_manifest\_permissions @@ -14,4 +12,4 @@ title: 'bazel\_android' bool bazel_android.merge_android_manifest_permissions ``` - The value of --merge\_android\_manifest\_permissions flag. +The value of --merge\_android\_manifest\_permissions flag. \ No newline at end of file diff --git a/rules/lib/fragments/coverage.mdx b/rules/lib/fragments/coverage.mdx index 072d74b8b..17f2f3fd0 100644 --- a/rules/lib/fragments/coverage.mdx +++ b/rules/lib/fragments/coverage.mdx @@ -2,13 +2,11 @@ title: 'coverage' --- - - A configuration fragment representing the coverage configuration. ## Members -- [output\_generator](#output_generator) +* [output\_generator](#output_generator) ## output\_generator @@ -16,7 +14,7 @@ A configuration fragment representing the coverage configuration. Label coverage.output_generator ``` - Returns the label pointed to by the [`--coverage_output_generator`](https://bazel.build/reference/command-line-reference#flag--coverage_output_generator) option if coverage collection is enabled, otherwise returns `None`. Can be accessed with [`configuration_field`](../globals/bzl.html#configuration_field): +Returns the label pointed to by the [`--coverage_output_generator`](https://bazel.build/reference/command-line-reference#flag--coverage_output_generator) option if coverage collection is enabled, otherwise returns `None`. Can be accessed with [`configuration_field`](../globals/bzl#configuration_field): ``` attr.label( @@ -27,4 +25,4 @@ attr.label( ) ``` - May return `None`. +May return `None`. \ No newline at end of file diff --git a/rules/lib/fragments/cpp.mdx b/rules/lib/fragments/cpp.mdx index c4c7a6c6a..ea0461ad8 100644 --- a/rules/lib/fragments/cpp.mdx +++ b/rules/lib/fragments/cpp.mdx @@ -2,21 +2,19 @@ title: 'cpp' --- - - A configuration fragment for C++. ## Members -- [apple\_generate\_dsym](#apple_generate_dsym) -- [conlyopts](#conlyopts) -- [copts](#copts) -- [custom\_malloc](#custom_malloc) -- [cxxopts](#cxxopts) -- [linkopts](#linkopts) -- [objc\_generate\_linkmap](#objc_generate_linkmap) -- [objc\_should\_strip\_binary](#objc_should_strip_binary) -- [objccopts](#objccopts) +* [apple\_generate\_dsym](#apple_generate_dsym) +* [conlyopts](#conlyopts) +* [copts](#copts) +* [custom\_malloc](#custom_malloc) +* [cxxopts](#cxxopts) +* [linkopts](#linkopts) +* [objc\_generate\_linkmap](#objc_generate_linkmap) +* [objc\_should\_strip\_binary](#objc_should_strip_binary) +* [objccopts](#objccopts) ## apple\_generate\_dsym @@ -24,9 +22,7 @@ A configuration fragment for C++. bool cpp.apple_generate_dsym ``` - Whether to generate Apple debug symbol(.dSYM) artifacts. - - +Whether to generate Apple debug symbol(.dSYM) artifacts. ## conlyopts @@ -34,9 +30,7 @@ bool cpp.apple_generate_dsym list cpp.conlyopts ``` - The flags passed to Bazel by [`--conlyopt`](/docs/user-manual#flag--conlyopt) option. - - +The flags passed to Bazel by [`--conlyopt`](/docs/user-manual#flag--conlyopt) option. ## copts @@ -44,9 +38,7 @@ list cpp.conlyopts list cpp.copts ``` - The flags passed to Bazel by [`--copt`](/docs/user-manual#flag--copt) option. - - +The flags passed to Bazel by [`--copt`](/docs/user-manual#flag--copt) option. ## custom\_malloc @@ -54,7 +46,7 @@ list cpp.copts Label cpp.custom_malloc ``` - Returns label pointed to by [`--custom_malloc`](/docs/user-manual#flag--custom_malloc) option. Can be accessed with [`configuration_field`](../globals/bzl.html#configuration_field): +Returns label pointed to by [`--custom_malloc`](/docs/user-manual#flag--custom_malloc) option. Can be accessed with [`configuration_field`](../globals/bzl#configuration_field): ``` attr.label( @@ -65,9 +57,7 @@ attr.label( ) ``` - May return `None`. - - +May return `None`. ## cxxopts @@ -75,9 +65,7 @@ attr.label( list cpp.cxxopts ``` - The flags passed to Bazel by [`--cxxopt`](/docs/user-manual#flag--cxxopt) option. - - +The flags passed to Bazel by [`--cxxopt`](/docs/user-manual#flag--cxxopt) option. ## linkopts @@ -85,9 +73,7 @@ list cpp.cxxopts list cpp.linkopts ``` - The flags passed to Bazel by [`--linkopt`](/docs/user-manual#flag--linkopt) option. - - +The flags passed to Bazel by [`--linkopt`](/docs/user-manual#flag--linkopt) option. ## objc\_generate\_linkmap @@ -95,9 +81,7 @@ list cpp.linkopts bool cpp.objc_generate_linkmap ``` - (Apple-only) Whether to generate linkmap artifacts. - - +(Apple-only) Whether to generate linkmap artifacts. ## objc\_should\_strip\_binary @@ -105,9 +89,7 @@ bool cpp.objc_generate_linkmap bool cpp.objc_should_strip_binary ``` - (Apple-only) whether to perform symbol and dead-code strippings on linked binaries. - - +(Apple-only) whether to perform symbol and dead-code strippings on linked binaries. ## objccopts @@ -115,4 +97,4 @@ bool cpp.objc_should_strip_binary list cpp.objccopts ``` - The flags passed to Bazel by [`--objccopt`](/docs/user-manual#flag--objccopt) option. +The flags passed to Bazel by [`--objccopt`](/docs/user-manual#flag--objccopt) option. \ No newline at end of file diff --git a/rules/lib/fragments/j2objc.mdx b/rules/lib/fragments/j2objc.mdx index 4553e0d25..a4abe6cc4 100644 --- a/rules/lib/fragments/j2objc.mdx +++ b/rules/lib/fragments/j2objc.mdx @@ -2,13 +2,11 @@ title: 'j2objc' --- - - A configuration fragment for j2Objc. ## Members -- [translation\_flags](#translation_flags) +* [translation\_flags](#translation_flags) ## translation\_flags @@ -16,4 +14,4 @@ A configuration fragment for j2Objc. list j2objc.translation_flags ``` - The list of flags to be used when the j2objc compiler is invoked. +The list of flags to be used when the j2objc compiler is invoked. \ No newline at end of file diff --git a/rules/lib/fragments/java.mdx b/rules/lib/fragments/java.mdx index d11a6d1f5..f1573479c 100644 --- a/rules/lib/fragments/java.mdx +++ b/rules/lib/fragments/java.mdx @@ -2,26 +2,24 @@ title: 'java' --- - - A java compiler configuration. ## Members -- [bytecode\_optimization\_pass\_actions](#bytecode_optimization_pass_actions) -- [bytecode\_optimizer\_mnemonic](#bytecode_optimizer_mnemonic) -- [default\_javac\_flags](#default_javac_flags) -- [default\_javac\_flags\_depset](#default_javac_flags_depset) -- [default\_jvm\_opts](#default_jvm_opts) -- [disallow\_java\_import\_exports](#disallow_java_import_exports) -- [multi\_release\_deploy\_jars](#multi_release_deploy_jars) -- [one\_version\_enforcement\_level](#one_version_enforcement_level) -- [plugins](#plugins) -- [run\_android\_lint](#run_android_lint) -- [split\_bytecode\_optimization\_pass](#split_bytecode_optimization_pass) -- [strict\_java\_deps](#strict_java_deps) -- [use\_header\_compilation\_direct\_deps](#use_header_compilation_direct_deps) -- [use\_ijars](#use_ijars) +* [bytecode\_optimization\_pass\_actions](#bytecode_optimization_pass_actions) +* [bytecode\_optimizer\_mnemonic](#bytecode_optimizer_mnemonic) +* [default\_javac\_flags](#default_javac_flags) +* [default\_javac\_flags\_depset](#default_javac_flags_depset) +* [default\_jvm\_opts](#default_jvm_opts) +* [disallow\_java\_import\_exports](#disallow_java_import_exports) +* [multi\_release\_deploy\_jars](#multi_release_deploy_jars) +* [one\_version\_enforcement\_level](#one_version_enforcement_level) +* [plugins](#plugins) +* [run\_android\_lint](#run_android_lint) +* [split\_bytecode\_optimization\_pass](#split_bytecode_optimization_pass) +* [strict\_java\_deps](#strict_java_deps) +* [use\_header\_compilation\_direct\_deps](#use_header_compilation_direct_deps) +* [use\_ijars](#use_ijars) ## bytecode\_optimization\_pass\_actions @@ -29,9 +27,7 @@ A java compiler configuration. int java.bytecode_optimization_pass_actions ``` - This specifies the number of actions to divide the OPTIMIZATION stage of the bytecode optimizer into. Note that if split\_bytecode\_optimization\_pass is set, this will only change behavior if it is > 2. - - +This specifies the number of actions to divide the OPTIMIZATION stage of the bytecode optimizer into. Note that if split\_bytecode\_optimization\_pass is set, this will only change behavior if it is > 2. ## bytecode\_optimizer\_mnemonic @@ -39,9 +35,7 @@ int java.bytecode_optimization_pass_actions string java.bytecode_optimizer_mnemonic ``` - The mnemonic for the bytecode optimizer. - - +The mnemonic for the bytecode optimizer. ## default\_javac\_flags @@ -49,9 +43,7 @@ string java.bytecode_optimizer_mnemonic list java.default_javac_flags ``` - The default flags for the Java compiler. - - +The default flags for the Java compiler. ## default\_javac\_flags\_depset @@ -59,9 +51,7 @@ list java.default_javac_flags depset java.default_javac_flags_depset ``` - The default flags for the Java compiler. - - +The default flags for the Java compiler. ## default\_jvm\_opts @@ -69,9 +59,7 @@ depset java.default_javac_flags_depset list java.default_jvm_opts ``` - Additional options to pass to the Java VM for each java\_binary target - - +Additional options to pass to the Java VM for each java\_binary target ## disallow\_java\_import\_exports @@ -79,9 +67,7 @@ list java.default_jvm_opts bool java.disallow_java_import_exports() ``` - Returns true if java\_import exports are not allowed. - - +Returns true if java\_import exports are not allowed. ## multi\_release\_deploy\_jars @@ -89,9 +75,7 @@ bool java.disallow_java_import_exports() bool java.multi_release_deploy_jars ``` - The value of the --incompatible\_multi\_release\_deploy\_jars flag. - - +The value of the --incompatible\_multi\_release\_deploy\_jars flag. ## one\_version\_enforcement\_level @@ -99,9 +83,7 @@ bool java.multi_release_deploy_jars string java.one_version_enforcement_level ``` - The value of the --experimental\_one\_version\_enforcement flag. - - +The value of the --experimental\_one\_version\_enforcement flag. ## plugins @@ -109,9 +91,7 @@ string java.one_version_enforcement_level list java.plugins ``` - A list containing the labels provided with --plugins, if any. - - +A list containing the labels provided with --plugins, if any. ## run\_android\_lint @@ -119,9 +99,7 @@ list java.plugins bool java.run_android_lint ``` - The value of the --experimental\_run\_android\_lint\_on\_java\_rules flag. - - +The value of the --experimental\_run\_android\_lint\_on\_java\_rules flag. ## split\_bytecode\_optimization\_pass @@ -129,9 +107,7 @@ bool java.run_android_lint bool java.split_bytecode_optimization_pass ``` - Returns whether the OPTIMIZATION stage of the bytecode optimizer will be split across two actions. - - +Returns whether the OPTIMIZATION stage of the bytecode optimizer will be split across two actions. ## strict\_java\_deps @@ -139,9 +115,7 @@ bool java.split_bytecode_optimization_pass string java.strict_java_deps ``` - The value of the strict\_java\_deps flag. - - +The value of the strict\_java\_deps flag. ## use\_header\_compilation\_direct\_deps @@ -149,9 +123,7 @@ string java.strict_java_deps bool java.use_header_compilation_direct_deps() ``` - Returns true if Java header compilation should use separate outputs for direct deps. - - +Returns true if Java header compilation should use separate outputs for direct deps. ## use\_ijars @@ -159,4 +131,4 @@ bool java.use_header_compilation_direct_deps() bool java.use_ijars() ``` - Returns true iff Java compilation should use ijars. +Returns true iff Java compilation should use ijars. \ No newline at end of file diff --git a/rules/lib/fragments/objc.mdx b/rules/lib/fragments/objc.mdx index 8128261ff..578ae19f4 100644 --- a/rules/lib/fragments/objc.mdx +++ b/rules/lib/fragments/objc.mdx @@ -2,20 +2,18 @@ title: 'objc' --- - - A configuration fragment for Objective-C. ## Members -- [alwayslink\_by\_default](#alwayslink_by_default) -- [builtin\_objc\_strip\_action](#builtin_objc_strip_action) -- [copts\_for\_current\_compilation\_mode](#copts_for_current_compilation_mode) -- [disallow\_sdk\_frameworks\_attributes](#disallow_sdk_frameworks_attributes) -- [ios\_simulator\_device](#ios_simulator_device) -- [ios\_simulator\_version](#ios_simulator_version) -- [strip\_executable\_safely](#strip_executable_safely) -- [uses\_device\_debug\_entitlements](#uses_device_debug_entitlements) +* [alwayslink\_by\_default](#alwayslink_by_default) +* [builtin\_objc\_strip\_action](#builtin_objc_strip_action) +* [copts\_for\_current\_compilation\_mode](#copts_for_current_compilation_mode) +* [disallow\_sdk\_frameworks\_attributes](#disallow_sdk_frameworks_attributes) +* [ios\_simulator\_device](#ios_simulator_device) +* [ios\_simulator\_version](#ios_simulator_version) +* [strip\_executable\_safely](#strip_executable_safely) +* [uses\_device\_debug\_entitlements](#uses_device_debug_entitlements) ## alwayslink\_by\_default @@ -23,9 +21,7 @@ A configuration fragment for Objective-C. bool objc.alwayslink_by_default ``` - Returns whether objc\_library and objc\_import should default to alwayslink=True. - - +Returns whether objc\_library and objc\_import should default to alwayslink=True. ## builtin\_objc\_strip\_action @@ -33,9 +29,7 @@ bool objc.alwayslink_by_default bool objc.builtin_objc_strip_action ``` - Returns whether to emit a strip action as part of objc linking. - - +Returns whether to emit a strip action as part of objc linking. ## copts\_for\_current\_compilation\_mode @@ -43,9 +37,7 @@ bool objc.builtin_objc_strip_action list objc.copts_for_current_compilation_mode ``` - Returns a list of default options to use for compiling Objective-C in the current mode. - - +Returns a list of default options to use for compiling Objective-C in the current mode. ## disallow\_sdk\_frameworks\_attributes @@ -53,9 +45,7 @@ list objc.copts_for_current_compilation_mode bool objc.disallow_sdk_frameworks_attributes ``` - Returns whether sdk\_frameworks and weak\_sdk\_frameworks are disallowed attributes. - - +Returns whether sdk\_frameworks and weak\_sdk\_frameworks are disallowed attributes. ## ios\_simulator\_device @@ -63,10 +53,8 @@ bool objc.disallow_sdk_frameworks_attributes string objc.ios_simulator_device ``` - The type of device (e.g. 'iPhone 6') to use when running on the simulator. - May return `None`. - - +The type of device (e.g. 'iPhone 6') to use when running on the simulator. +May return `None`. ## ios\_simulator\_version @@ -74,10 +62,8 @@ string objc.ios_simulator_device DottedVersion objc.ios_simulator_version ``` - The SDK version of the iOS simulator to use when running on the simulator. - May return `None`. - - +The SDK version of the iOS simulator to use when running on the simulator. +May return `None`. ## strip\_executable\_safely @@ -85,9 +71,7 @@ DottedVersion objc.ios_simulator_version bool objc.strip_executable_safely ``` - Returns whether executable strip action should use flag -x, which does not break dynamic symbol resolution. - - +Returns whether executable strip action should use flag -x, which does not break dynamic symbol resolution. ## uses\_device\_debug\_entitlements @@ -95,4 +79,4 @@ bool objc.strip_executable_safely bool objc.uses_device_debug_entitlements ``` - Returns whether device debug entitlements should be included when signing an application. +Returns whether device debug entitlements should be included when signing an application. \ No newline at end of file diff --git a/rules/lib/fragments/platform.mdx b/rules/lib/fragments/platform.mdx index d6a525d95..f5f8651c7 100644 --- a/rules/lib/fragments/platform.mdx +++ b/rules/lib/fragments/platform.mdx @@ -2,14 +2,12 @@ title: 'platform' --- - - The platform configuration. ## Members -- [host\_platform](#host_platform) -- [platform](#platform) +* [host\_platform](#host_platform) +* [platform](#platform) ## host\_platform @@ -17,9 +15,7 @@ The platform configuration. Label platform.host_platform ``` - The current host platform - - +The current host platform ## platform @@ -27,4 +23,4 @@ Label platform.host_platform Label platform.platform ``` - The current target platform +The current target platform \ No newline at end of file diff --git a/rules/lib/fragments/proto.mdx b/rules/lib/fragments/proto.mdx index e1eb8a5b0..8ebf78274 100644 --- a/rules/lib/fragments/proto.mdx +++ b/rules/lib/fragments/proto.mdx @@ -2,6 +2,4 @@ title: 'proto' --- - - -A configuration fragment representing protocol buffers. +A configuration fragment representing protocol buffers. \ No newline at end of file diff --git a/rules/lib/globals.mdx b/rules/lib/globals.mdx index 13ced523a..cdcdd3c9f 100644 --- a/rules/lib/globals.mdx +++ b/rules/lib/globals.mdx @@ -2,12 +2,11 @@ title: 'Global functions' --- - This section lists the global functions available in Starlark. The list of available functions differs depending on the file type (whether a BUILD file, or a .bzl file, etc). -- [.bzl files](/rules/lib/globals/bzl) -- [All Bazel files](/rules/lib/globals/all) -- [BUILD files](/rules/lib/globals/build) -- [MODULE.bazel files](/rules/lib/globals/module) -- [REPO.bazel files](/rules/lib/globals/repo) -- [VENDOR.bazel files](/rules/lib/globals/vendor) +* [.bzl files](/rules/lib/globals/bzl) +* [All Bazel files](/rules/lib/globals/all) +* [BUILD files](/rules/lib/globals/build) +* [MODULE.bazel files](/rules/lib/globals/module) +* [REPO.bazel files](/rules/lib/globals/repo) +* [VENDOR.bazel files](/rules/lib/globals/vendor) \ No newline at end of file diff --git a/rules/lib/globals/all.mdx b/rules/lib/globals/all.mdx index a893c9a44..165ca362f 100644 --- a/rules/lib/globals/all.mdx +++ b/rules/lib/globals/all.mdx @@ -2,39 +2,37 @@ title: 'All Bazel files' --- - - Methods available in all Bazel files, including .bzl files, BUILD, MODULE.bazel, VENDOR.bazel, and WORKSPACE. ## Members -- [abs](#abs) -- [all](#all) -- [any](#any) -- [bool](#bool) -- [dict](#dict) -- [dir](#dir) -- [enumerate](#enumerate) -- [fail](#fail) -- [float](#float) -- [getattr](#getattr) -- [hasattr](#hasattr) -- [hash](#hash) -- [int](#int) -- [len](#len) -- [list](#list) -- [max](#max) -- [min](#min) -- [print](#print) -- [range](#range) -- [repr](#repr) -- [reversed](#reversed) -- [set](#set) -- [sorted](#sorted) -- [str](#str) -- [tuple](#tuple) -- [type](#type) -- [zip](#zip) +* [abs](#abs) +* [all](#all) +* [any](#any) +* [bool](#bool) +* [dict](#dict) +* [dir](#dir) +* [enumerate](#enumerate) +* [fail](#fail) +* [float](#float) +* [getattr](#getattr) +* [hasattr](#hasattr) +* [hash](#hash) +* [int](#int) +* [len](#len) +* [list](#list) +* [max](#max) +* [min](#min) +* [print](#print) +* [range](#range) +* [repr](#repr) +* [reversed](#reversed) +* [set](#set) +* [sorted](#sorted) +* [str](#str) +* [tuple](#tuple) +* [type](#type) +* [zip](#zip) ## abs @@ -42,7 +40,7 @@ Methods available in all Bazel files, including .bzl files, BUILD, MODULE.bazel, unknown abs(x) ``` - Returns the absolute value of a number (a non-negative number with the same magnitude). +Returns the absolute value of a number (a non-negative number with the same magnitude). ``` abs(-2.3) == 2.3 @@ -50,11 +48,9 @@ abs(-2.3) == 2.3 ### Parameters -ParameterDescription`x`[int](../core/int.html); or [float](../core/float.html); - required - - A number (int or float) - +| Parameter | Description | +| --- | --- | +| `x` | [int](../core/int); or [float](../core/float); required A number (int or float) | ## all @@ -62,7 +58,7 @@ ParameterDescription`x`[int](../core/int.html); or [float](../core/float.html); bool all(elements) ``` - Returns true if all elements evaluate to True or if the collection is empty. Elements are converted to boolean using the [bool](#bool) function. +Returns true if all elements evaluate to True or if the collection is empty. Elements are converted to boolean using the [bool](#bool) function. ``` all(["hello", 3, True]) == True @@ -71,12 +67,9 @@ all([-1, 0, 1]) == False ### Parameters -ParameterDescription`elements` - iterable; - required - - A collection of elements. - +| Parameter | Description | +| --- | --- | +| `elements` | iterable; required A collection of elements. | ## any @@ -84,7 +77,7 @@ ParameterDescription`elements` bool any(elements) ``` - Returns true if at least one element evaluates to True. Elements are converted to boolean using the [bool](#bool) function. +Returns true if at least one element evaluates to True. Elements are converted to boolean using the [bool](#bool) function. ``` any([-1, 0, 1]) == True @@ -93,12 +86,9 @@ any([False, 0, ""]) == False ### Parameters -ParameterDescription`elements` - iterable; - required - - A collection of elements. - +| Parameter | Description | +| --- | --- | +| `elements` | iterable; required A collection of elements. | ## bool @@ -106,16 +96,13 @@ ParameterDescription`elements` bool bool(x=False) ``` - Constructor for the bool type. It returns `False` if the object is `None`, `False`, an empty string ( `""`), the number `0`, or an empty collection (e.g. `()`, `[]`). Otherwise, it returns `True`. - +Constructor for the bool type. It returns `False` if the object is `None`, `False`, an empty string (`""`), the number `0`, or an empty collection (e.g. `()`, `[]`). Otherwise, it returns `True`. ### Parameters -ParameterDescription`x` - default is `False` - - The variable to convert. - +| Parameter | Description | +| --- | --- | +| `x` | default is `False` The variable to convert. | ## dict @@ -123,20 +110,14 @@ ParameterDescription`x` dict dict(pairs=[], **kwargs) ``` - Creates a [dictionary](../core/dict.html) from an optional positional argument and an optional set of keyword arguments. In the case where the same key is given multiple times, the last value will be used. Entries supplied via keyword arguments are considered to come after entries supplied via the positional argument. - +Creates a [dictionary](../core/dict) from an optional positional argument and an optional set of keyword arguments. In the case where the same key is given multiple times, the last value will be used. Entries supplied via keyword arguments are considered to come after entries supplied via the positional argument. ### Parameters -ParameterDescription`pairs` - default is `[]` - - A dict, or an iterable whose elements are each of length 2 (key, value). - `kwargs` - required - - Dictionary of additional entries. - +| Parameter | Description | +| --- | --- | +| `pairs` | default is `[]` A dict, or an iterable whose elements are each of length 2 (key, value). | +| `kwargs` | required Dictionary of additional entries. | ## dir @@ -144,16 +125,13 @@ ParameterDescription`pairs` list dir(x) ``` - Returns a list of strings: the names of the attributes and methods of the parameter object. - +Returns a list of strings: the names of the attributes and methods of the parameter object. ### Parameters -ParameterDescription`x` - required - - The object to check. - +| Parameter | Description | +| --- | --- | +| `x` | required The object to check. | ## enumerate @@ -161,7 +139,7 @@ ParameterDescription`x` list enumerate(list, start=0) ``` - Returns a list of pairs (two-element tuples), with the index (int) and the item from the input sequence. +Returns a list of pairs (two-element tuples), with the index (int) and the item from the input sequence. ``` enumerate([24, 21, 84]) == [(0, 24), (1, 21), (2, 84)] @@ -169,15 +147,10 @@ enumerate([24, 21, 84]) == [(0, 24), (1, 21), (2, 84)] ### Parameters -ParameterDescription`list` - required - - input sequence. - `start`[int](../core/int.html); - default is `0` - - start index. - +| Parameter | Description | +| --- | --- | +| `list` | required input sequence. | +| `start` | [int](../core/int); default is `0` start index. | ## fail @@ -185,32 +158,17 @@ ParameterDescription`list` None fail(*args, msg=None, attr=None, sep=" ", stack_trace=True) ``` - Causes execution to fail with an error. - +Causes execution to fail with an error. ### Parameters -ParameterDescription`msg` - default is `None` - - Deprecated: use positional arguments instead. This argument acts like an implicit leading positional argument. - `attr`[string](../core/string.html); or `None`; - default is `None` - - Deprecated. Causes an optional prefix containing this string to be added to the error message. - `sep`[string](../core/string.html); - default is `" "` - - The separator string between the objects, default is space (" "). - `stack_trace`[bool](../core/bool.html); - default is `True` - - If False stack trace is elided from failure for friendlier user messages - `args` - required - - A list of values, formatted with debugPrint (which is equivalent to str by default) and joined with sep (defaults to " "), that appear in the error message. - +| Parameter | Description | +| --- | --- | +| `msg` | default is `None` Deprecated: use positional arguments instead. This argument acts like an implicit leading positional argument. | +| `attr` | [string](../core/string); or `None`; default is `None` Deprecated. Causes an optional prefix containing this string to be added to the error message. | +| `sep` | [string](../core/string); default is `" "` The separator string between the objects, default is space (" "). | +| `stack_trace` | [bool](../core/bool); default is `True` If False stack trace is elided from failure for friendlier user messages | +| `args` | required A list of values, formatted with debugPrint (which is equivalent to str by default) and joined with sep (defaults to " "), that appear in the error message. | ## float @@ -218,23 +176,17 @@ ParameterDescription`msg` float float(x=unbound) ``` - Returns x as a float value. +Returns x as a float value. -- If `x` is already a float, `float` returns it unchanged. -- If `x` is a bool, `float` returns 1.0 for True and 0.0 for False. -- If `x` is an int, `float` returns the nearest finite floating-point value to x, or an error if the magnitude is too large. -- If `x` is a string, it must be a valid floating-point literal, or be equal (ignoring case) to `NaN`, `Inf`, or `Infinity`, optionally preceded by a `+` or `-` sign. +* If `x` is already a float, `float` returns it unchanged.* If `x` is a bool, `float` returns 1.0 for True and 0.0 for False.* If `x` is an int, `float` returns the nearest finite floating-point value to x, or an error if the magnitude is too large.* If `x` is a string, it must be a valid floating-point literal, or be equal (ignoring case) to `NaN`, `Inf`, or `Infinity`, optionally preceded by a `+` or `-` sign. Any other value causes an error. With no argument, `float()` returns 0.0. - ### Parameters -ParameterDescription`x`[string](../core/string.html); or [bool](../core/bool.html); or [int](../core/int.html); or [float](../core/float.html); - default is `unbound` - - The value to convert. - +| Parameter | Description | +| --- | --- | +| `x` | [string](../core/string); or [bool](../core/bool); or [int](../core/int); or [float](../core/float); default is `unbound` The value to convert. | ## getattr @@ -242,7 +194,7 @@ ParameterDescription`x`[string](../core/string.html); or [bool](../core/bool.htm unknown getattr(x, name, default=unbound) ``` - Returns the struct's field of the given name if it exists. If not, it either returns `default` (if specified) or raises an error. `getattr(x, "foobar")` is equivalent to `x.foobar`. +Returns the struct's field of the given name if it exists. If not, it either returns `default` (if specified) or raises an error. `getattr(x, "foobar")` is equivalent to `x.foobar`. ``` getattr(ctx.attr, "myattr") @@ -251,19 +203,11 @@ getattr(ctx.attr, "myattr", "mydefault") ### Parameters -ParameterDescription`x` - required - - The struct whose attribute is accessed. - `name`[string](../core/string.html); - required - - The name of the struct attribute. - `default` - default is `unbound` - - The default value to return in case the struct doesn't have an attribute of the given name. - +| Parameter | Description | +| --- | --- | +| `x` | required The struct whose attribute is accessed. | +| `name` | [string](../core/string); required The name of the struct attribute. | +| `default` | default is `unbound` The default value to return in case the struct doesn't have an attribute of the given name. | ## hasattr @@ -271,7 +215,7 @@ ParameterDescription`x` bool hasattr(x, name) ``` - Returns True if the object `x` has an attribute or method of the given `name`, otherwise False. Example: +Returns True if the object `x` has an attribute or method of the given `name`, otherwise False. Example: ``` hasattr(ctx.attr, "myattr") @@ -279,15 +223,10 @@ hasattr(ctx.attr, "myattr") ### Parameters -ParameterDescription`x` - required - - The object to check. - `name`[string](../core/string.html); - required - - The name of the attribute. - +| Parameter | Description | +| --- | --- | +| `x` | required | +| `name` | [string](../core/string); required The name of the attribute. | ## hash @@ -295,22 +234,19 @@ ParameterDescription`x` int hash(value) ``` - Return a hash value for a string. This is computed deterministically using the same algorithm as Java's `String.hashCode()`, namely: +Return a hash value for a string. This is computed deterministically using the same algorithm as Java's `String.hashCode()`, namely: ``` s[0] * (31^(n-1)) + s[1] * (31^(n-2)) + ... + s[n-1] ``` - Hashing of values besides strings is not currently supported. - +Hashing of values besides strings is not currently supported. ### Parameters -ParameterDescription`value`[string](../core/string.html); - required - - String value to hash. - +| Parameter | Description | +| --- | --- | +| `value` | [string](../core/string); required String value to hash. | ## int @@ -318,12 +254,9 @@ ParameterDescription`value`[string](../core/string.html); int int(x, base=unbound) ``` - Returns x as an int value. +Returns x as an int value. -- If `x` is already an int, `int` returns it unchanged. -- If `x` is a bool, `int` returns 1 for True and 0 for False. -- If `x` is a string, it must have the format `````. `` is either `"+"`, `"-"`, or empty (interpreted as positive). `` are a sequence of digits from 0 up to `base` \- 1, where the letters a-z (or equivalently, A-Z) are used as digits for 10-35. In the case where `base` is 2/8/16, ````` is optional and may be 0b/0o/0x (or equivalently, 0B/0O/0X) respectively; if the `base` is any other value besides these bases or the special value 0, the prefix must be empty. In the case where `base` is 0, the string is interpreted as an integer literal, in the sense that one of the bases 2/8/10/16 is chosen depending on which prefix if any is used. If `base` is 0, no prefix is used, and there is more than one digit, the leading digit cannot be 0; this is to avoid confusion between octal and decimal. The magnitude of the number represented by the string must be within the allowed range for the int type. -- If `x` is a float, `int` returns the integer value of the float, rounding towards zero. It is an error if x is non-finite (NaN or infinity). +* If `x` is already an int, `int` returns it unchanged.* If `x` is a bool, `int` returns 1 for True and 0 for False.* If `x` is a string, it must have the format ``. `` is either `"+"`, `"-"`, or empty (interpreted as positive). `` are a sequence of digits from 0 up to `base` - 1, where the letters a-z (or equivalently, A-Z) are used as digits for 10-35. In the case where `base` is 2/8/16, `` is optional and may be 0b/0o/0x (or equivalently, 0B/0O/0X) respectively; if the `base` is any other value besides these bases or the special value 0, the prefix must be empty. In the case where `base` is 0, the string is interpreted as an integer literal, in the sense that one of the bases 2/8/10/16 is chosen depending on which prefix if any is used. If `base` is 0, no prefix is used, and there is more than one digit, the leading digit cannot be 0; this is to avoid confusion between octal and decimal. The magnitude of the number represented by the string must be within the allowed range for the int type.* If `x` is a float, `int` returns the integer value of the float, rounding towards zero. It is an error if x is non-finite (NaN or infinity). This function fails if `x` is any other type, or if the value is a string not satisfying the above format. Unlike Python's `int` function, this function does not allow zero arguments, and does not allow extraneous whitespace for string arguments. @@ -339,20 +272,14 @@ int("10", 0) == 10 int("-0x10", 0) == -16 int("-0x10", 0) == -16 int("123.456") == 123 - ``` ### Parameters -ParameterDescription`x`[string](../core/string.html); or [bool](../core/bool.html); or [int](../core/int.html); or [float](../core/float.html); - required - - The string to convert. - `base`[int](../core/int.html); - default is `unbound` - - The base used to interpret a string value; defaults to 10. Must be between 2 and 36 (inclusive), or 0 to detect the base as if `x` were an integer literal. This parameter must not be supplied if the value is not a string. - +| Parameter | Description | +| --- | --- | +| `x` | [string](../core/string); or [bool](../core/bool); or [int](../core/int); or [float](../core/float); required The string to convert. | +| `base` | [int](../core/int); default is `unbound` The base used to interpret a string value; defaults to 10. Must be between 2 and 36 (inclusive), or 0 to detect the base as if `x` were an integer literal. This parameter must not be supplied if the value is not a string. | ## len @@ -360,17 +287,13 @@ ParameterDescription`x`[string](../core/string.html); or [bool](../core/bool.htm int len(x) ``` - Returns the length of a string, sequence (such as a list or tuple), dict, set, or other iterable. - +Returns the length of a string, sequence (such as a list or tuple), dict, set, or other iterable. ### Parameters -ParameterDescription`x` - iterable; or [string](../core/string.html); - required - - The value whose length to report. - +| Parameter | Description | +| --- | --- | +| `x` | iterable; or [string](../core/string); required The value whose length to report. | ## list @@ -378,7 +301,7 @@ ParameterDescription`x` list list(x=[]) ``` - Returns a new list with the same elements as the given iterable value. +Returns a new list with the same elements as the given iterable value. ``` list([1, 2]) == [1, 2] @@ -388,12 +311,9 @@ list({5: "a", 2: "b", 4: "c"}) == [5, 2, 4] ### Parameters -ParameterDescription`x` - iterable; - default is `[]` - - The object to convert. - +| Parameter | Description | +| --- | --- | +| `x` | iterable; default is `[]` The object to convert. | ## max @@ -401,28 +321,21 @@ ParameterDescription`x` unknown max(*args, key=None) ``` - Returns the largest one of all given arguments. If only one positional argument is provided, it must be a non-empty iterable.It is an error if elements are not comparable (for example int with string), or if no arguments are given. +Returns the largest one of all given arguments. If only one positional argument is provided, it must be a non-empty iterable.It is an error if elements are not comparable (for example int with string), or if no arguments are given. ``` max(2, 5, 4) == 5 max([5, 6, 3]) == 6 max("two", "three", "four", key = len) =="three" # the longest max([1, -1, -2, 2], key = abs) == -2 # the first encountered with maximal key value - ``` ### Parameters -ParameterDescription`key` - callable; or `None`; - default is `None` - - An optional function applied to each element before comparison. - `args` - required - - The elements to be checked. - +| Parameter | Description | +| --- | --- | +| `key` | callable; or `None`; default is `None` An optional function applied to each element before comparison. | +| `args` | required The elements to be checked. | ## min @@ -430,28 +343,21 @@ ParameterDescription`key` unknown min(*args, key=None) ``` - Returns the smallest one of all given arguments. If only one positional argument is provided, it must be a non-empty iterable. It is an error if elements are not comparable (for example int with string), or if no arguments are given. +Returns the smallest one of all given arguments. If only one positional argument is provided, it must be a non-empty iterable. It is an error if elements are not comparable (for example int with string), or if no arguments are given. ``` min(2, 5, 4) == 2 min([5, 6, 3]) == 3 min("six", "three", "four", key = len) == "six" # the shortest min([2, -2, -1, 1], key = abs) == -1 # the first encountered with minimal key value - ``` ### Parameters -ParameterDescription`key` - callable; or `None`; - default is `None` - - An optional function applied to each element before comparison. - `args` - required - - The elements to be checked. - +| Parameter | Description | +| --- | --- | +| `key` | callable; or `None`; default is `None` An optional function applied to each element before comparison. | +| `args` | required The elements to be checked. | ## print @@ -459,22 +365,16 @@ ParameterDescription`key` None print(*args, sep=" ") ``` - Prints `args` as debug output. It will be prefixed with the string `"DEBUG"` and the location (file and line number) of this call. The exact way in which the arguments are converted to strings is unspecified and may change at any time. In particular, it may be different from (and more detailed than) the formatting done by [`str()`](#str) and [`repr()`](#repr). +Prints `args` as debug output. It will be prefixed with the string `"DEBUG"` and the location (file and line number) of this call. The exact way in which the arguments are converted to strings is unspecified and may change at any time. In particular, it may be different from (and more detailed than) the formatting done by [`str()`](#str) and [`repr()`](#repr). Using `print` in production code is discouraged due to the spam it creates for users. For deprecations, prefer a hard error using [`fail()`](#fail) whenever possible. - ### Parameters -ParameterDescription`sep`[string](../core/string.html); - default is `" "` - - The separator string between the objects, default is space (" "). - `args` - required - - The objects to print. - +| Parameter | Description | +| --- | --- | +| `sep` | [string](../core/string); default is `" "` The separator string between the objects, default is space (" "). | +| `args` | required The objects to print. | ## range @@ -482,7 +382,7 @@ ParameterDescription`sep`[string](../core/string.html); sequence range(start_or_stop, stop=unbound, step=1) ``` - Creates a list where items go from `start` to `stop`, using a `step` increment. If a single argument is provided, items will range from 0 to that element. +Creates a list where items go from `start` to `stop`, using a `step` increment. If a single argument is provided, items will range from 0 to that element. ``` range(4) == [0, 1, 2, 3] @@ -492,19 +392,11 @@ range(3, 0, -1) == [3, 2, 1] ### Parameters -ParameterDescription`start_or_stop`[int](../core/int.html); - required - - Value of the start element if stop is provided, otherwise value of stop and the actual start is 0 - `stop`[int](../core/int.html); - default is `unbound` - - optional index of the first item _not_ to be included in the resulting list; generation of the list stops before `stop` is reached. - `step`[int](../core/int.html); - default is `1` - - The increment (default is 1). It may be negative. - +| Parameter | Description | +| --- | --- | +| `start_or_stop` | [int](../core/int); required Value of the start element if stop is provided, otherwise value of stop and the actual start is 0 | +| `stop` | [int](../core/int); default is `unbound` optional index of the first item *not* to be included in the resulting list; generation of the list stops before `stop` is reached. | +| `step` | [int](../core/int); default is `1` The increment (default is 1). It may be negative. | ## repr @@ -512,7 +404,7 @@ ParameterDescription`start_or_stop`[int](../core/int.html); string repr(x) ``` - Converts any object to a string representation. This is useful for debugging. +Converts any object to a string representation. This is useful for debugging. ``` repr("ab") == '"ab"' @@ -520,11 +412,9 @@ repr("ab") == '"ab"' ### Parameters -ParameterDescription`x` - required - - The object to convert. - +| Parameter | Description | +| --- | --- | +| `x` | required | ## reversed @@ -532,7 +422,7 @@ ParameterDescription`x` list reversed(sequence) ``` - Returns a new, unfrozen list that contains the elements of the original iterable sequence in reversed order. +Returns a new, unfrozen list that contains the elements of the original iterable sequence in reversed order. ``` reversed([3, 5, 4]) == [4, 5, 3] @@ -540,12 +430,9 @@ reversed([3, 5, 4]) == [4, 5, 3] ### Parameters -ParameterDescription`sequence` - iterable; - required - - The iterable sequence (e.g. list) to be reversed. - +| Parameter | Description | +| --- | --- | +| `sequence` | iterable; required The iterable sequence (e.g. list) to be reversed. | ## set @@ -553,7 +440,7 @@ ParameterDescription`sequence` set set(elements=[]) ``` - Creates a new [set](../core/set.html) containing the unique elements of a given +Creates a new [set](../core/set) containing the unique elements of a given iterable, preserving iteration order. If called with no argument, `set()` returns a new empty set. @@ -564,17 +451,13 @@ For example, set() # an empty set set([3, 1, 1, 2]) # set([3, 1, 2]), a set of three elements set({"k1": "v1", "k2": "v2"}) # set(["k1", "k2"]), a set of two elements - ``` ### Parameters -ParameterDescription`elements` - iterable; - default is `[]` - - An iterable of hashable values. - +| Parameter | Description | +| --- | --- | +| `elements` | iterable; default is `[]` An iterable of hashable values. | ## sorted @@ -582,33 +465,22 @@ ParameterDescription`elements` list sorted(iterable, key=None, *, reverse=False) ``` - Returns a new sorted list containing all the elements of the supplied iterable sequence. An error may occur if any pair of elements x, y may not be compared using x < y. The elements are sorted into ascending order, unless the reverse argument is True, in which case the order is descending. - Sorting is stable: elements that compare equal retain their original relative order. +Returns a new sorted list containing all the elements of the supplied iterable sequence. An error may occur if any pair of elements x, y may not be compared using x < y. The elements are sorted into ascending order, unless the reverse argument is True, in which case the order is descending. +Sorting is stable: elements that compare equal retain their original relative order. ``` sorted([3, 5, 4]) == [3, 4, 5] sorted([3, 5, 4], reverse = True) == [5, 4, 3] sorted(["two", "three", "four"], key = len) == ["two", "four", "three"] # sort by length - ``` ### Parameters -ParameterDescription`iterable` - iterable; - required - - The iterable sequence to sort. - `key` - callable; or `None`; - default is `None` - - An optional function applied to each element before comparison. - `reverse`[bool](../core/bool.html); - default is `False` - - Return results in descending order. - +| Parameter | Description | +| --- | --- | +| `iterable` | iterable; required The iterable sequence to sort. | +| `key` | callable; or `None`; default is `None` An optional function applied to each element before comparison. | +| `reverse` | [bool](../core/bool); default is `False` Return results in descending order. | ## str @@ -616,7 +488,7 @@ ParameterDescription`iterable` string str(x) ``` - Converts any object to string. This is useful for debugging. +Converts any object to string. This is useful for debugging. ``` str("ab") == "ab" @@ -625,11 +497,9 @@ str(8) == "8" ### Parameters -ParameterDescription`x` - required - - The object to convert. - +| Parameter | Description | +| --- | --- | +| `x` | required The object to convert. | ## tuple @@ -637,7 +507,7 @@ ParameterDescription`x` tuple tuple(x=()) ``` - Returns a tuple with the same elements as the given iterable value. +Returns a tuple with the same elements as the given iterable value. ``` tuple([1, 2]) == (1, 2) @@ -647,12 +517,9 @@ tuple({5: "a", 2: "b", 4: "c"}) == (5, 2, 4) ### Parameters -ParameterDescription`x` - iterable; - default is `()` - - The object to convert. - +| Parameter | Description | +| --- | --- | +| `x` | iterable; default is `()` The object to convert. | ## type @@ -660,7 +527,7 @@ ParameterDescription`x` string type(x) ``` - Returns the type name of its argument. This is useful for debugging and type-checking. Examples: +Returns the type name of its argument. This is useful for debugging and type-checking. Examples: ``` type(2) == "int" @@ -676,11 +543,9 @@ if type(x) == type([]): # if x is a list ### Parameters -ParameterDescription`x` - required - - The object to check type of. - +| Parameter | Description | +| --- | --- | +| `x` | required The object to check type of. | ## zip @@ -688,7 +553,7 @@ ParameterDescription`x` list zip(*args) ``` - Returns a `list` of `tuple` s, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The list has the size of the shortest input. With a single iterable argument, it returns a list of 1-tuples. With no arguments, it returns an empty list. Examples: +Returns a `list` of `tuple`s, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The list has the size of the shortest input. With a single iterable argument, it returns a list of 1-tuples. With no arguments, it returns an empty list. Examples: ``` zip() # == [] @@ -699,7 +564,6 @@ zip([1, 2], [3, 4, 5]) # == [(1, 3), (2, 4)] ### Parameters -ParameterDescription`args` - required - - lists to zip. +| Parameter | Description | +| --- | --- | +| `args` | required lists to zip. | \ No newline at end of file diff --git a/rules/lib/globals/build.mdx b/rules/lib/globals/build.mdx index eaf6b07bb..b00c047e6 100644 --- a/rules/lib/globals/build.mdx +++ b/rules/lib/globals/build.mdx @@ -2,28 +2,26 @@ title: 'BUILD files' --- - - Methods available in BUILD files. See also the Build Encyclopedia for extra [functions](/reference/be/functions) and build rules, which can also be used in BUILD files. ## Members -- [depset](#depset) -- [existing\_rule](#existing_rule) -- [existing\_rules](#existing_rules) -- [exports\_files](#exports_files) -- [glob](#glob) -- [module\_name](#module_name) -- [module\_version](#module_version) -- [package](#package) -- [package\_default\_visibility](#package_default_visibility) -- [package\_group](#package_group) -- [package\_name](#package_name) -- [package\_relative\_label](#package_relative_label) -- [repo\_name](#repo_name) -- [repository\_name](#repository_name) -- [select](#select) -- [subpackages](#subpackages) +* [depset](#depset) +* [existing\_rule](#existing_rule) +* [existing\_rules](#existing_rules) +* [exports\_files](#exports_files) +* [glob](#glob) +* [module\_name](#module_name) +* [module\_version](#module_version) +* [package](#package) +* [package\_default\_visibility](#package_default_visibility) +* [package\_group](#package_group) +* [package\_name](#package_name) +* [package\_relative\_label](#package_relative_label) +* [repo\_name](#repo_name) +* [repository\_name](#repository_name) +* [select](#select) +* [subpackages](#subpackages) ## depset @@ -31,7 +29,7 @@ Methods available in BUILD files. See also the Build Encyclopedia for extra [fun depset depset(direct=None, order="default", *, transitive=None) ``` - Creates a [depset](../builtins/depset.html). The `direct` parameter is a list of direct elements of the depset, and `transitive` parameter is a list of depsets whose elements become indirect elements of the created depset. The order in which elements are returned when the depset is converted to a list is specified by the `order` parameter. See the [Depsets overview](https://bazel.build/extending/depsets) for more information. +Creates a [depset](../builtins/depset). The `direct` parameter is a list of direct elements of the depset, and `transitive` parameter is a list of depsets whose elements become indirect elements of the created depset. The order in which elements are returned when the depset is converted to a list is specified by the `order` parameter. See the [Depsets overview](https://bazel.build/extending/depsets) for more information. All elements (direct and indirect) of a depset must be of the same type, as obtained by the expression [`type(x)`](../globals/all#type). @@ -39,24 +37,15 @@ Because a hash-based set is used to eliminate duplicates during iteration, all e In addition, elements must currently be immutable, though this restriction will be relaxed in future. -The order of the created depset should be _compatible_ with the order of its `transitive` depsets. `"default"` order is compatible with any other order, all other orders are only compatible with themselves. - +The order of the created depset should be *compatible* with the order of its `transitive` depsets. `"default"` order is compatible with any other order, all other orders are only compatible with themselves. ### Parameters -ParameterDescription`direct`[sequence](../core/list.html); or `None`; - default is `None` - - A list of _direct_ elements of a depset. - `order`[string](../core/string.html); - default is `"default"` - - The traversal strategy for the new depset. See [here](../builtins/depset.html) for the possible values. - `transitive`[sequence](../core/list.html) of [depset](../builtins/depset.html) s; or `None`; - default is `None` - - A list of depsets whose elements will become indirect elements of the depset. - +| Parameter | Description | +| --- | --- | +| `direct` | [sequence](../core/list); or `None`; default is `None` A list of *direct* elements of a depset. | +| `order` | [string](../core/string); default is `"default"` The traversal strategy for the new depset. See [here](../builtins/depset) for the possible values. | +| `transitive` | [sequence](../core/list) of [depset](../builtins/depset)s; or `None`; default is `None` A list of depsets whose elements will become indirect elements of the depset. | ## existing\_rule @@ -64,30 +53,27 @@ ParameterDescription`direct`[sequence](../core/list.html); or `None`; unknown existing_rule(name) ``` - Returns an immutable dict-like object that describes the attributes of a rule instantiated in this thread's package, or `None` if no rule instance of that name exists. +Returns an immutable dict-like object that describes the attributes of a rule instantiated in this thread's package, or `None` if no rule instance of that name exists. -Here, an _immutable dict-like object_ means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. +Here, an *immutable dict-like object* means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. The result contains an entry for each attribute, with the exception of private ones (whose names do not start with a letter) and a few unrepresentable legacy attribute types. In addition, the dict contains entries for the rule instance's `name` and `kind` (for example, `'cc_binary'`). The values of the result represent attribute values as follows: -- Attributes of type str, int, and bool are represented as is. -- Labels are converted to strings of the form `':foo'` for targets in the same package or `'//pkg:name'` for targets in a different package. -- Lists are represented as tuples, and dicts are converted to new, mutable dicts. Their elements are recursively converted in the same fashion. -- `select` values are returned with their contents transformed as described above. -- Attributes for which no value was specified during rule instantiation and whose default value is computed are excluded from the result. (Computed defaults cannot be computed until the analysis phase.). +* Attributes of type str, int, and bool are represented as is. +* Labels are converted to strings of the form `':foo'` for targets in the same package or `'//pkg:name'` for targets in a different package. +* Lists are represented as tuples, and dicts are converted to new, mutable dicts. Their elements are recursively converted in the same fashion. +* `select` values are returned with their contents transformed as described above. +* Attributes for which no value was specified during rule instantiation and whose default value is computed are excluded from the result. (Computed defaults cannot be computed until the analysis phase.). If possible, use this function only in [implementation functions of rule finalizer symbolic macros](https://bazel.build/extending/macros#finalizers). Use of this function in other contexts is not recommened, and will be disabled in a future Bazel release; it makes `BUILD` files brittle and order-dependent. Also, beware that it differs subtly from the two other conversions of rule attribute values from internal form to Starlark: one used by computed defaults, the other used by `ctx.attr.foo`. - ### Parameters -ParameterDescription`name`[string](../core/string.html); - required - - The name of the target. - +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); required The name of the target. | ## existing\_rules @@ -95,38 +81,27 @@ ParameterDescription`name`[string](../core/string.html); unknown existing_rules() ``` - Returns an immutable dict-like object describing the rules so far instantiated in this thread's package. Each entry of the dict-like object maps the name of the rule instance to the result that would be returned by `existing_rule(name)`. +Returns an immutable dict-like object describing the rules so far instantiated in this thread's package. Each entry of the dict-like object maps the name of the rule instance to the result that would be returned by `existing_rule(name)`. -Here, an _immutable dict-like object_ means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. +Here, an *immutable dict-like object* means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. If possible, use this function only in [implementation functions of rule finalizer symbolic macros](https://bazel.build/extending/macros#finalizers). Use of this function in other contexts is not recommened, and will be disabled in a future Bazel release; it makes `BUILD` files brittle and order-dependent. - - ## exports\_files ``` None exports_files(srcs, visibility=None, licenses=None) ``` - Specifies a list of files belonging to this package that are exported to other packages. - +Specifies a list of files belonging to this package that are exported to other packages. ### Parameters -ParameterDescription`srcs`[sequence](../core/list.html) of [string](../core/string.html) s; - required - - The list of files to export. - `visibility`[sequence](../core/list.html); or `None`; - default is `None` - - A visibility declaration can to be specified. The files will be visible to the targets specified. If no visibility is specified, the files will be visible to every package. - `licenses`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Licenses to be specified. - +| Parameter | Description | +| --- | --- | +| `srcs` | [sequence](../core/list) of [string](../core/string)s; required The list of files to export. | +| `visibility` | [sequence](../core/list); or `None`; default is `None` A visibility declaration can to be specified. The files will be visible to the targets specified. If no visibility is specified, the files will be visible to every package. | +| `licenses` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Licenses to be specified. | ## glob @@ -134,33 +109,21 @@ ParameterDescription`srcs`[sequence](../core/list.html) of [string](../core/stri sequence glob(include=[], exclude=[], exclude_directories=1, allow_empty=unbound) ``` - Glob returns a new, mutable, sorted list of every file in the current package that: +Glob returns a new, mutable, sorted list of every file in the current package that: -- Matches at least one pattern in `include`. -- Does not match any of the patterns in `exclude` (default `[]`). +* Matches at least one pattern in `include`. +* Does not match any of the patterns in `exclude` (default `[]`). If the `exclude_directories` argument is enabled (set to `1`), files of type directory will be omitted from the results (default `1`). - ### Parameters -ParameterDescription`include`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - The list of glob patterns to include. - `exclude`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - The list of glob patterns to exclude. - `exclude_directories`[int](../core/int.html); - default is `1` - - A flag whether to exclude directories or not. - `allow_empty` - default is `unbound` - - Whether we allow glob patterns to match nothing. If \`allow\_empty\` is False, each individual include pattern must match something and also the final result must be non-empty (after the matches of the \`exclude\` patterns are excluded). - +| Parameter | Description | +| --- | --- | +| `include` | [sequence](../core/list) of [string](../core/string)s; default is `[]` The list of glob patterns to include. | +| `exclude` | [sequence](../core/list) of [string](../core/string)s; default is `[]` The list of glob patterns to exclude. | +| `exclude_directories` | [int](../core/int); default is `1` A flag whether to exclude directories or not. | +| `allow_empty` | default is `unbound` Whether we allow glob patterns to match nothing. If `allow\_empty` is False, each individual include pattern must match something and also the final result must be non-empty (after the matches of the `exclude` patterns are excluded). | ## module\_name @@ -168,10 +131,8 @@ ParameterDescription`include`[sequence](../core/list.html) of [string](../core/s string module_name() ``` - The name of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the name of the module hosting the extension. It's the same as the `module.name` field seen in `module_ctx.modules`. - May return `None`. - - +The name of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the name of the module hosting the extension. It's the same as the `module.name` field seen in `module_ctx.modules`. +May return `None`. ## module\_version @@ -179,10 +140,8 @@ string module_name() string module_version() ``` - The version of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the version of the module hosting the extension. It's the same as the `module.version` field seen in `module_ctx.modules`. - May return `None`. - - +The version of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the version of the module hosting the extension. It's the same as the `module.version` field seen in `module_ctx.modules`. +May return `None`. ## package @@ -190,16 +149,13 @@ string module_version() unknown package(**kwargs) ``` - Declares metadata that applies to every rule in the package. It must be called at most once within a package (BUILD file). If called, it should be the first call in the BUILD file, right after the `load()` statements. - +Declares metadata that applies to every rule in the package. It must be called at most once within a package (BUILD file). If called, it should be the first call in the BUILD file, right after the `load()` statements. ### Parameters -ParameterDescription`kwargs` - required - - See the [`package()`](/reference/be/functions#package) function in the Build Encyclopedia for applicable arguments. - +| Parameter | Description | +| --- | --- | +| `kwargs` | required See the [`package()`](/reference/be/functions#package) function in the Build Encyclopedia for applicable arguments. | ## package\_default\_visibility @@ -207,9 +163,7 @@ ParameterDescription`kwargs` List package_default_visibility() ``` - Returns the default visibility of the package being evaluated. This is the value of the `default_visibility` parameter of `package()`, extended to include the package itself. - - +Returns the default visibility of the package being evaluated. This is the value of the `default_visibility` parameter of `package()`, extended to include the package itself. ## package\_group @@ -217,24 +171,15 @@ List package_default_visibility() None package_group(*, name, packages=[], includes=[]) ``` - This function defines a set of packages and assigns a label to the group. The label can be referenced in `visibility` attributes. - +This function defines a set of packages and assigns a label to the group. The label can be referenced in `visibility` attributes. ### Parameters -ParameterDescription`name`[string](../core/string.html); - required - - The unique name for this rule. - `packages`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - A complete enumeration of packages in this group. - `includes`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Other package groups that are included in this one. - +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); required The unique name for this rule. | +| `packages` | [sequence](../core/list) of [string](../core/string)s; default is `[]` A complete enumeration of packages in this group. | +| `includes` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Other package groups that are included in this one. | ## package\_name @@ -242,9 +187,7 @@ ParameterDescription`name`[string](../core/string.html); string package_name() ``` - The name of the package being evaluated, without the repository name. For example, in the BUILD file `some/package/BUILD`, its value will be `some/package`. If the BUILD file calls a function defined in a .bzl file, `package_name()` will match the caller BUILD file package. The value will always be an empty string for the root package. - - +The name of the package being evaluated, without the repository name. For example, in the BUILD file `some/package/BUILD`, its value will be `some/package`. If the BUILD file calls a function defined in a .bzl file, `package_name()` will match the caller BUILD file package. The value will always be an empty string for the root package. ## package\_relative\_label @@ -252,22 +195,19 @@ string package_name() Label package_relative_label(input) ``` - Converts the input string into a [Label](../builtins/Label.html) object, in the context of the package currently being initialized (that is, the `BUILD` file for which the current macro is executing). If the input is already a `Label`, it is returned unchanged. +Converts the input string into a [Label](../builtins/Label) object, in the context of the package currently being initialized (that is, the `BUILD` file for which the current macro is executing). If the input is already a `Label`, it is returned unchanged. This function may only be called while evaluating a BUILD file and the macros it directly or indirectly calls; it may not be called in (for instance) a rule implementation function. The result of this function is the same `Label` value as would be produced by passing the given string to a label-valued attribute of a target declared in the BUILD file. -_Usage note:_ The difference between this function and [Label()](../builtins/Label.html#Label) is that `Label()` uses the context of the package of the `.bzl` file that called it, not the package of the `BUILD` file. Use `Label()` when you need to refer to a fixed target that is hardcoded into the macro, such as a compiler. Use `package_relative_label()` when you need to normalize a label string supplied by the BUILD file to a `Label` object. (There is no way to convert a string to a `Label` in the context of a package other than the BUILD file or the calling .bzl file. For that reason, outer macros should always prefer to pass Label objects to inner macros rather than label strings.) [`ctx.package_relative_label()`](ctx.html#package_relative_label) provides the same functionality within a rule or aspect implementation function. - +*Usage note:* The difference between this function and [Label()](../builtins/Label#Label) is that `Label()` uses the context of the package of the `.bzl` file that called it, not the package of the `BUILD` file. Use `Label()` when you need to refer to a fixed target that is hardcoded into the macro, such as a compiler. Use `package_relative_label()` when you need to normalize a label string supplied by the BUILD file to a `Label` object. (There is no way to convert a string to a `Label` in the context of a package other than the BUILD file or the calling .bzl file. For that reason, outer macros should always prefer to pass Label objects to inner macros rather than label strings.)[`ctx.package_relative_label()`](ctx#package_relative_label) provides the same functionality within a rule or aspect implementation function. ### Parameters -ParameterDescription`input`[string](../core/string.html); or [Label](../builtins/Label.html); - required - - The input label string or Label object. If a Label object is passed, it's returned as is. - +| Parameter | Description | +| --- | --- | +| `input` | [string](../core/string); or [Label](../builtins/Label); required The input label string or Label object. If a Label object is passed, it's returned as is. | ## repo\_name @@ -275,9 +215,7 @@ ParameterDescription`input`[string](../core/string.html); or [Label](../builtins string repo_name() ``` - The canonical name of the repository containing the package currently being evaluated, with no leading at-signs. - - +The canonical name of the repository containing the package currently being evaluated, with no leading at-signs. ## repository\_name @@ -285,13 +223,10 @@ string repo_name() string repository_name() ``` - **Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` - +**Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` **Deprecated.** Prefer to use [`repo_name`](#repo_name) instead, which doesn't contain the spurious leading at-sign, but behaves identically otherwise. -The canonical name of the repository containing the package currently being evaluated, with a single at-sign ( `@`) prefixed. For example, in packages that are called into existence by the WORKSPACE stanza `local_repository(name='local', path=...)` it will be set to `@local`. In packages in the main repository, it will be set to `@`. - - +The canonical name of the repository containing the package currently being evaluated, with a single at-sign (`@`) prefixed. For example, in packages that are called into existence by the WORKSPACE stanza `local_repository(name='local', path=...)` it will be set to `@local`. In packages in the main repository, it will be set to `@`. ## select @@ -299,20 +234,14 @@ The canonical name of the repository containing the package currently being eval unknown select(x, no_match_error='') ``` - `select()` is the helper function that makes a rule attribute [configurable](/reference/be/common-definitions#configurable-attributes). See [build encyclopedia](/reference/be/functions#select) for details. - +`select()` is the helper function that makes a rule attribute [configurable](/reference/be/common-definitions#configurable-attributes). See [build encyclopedia](/reference/be/functions#select) for details. ### Parameters -ParameterDescription`x`[dict](../core/dict.html); - required - - A dict that maps configuration conditions to values. Each key is a [Label](../builtins/Label.html) or a label string that identifies a config\_setting or constraint\_value instance. See the [documentation on macros](https://bazel.build/extending/legacy-macros#label-resolution) for when to use a Label instead of a string. If `--incompatible_resolve_select_keys_eagerly` is enabled, the keys are resolved to `Label` objects relative to the package of the file that contains this call to `select`. - `no_match_error`[string](../core/string.html); - default is `''` - - Optional custom error to report if no condition matches. - +| Parameter | Description | +| --- | --- | +| `x` | [dict](../core/dict); required | +| `no_match_error` | [string](../core/string); default is `''` Optional custom error to report if no condition matches. | ## subpackages @@ -320,20 +249,12 @@ ParameterDescription`x`[dict](../core/dict.html); sequence subpackages(*, include, exclude=[], allow_empty=False) ``` - Returns a new mutable list of every direct subpackage of the current package, regardless of file-system directory depth. List returned is sorted and contains the names of subpackages relative to the current package. It is advised to prefer using the methods in bazel\_skylib.subpackages module rather than calling this function directly. - +Returns a new mutable list of every direct subpackage of the current package, regardless of file-system directory depth. List returned is sorted and contains the names of subpackages relative to the current package. It is advised to prefer using the methods in bazel\_skylib.subpackages module rather than calling this function directly. ### Parameters -ParameterDescription`include`[sequence](../core/list.html) of [string](../core/string.html) s; - required - - The list of glob patterns to include in subpackages scan. - `exclude`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - The list of glob patterns to exclude from subpackages scan. - `allow_empty`[bool](../core/bool.html); - default is `False` - - Whether we fail if the call returns an empty list. By default empty list indicates potential error in BUILD file where the call to subpackages() is superflous. Setting to true allows this function to succeed in that case. +| Parameter | Description | +| --- | --- | +| `include` | [sequence](../core/list) of [string](../core/string)s; required The list of glob patterns to include in subpackages scan. | +| `exclude` | [sequence](../core/list) of [string](../core/string)s; default is `[]` The list of glob patterns to exclude from subpackages scan. | +| `allow_empty` | [bool](../core/bool); default is `False` Whether we fail if the call returns an empty list. By default empty list indicates potential error in BUILD file where the call to subpackages() is superflous. Setting to true allows this function to succeed in that case. | \ No newline at end of file diff --git a/rules/lib/globals/bzl.mdx b/rules/lib/globals/bzl.mdx new file mode 100644 index 000000000..748fc2e5c --- /dev/null +++ b/rules/lib/globals/bzl.mdx @@ -0,0 +1,379 @@ +--- +title: '.bzl files' +--- + +Global methods available in all .bzl files. + +## Members + +* [analysis\_test\_transition](#analysis_test_transition) +* [aspect](#aspect) +* [configuration\_field](#configuration_field) +* [depset](#depset) +* [exec\_group](#exec_group) +* [exec\_transition](#exec_transition) +* [macro](#macro) +* [materializer\_rule](#materializer_rule) +* [module\_extension](#module_extension) +* [provider](#provider) +* [repository\_rule](#repository_rule) +* [rule](#rule) +* [select](#select) +* [subrule](#subrule) +* [tag\_class](#tag_class) +* [visibility](#visibility) + +## analysis\_test\_transition + +``` +transition analysis_test_transition(*, settings) +``` + +Creates a configuration transition to be applied on an analysis-test rule's dependencies. This transition may only be applied on attributes of rules with `analysis_test = True`. Such rules are restricted in capabilities (for example, the size of their dependency tree is limited), so transitions created using this function are limited in potential scope as compared to transitions created using [`transition()`](../builtins/transition). + +This function is primarily designed to facilitate the [Analysis Test Framework](https://bazel.build/rules/testing) core library. See its documentation (or its implementation) for best practices. + +### Parameters + +| Parameter | Description | +| --- | --- | +| `settings` | [dict](../core/dict); required A dictionary containing information about configuration settings which should be set by this configuration transition. Keys are build setting labels and values are their new post-transition values. All other settings are unchanged. Use this to declare specific configuration settings that an analysis test requires to be set in order to pass. | + +## aspect + +``` +Aspect aspect(implementation, attr_aspects=[], toolchains_aspects=[], attrs={}, required_providers=[], required_aspect_providers=[], provides=[], requires=[], propagation_predicate=None, fragments=[], host_fragments=[], toolchains=[], doc=None, *, apply_to_generating_rules=False, exec_compatible_with=[], exec_groups=None, subrules=[]) +``` + +Creates a new aspect. The result of this function must be stored in a global value. Please see the [introduction to Aspects](https://bazel.build/extending/aspects) for more details. + +### Parameters + +| Parameter | Description | +| --- | --- | +| `implementation` | [function](../core/function); required A Starlark function that implements this aspect, with exactly two parameters: [Target](../builtins/Target) (the target to which the aspect is applied) and [ctx](../builtins/ctx) (the rule context which the target is created from). Attributes of the target are available via the `ctx.rule` field. This function is evaluated during the analysis phase for each application of an aspect to a target. | +| `attr_aspects` | [sequence](../core/list) of [string](../core/string)s; or [function](../core/function); default is `[]` Accepts a list of attribute names or [Experimental] a function that returns the list of attribute names. The aspect propagates along dependencies specified in the attributes of a target with these names. Common values here include `deps` and `exports`. The list can also contain a single string `"*"` to propagate along all dependencies of a target. | +| `toolchains_aspects` | [sequence](../core/list); or [function](../core/function); default is `[]` Accepts a list of toolchain types or [Experimental] a function that returns the list of toolchain types. The aspect propagates to target toolchains which match these toolchain types. | +| `attrs` | [dict](../core/dict); default is `{}` A dictionary declaring all the attributes of the aspect. It maps from an attribute name to an attribute object, like `attr.label` or `attr.string` (see [`attr`](../toplevel/attr) module). Aspect attributes are available to implementation function as fields of `ctx` parameter. Implicit attributes starting with `_` must have default values, and have type `label` or `label_list`. Explicit attributes must have type `string`, and must use the `values` restriction. Explicit attributes restrict the aspect to only be used with rules that have attributes of the same name, type, and valid values according to the restriction. Declared attributes will convert `None` to the default value. | +| `required_providers` | [sequence](../core/list); default is `[]` This attribute allows the aspect to limit its propagation to only the targets whose rules advertise its required providers. The value must be a list containing either individual providers or lists of providers but not both. For example, `[[FooInfo], [BarInfo], [BazInfo, QuxInfo]]` is a valid value while `[FooInfo, BarInfo, [BazInfo, QuxInfo]]` is not valid. An unnested list of providers will automatically be converted to a list containing one list of providers. That is, `[FooInfo, BarInfo]` will automatically be converted to `[[FooInfo, BarInfo]]`. To make some rule (e.g. `some_rule`) targets visible to an aspect, `some_rule` must advertise all providers from at least one of the required providers lists. For example, if the `required_providers` of an aspect are `[[FooInfo], [BarInfo], [BazInfo, QuxInfo]]`, this aspect can see `some_rule` targets if and only if `some_rule` provides `FooInfo`, *or* `BarInfo`, *or* both `BazInfo` *and* `QuxInfo`. | +| `required_aspect_providers` | [sequence](../core/list); default is `[]` This attribute allows this aspect to inspect other aspects. The value must be a list containing either individual providers or lists of providers but not both. For example, `[[FooInfo], [BarInfo], [BazInfo, QuxInfo]]` is a valid value while `[FooInfo, BarInfo, [BazInfo, QuxInfo]]` is not valid. An unnested list of providers will automatically be converted to a list containing one list of providers. That is, `[FooInfo, BarInfo]` will automatically be converted to `[[FooInfo, BarInfo]]`. To make another aspect (e.g. `other_aspect`) visible to this aspect, `other_aspect` must provide all providers from at least one of the lists. In the example of `[[FooInfo], [BarInfo], [BazInfo, QuxInfo]]`, this aspect can see `other_aspect` if and only if `other_aspect` provides `FooInfo`, *or* `BarInfo`, *or* both `BazInfo` *and* `QuxInfo`. | +| `provides` | [sequence](../core/list); default is `[]` A list of providers that the implementation function must return. It is an error if the implementation function omits any of the types of providers listed here from its return value. However, the implementation function may return additional providers not listed here. Each element of the list is an `*Info` object returned by [`provider()`](../globals/bzl#provider). When a target of the rule is used as a dependency for a target that declares a required provider, it is not necessary to specify that provider here. It is enough that the implementation function returns it. However, it is considered best practice to specify it, even though this is not required. The [`required_providers`](../globals/bzl#aspect.required_providers) field of an [aspect](../globals/bzl#aspect) does, however, require that providers are specified here. | +| `requires` | [sequence](../core/list) of [Aspect](../builtins/Aspect)s; default is `[]` List of aspects required to be propagated before this aspect. | +| `propagation_predicate` | [function](../core/function); or `None`; default is `None` Experimental: a function that returns a boolean value indicating whether the aspect should be propagated to a target. | +| `fragments` | [sequence](../core/list) of [string](../core/string)s; default is `[]` List of names of configuration fragments that the aspect requires in target configuration. | +| `host_fragments` | [sequence](../core/list) of [string](../core/string)s; default is `[]` List of names of configuration fragments that the aspect requires in host configuration. | +| `toolchains` | [sequence](../core/list); default is `[]` If set, the set of toolchains this aspect requires. The list can contain String, Label, or StarlarkToolchainTypeApi objects, in any combination. Toolchains will be found by checking the current platform, and provided to the aspect implementation via `ctx.toolchain`. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the aspect that can be extracted by documentation generating tools. | +| `apply_to_generating_rules` | [bool](../core/bool); default is `False` If true, the aspect will, when applied to an output file, instead apply to the output file's generating rule. For example, suppose an aspect propagates transitively through attribute `deps` and it is applied to target `alpha`. Suppose `alpha` has `deps = [':beta\_output']`, where `beta\_output` is a declared output of a target `beta`. Suppose `beta` has a target `charlie` as one of its `deps`. If `apply\_to\_generating\_rules=True` for the aspect, then the aspect will propagate through `alpha`, `beta`, and `charlie`. If False, then the aspect will propagate only to `alpha`. False by default. | +| `exec_compatible_with` | [sequence](../core/list) of [string](../core/string)s; default is `[]` A list of constraints on the execution platform that apply to all instances of this aspect. | +| `exec_groups` | [dict](../core/dict); or `None`; default is `None` Dict of execution group name (string) to [`exec_group`s](../globals/bzl#exec_group). If set, allows aspects to run actions on multiple execution platforms within a single instance. See [execution groups documentation](/reference/exec-groups) for more info. | +| `subrules` | [sequence](../core/list) of [Subrule](../builtins/Subrule)s; default is `[]` Experimental: list of subrules used by this aspect. | + +## configuration\_field + +``` +LateBoundDefault configuration_field(fragment, name) +``` + +References a late-bound default value for an attribute of type [label](../toplevel/attr#label). A value is 'late-bound' if it requires the configuration to be built before determining the value. Any attribute using this as a value must [be private](https://bazel.build/extending/rules#private-attributes). + +Example usage: + +Defining a rule attribute: + +``` +'_foo': attr.label(default=configuration_field(fragment='java', name='toolchain')) +``` + +Accessing in rule implementation: + +``` + def _rule_impl(ctx): + foo_info = ctx.attr._foo + ... +``` + +### Parameters + +| Parameter | Description | +| --- | --- | +| `fragment` | [string](../core/string); required | +| `name` | [string](../core/string); required | + +## depset + +``` +depset depset(direct=None, order="default", *, transitive=None) +``` + +Creates a [depset](../builtins/depset). The `direct` parameter is a list of direct elements of the depset, and `transitive` parameter is a list of depsets whose elements become indirect elements of the created depset. The order in which elements are returned when the depset is converted to a list is specified by the `order` parameter. See the [Depsets overview](https://bazel.build/extending/depsets) for more information. + +All elements (direct and indirect) of a depset must be of the same type, as obtained by the expression [`type(x)`](../globals/all#type). + +Because a hash-based set is used to eliminate duplicates during iteration, all elements of a depset should be hashable. However, this invariant is not currently checked consistently in all constructors. Use the --incompatible\_always\_check\_depset\_elements flag to enable consistent checking; this will be the default behavior in future releases; see [Issue 10313](https://github.com/bazelbuild/bazel/issues/10313). + +In addition, elements must currently be immutable, though this restriction will be relaxed in future. + +The order of the created depset should be *compatible* with the order of its `transitive` depsets. `"default"` order is compatible with any other order, all other orders are only compatible with themselves. + +### Parameters + +| Parameter | Description | +| --- | --- | +| `direct` | [sequence](../core/list); or `None`; default is `None` A list of *direct* elements of a depset. | +| `order` | [string](../core/string); default is `"default"` The traversal strategy for the new depset. See [here](../builtins/depset) for the possible values. | +| `transitive` | [sequence](../core/list) of [depset](../builtins/depset)s; or `None`; default is `None` A list of depsets whose elements will become indirect elements of the depset. | + +## exec\_group + +``` +exec_group exec_group(*, toolchains=[], exec_compatible_with=[]) +``` + +Creates an [execution group](/reference/exec-groups) which can be used to create actions for a specific execution platform during rule implementation. + +### Parameters + +| Parameter | Description | +| --- | --- | +| `toolchains` | [sequence](../core/list); default is `[]` The set of toolchains this execution group requires. The list can contain String, Label, or StarlarkToolchainTypeApi objects, in any combination. | +| `exec_compatible_with` | [sequence](../core/list) of [string](../core/string)s; default is `[]` A list of constraints on the execution platform. | + +## exec\_transition + +``` +transition exec_transition(*, implementation, inputs, outputs) +``` + +A specialized version of [`transition()`](../builtins/transition) used to define the exec transition. See its documentation (or its implementation) for best practices. Only usable from the Bazel builtins. + +### Parameters + +| Parameter | Description | +| --- | --- | +| `implementation` | callable; required | +| `inputs` | [sequence](../core/list) of [string](../core/string)s; required | +| `outputs` | [sequence](../core/list) of [string](../core/string)s; required | + +## macro + +``` +macro macro(*, implementation, attrs={}, inherit_attrs=None, finalizer=False, doc=None) +``` + +Defines a symbolic macro, which may be called in `BUILD` files or macros (legacy or +symbolic) to define targets – possibly multiple ones. + +The value returned by `macro(...)` must be assigned to a global variable in a .bzl +file; the name of the global variable will be the macro symbol's name. + +See [Macros](https://bazel.build/extending/macros) for a comprehensive guide on how to use symbolic +macros. + +### Parameters + +| Parameter | Description | +| --- | --- | +| `implementation` | [function](../core/function); required The Starlark function implementing this macro. The values of the macro's attributes are passed to the implementation function as keyword arguments. The implementation function must have at least two named parameters, `name` and `visibility`, and if the macro inherits attributes (see `inherit_attrs` below), it must have a `**kwargs` residual keyword parameter. By convention, the implementation function should have a named parameter for any attribute that the macro needs to examine, modify, or pass to non-"main" targets, while the "bulk" inherited attributes which will be passed to the "main" target unchanged are passed as `**kwargs`. The implementation function must not return a value. Instead, the implementation function *declares targets* by calling rule or macro symbols. The name of any target or inner symbolic macro declared by a symbolic macro (including by any Starlark function that the macro's implementation function transitively calls) must either equal `name` (this is referred to as the "main" target) or start with `name`, followed by a separator chracter (`"_"`, `"-"`, or `"."`) and a string suffix. (Targets violating this naming scheme are allowed to be declared, but cannot be built, configured, or depended upon.) By default, targets declared by a symbolic macro (including by any Starlark function that the macro's implementation function transitively calls) are visible only in the package containing the .bzl file defining the macro. To declare targets visible externally, *including to the caller of the symbolic macro*, the implementation function must set `visibility` appropriately – typically, by passing `visibility = visibility` to the rule or macro symbol being called. The following APIs are unavailable within a macro implementation function and any Starlark function it transitively calls: * [`package()`, `licenses()`* `environment_group()`* [`native.glob()`](../toplevel/native#glob) – instead, you may pass a glob into the macro via a label list attribute* [`native.subpackages()`](../toplevel/native#subpackages)* (allowed in rule finalizers only, see `finalizer` below) [`native.existing_rules()`](../toplevel/native#existing_rules), [`native.existing_rule()`](../toplevel/native#existing_rule)* (for `WORKSPACE` threads) [`workspace()`](../globals/workspace#workspace), [`register_toolchains()`](../globals/workspace#register_toolchains), [`bind()`](../globals/workspace#register_execution_platforms>register_execution_platforms(), + +## get_default_canonical_id + +

    +load("@bazel//tools/build_defs/repo:cache.bzl", "get_default_canonical_id")
    +
    +get_default_canonical_id(repository_ctx, urls)
    +
    + +Returns the default canonical id to use for downloads. + +Returns `""` (empty string) when Bazel is run with +`--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0`. + +e.g. +```python +load("@bazel_tools//tools/build_defs/repo:cache.bzl", "get_default_canonical_id") +# ... + repository_ctx.download_and_extract( + url = urls, + integrity = integrity + canonical_id = get_default_canonical_id(repository_ctx, urls), + ), +``` + +### Parameters + + ++++ + + + + + + + + + + +
    repository_ctx + +required. + +

    + +The repository context of the repository rule calling this utility +function. + +

    +
    urls + +required. + +

    + +A list of URLs matching what is passed to `repository_ctx.download` and +`repository_ctx.download_and_extract`. + +

    +
    + diff --git a/rules/lib/repo/git.mdx b/rules/lib/repo/git.mdx new file mode 100644 index 000000000..1019c1794 --- /dev/null +++ b/rules/lib/repo/git.mdx @@ -0,0 +1,832 @@ +--- +title: 'git repository rules' +--- + +The following functions can be loaded from +`@bazel_tools//tools/build_defs/repo:git.bzl`. + + +Rules for cloning external git repositories. + + + +## git_repository + +
    +load("@bazel//tools/build_defs/repo:git.bzl", "git_repository")
    +
    +git_repository(name, branch, build_file, build_file_content, canonical_id, commit, init_submodules,
    +               patch_args, patch_cmds, patch_cmds_win, patch_strip, patch_tool, patches,
    +               recursive_init_submodules, remote, remote_module_file_integrity,
    +               remote_module_file_urls, remote_patch_strip, remote_patches, shallow_since,
    +               sparse_checkout_file, sparse_checkout_patterns, strip_prefix, tag, verbose,
    +               workspace_file, workspace_file_content)
    +
    + +Clone an external git repository. + +Clones a Git repository, checks out the specified branch, tag, or commit, and +makes its targets available for binding. If no branch, tag or commit is +specified, check out the repository's default branch. Also determine the id +and date of the commit that was checked out, and return a dict with +parameters that provide a reproducible version of this rule (which a tag or +branch not necessarily is). + +Bazel will first try to perform a shallow fetch of only the specified commit. +If that fails (usually due to missing server support), it will fall back to a +full fetch of the repository. + +Prefer [`http_archive`](/rules/lib/repo/http#http_archive) to `git_repository`. +The reasons are: + +* Git repository rules depend on system `git(1)` whereas the HTTP downloader is built + into Bazel and has no system dependencies. +* `http_archive` supports a list of `urls` as mirrors, and `git_repository` supports only + a single `remote`. +* `http_archive` works with the [repository cache](/run/build#repository-cache), but not + `git_repository`. See + [#5116](https://github.com/bazelbuild/bazel/issues/5116) for more information. + +**ATTRIBUTES** + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name + +Name; required + +

    + +A unique name for this repository. + +

    +
    branch + +String; optional + +

    + +branch in the remote repository to checked out. Precisely one of branch, tag, or commit must be specified. + +

    +
    build_file + +Label; optional + +

    + +The file to use as the BUILD file for this repository. This attribute is an absolute label (use '@//' for the main repo). The file does not need to be named BUILD, but can be (something like BUILD.new-repo-name may work well for distinguishing it from the repository's actual BUILD files). + +

    +
    build_file_content + +String; optional + +

    + +The content for the BUILD file for this repository. + +

    +
    canonical_id + +String; optional + +

    + +A canonical ID of the file downloaded. + +If specified and non-empty, Bazel will not take the file from cache, unless it +was added to the cache by a request with the same canonical ID. + +If unspecified or empty, Bazel by default uses the URLs of the file as the +canonical ID. This helps catch the common mistake of updating the URLs without +also updating the hash, resulting in builds that succeed locally but fail on +machines without the file in the cache. This behavior can be disabled with +--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0. + +

    +
    commit + +String; optional + +

    + +specific commit to be checked out. Precisely one of branch, tag, or commit must be specified. + +

    +
    init_submodules + +Boolean; optional + +

    + +Whether to clone submodules in the repository. + +

    +
    patch_args + +List of strings; optional + +

    + +The arguments given to the patch tool. Defaults to -p0 (see the `patch_strip` attribute), however -p1 will usually be needed for patches generated by git. If multiple -p arguments are specified, the last one will take effect.If arguments other than -p are specified, Bazel will fall back to use patch command line tool instead of the Bazel-native patch implementation. When falling back to patch command line tool and patch_tool attribute is not specified, `patch` will be used. + +

    +
    patch_cmds + +List of strings; optional + +

    + +Sequence of Bash commands to be applied on Linux/Macos after patches are applied. + +

    +
    patch_cmds_win + +List of strings; optional + +

    + +Sequence of Powershell commands to be applied on Windows after patches are applied. If this attribute is not set, patch_cmds will be executed on Windows, which requires Bash binary to exist. + +

    +
    patch_strip + +Integer; optional + +

    + +When set to `N`, this is equivalent to inserting `-pN` to the beginning of `patch_args`. + +

    +
    patch_tool + +String; optional + +

    + +The patch(1) utility to use. If this is specified, Bazel will use the specified patch tool instead of the Bazel-native patch implementation. + +

    +
    patches + +List of labels; optional + +

    + +A list of files that are to be applied as patches after extracting the archive. By default, it uses the Bazel-native patch implementation which doesn't support fuzz match and binary patch, but Bazel will fall back to use patch command line tool if `patch_tool` attribute is specified or there are arguments other than `-p` in `patch_args` attribute. + +

    +
    recursive_init_submodules + +Boolean; optional + +

    + +Whether to clone submodules recursively in the repository. + +

    +
    remote + +String; required + +

    + +The URI of the remote Git repository + +

    +
    remote_module_file_integrity + +String; optional + +

    + +For internal use only. + +

    +
    remote_module_file_urls + +List of strings; optional + +

    + +For internal use only. + +

    +
    remote_patch_strip + +Integer; optional + +

    + +The number of leading slashes to be stripped from the file name in the remote patches. + +

    +
    remote_patches + +Dictionary: String -> String; optional + +

    + +A map of patch file URL to its integrity value, they are applied after cloning the repository and before applying patch files from the `patches` attribute. It uses the Bazel-native patch implementation, you can specify the patch strip number with `remote_patch_strip` + +

    +
    shallow_since + +String; optional + +

    + +an optional date, not after the specified commit; the argument is not allowed if a tag or branch is specified (which can always be cloned with --depth=1). Setting such a date close to the specified commit may allow for a shallow clone of the repository even if the server does not support shallow fetches of arbitrary commits. Due to bugs in git's --shallow-since implementation, using this attribute is not recommended as it may result in fetch failures. + +

    +
    sparse_checkout_file + +Label; optional + +

    + +File containing .gitignore-style patterns for a sparse checkout of files in this repository. Either `sparse_checkout_patterns` or `sparse_checkout_file` may be specified, or neither, but not both. + +

    +
    sparse_checkout_patterns + +List of strings; optional + +

    + +Sequence of patterns for a sparse checkout of files in this repository. + +

    +
    strip_prefix + +String; optional + +

    + +A directory prefix to strip from the extracted files. + +

    +
    tag + +String; optional + +

    + +tag in the remote repository to checked out. Precisely one of branch, tag, or commit must be specified. + +

    +
    verbose + +Boolean; optional + +
    workspace_file + +Label; optional + +

    + +No-op attribute; do not use. + +

    +
    workspace_file_content + +String; optional + +

    + +No-op attribute; do not use. + +

    +
    + +**ENVIRONMENT VARIABLES** + +This repository rule depends on the following environment variables: + +* `BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID` + + + +## new_git_repository + +
    +load("@bazel//tools/build_defs/repo:git.bzl", "new_git_repository")
    +
    +new_git_repository(name, branch, build_file, build_file_content, canonical_id, commit,
    +                   init_submodules, patch_args, patch_cmds, patch_cmds_win, patch_strip, patch_tool,
    +                   patches, recursive_init_submodules, remote, remote_module_file_integrity,
    +                   remote_module_file_urls, remote_patch_strip, remote_patches, shallow_since,
    +                   sparse_checkout_file, sparse_checkout_patterns, strip_prefix, tag, verbose,
    +                   workspace_file, workspace_file_content)
    +
    + +Clone an external git repository. + +Clones a Git repository, checks out the specified branch, tag, or commit, and +makes its targets available for binding. If no branch, tag or commit is +specified, check out the repository's default branch. Also determine the id +and date of the commit that was checked out, and return a dict with +parameters that provide a reproducible version of this rule (which a tag or +branch not necessarily is). + +Bazel will first try to perform a shallow fetch of only the specified commit. +If that fails (usually due to missing server support), it will fall back to a +full fetch of the repository. + +Prefer [`http_archive`](/rules/lib/repo/http#http_archive) to `git_repository`. +The reasons are: + +* Git repository rules depend on system `git(1)` whereas the HTTP downloader is built + into Bazel and has no system dependencies. +* `http_archive` supports a list of `urls` as mirrors, and `git_repository` supports only + a single `remote`. +* `http_archive` works with the [repository cache](/run/build#repository-cache), but not + `git_repository`. See + [#5116](https://github.com/bazelbuild/bazel/issues/5116) for more information. + +**ATTRIBUTES** + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name + +Name; required + +

    + +A unique name for this repository. + +

    +
    branch + +String; optional + +

    + +branch in the remote repository to checked out. Precisely one of branch, tag, or commit must be specified. + +

    +
    build_file + +Label; optional + +

    + +The file to use as the BUILD file for this repository. This attribute is an absolute label (use '@//' for the main repo). The file does not need to be named BUILD, but can be (something like BUILD.new-repo-name may work well for distinguishing it from the repository's actual BUILD files). + +

    +
    build_file_content + +String; optional + +

    + +The content for the BUILD file for this repository. + +

    +
    canonical_id + +String; optional + +

    + +A canonical ID of the file downloaded. + +If specified and non-empty, Bazel will not take the file from cache, unless it +was added to the cache by a request with the same canonical ID. + +If unspecified or empty, Bazel by default uses the URLs of the file as the +canonical ID. This helps catch the common mistake of updating the URLs without +also updating the hash, resulting in builds that succeed locally but fail on +machines without the file in the cache. This behavior can be disabled with +--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0. + +

    +
    commit + +String; optional + +

    + +specific commit to be checked out. Precisely one of branch, tag, or commit must be specified. + +

    +
    init_submodules + +Boolean; optional + +

    + +Whether to clone submodules in the repository. + +

    +
    patch_args + +List of strings; optional + +

    + +The arguments given to the patch tool. Defaults to -p0 (see the `patch_strip` attribute), however -p1 will usually be needed for patches generated by git. If multiple -p arguments are specified, the last one will take effect.If arguments other than -p are specified, Bazel will fall back to use patch command line tool instead of the Bazel-native patch implementation. When falling back to patch command line tool and patch_tool attribute is not specified, `patch` will be used. + +

    +
    patch_cmds + +List of strings; optional + +

    + +Sequence of Bash commands to be applied on Linux/Macos after patches are applied. + +

    +
    patch_cmds_win + +List of strings; optional + +

    + +Sequence of Powershell commands to be applied on Windows after patches are applied. If this attribute is not set, patch_cmds will be executed on Windows, which requires Bash binary to exist. + +

    +
    patch_strip + +Integer; optional + +

    + +When set to `N`, this is equivalent to inserting `-pN` to the beginning of `patch_args`. + +

    +
    patch_tool + +String; optional + +

    + +The patch(1) utility to use. If this is specified, Bazel will use the specified patch tool instead of the Bazel-native patch implementation. + +

    +
    patches + +List of labels; optional + +

    + +A list of files that are to be applied as patches after extracting the archive. By default, it uses the Bazel-native patch implementation which doesn't support fuzz match and binary patch, but Bazel will fall back to use patch command line tool if `patch_tool` attribute is specified or there are arguments other than `-p` in `patch_args` attribute. + +

    +
    recursive_init_submodules + +Boolean; optional + +

    + +Whether to clone submodules recursively in the repository. + +

    +
    remote + +String; required + +

    + +The URI of the remote Git repository + +

    +
    remote_module_file_integrity + +String; optional + +

    + +For internal use only. + +

    +
    remote_module_file_urls + +List of strings; optional + +

    + +For internal use only. + +

    +
    remote_patch_strip + +Integer; optional + +

    + +The number of leading slashes to be stripped from the file name in the remote patches. + +

    +
    remote_patches + +Dictionary: String -> String; optional + +

    + +A map of patch file URL to its integrity value, they are applied after cloning the repository and before applying patch files from the `patches` attribute. It uses the Bazel-native patch implementation, you can specify the patch strip number with `remote_patch_strip` + +

    +
    shallow_since + +String; optional + +

    + +an optional date, not after the specified commit; the argument is not allowed if a tag or branch is specified (which can always be cloned with --depth=1). Setting such a date close to the specified commit may allow for a shallow clone of the repository even if the server does not support shallow fetches of arbitrary commits. Due to bugs in git's --shallow-since implementation, using this attribute is not recommended as it may result in fetch failures. + +

    +
    sparse_checkout_file + +Label; optional + +

    + +File containing .gitignore-style patterns for a sparse checkout of files in this repository. Either `sparse_checkout_patterns` or `sparse_checkout_file` may be specified, or neither, but not both. + +

    +
    sparse_checkout_patterns + +List of strings; optional + +

    + +Sequence of patterns for a sparse checkout of files in this repository. + +

    +
    strip_prefix + +String; optional + +

    + +A directory prefix to strip from the extracted files. + +

    +
    tag + +String; optional + +

    + +tag in the remote repository to checked out. Precisely one of branch, tag, or commit must be specified. + +

    +
    verbose + +Boolean; optional + +
    workspace_file + +Label; optional + +

    + +No-op attribute; do not use. + +

    +
    workspace_file_content + +String; optional + +

    + +No-op attribute; do not use. + +

    +
    + +**ENVIRONMENT VARIABLES** + +This repository rule depends on the following environment variables: + +* `BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID` + diff --git a/rules/lib/repo/http.mdx b/rules/lib/repo/http.mdx new file mode 100644 index 000000000..e5601205a --- /dev/null +++ b/rules/lib/repo/http.mdx @@ -0,0 +1,1045 @@ +--- +title: 'http repository rules' +--- + +The following functions can be loaded from +`@bazel_tools//tools/build_defs/repo:http.bzl`. + + +Rules for downloading files and archives over HTTP. + +### Setup + +To use these rules in a module extension, load them in your .bzl file and then call them from your +extension's implementation function. For example, to use `http_archive`: + +```python +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +def _my_extension_impl(mctx): + http_archive(name = "foo", urls = [...]) + +my_extension = module_extension(implementation = _my_extension_impl) +``` + +Alternatively, you can directly call these repo rules in your MODULE.bazel file with +`use_repo_rule`: + +```python +http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +http_archive(name = "foo", urls = [...]) +``` + + + +## http_archive + +
    +load("@bazel//tools/build_defs/repo:http.bzl", "http_archive")
    +
    +http_archive(name, add_prefix, auth_patterns, build_file, build_file_content, canonical_id, files,
    +             integrity, netrc, patch_args, patch_cmds, patch_cmds_win, patch_strip, patch_tool,
    +             patches, remote_file_integrity, remote_file_urls, remote_module_file_integrity,
    +             remote_module_file_urls, remote_patch_strip, remote_patches, sha256, strip_prefix, type,
    +             url, urls, workspace_file, workspace_file_content)
    +
    + +Downloads a Bazel repository as a compressed archive file, decompresses it, +and makes its targets available for binding. + +It supports the following file extensions: `"zip"`, `"jar"`, `"war"`, `"aar"`, `"nupkg"`, `"whl"`, `"tar"`, `"tar.gz"`, `"tgz"`, `"gz"`, `"tar.xz"`, `"txz"`, `"xz"`, `"tar.zst"`, `"tzst"`, `"zst"`, `"tar.bz2"`, `"tbz"`, `"bz2"`, `"ar"`, `"deb"` or `"7z"`. + +Examples: + Suppose the current repository contains the source code for a chat program, + rooted at the directory `~/chat-app`. It needs to depend on an SSL library + which is available from http://example.com/openssl.zip. This `.zip` file + contains the following directory structure: + + ``` + WORKSPACE + src/ + openssl.cc + openssl.h + ``` + + In the local repository, the user creates a `openssl.BUILD` file which + contains the following target definition: + + ```python + cc_library( + name = "openssl-lib", + srcs = ["src/openssl.cc"], + hdrs = ["src/openssl.h"], + ) + ``` + + Targets in the `~/chat-app` repository can depend on this target if the + following lines are added to `~/chat-app/WORKSPACE`: + + ```python + load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + + http_archive( + name = "my_ssl", + url = "http://example.com/openssl.zip", + sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + build_file = "@//:openssl.BUILD", + ) + ``` + + Then targets would specify `@my_ssl//:openssl-lib` as a dependency. + +**ATTRIBUTES** + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name + +Name; required + +

    + +A unique name for this repository. + +

    +
    add_prefix + +String; optional + +

    + +Destination directory relative to the repository directory. + +The archive will be unpacked into this directory, after applying `strip_prefix` +(if any) to the file paths within the archive. For example, file +`foo-1.2.3/src/foo.h` will be unpacked to `bar/src/foo.h` if `add_prefix = "bar"` +and `strip_prefix = "foo-1.2.3"`. + +

    +
    auth_patterns + +Dictionary: String -> String; optional + +

    + +An optional dict mapping host names to custom authorization patterns. + +If a URL's host name is present in this dict the value will be used as a pattern when +generating the authorization header for the http request. This enables the use of custom +authorization schemes used in a lot of common cloud storage providers. + +The pattern currently supports 2 tokens: <login> and +<password>, which are replaced with their equivalent value +in the netrc file for the same host name. After formatting, the result is set +as the value for the Authorization field of the HTTP request. + +Example attribute and netrc for a http download to an oauth2 enabled API using a bearer token: + +

    +auth_patterns = {
    +    "storage.cloudprovider.com": "Bearer <password>"
    +}
    +
    + +netrc: + +
    +machine storage.cloudprovider.com
    +        password RANDOM-TOKEN
    +
    + +The final HTTP request would have the following header: + +
    +Authorization: Bearer RANDOM-TOKEN
    +
    + +

    +
    build_file + +Label; optional + +

    + +The file to use as the BUILD file for this repository.This attribute is an absolute label (use '@//' for the main repo). The file does not need to be named BUILD, but can be (something like BUILD.new-repo-name may work well for distinguishing it from the repository's actual BUILD files. Either build_file or build_file_content can be specified, but not both. + +

    +
    build_file_content + +String; optional + +

    + +The content for the BUILD file for this repository. Either build_file or build_file_content can be specified, but not both. + +

    +
    canonical_id + +String; optional + +

    + +A canonical ID of the file downloaded. + +If specified and non-empty, Bazel will not take the file from cache, unless it +was added to the cache by a request with the same canonical ID. + +If unspecified or empty, Bazel by default uses the URLs of the file as the +canonical ID. This helps catch the common mistake of updating the URLs without +also updating the hash, resulting in builds that succeed locally but fail on +machines without the file in the cache. This behavior can be disabled with +--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0. + +

    +
    files + +Dictionary: String -> Label; optional + +

    + +A map of relative paths (key) to a file label (value) that overlaid on the repo as +a symlink. This is useful when you want to add REPO.bazel or BUILD.bazel files atop an existing +repository. Files are symlinked after remote files are downloaded and patches (`remote_patches`, +`patches`) are applied. Existing files will be overwritten. + +

    +
    integrity + +String; optional + +

    + +Expected checksum in Subresource Integrity format of the file downloaded. + +This must match the checksum of the file downloaded. _It is a security risk +to omit the checksum as remote files can change._ At best omitting this +field will make your build non-hermetic. It is optional to make development +easier but either this attribute or `sha256` should be set before shipping. + +

    +
    netrc + +String; optional + +

    + +Location of the .netrc file to use for authentication + +

    +
    patch_args + +List of strings; optional + +

    + +The arguments given to the patch tool. Defaults to -p0 (see the `patch_strip` attribute), however -p1 will usually be needed for patches generated by git. If multiple -p arguments are specified, the last one will take effect.If arguments other than -p are specified, Bazel will fall back to use patch command line tool instead of the Bazel-native patch implementation. When falling back to patch command line tool and patch_tool attribute is not specified, `patch` will be used. This only affects patch files in the `patches` attribute. + +

    +
    patch_cmds + +List of strings; optional + +

    + +Sequence of Bash commands to be applied on Linux/Macos after patches are applied. + +

    +
    patch_cmds_win + +List of strings; optional + +

    + +Sequence of Powershell commands to be applied on Windows after patches are applied. If this attribute is not set, patch_cmds will be executed on Windows, which requires Bash binary to exist. + +

    +
    patch_strip + +Integer; optional + +

    + +When set to `N`, this is equivalent to inserting `-pN` to the beginning of `patch_args`. + +

    +
    patch_tool + +String; optional + +

    + +The patch(1) utility to use. If this is specified, Bazel will use the specified patch tool instead of the Bazel-native patch implementation. + +

    +
    patches + +List of labels; optional + +

    + +A list of files that are to be applied as patches after extracting the archive. By default, it uses the Bazel-native patch implementation which doesn't support fuzz match and binary patch, but Bazel will fall back to use patch command line tool if `patch_tool` attribute is specified or there are arguments other than `-p` in `patch_args` attribute. + +

    +
    remote_file_integrity + +Dictionary: String -> String; optional + +

    + +A map of file relative paths (key) to its integrity value (value). These relative paths should map to the files (key) in the `remote_file_urls` attribute. + +

    +
    remote_file_urls + +Dictionary: String -> List of strings; optional + +

    + +A map of relative paths (key) to a list of URLs (value) that are to be downloaded +and made available as overlaid files on the repo. This is useful when you want to add REPO.bazel or +BUILD.bazel files atop an existing repository. The files are downloaded before `files` are +symlinked and patches (`remote_patches`, `patches`) are applied. The list of URLs should all be +possible mirrors of the same file. The URLs are tried in order until one succeeds. Existing files +will be overwritten. + +

    +
    remote_module_file_integrity + +String; optional + +

    + +For internal use only. + +

    +
    remote_module_file_urls + +List of strings; optional + +

    + +For internal use only. + +

    +
    remote_patch_strip + +Integer; optional + +

    + +The number of leading slashes to be stripped from the file name in the remote patches. + +

    +
    remote_patches + +Dictionary: String -> String; optional + +

    + +A map of patch file URL to its integrity value, they are applied after extracting the archive and before applying patch files from the `patches` attribute. It uses the Bazel-native patch implementation, you can specify the patch strip number with `remote_patch_strip` + +

    +
    sha256 + +String; optional + +

    + +The expected SHA-256 of the file downloaded. + +This must match the SHA-256 of the file downloaded. _It is a security risk +to omit the SHA-256 as remote files can change._ At best omitting this +field will make your build non-hermetic. It is optional to make development +easier but either this attribute or `integrity` should be set before shipping. + +

    +
    strip_prefix + +String; optional + +

    + +A directory prefix to strip from the extracted files. + +Many archives contain a top-level directory that contains all of the useful +files in archive. Instead of needing to specify this prefix over and over +in the `build_file`, this field can be used to strip it from all of the +extracted files. + +For example, suppose you are using `foo-lib-latest.zip`, which contains the +directory `foo-lib-1.2.3/` under which there is a `WORKSPACE` file and are +`src/`, `lib/`, and `test/` directories that contain the actual code you +wish to build. Specify `strip_prefix = "foo-lib-1.2.3"` to use the +`foo-lib-1.2.3` directory as your top-level directory. + +Note that if there are files outside of this directory, they will be +discarded and inaccessible (e.g., a top-level license file). This includes +files/directories that start with the prefix but are not in the directory +(e.g., `foo-lib-1.2.3.release-notes`). If the specified prefix does not +match a directory in the archive, Bazel will return an error. + +

    +
    type + +String; optional + +

    + +The archive type of the downloaded file. + +By default, the archive type is determined from the file extension of the +URL. If the file has no extension, you can explicitly specify one of the +following: `"zip"`, `"jar"`, `"war"`, `"aar"`, `"nupkg"`, `"whl"`, `"tar"`, `"tar.gz"`, `"tgz"`, `"gz"`, `"tar.xz"`, `"txz"`, `"xz"`, `"tar.zst"`, `"tzst"`, `"zst"`, `"tar.bz2"`, `"tbz"`, `"bz2"`, `"ar"`, `"deb"` or `"7z"`. + +

    +
    url + +String; optional + +

    + +A URL to a file that will be made available to Bazel. + +This must be a file, http or https URL. Redirections are followed. +Authentication is not supported. + +More flexibility can be achieved by the urls parameter that allows +to specify alternative URLs to fetch from. + +

    +
    urls + +List of strings; optional + +

    + +A list of URLs to a file that will be made available to Bazel. + +Each entry must be a file, http or https URL. Redirections are followed. +Authentication is not supported. + +URLs are tried in order until one succeeds, so you should list local mirrors first. +If all downloads fail, the rule will fail. + +

    +
    workspace_file + +Label; optional + +

    + +No-op attribute; do not use. + +

    +
    workspace_file_content + +String; optional + +

    + +No-op attribute; do not use. + +

    +
    + +**ENVIRONMENT VARIABLES** + +This repository rule depends on the following environment variables: + +* `BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID` + + + +## http_file + +
    +load("@bazel//tools/build_defs/repo:http.bzl", "http_file")
    +
    +http_file(name, auth_patterns, canonical_id, downloaded_file_path, executable, integrity, netrc,
    +          sha256, url, urls)
    +
    + +Downloads a file from a URL and makes it available to be used as a file +group. + +Examples: + Suppose you need to have a debian package for your custom rules. This package + is available from http://example.com/package.deb. Then you can add to your + WORKSPACE file: + + ```python + load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") + + http_file( + name = "my_deb", + url = "http://example.com/package.deb", + sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ) + ``` + + Targets would specify `@my_deb//file` as a dependency to depend on this file. + +**ATTRIBUTES** + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name + +Name; required + +

    + +A unique name for this repository. + +

    +
    auth_patterns + +Dictionary: String -> String; optional + +

    + +An optional dict mapping host names to custom authorization patterns. + +If a URL's host name is present in this dict the value will be used as a pattern when +generating the authorization header for the http request. This enables the use of custom +authorization schemes used in a lot of common cloud storage providers. + +The pattern currently supports 2 tokens: <login> and +<password>, which are replaced with their equivalent value +in the netrc file for the same host name. After formatting, the result is set +as the value for the Authorization field of the HTTP request. + +Example attribute and netrc for a http download to an oauth2 enabled API using a bearer token: + +

    +auth_patterns = {
    +    "storage.cloudprovider.com": "Bearer <password>"
    +}
    +
    + +netrc: + +
    +machine storage.cloudprovider.com
    +        password RANDOM-TOKEN
    +
    + +The final HTTP request would have the following header: + +
    +Authorization: Bearer RANDOM-TOKEN
    +
    + +

    +
    canonical_id + +String; optional + +

    + +A canonical ID of the file downloaded. + +If specified and non-empty, Bazel will not take the file from cache, unless it +was added to the cache by a request with the same canonical ID. + +If unspecified or empty, Bazel by default uses the URLs of the file as the +canonical ID. This helps catch the common mistake of updating the URLs without +also updating the hash, resulting in builds that succeed locally but fail on +machines without the file in the cache. This behavior can be disabled with +--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0. + +

    +
    downloaded_file_path + +String; optional + +

    + +Path assigned to the file downloaded + +

    +
    executable + +Boolean; optional + +

    + +If the downloaded file should be made executable. + +

    +
    integrity + +String; optional + +

    + +Expected checksum in Subresource Integrity format of the file downloaded. + +This must match the checksum of the file downloaded. _It is a security risk +to omit the checksum as remote files can change._ At best omitting this +field will make your build non-hermetic. It is optional to make development +easier but either this attribute or `sha256` should be set before shipping. + +

    +
    netrc + +String; optional + +

    + +Location of the .netrc file to use for authentication + +

    +
    sha256 + +String; optional + +

    + +The expected SHA-256 of the file downloaded. + +This must match the SHA-256 of the file downloaded. _It is a security risk +to omit the SHA-256 as remote files can change._ At best omitting this +field will make your build non-hermetic. It is optional to make development +easier but should be set before shipping. + +

    +
    url + +String; optional + +

    + +A URL to a file that will be made available to Bazel. + +This must be a file, http or https URL. Redirections are followed. +Authentication is not supported. + +More flexibility can be achieved by the urls parameter that allows +to specify alternative URLs to fetch from. + +

    +
    urls + +List of strings; optional + +

    + +A list of URLs to a file that will be made available to Bazel. + +Each entry must be a file, http or https URL. Redirections are followed. +Authentication is not supported. + +URLs are tried in order until one succeeds, so you should list local mirrors first. +If all downloads fail, the rule will fail. + +

    +
    + +**ENVIRONMENT VARIABLES** + +This repository rule depends on the following environment variables: + +* `BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID` + + + +## http_jar + +
    +load("@bazel//tools/build_defs/repo:http.bzl", "http_jar")
    +
    +http_jar(name, auth_patterns, canonical_id, downloaded_file_name, integrity, netrc, sha256, url,
    +         urls)
    +
    + +Downloads a jar from a URL and makes it available as java_import + +Downloaded files must have a .jar extension. + +Examples: + Suppose the current repository contains the source code for a chat program, rooted at the + directory `~/chat-app`. It needs to depend on an SSL library which is available from + `http://example.com/openssl-0.2.jar`. + + Targets in the `~/chat-app` repository can depend on this target if the following lines are + added to `~/chat-app/WORKSPACE`: + + ```python + load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar") + + http_jar( + name = "my_ssl", + url = "http://example.com/openssl-0.2.jar", + sha256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + ) + ``` + + Targets would specify `@my_ssl//jar` as a dependency to depend on this jar. + + You may also reference files on the current system (localhost) by using "file:///path/to/file" + if you are on Unix-based systems. If you're on Windows, use "file:///c:/path/to/file". In both + examples, note the three slashes (`/`) -- the first two slashes belong to `file://` and the third + one belongs to the absolute path to the file. + +**ATTRIBUTES** + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    name + +Name; required + +

    + +A unique name for this repository. + +

    +
    auth_patterns + +Dictionary: String -> String; optional + +

    + +An optional dict mapping host names to custom authorization patterns. + +If a URL's host name is present in this dict the value will be used as a pattern when +generating the authorization header for the http request. This enables the use of custom +authorization schemes used in a lot of common cloud storage providers. + +The pattern currently supports 2 tokens: <login> and +<password>, which are replaced with their equivalent value +in the netrc file for the same host name. After formatting, the result is set +as the value for the Authorization field of the HTTP request. + +Example attribute and netrc for a http download to an oauth2 enabled API using a bearer token: + +

    +auth_patterns = {
    +    "storage.cloudprovider.com": "Bearer <password>"
    +}
    +
    + +netrc: + +
    +machine storage.cloudprovider.com
    +        password RANDOM-TOKEN
    +
    + +The final HTTP request would have the following header: + +
    +Authorization: Bearer RANDOM-TOKEN
    +
    + +

    +
    canonical_id + +String; optional + +

    + +A canonical ID of the file downloaded. + +If specified and non-empty, Bazel will not take the file from cache, unless it +was added to the cache by a request with the same canonical ID. + +If unspecified or empty, Bazel by default uses the URLs of the file as the +canonical ID. This helps catch the common mistake of updating the URLs without +also updating the hash, resulting in builds that succeed locally but fail on +machines without the file in the cache. This behavior can be disabled with +--repo_env=BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID=0. + +

    +
    downloaded_file_name + +String; optional + +

    + +Filename assigned to the jar downloaded + +

    +
    integrity + +String; optional + +

    + +Expected checksum in Subresource Integrity format of the file downloaded. + +This must match the checksum of the file downloaded. _It is a security risk +to omit the checksum as remote files can change._ At best omitting this +field will make your build non-hermetic. It is optional to make development +easier but either this attribute or `sha256` should be set before shipping. + +

    +
    netrc + +String; optional + +

    + +Location of the .netrc file to use for authentication + +

    +
    sha256 + +String; optional + +

    + +The expected SHA-256 of the file downloaded. + +This must match the SHA-256 of the file downloaded. _It is a security risk +to omit the SHA-256 as remote files can change._ At best omitting this +field will make your build non-hermetic. It is optional to make development +easier but either this attribute or `integrity` should be set before shipping. + +

    +
    url + +String; optional + +

    + +A URL to a file that will be made available to Bazel. + +This must be a file, http or https URL. Redirections are followed. +Authentication is not supported. + +More flexibility can be achieved by the urls parameter that allows +to specify alternative URLs to fetch from. + +The URL must end in `.jar`. + +

    +
    urls + +List of strings; optional + +

    + +A list of URLs to a file that will be made available to Bazel. + +Each entry must be a file, http or https URL. Redirections are followed. +Authentication is not supported. + +URLs are tried in order until one succeeds, so you should list local mirrors first. +If all downloads fail, the rule will fail. + +All URLs must end in `.jar`. + +

    +
    + +**ENVIRONMENT VARIABLES** + +This repository rule depends on the following environment variables: + +* `BAZEL_HTTP_RULES_URLS_AS_DEFAULT_CANONICAL_ID` + diff --git a/rules/lib/repo/index.mdx b/rules/lib/repo/index.mdx index 35fb6154a..ab27e81ca 100644 --- a/rules/lib/repo/index.mdx +++ b/rules/lib/repo/index.mdx @@ -1,8 +1,8 @@ + --- title: 'Repository Rules' --- - * [Rules related to git](git) * [Rules related to http](http) * [Rules related to local directories](local) diff --git a/rules/lib/repo/local.mdx b/rules/lib/repo/local.mdx new file mode 100644 index 000000000..21ac0bf43 --- /dev/null +++ b/rules/lib/repo/local.mdx @@ -0,0 +1,166 @@ +--- +title: 'local repository rules' +--- + +The following functions can be loaded from +`@bazel_tools//tools/build_defs/repo:local.bzl`. + + +Rules for making directories in the local filesystem available as repos. + +### Setup + +To use these rules in a module extension, load them in your .bzl file and then call them from your +extension's implementation function. For example, to use `local_repository`: + +```python +load("@bazel_tools//tools/build_defs/repo:local.bzl", "local_repository") + +def _my_extension_impl(mctx): + local_repository(name = "foo", path = "foo") + +my_extension = module_extension(implementation = _my_extension_impl) +``` + +Alternatively, you can directly call these repo rules in your MODULE.bazel file with +`use_repo_rule`: + +```python +local_repository = use_repo_rule("@bazel_tools//tools/build_defs/repo:local.bzl", "local_repository") +local_repository(name = "foo", path = "foo") +``` + + + +## local_repository + +
    +load("@bazel//tools/build_defs/repo:local.bzl", "local_repository")
    +
    +local_repository(name, path)
    +
    + +Makes a local directory that already contains Bazel files available as a repo. This directory should contain Bazel BUILD files and a repo boundary file already. If it doesn't contain these files, consider using [`new_local_repository`](#new_local_repository) instead. + +**ATTRIBUTES** + + ++++ + + + + + + + + + + +
    name + +Name; required + +

    + +A unique name for this repository. + +

    +
    path + +String; required + +

    + +The path to the directory to make available as a repo. + +The path can be either absolute, or relative to the workspace root. + +

    +
    + + + +## new_local_repository + +
    +load("@bazel//tools/build_defs/repo:local.bzl", "new_local_repository")
    +
    +new_local_repository(name, build_file, build_file_content, path)
    +
    + +Makes a local directory that doesn't contain Bazel files available as a repo. This directory need not contain Bazel BUILD files or a repo boundary file; they will be created by this repo rule. If the directory already contains Bazel files, consider using [`local_repository`](#local_repository) instead. + +**ATTRIBUTES** + + ++++ + + + + + + + + + + + + + + + + + + +
    name + +Name; required + +

    + +A unique name for this repository. + +

    +
    build_file + +Label; optional + +

    + +A file to use as a BUILD file for this repo. + +Exactly one of `build_file` and `build_file_content` must be specified. + +The file addressed by this label does not need to be named BUILD, but can be. Something like `BUILD.new-repo-name` may work well to distinguish it from actual BUILD files. + +

    +
    build_file_content + +String; optional + +

    + +The content of the BUILD file to be created for this repo. + +Exactly one of `build_file` and `build_file_content` must be specified. + +

    +
    path + +String; required + +

    + +The path to the directory to make available as a repo. + +The path can be either absolute, or relative to the workspace root. + +

    +
    + diff --git a/rules/lib/repo/utils.mdx b/rules/lib/repo/utils.mdx new file mode 100644 index 000000000..536387aa6 --- /dev/null +++ b/rules/lib/repo/utils.mdx @@ -0,0 +1,727 @@ +--- +title: 'utils repository rules' +--- + +The following functions can be loaded from +`@bazel_tools//tools/build_defs/repo:utils.bzl`. + + +Utils for manipulating external repositories, once fetched. + +### Setup + +These utilities are intended to be used by other repository rules. They +can be loaded as follows. + +```python +load( + "@bazel_tools//tools/build_defs/repo:utils.bzl", + "workspace_and_buildfile", + "patch", + "update_attrs", +) +``` + + + +## download_remote_files + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "download_remote_files")
    +
    +download_remote_files(ctx, auth)
    +
    + +Utility function for downloading remote files. + +This rule is intended to be used in the implementation function of +a repository rule. It assumes the parameters `remote_file_urls` and +`remote_file_integrity` to be present in `ctx.attr`. + +Existing files will be overwritten. + +### Parameters + + ++++ + + + + + + + + + + +
    ctx + +required. + +

    + +The repository context of the repository rule calling this utility +function. + +

    +
    auth + +optional. +default is None + +

    + +An optional dict specifying authentication information for some of the URLs. + +

    +
    + +### Returns + +dict mapping file paths to a download info. + + + + +## get_auth + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "get_auth")
    +
    +get_auth(ctx, urls)
    +
    + +Utility function to obtain the correct auth dict for a list of urls from .netrc file. + +Support optional netrc and auth_patterns attributes if available. + +### Parameters + + ++++ + + + + + + + + + + +
    ctx + +required. + +

    + +The repository context of the repository rule calling this utility +function. + +

    +
    urls + +required. + +

    + +the list of urls to read + +

    +
    + +### Returns + +the auth dict which can be passed to repository_ctx.download + + + + +## maybe + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "maybe")
    +
    +maybe(repo_rule, name, **kwargs)
    +
    + +Utility function for only adding a repository if it's not already present. + +This is to implement safe repositories.bzl macro documented in +https://bazel.build/rules/deploying#dependencies. + +### Parameters + + ++++ + + + + + + + + + + + + + + +
    repo_rule + +required. + +

    + +repository rule function. + +

    +
    name + +required. + +

    + +name of the repository to create. + +

    +
    kwargs + +optional. + +

    + +remaining arguments that are passed to the repo_rule function. + +

    +
    + +### Returns + +Nothing, defines the repository when needed as a side-effect. + + + + +## parse_netrc + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "parse_netrc")
    +
    +parse_netrc(contents, filename)
    +
    + +Utility function to parse at least a basic .netrc file. + +### Parameters + + ++++ + + + + + + + + + + +
    contents + +required. + +

    + +input for the parser. + +

    +
    filename + +optional. +default is "a .netrc file" + +

    + +filename to use in error messages, if any. + +

    +
    + +### Returns + +dict mapping a machine names to a dict with the information provided +about them + + + + +## patch + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "patch")
    +
    +patch(ctx, patches, patch_cmds, patch_cmds_win, patch_tool, patch_args, auth)
    +
    + +Implementation of patching an already extracted repository. + +This rule is intended to be used in the implementation function of +a repository rule. If the parameters `patches`, `patch_tool`, +`patch_args`, `patch_cmds` and `patch_cmds_win` are not specified +then they are taken from `ctx.attr`. + +### Parameters + + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ctx + +required. + +

    + +The repository context of the repository rule calling this utility +function. + +

    +
    patches + +optional. +default is None + +

    + +The patch files to apply. List of strings, Labels, or paths. + +

    +
    patch_cmds + +optional. +default is None + +

    + +Bash commands to run for patching, passed one at a +time to bash -c. List of strings + +

    +
    patch_cmds_win + +optional. +default is None + +

    + +Powershell commands to run for patching, passed +one at a time to powershell /c. List of strings. If the +boolean value of this parameter is false, patch_cmds will be +used and this parameter will be ignored. + +

    +
    patch_tool + +optional. +default is None + +

    + +Path of the patch tool to execute for applying +patches. String. + +

    +
    patch_args + +optional. +default is None + +

    + +Arguments to pass to the patch tool. List of strings. + +

    +
    auth + +optional. +default is None + +

    + +An optional dict specifying authentication information for some of the URLs. + +

    +
    + +### Returns + +dict mapping remote patch URLs to a download info. + + + + +## read_netrc + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "read_netrc")
    +
    +read_netrc(ctx, filename)
    +
    + +Utility function to parse at least a basic .netrc file. + +### Parameters + + ++++ + + + + + + + + + + +
    ctx + +required. + +

    + +The repository context of the repository rule calling this utility +function. + +

    +
    filename + +required. + +

    + +the name of the .netrc file to read + +

    +
    + +### Returns + +dict mapping a machine names to a dict with the information provided +about them + + + + +## read_user_netrc + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "read_user_netrc")
    +
    +read_user_netrc(ctx)
    +
    + +Read user's default netrc file. + +### Parameters + + ++++ + + + + + + +
    ctx + +required. + +

    + +The repository context of the repository rule calling this utility function. + +

    +
    + +### Returns + +dict mapping a machine names to a dict with the information provided about them. + + + + +## symlink_files + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "symlink_files")
    +
    +symlink_files(ctx)
    +
    + +Utility function for symlinking local files. + +This is intended to be used in the implementation function of a repository rule. It assumes the +parameter `files` is present in `ctx.attr`. + +Existing files will be overwritten. + +### Parameters + + ++++ + + + + + + +
    + + + +## update_attrs + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "update_attrs")
    +
    +update_attrs(orig, keys, override)
    +
    + +Utility function for altering and adding the specified attributes to a particular repository rule invocation. + + This is used to make a rule reproducible. + +### Parameters + + ++++ + + + + + + + + + + + + + + +
    orig + +required. + +

    + +dict of actually set attributes (either explicitly or implicitly) +by a particular rule invocation + +

    +
    keys + +required. + +

    + +complete set of attributes defined on this rule + +

    +
    override + +required. + +

    + +dict of attributes to override or add to orig + +

    +
    + +### Returns + +dict of attributes with the keys from override inserted/updated + + + + +## use_netrc + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "use_netrc")
    +
    +use_netrc(netrc, urls, patterns)
    +
    + +Compute an auth dict from a parsed netrc file and a list of URLs. + +### Parameters + + ++++ + + + + + + + + + + + + + + +
    netrc + +required. + +

    + +a netrc file already parsed to a dict, e.g., as obtained from +read_netrc + +

    +
    urls + +required. + +

    + +a list of URLs. + +

    +
    patterns + +required. + +

    + +optional dict of url to authorization patterns + +

    +
    + +### Returns + +dict suitable as auth argument for ctx.download; more precisely, the dict +will map all URLs where the netrc file provides login and password to a +dict containing the corresponding login, password and optional authorization pattern, +as well as the mapping of "type" to "basic" or "pattern". + + + + +## workspace_and_buildfile + +
    +load("@bazel//tools/build_defs/repo:utils.bzl", "workspace_and_buildfile")
    +
    +workspace_and_buildfile(ctx)
    +
    + +Utility function for writing a BUILD file. + +This rule is intended to be used in the implementation function of a +repository rule. +It assumes the parameters `name`, `build_file`, and `build_file_content` to +be present in `ctx.attr`; the latter two possibly with value None. + +### Parameters + + ++++ + + + + + + +
    ctx + +required. + +

    + +The repository context of the repository rule calling this utility +function. + +

    +
    + diff --git a/rules/lib/toplevel.mdx b/rules/lib/toplevel.mdx index 6f3871050..98622e8be 100644 --- a/rules/lib/toplevel.mdx +++ b/rules/lib/toplevel.mdx @@ -2,17 +2,16 @@ title: 'Top-level Modules' --- - This section lists top-level modules. These symbols are available only in .bzl files. -- [apple\_common](/rules/lib/toplevel/apple_common) -- [attr](/rules/lib/toplevel/attr) -- [cc\_common](/rules/lib/toplevel/cc_common) -- [config](/rules/lib/toplevel/config) -- [config\_common](/rules/lib/toplevel/config_common) -- [coverage\_common](/rules/lib/toplevel/coverage_common) -- [java\_common](/rules/lib/toplevel/java_common) -- [native](/rules/lib/toplevel/native) -- [platform\_common](/rules/lib/toplevel/platform_common) -- [proto](/rules/lib/toplevel/proto) -- [testing](/rules/lib/toplevel/testing) +* [apple\_common](/rules/lib/toplevel/apple_common) +* [attr](/rules/lib/toplevel/attr) +* [cc\_common](/rules/lib/toplevel/cc_common) +* [config](/rules/lib/toplevel/config) +* [config\_common](/rules/lib/toplevel/config_common) +* [coverage\_common](/rules/lib/toplevel/coverage_common) +* [java\_common](/rules/lib/toplevel/java_common) +* [native](/rules/lib/toplevel/native) +* [platform\_common](/rules/lib/toplevel/platform_common) +* [proto](/rules/lib/toplevel/proto) +* [testing](/rules/lib/toplevel/testing) \ No newline at end of file diff --git a/rules/lib/toplevel/apple_common.mdx b/rules/lib/toplevel/apple_common.mdx index e953e505c..f220a6f1a 100644 --- a/rules/lib/toplevel/apple_common.mdx +++ b/rules/lib/toplevel/apple_common.mdx @@ -2,20 +2,18 @@ title: 'apple\_common' --- - - Functions for Starlark to access internals of the apple rule implementations. ## Members -- [apple\_host\_system\_env](#apple_host_system_env) -- [apple\_toolchain](#apple_toolchain) -- [dotted\_version](#dotted_version) -- [platform](#platform) -- [platform\_type](#platform_type) -- [target\_apple\_env](#target_apple_env) -- [XcodeProperties](#XcodeProperties) -- [XcodeVersionConfig](#XcodeVersionConfig) +* [apple\_host\_system\_env](#apple_host_system_env) +* [apple\_toolchain](#apple_toolchain) +* [dotted\_version](#dotted_version) +* [platform](#platform) +* [platform\_type](#platform_type) +* [target\_apple\_env](#target_apple_env) +* [XcodeProperties](#XcodeProperties) +* [XcodeVersionConfig](#XcodeVersionConfig) ## apple\_host\_system\_env @@ -23,16 +21,13 @@ Functions for Starlark to access internals of the apple rule implementations. dict apple_common.apple_host_system_env(xcode_config) ``` - Returns a [dict](../core/dict.html) of environment variables that should be set for actions that need to run build tools on an Apple host system, such as the version of Xcode that should be used. The keys are variable names and the values are their corresponding values. - +Returns a [dict](../core/dict) of environment variables that should be set for actions that need to run build tools on an Apple host system, such as the version of Xcode that should be used. The keys are variable names and the values are their corresponding values. ### Parameters -ParameterDescription`xcode_config` - required - - A provider containing information about the Xcode configuration. - +| Parameter | Description | +| --- | --- | +| `xcode_config` | required A provider containing information about the Xcode configuration. | ## apple\_toolchain @@ -40,9 +35,7 @@ ParameterDescription`xcode_config` unknown apple_common.apple_toolchain() ``` - Utilities for resolving items from the apple toolchain. - - +Utilities for resolving items from the apple toolchain. ## dotted\_version @@ -50,16 +43,13 @@ unknown apple_common.apple_toolchain() DottedVersion apple_common.dotted_version(version) ``` - Creates a new [DottedVersion](../builtins/DottedVersion.html) instance. - +Creates a new [DottedVersion](../builtins/DottedVersion) instance. ### Parameters -ParameterDescription`version`[string](../core/string.html); - required - - The string representation of the DottedVersion. - +| Parameter | Description | +| --- | --- | +| `version` | [string](../core/string); required The string representation of the DottedVersion. | ## platform @@ -67,21 +57,19 @@ ParameterDescription`version`[string](../core/string.html); struct apple_common.platform ``` - An enum-like struct that contains the following fields corresponding to Apple platforms: - -- `ios_device` -- `ios_simulator` -- `macos` -- `tvos_device` -- `tvos_simulator` -- `visionos_device` -- `visionos_simulator` -- `watchos_device` -- `watchos_simulator` - -These values can be passed to methods that expect a platform, like [XcodeVersionConfig.sdk\_version\_for\_platform](../providers/XcodeVersionConfig.html#sdk_version_for_platform). +An enum-like struct that contains the following fields corresponding to Apple platforms: +* `ios_device` +* `ios_simulator` +* `macos` +* `tvos_device` +* `tvos_simulator` +* `visionos_device` +* `visionos_simulator` +* `watchos_device` +* `watchos_simulator` +These values can be passed to methods that expect a platform, like [XcodeVersionConfig.sdk\_version\_for\_platform](../providers/XcodeVersionConfig#sdk_version_for_platform). ## platform\_type @@ -89,38 +77,30 @@ These values can be passed to methods that expect a platform, like [XcodeVersion struct apple_common.platform_type ``` - An enum-like struct that contains the following fields corresponding to Apple platform types: +An enum-like struct that contains the following fields corresponding to Apple platform types: -- `ios` -- `macos` -- `tvos` -- `visionos` -- `watchos` +* `ios` +* `macos` +* `tvos` +* `visionos` +* `watchos` These values can be passed to methods that expect a platform type. - - ## target\_apple\_env ``` dict apple_common.target_apple_env(xcode_config, platform) ``` - Returns a `dict` of environment variables that should be set for actions that build targets of the given Apple platform type. For example, this dictionary contains variables that denote the platform name and SDK version with which to build. The keys are variable names and the values are their corresponding values. - +Returns a `dict` of environment variables that should be set for actions that build targets of the given Apple platform type. For example, this dictionary contains variables that denote the platform name and SDK version with which to build. The keys are variable names and the values are their corresponding values. ### Parameters -ParameterDescription`xcode_config` - required - - A provider containing information about the Xcode configuration. - `platform` - required - - The apple platform. - +| Parameter | Description | +| --- | --- | +| `xcode_config` | required | +| `platform` | required | ## XcodeProperties @@ -128,14 +108,13 @@ ParameterDescription`xcode_config` Provider apple_common.XcodeProperties ``` - The constructor/key for the `XcodeVersionProperties` provider. +The constructor/key for the `XcodeVersionProperties` provider. If a target propagates the `XcodeVersionProperties` provider, use this as the key with which to retrieve it. Example: ``` dep = ctx.attr.deps[0] p = dep[apple_common.XcodeVersionProperties] - ``` ## XcodeVersionConfig @@ -144,4 +123,4 @@ p = dep[apple_common.XcodeVersionProperties] Provider apple_common.XcodeVersionConfig ``` - The constructor/key for the `XcodeVersionConfig` provider. +The constructor/key for the `XcodeVersionConfig` provider. \ No newline at end of file diff --git a/rules/lib/toplevel/attr.mdx b/rules/lib/toplevel/attr.mdx index 85cda01b0..3ff113c56 100644 --- a/rules/lib/toplevel/attr.mdx +++ b/rules/lib/toplevel/attr.mdx @@ -2,29 +2,27 @@ title: 'attr' --- - - -This is a top-level module for defining the attribute schemas of a rule or aspect. Each function returns an object representing the schema of a single attribute. These objects are used as the values of the `attrs` dictionary argument of [`rule()`](../globals/bzl.html#rule), [`aspect()`](../globals/bzl.html#aspect), [`repository_rule()`](../globals/bzl.html#repository_rule) and [`tag_class()`](../globals/bzl.html#tag_class). +This is a top-level module for defining the attribute schemas of a rule or aspect. Each function returns an object representing the schema of a single attribute. These objects are used as the values of the `attrs` dictionary argument of [`rule()`](../globals/bzl#rule), [`aspect()`](../globals/bzl#aspect), [`repository_rule()`](../globals/bzl#repository_rule) and [`tag_class()`](../globals/bzl#tag_class). See the Rules page for more on [defining](https://bazel.build/extending/rules#attributes) and [using](https://bazel.build/extending/rules#implementation_function) attributes. ## Members -- [bool](#bool) -- [int](#int) -- [int\_list](#int_list) -- [label](#label) -- [label\_keyed\_string\_dict](#label_keyed_string_dict) -- [label\_list](#label_list) -- [label\_list\_dict](#label_list_dict) -- [output](#output) -- [output\_list](#output_list) -- [string](#string) -- [string\_dict](#string_dict) -- [string\_keyed\_label\_dict](#string_keyed_label_dict) -- [string\_list](#string_list) -- [string\_list\_dict](#string_list_dict) +* [bool](#bool) +* [int](#int) +* [int\_list](#int_list) +* [label](#label) +* [label\_keyed\_string\_dict](#label_keyed_string_dict) +* [label\_list](#label_list) +* [label\_list\_dict](#label_list_dict) +* [output](#output) +* [output\_list](#output_list) +* [string](#string) +* [string\_dict](#string_dict) +* [string\_keyed\_label\_dict](#string_keyed_label_dict) +* [string\_list](#string_list) +* [string\_list\_dict](#string_list_dict) ## bool @@ -32,34 +30,16 @@ and [using](https://bazel.build/extending/rules#implementation_function) attribu Attribute attr.bool(*, configurable=unbound, default=False, doc=None, mandatory=False) ``` - Creates a schema for a boolean attribute. The corresponding [`ctx.attr`](../builtins/ctx.html#attr) attribute will be of type [`bool`](../core/bool.html). - +Creates a schema for a boolean attribute. The corresponding [`ctx.attr`](../builtins/ctx#attr) attribute will be of type [`bool`](../core/bool). ### Parameters -ParameterDescription`configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[bool](../core/bool.html); - default is `False` - - A default value to use if no value for this attribute is given when instantiating the rule. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - +| Parameter | Description | +| --- | --- | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [bool](../core/bool); default is `False` A default value to use if no value for this attribute is given when instantiating the rule. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | ## int @@ -67,38 +47,17 @@ For an attribute of a rule or aspect, `configurable` must be left unbound. Most Attribute attr.int(*, configurable=unbound, default=0, doc=None, mandatory=False, values=[]) ``` - Creates a schema for an integer attribute. The value must be in the signed 32-bit range. The corresponding [`ctx.attr`](../builtins/ctx.html#attr) attribute will be of type [`int`](../core/int.html). - +Creates a schema for an integer attribute. The value must be in the signed 32-bit range. The corresponding [`ctx.attr`](../builtins/ctx#attr) attribute will be of type [`int`](../core/int). ### Parameters -ParameterDescription`configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[int](../core/int.html); - default is `0` - - A default value to use if no value for this attribute is given when instantiating the rule. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `values`[sequence](../core/list.html) of [int](../core/int.html) s; - default is `[]` - - The list of allowed values for the attribute. An error is raised if any other value is given. - +| Parameter | Description | +| --- | --- | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [int](../core/int); default is `0` A default value to use if no value for this attribute is given when instantiating the rule. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `values` | [sequence](../core/list) of [int](../core/int)s; default is `[]` The list of allowed values for the attribute. An error is raised if any other value is given. | ## int\_list @@ -106,38 +65,17 @@ For an attribute of a rule or aspect, `configurable` must be left unbound. Most Attribute attr.int_list(mandatory=False, allow_empty=True, *, configurable=unbound, default=[], doc=None) ``` - Creates a schema for a list-of-integers attribute. Each element must be in the signed 32-bit range. - +Creates a schema for a list-of-integers attribute. Each element must be in the signed 32-bit range. ### Parameters -ParameterDescription`mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[sequence](../core/list.html) of [int](../core/int.html) s; - default is `[]` - - A default value to use if no value for this attribute is given when instantiating the rule. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - +| Parameter | Description | +| --- | --- | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [sequence](../core/list) of [int](../core/int)s; default is `[]` A default value to use if no value for this attribute is given when instantiating the rule. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | ## label @@ -147,88 +85,31 @@ Attribute attr.label(*, configurable=unbound, default=None, materializer=None, d Creates a schema for a label attribute. This is a dependency attribute. -This attribute contains unique [`Label`](../builtins/Label.html) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label.html#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +This attribute contains unique [`Label`](../builtins/Label) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. -At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target.html) s. This allows you to access the providers of the current target's dependencies. +At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target)s. This allows you to access the providers of the current target's dependencies. In addition to ordinary source files, this kind of attribute is often used to refer to a tool -- for example, a compiler. Such tools are considered to be dependencies, just like source files. To avoid requiring users to specify the tool's label every time they use the rule in their BUILD files, you can hard-code the label of a canonical tool as the `default` value of this attribute. If you also want to prevent users from overriding this default, you can make the attribute private by giving it a name that starts with an underscore. See the [Rules](https://bazel.build/extending/rules#private-attributes) page for more information. - ### Parameters -ParameterDescription`configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[Label](../builtins/Label.html); or [string](../core/string.html); or [LateBoundDefault](../builtins/LateBoundDefault.html); or NativeComputedDefault; or [function](../core/function.html); or `None`; - default is `None` - - A default value to use if no value for this attribute is given when instantiating the rule.Use a string or the [`Label`](../builtins/Label.html#Label) function to specify a default value, for example, `attr.label(default = "//a:b")`. - `materializer`[function](../core/function.html); - default is `None` - -**Experimental**. This parameter is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--experimental_dormant_deps` - -If set, the attribute materializes dormant dependencies from the transitive closure. The value of this parameter must be a functon that gets access to the values of the attributes of the rule that either are not dependencies or are marked as available for dependency resolution. It must return either a dormant dependency or a list of them depending on the type of the attribute - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `executable`[bool](../core/bool.html); - default is `False` - - True if the dependency has to be executable. This means the label must refer to an executable file, or to a rule that outputs an executable file. Access the label with `ctx.executable.`. - `allow_files`[bool](../core/bool.html); or [sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). - `allow_single_file` - default is `None` - - This is similar to `allow_files`, with the restriction that the label must correspond to a single [File](../builtins/File.html). Access it through `ctx.file.`. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `skip_validations`[bool](../core/bool.html); - default is `False` - - If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. - `providers`[sequence](../core/list.html); - default is `[]` - - The providers that must be given by any dependency appearing in this attribute. - -The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl.html#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. - - -`for_dependency_resolution` - default is `unbound` - - If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. - `allow_rules`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. - `cfg` - default is `None` - -[Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. This parameter is required if `executable` is True to guard against accidentally building host tools in the target configuration. `"target"` has no semantic effect, so don't set it when `executable` is False unless it really helps clarify your intentions. - `aspects`[sequence](../core/list.html) of [Aspect](../builtins/Aspect.html) s; - default is `[]` - - Aspects that should be applied to the dependency or dependencies specified by this attribute. - `flags`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Deprecated, will be removed. - +| Parameter | Description | +| --- | --- | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [Label](../builtins/Label); or [string](../core/string); or [LateBoundDefault](../builtins/LateBoundDefault); or NativeComputedDefault; or [function](../core/function); or `None`; default is `None` A default value to use if no value for this attribute is given when instantiating the rule.Use a string or the [`Label`](../builtins/Label#Label) function to specify a default value, for example, `attr.label(default = "//a:b")`. | +| `materializer` | [function](../core/function); default is `None` **Experimental**. This parameter is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--experimental_dormant_deps` If set, the attribute materializes dormant dependencies from the transitive closure. The value of this parameter must be a functon that gets access to the values of the attributes of the rule that either are not dependencies or are marked as available for dependency resolution. It must return either a dormant dependency or a list of them depending on the type of the attribute | +| `doc` | [string](../core/string); or `None`; default is `None` | +| `executable` | [bool](../core/bool); default is `False` True if the dependency has to be executable. This means the label must refer to an executable file, or to a rule that outputs an executable file. Access the label with `ctx.executable.`. | +| `allow_files` | [bool](../core/bool); or [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). | +| `allow_single_file` | default is `None` This is similar to `allow_files`, with the restriction that the label must correspond to a single [File](../builtins/File). Access it through `ctx.file.`. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `skip_validations` | [bool](../core/bool); default is `False` If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. | +| `providers` | [sequence](../core/list); default is `[]` The providers that must be given by any dependency appearing in this attribute. The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. | +| `for_dependency_resolution` | default is `unbound` If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. | +| `allow_rules` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. | +| `cfg` | default is `None` [Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. This parameter is required if `executable` is True to guard against accidentally building host tools in the target configuration. `"target"` has no semantic effect, so don't set it when `executable` is False unless it really helps clarify your intentions. | +| `aspects` | [sequence](../core/list) of [Aspect](../builtins/Aspect)s; default is `[]` Aspects that should be applied to the dependency or dependencies specified by this attribute. | +| `flags` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Deprecated, will be removed. | ## label\_keyed\_string\_dict @@ -238,76 +119,27 @@ Attribute attr.label_keyed_string_dict(allow_empty=True, *, configurable=unbound Creates a schema for an attribute holding a dictionary, where the keys are labels and the values are strings. This is a dependency attribute. -This attribute contains unique [`Label`](../builtins/Label.html) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label.html#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. - -At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target.html) s. This allows you to access the providers of the current target's dependencies. +This attribute contains unique [`Label`](../builtins/Label) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target)s. This allows you to access the providers of the current target's dependencies. ### Parameters -ParameterDescription`allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[dict](../core/dict.html); or [function](../core/function.html); - default is `{}` - - A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label.html#Label) function to specify default values, for example, `attr.label_keyed_string_dict(default = {"//a:b": "value", "//a:c": "string"})`. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `allow_files`[bool](../core/bool.html); or [sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). - `allow_rules`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. - `providers`[sequence](../core/list.html); - default is `[]` - - The providers that must be given by any dependency appearing in this attribute. - -The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl.html#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. - - -`for_dependency_resolution` - default is `unbound` - - If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. - `flags`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Deprecated, will be removed. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `skip_validations`[bool](../core/bool.html); - default is `False` - - If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. - `cfg` - default is `None` - -[Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. - `aspects`[sequence](../core/list.html) of [Aspect](../builtins/Aspect.html) s; - default is `[]` - - Aspects that should be applied to the dependency or dependencies specified by this attribute. - +| Parameter | Description | +| --- | --- | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [dict](../core/dict); or [function](../core/function); default is `{}` A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label#Label) function to specify default values, for example, `attr.label_keyed_string_dict(default = {"//a:b": "value", "//a:c": "string"})`. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `allow_files` | [bool](../core/bool); or [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). | +| `allow_rules` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. | +| `providers` | [sequence](../core/list); default is `[]` The providers that must be given by any dependency appearing in this attribute. The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. | +| `for_dependency_resolution` | default is `unbound` If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. | +| `flags` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Deprecated, will be removed. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `skip_validations` | [bool](../core/bool); default is `False` If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. | +| `cfg` | default is `None` [Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. | +| `aspects` | [sequence](../core/list) of [Aspect](../builtins/Aspect)s; default is `[]` Aspects that should be applied to the dependency or dependencies specified by this attribute. | ## label\_list @@ -315,84 +147,30 @@ The format of this argument is a list of lists of providers -- `*Info` objects r Attribute attr.label_list(allow_empty=True, *, configurable=unbound, default=[], materializer=None, doc=None, allow_files=None, allow_rules=None, providers=[], for_dependency_resolution=unbound, flags=[], mandatory=False, skip_validations=False, cfg=None, aspects=[]) ``` -Creates a schema for a list-of-labels attribute. This is a dependency attribute. The corresponding [`ctx.attr`](../builtins/ctx.html#attr) attribute will be of type [list](../core/list.html) of [`Target` s](../builtins/Target.html). - -This attribute contains unique [`Label`](../builtins/Label.html) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label.html#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +Creates a schema for a list-of-labels attribute. This is a dependency attribute. The corresponding [`ctx.attr`](../builtins/ctx#attr) attribute will be of type [list](../core/list) of [`Target`s](../builtins/Target). -At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target.html) s. This allows you to access the providers of the current target's dependencies. +This attribute contains unique [`Label`](../builtins/Label) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target)s. This allows you to access the providers of the current target's dependencies. ### Parameters -ParameterDescription`allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[sequence](../core/list.html) of [Label](../builtins/Label.html) s; or [function](../core/function.html); - default is `[]` - - A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label.html#Label) function to specify default values, for example, `attr.label_list(default = ["//a:b", "//a:c"])`. - `materializer`[function](../core/function.html); - default is `None` - -**Experimental**. This parameter is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--experimental_dormant_deps` - -If set, the attribute materializes dormant dependencies from the transitive closure. The value of this parameter must be a functon that gets access to the values of the attributes of the rule that either are not dependencies or are marked as available for dependency resolution. It must return either a dormant dependency or a list of them depending on the type of the attribute - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `allow_files`[bool](../core/bool.html); or [sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). - `allow_rules`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. - `providers`[sequence](../core/list.html); - default is `[]` - - The providers that must be given by any dependency appearing in this attribute. - -The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl.html#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. - - -`for_dependency_resolution` - default is `unbound` - - If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. - `flags`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Deprecated, will be removed. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `skip_validations`[bool](../core/bool.html); - default is `False` - - If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. - `cfg` - default is `None` - -[Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. - `aspects`[sequence](../core/list.html) of [Aspect](../builtins/Aspect.html) s; - default is `[]` - - Aspects that should be applied to the dependency or dependencies specified by this attribute. - +| Parameter | Description | +| --- | --- | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [sequence](../core/list) of [Label](../builtins/Label)s; or [function](../core/function); default is `[]` A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label#Label) function to specify default values, for example, `attr.label_list(default = ["//a:b", "//a:c"])`. | +| `materializer` | [function](../core/function); default is `None` **Experimental**. This parameter is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--experimental_dormant_deps` If set, the attribute materializes dormant dependencies from the transitive closure. The value of this parameter must be a functon that gets access to the values of the attributes of the rule that either are not dependencies or are marked as available for dependency resolution. It must return either a dormant dependency or a list of them depending on the type of the attribute | +| `doc` | [string](../core/string); or `None`; default is `None` | +| `allow_files` | [bool](../core/bool); or [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). | +| `allow_rules` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. | +| `providers` | [sequence](../core/list); default is `[]` The providers that must be given by any dependency appearing in this attribute. The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. | +| `for_dependency_resolution` | default is `unbound` If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. | +| `flags` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Deprecated, will be removed. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `skip_validations` | [bool](../core/bool); default is `False` If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. | +| `cfg` | default is `None` [Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. | +| `aspects` | [sequence](../core/list) of [Aspect](../builtins/Aspect)s; default is `[]` Aspects that should be applied to the dependency or dependencies specified by this attribute. | ## label\_list\_dict @@ -402,78 +180,27 @@ Attribute attr.label_list_dict(allow_empty=True, *, configurable=unbound, defaul Creates a schema for an attribute holding a dictionary, where the keys are strings and the values are list of labels. This is a dependency attribute. -This attribute contains unique [`Label`](../builtins/Label.html) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label.html#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. - -At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target.html) s. This allows you to access the providers of the current target's dependencies. +This attribute contains unique [`Label`](../builtins/Label) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target)s. This allows you to access the providers of the current target's dependencies. ### Parameters -ParameterDescription`allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[dict](../core/dict.html); - default is `{}` - - A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label.html#Label) function to specify default values, for example, -`attr.label_list_dict(default = {"key1": ["//a:b", "//a:c"], "key2": -[Label("@my_repo//d:e")]})`. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `allow_files`[bool](../core/bool.html); or [sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). - `allow_rules`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. - `providers`[sequence](../core/list.html); - default is `[]` - - The providers that must be given by any dependency appearing in this attribute. - -The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl.html#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. - - -`for_dependency_resolution` - default is `unbound` - - If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. - `flags`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Deprecated, will be removed. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `skip_validations`[bool](../core/bool.html); - default is `False` - - If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. - `cfg` - default is `None` - -[Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. - `aspects`[sequence](../core/list.html) of [Aspect](../builtins/Aspect.html) s; - default is `[]` - - Aspects that should be applied to the dependency or dependencies specified by this attribute. - +| Parameter | Description | +| --- | --- | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [dict](../core/dict); default is `{}` A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label#Label) function to specify default values, for example, `attr.label_list_dict(default = {"key1": ["//a:b", "//a:c"], "key2": [Label("@my_repo//d:e")]})`. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `allow_files` | [bool](../core/bool); or [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). | +| `allow_rules` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. | +| `providers` | [sequence](../core/list); default is `[]` The providers that must be given by any dependency appearing in this attribute. The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. | +| `for_dependency_resolution` | default is `unbound` If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. | +| `flags` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Deprecated, will be removed. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `skip_validations` | [bool](../core/bool); default is `False` If true, validation actions of transitive dependencies from this attribute will not run. This is a temporary mitigation and WILL be removed in the future. | +| `cfg` | default is `None` [Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. | +| `aspects` | [sequence](../core/list) of [Aspect](../builtins/Aspect)s; default is `[]` Aspects that should be applied to the dependency or dependencies specified by this attribute. | ## output @@ -483,22 +210,16 @@ Attribute attr.output(*, doc=None, mandatory=False) Creates a schema for an output (label) attribute. -This attribute contains unique [`Label`](../builtins/Label.html) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label.html#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. - -At analysis time, the corresponding [`File`](../builtins/File.html) can be retrieved using [`ctx.outputs`](../builtins/ctx.html#outputs). +This attribute contains unique [`Label`](../builtins/Label) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +At analysis time, the corresponding [`File`](../builtins/File) can be retrieved using [`ctx.outputs`](../builtins/ctx#outputs). ### Parameters -ParameterDescription`doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - +| Parameter | Description | +| --- | --- | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | ## output\_list @@ -506,28 +227,19 @@ ParameterDescription`doc`[string](../core/string.html); or `None`; Attribute attr.output_list(allow_empty=True, *, doc=None, mandatory=False) ``` - Creates a schema for a list-of-outputs attribute. - -This attribute contains unique [`Label`](../builtins/Label.html) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label.html#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +Creates a schema for a list-of-outputs attribute. -At analysis time, the corresponding [`File`](../builtins/File.html) can be retrieved using [`ctx.outputs`](../builtins/ctx.html#outputs). +This attribute contains unique [`Label`](../builtins/Label) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +At analysis time, the corresponding [`File`](../builtins/File) can be retrieved using [`ctx.outputs`](../builtins/ctx#outputs). ### Parameters -ParameterDescription`allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - +| Parameter | Description | +| --- | --- | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | ## string @@ -535,38 +247,17 @@ ParameterDescription`allow_empty`[bool](../core/bool.html); Attribute attr.string(*, configurable=unbound, default='', doc=None, mandatory=False, values=[]) ``` - Creates a schema for a [string](../core/string.html#attr) attribute. - +Creates a schema for a [string](../core/string#attr) attribute. ### Parameters -ParameterDescription`configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[string](../core/string.html); or NativeComputedDefault; - default is `''` - - A default value to use if no value for this attribute is given when instantiating the rule. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `values`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - The list of allowed values for the attribute. An error is raised if any other value is given. - +| Parameter | Description | +| --- | --- | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [string](../core/string); or NativeComputedDefault; default is `''` A default value to use if no value for this attribute is given when instantiating the rule. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `values` | [sequence](../core/list) of [string](../core/string)s; default is `[]` The list of allowed values for the attribute. An error is raised if any other value is given. | ## string\_dict @@ -574,38 +265,17 @@ For an attribute of a rule or aspect, `configurable` must be left unbound. Most Attribute attr.string_dict(allow_empty=True, *, configurable=unbound, default={}, doc=None, mandatory=False) ``` - Creates a schema for an attribute holding a dictionary, where the keys and values are strings. - +Creates a schema for an attribute holding a dictionary, where the keys and values are strings. ### Parameters -ParameterDescription`allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[dict](../core/dict.html); - default is `{}` - - A default value to use if no value for this attribute is given when instantiating the rule. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - +| Parameter | Description | +| --- | --- | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [dict](../core/dict); default is `{}` A default value to use if no value for this attribute is given when instantiating the rule. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | ## string\_keyed\_label\_dict @@ -615,72 +285,26 @@ Attribute attr.string_keyed_label_dict(allow_empty=True, *, configurable=unbound Creates a schema for an attribute whose value is a dictionary where the keys are strings and the values are labels. This is a dependency attribute. -This attribute contains unique [`Label`](../builtins/Label.html) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label.html#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. - -At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target.html) s. This allows you to access the providers of the current target's dependencies. +This attribute contains unique [`Label`](../builtins/Label) values. If a string is supplied in place of a `Label`, it will be converted using the [label constructor](../builtins/Label#Label). The relative parts of the label path, including the (possibly renamed) repository, are resolved with respect to the instantiated target's package. +At analysis time (within the rule's implementation function), when retrieving the attribute value from `ctx.attr`, labels are replaced by the corresponding [`Target`](../builtins/Target)s. This allows you to access the providers of the current target's dependencies. ### Parameters -ParameterDescription`allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[dict](../core/dict.html); or [function](../core/function.html); - default is `{}` - - A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label.html#Label) function to specify default values, for example, `attr.string_keyed_label_dict(default = {"foo": "//a:b", "bar": "//a:c"})`. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `allow_files`[bool](../core/bool.html); or [sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). - `allow_rules`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. - `providers`[sequence](../core/list.html); - default is `[]` - - The providers that must be given by any dependency appearing in this attribute. - -The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl.html#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. - - -`for_dependency_resolution` - default is `unbound` - - If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. - `flags`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Deprecated, will be removed. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `cfg` - default is `None` - -[Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. - `aspects`[sequence](../core/list.html) of [Aspect](../builtins/Aspect.html) s; - default is `[]` - - Aspects that should be applied to the dependency or dependencies specified by this attribute. - +| Parameter | Description | +| --- | --- | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [dict](../core/dict); or [function](../core/function); default is `{}` A default value to use if no value for this attribute is given when instantiating the rule.Use strings or the [`Label`](../builtins/Label#Label) function to specify default values, for example, `attr.string_keyed_label_dict(default = {"foo": "//a:b", "bar": "//a:c"})`. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `allow_files` | [bool](../core/bool); or [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Whether `File` targets are allowed. Can be `True`, `False` (default), or a list of file extensions that are allowed (for example, `[".cc", ".cpp"]`). | +| `allow_rules` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Which rule targets (name of the classes) are allowed. This is deprecated (kept only for compatibility), use providers instead. | +| `providers` | [sequence](../core/list); default is `[]` The providers that must be given by any dependency appearing in this attribute. The format of this argument is a list of lists of providers -- `*Info` objects returned by [`provider()`](../globals/bzl#provider) (or in the case of a legacy provider, its string name). The dependency must return ALL providers mentioned in at least ONE of the inner lists. As a convenience, this argument may also be a single-level list of providers, in which case it is wrapped in an outer list with one element (i.e. `[A, B]` means `[[A, B]]`). It is NOT required that the rule of the dependency advertises those providers in its `provides` parameter, however, it is considered best practice. | +| `for_dependency_resolution` | default is `unbound` If this is set, the attribute is available for materializers. Only rules marked with the flag of the same name are allowed to be referenced through such attributes. | +| `flags` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Deprecated, will be removed. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `cfg` | default is `None` [Configuration](https://bazel.build/extending/rules#configurations) of the attribute. It can be either `"exec"`, which indicates that the dependency is built for the `execution platform`, or `"target"`, which indicates that the dependency is build for the `target platform`. A typical example of the difference is when building mobile apps, where the `target platform` is `Android` or `iOS` while the `execution platform` is `Linux`, `macOS`, or `Windows`. | +| `aspects` | [sequence](../core/list) of [Aspect](../builtins/Aspect)s; default is `[]` Aspects that should be applied to the dependency or dependencies specified by this attribute. | ## string\_list @@ -688,38 +312,17 @@ The format of this argument is a list of lists of providers -- `*Info` objects r Attribute attr.string_list(mandatory=False, allow_empty=True, *, configurable=unbound, default=[], doc=None) ``` - Creates a schema for a list-of-strings attribute. - +Creates a schema for a list-of-strings attribute. ### Parameters -ParameterDescription`mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). - `allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[sequence](../core/list.html) of [string](../core/string.html) s; or NativeComputedDefault; - default is `[]` - - A default value to use if no value for this attribute is given when instantiating the rule. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - +| Parameter | Description | +| --- | --- | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [sequence](../core/list) of [string](../core/string)s; or NativeComputedDefault; default is `[]` A default value to use if no value for this attribute is given when instantiating the rule. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | ## string\_list\_dict @@ -727,34 +330,14 @@ For an attribute of a rule or aspect, `configurable` must be left unbound. Most Attribute attr.string_list_dict(allow_empty=True, *, configurable=unbound, default={}, doc=None, mandatory=False) ``` - Creates a schema for an attribute holding a dictionary, where the keys are strings and the values are lists of strings. - +Creates a schema for an attribute holding a dictionary, where the keys are strings and the values are lists of strings. ### Parameters -ParameterDescription`allow_empty`[bool](../core/bool.html); - default is `True` - - True if the attribute can be empty. - `configurable`[bool](../core/bool.html); or unbound; - default is `unbound` - - This argument can only be specified for an attribute of a symbolic macro. - -If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. - -For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. - - -`default`[dict](../core/dict.html); - default is `{}` - - A default value to use if no value for this attribute is given when instantiating the rule. - `doc`[string](../core/string.html); or `None`; - default is `None` - - A description of the attribute that can be extracted by documentation generating tools. - `mandatory`[bool](../core/bool.html); - default is `False` - - If true, the value must be specified explicitly (even if it has a `default`). +| Parameter | Description | +| --- | --- | +| `allow_empty` | [bool](../core/bool); default is `True` True if the attribute can be empty. | +| `configurable` | [bool](../core/bool); or unbound; default is `unbound` This argument can only be specified for an attribute of a symbolic macro. If `configurable` is explicitly set to `False`, the symbolic macro attribute is non-configurable - in other words, it cannot take a `select()` value. If the `configurable` is either unbound or explicitly set to `True`, the attribute is configurable and can take a `select()` value. For an attribute of a rule or aspect, `configurable` must be left unbound. Most Starlark rule attributes are always configurable, with the exception of `attr.output()`, `attr.output_list()`, and `attr.license()` rule attributes, which are always non-configurable. | +| `default` | [dict](../core/dict); default is `{}` A default value to use if no value for this attribute is given when instantiating the rule. | +| `doc` | [string](../core/string); or `None`; default is `None` A description of the attribute that can be extracted by documentation generating tools. | +| `mandatory` | [bool](../core/bool); default is `False` If true, the value must be specified explicitly (even if it has a `default`). | \ No newline at end of file diff --git a/rules/lib/toplevel/cc_common.mdx b/rules/lib/toplevel/cc_common.mdx index 3972082e1..070aa2e70 100644 --- a/rules/lib/toplevel/cc_common.mdx +++ b/rules/lib/toplevel/cc_common.mdx @@ -2,36 +2,34 @@ title: 'cc\_common' --- - - Utilities for C++ compilation, linking, and command line generation. ## Members -- [action\_is\_enabled](#action_is_enabled) -- [CcToolchainInfo](#CcToolchainInfo) -- [compile](#compile) -- [configure\_features](#configure_features) -- [create\_cc\_toolchain\_config\_info](#create_cc_toolchain_config_info) -- [create\_compilation\_context](#create_compilation_context) -- [create\_compilation\_outputs](#create_compilation_outputs) -- [create\_compile\_variables](#create_compile_variables) -- [create\_library\_to\_link](#create_library_to_link) -- [create\_link\_variables](#create_link_variables) -- [create\_linker\_input](#create_linker_input) -- [create\_linking\_context](#create_linking_context) -- [create\_linking\_context\_from\_compilation\_outputs](#create_linking_context_from_compilation_outputs) -- [create\_lto\_compilation\_context](#create_lto_compilation_context) -- [do\_not\_use\_tools\_cpp\_compiler\_present](#do_not_use_tools_cpp_compiler_present) -- [get\_environment\_variables](#get_environment_variables) -- [get\_execution\_requirements](#get_execution_requirements) -- [get\_memory\_inefficient\_command\_line](#get_memory_inefficient_command_line) -- [get\_tool\_for\_action](#get_tool_for_action) -- [is\_enabled](#is_enabled) -- [link](#link) -- [merge\_cc\_infos](#merge_cc_infos) -- [merge\_compilation\_contexts](#merge_compilation_contexts) -- [merge\_compilation\_outputs](#merge_compilation_outputs) +* [action\_is\_enabled](#action_is_enabled) +* [CcToolchainInfo](#CcToolchainInfo) +* [compile](#compile) +* [configure\_features](#configure_features) +* [create\_cc\_toolchain\_config\_info](#create_cc_toolchain_config_info) +* [create\_compilation\_context](#create_compilation_context) +* [create\_compilation\_outputs](#create_compilation_outputs) +* [create\_compile\_variables](#create_compile_variables) +* [create\_library\_to\_link](#create_library_to_link) +* [create\_link\_variables](#create_link_variables) +* [create\_linker\_input](#create_linker_input) +* [create\_linking\_context](#create_linking_context) +* [create\_linking\_context\_from\_compilation\_outputs](#create_linking_context_from_compilation_outputs) +* [create\_lto\_compilation\_context](#create_lto_compilation_context) +* [do\_not\_use\_tools\_cpp\_compiler\_present](#do_not_use_tools_cpp_compiler_present) +* [get\_environment\_variables](#get_environment_variables) +* [get\_execution\_requirements](#get_execution_requirements) +* [get\_memory\_inefficient\_command\_line](#get_memory_inefficient_command_line) +* [get\_tool\_for\_action](#get_tool_for_action) +* [is\_enabled](#is_enabled) +* [link](#link) +* [merge\_cc\_infos](#merge_cc_infos) +* [merge\_compilation\_contexts](#merge_compilation_contexts) +* [merge\_compilation\_outputs](#merge_compilation_outputs) ## action\_is\_enabled @@ -39,20 +37,14 @@ Utilities for C++ compilation, linking, and command line generation. bool cc_common.action_is_enabled(*, feature_configuration, action_name) ``` - Returns True if given action\_config is enabled in the feature configuration. - +Returns True if given action\_config is enabled in the feature configuration. ### Parameters -ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `action_name`[string](../core/string.html); - required - - Name of the action\_config. - +| Parameter | Description | +| --- | --- | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `action_name` | [string](../core/string); required Name of the action\_config. | ## CcToolchainInfo @@ -60,9 +52,7 @@ ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/Fe Provider cc_common.CcToolchainInfo ``` - The key used to retrieve the provider that contains information about the C++ toolchain being used - - +The key used to retrieve the provider that contains information about the C++ toolchain being used ## compile @@ -70,105 +60,35 @@ Provider cc_common.CcToolchainInfo tuple cc_common.compile(*, actions, feature_configuration, cc_toolchain, srcs=[], public_hdrs=[], private_hdrs=[], includes=[], quote_includes=[], system_includes=[], framework_includes=[], defines=[], local_defines=[], include_prefix='', strip_include_prefix='', user_compile_flags=[], conly_flags=[], cxx_flags=[], compilation_contexts=[], name, disallow_pic_outputs=False, disallow_nopic_outputs=False, additional_inputs=[], module_interfaces=unbound) ``` - Should be used for C++ compilation. Returns tuple of ( `CompilationContext`, `CcCompilationOutputs`). - +Should be used for C++ compilation. Returns tuple of (`CompilationContext`, `CcCompilationOutputs`). ### Parameters -ParameterDescription`actions`[actions](../builtins/actions.html); - required - -`actions` object. - `feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - -`feature_configuration` to be queried. - `cc_toolchain` - Info; - required - -`CcToolchainInfo` provider to be used. - `srcs`[sequence](../core/list.html); - default is `[]` - - The list of source files to be compiled. - `public_hdrs`[sequence](../core/list.html); - default is `[]` - - List of headers needed for compilation of srcs and may be included by dependent rules transitively. - `private_hdrs`[sequence](../core/list.html); - default is `[]` - - List of headers needed for compilation of srcs and NOT to be included by dependent rules. - `includes`[sequence](../core/list.html); or [depset](../builtins/depset.html); - default is `[]` - - Search paths for header files referenced both by angle bracket and quotes. Usually passed with -I. Propagated to dependents transitively. - `quote_includes`[sequence](../core/list.html); - default is `[]` - - Search paths for header files referenced by quotes, e.g. #include "foo/bar/header.h". They can be either relative to the exec root or absolute. Usually passed with -iquote. Propagated to dependents transitively. - `system_includes`[sequence](../core/list.html); - default is `[]` - - Search paths for header files referenced by angle brackets, e.g. #include <foo/bar/header.h>. They can be either relative to the exec root or absolute. Usually passed with -isystem. Propagated to dependents transitively. - `framework_includes`[sequence](../core/list.html); - default is `[]` - - Search paths for header files from Apple frameworks. They can be either relative to the exec root or absolute. Usually passed with -F. Propagated to dependents transitively. - `defines`[sequence](../core/list.html); - default is `[]` - - Set of defines needed to compile this target. Each define is a string. Propagated to dependents transitively. - `local_defines`[sequence](../core/list.html); - default is `[]` - - Set of defines needed to compile this target. Each define is a string. Not propagated to dependents transitively. - `include_prefix`[string](../core/string.html); - default is `''` - - The prefix to add to the paths of the headers of this rule. When set, the headers in the hdrs attribute of this rule are accessible at is the value of this attribute prepended to their repository-relative path. The prefix in the strip\_include\_prefix attribute is removed before this prefix is added. - `strip_include_prefix`[string](../core/string.html); - default is `''` - - The prefix to strip from the paths of the headers of this rule. When set, the headers in the hdrs attribute of this rule are accessible at their path with this prefix cut off. If it's a relative path, it's taken as a package-relative one. If it's an absolute one, it's understood as a repository-relative path. The prefix in the include\_prefix attribute is added after this prefix is stripped. - `user_compile_flags`[sequence](../core/list.html); - default is `[]` - - Additional list of compilation options. - `conly_flags`[sequence](../core/list.html); - default is `[]` - - Additional list of compilation options for C compiles. - `cxx_flags`[sequence](../core/list.html); - default is `[]` - - Additional list of compilation options for C++ compiles. - `compilation_contexts`[sequence](../core/list.html); - default is `[]` - - Headers from dependencies used for compilation. - `name`[string](../core/string.html); - required - - This is used for naming the output artifacts of actions created by this method. See also the \`main\_output\` arg. - `disallow_pic_outputs`[bool](../core/bool.html); - default is `False` - - Whether PIC outputs should be created. - `disallow_nopic_outputs`[bool](../core/bool.html); - default is `False` - - Whether NOPIC outputs should be created. - `additional_inputs`[sequence](../core/list.html); - default is `[]` - - List of additional files needed for compilation of srcs - `module_interfaces`[sequence](../core/list.html); - default is `unbound` - - The list of module interfaces source files to be compiled. Note: this is an experimental feature, only enabled with --experimental\_cpp\_modules - +| Parameter | Description | +| --- | --- | +| `actions` | [actions](../builtins/actions); required `actions` object. | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required `feature_configuration` to be queried. | +| `cc_toolchain` | Info; required `CcToolchainInfo` provider to be used. | +| `srcs` | [sequence](../core/list); default is `[]` The list of source files to be compiled. | +| `public_hdrs` | [sequence](../core/list); default is `[]` List of headers needed for compilation of srcs and may be included by dependent rules transitively. | +| `private_hdrs` | [sequence](../core/list); default is `[]` List of headers needed for compilation of srcs and NOT to be included by dependent rules. | +| `includes` | [sequence](../core/list); or [depset](../builtins/depset); default is `[]` Search paths for header files referenced both by angle bracket and quotes. Usually passed with -I. Propagated to dependents transitively. | +| `quote_includes` | [sequence](../core/list); default is `[]` Search paths for header files referenced by quotes, e.g. #include "foo/bar/header.h". They can be either relative to the exec root or absolute. Usually passed with -iquote. Propagated to dependents transitively. | +| `system_includes` | [sequence](../core/list); default is `[]` Search paths for header files referenced by angle brackets, e.g. #include . They can be either relative to the exec root or absolute. Usually passed with -isystem. Propagated to dependents transitively. | +| `framework_includes` | [sequence](../core/list); default is `[]` Search paths for header files from Apple frameworks. They can be either relative to the exec root or absolute. Usually passed with -F. Propagated to dependents transitively. | +| `defines` | [sequence](../core/list); default is `[]` Set of defines needed to compile this target. Each define is a string. Propagated to dependents transitively. | +| `local_defines` | [sequence](../core/list); default is `[]` Set of defines needed to compile this target. Each define is a string. Not propagated to dependents transitively. | +| `include_prefix` | [string](../core/string); default is `''` The prefix to add to the paths of the headers of this rule. When set, the headers in the hdrs attribute of this rule are accessible at is the value of this attribute prepended to their repository-relative path. The prefix in the strip\_include\_prefix attribute is removed before this prefix is added. | +| `strip_include_prefix` | [string](../core/string); default is `''` The prefix to strip from the paths of the headers of this rule. When set, the headers in the hdrs attribute of this rule are accessible at their path with this prefix cut off. If it's a relative path, it's taken as a package-relative one. If it's an absolute one, it's understood as a repository-relative path. The prefix in the include\_prefix attribute is added after this prefix is stripped. | +| `user_compile_flags` | [sequence](../core/list); default is `[]` Additional list of compilation options. | +| `conly_flags` | [sequence](../core/list); default is `[]` Additional list of compilation options for C compiles. | +| `cxx_flags` | [sequence](../core/list); default is `[]` Additional list of compilation options for C++ compiles. | +| `compilation_contexts` | [sequence](../core/list); default is `[]` Headers from dependencies used for compilation. | +| `name` | [string](../core/string); required This is used for naming the output artifacts of actions created by this method. See also the `main\_output` arg. | +| `disallow_pic_outputs` | [bool](../core/bool); default is `False` Whether PIC outputs should be created. | +| `disallow_nopic_outputs` | [bool](../core/bool); default is `False` Whether NOPIC outputs should be created. | +| `additional_inputs` | [sequence](../core/list); default is `[]` List of additional files needed for compilation of srcs | +| `module_interfaces` | [sequence](../core/list); default is `unbound` The list of module interfaces source files to be compiled. Note: this is an experimental feature, only enabled with --experimental\_cpp\_modules | ## configure\_features @@ -176,33 +96,17 @@ ParameterDescription`actions`[actions](../builtins/actions.html); FeatureConfiguration cc_common.configure_features(*, ctx, cc_toolchain, language=None, requested_features=[], unsupported_features=[]) ``` - Creates a feature\_configuration instance. Requires the cpp configuration fragment. - +Creates a feature\_configuration instance. Requires the cpp configuration fragment. ### Parameters -ParameterDescription`ctx`[ctx](../builtins/ctx.html); - required - - The rule context. - `cc_toolchain` - Info; - required - - cc\_toolchain for which we configure features. - `language`[string](../core/string.html); or `None`; - default is `None` - - The language to configure for: either c++ or objc (default c++) - `requested_features`[sequence](../core/list.html); - default is `[]` - - List of features to be enabled. - `unsupported_features`[sequence](../core/list.html); - default is `[]` - - List of features that are unsupported by the current rule. - +| Parameter | Description | +| --- | --- | +| `ctx` | [ctx](../builtins/ctx); required The rule context. | +| `cc_toolchain` | Info; required cc\_toolchain for which we configure features. | +| `language` | [string](../core/string); or `None`; default is `None` The language to configure for: either c++ or objc (default c++) | +| `requested_features` | [sequence](../core/list); default is `[]` List of features to be enabled. | +| `unsupported_features` | [sequence](../core/list); default is `[]` List of features that are unsupported by the current rule. | ## create\_cc\_toolchain\_config\_info @@ -210,137 +114,28 @@ ParameterDescription`ctx`[ctx](../builtins/ctx.html); None cc_common.create_cc_toolchain_config_info(*, ctx, features=[], action_configs=[], artifact_name_patterns=[], cxx_builtin_include_directories=[], toolchain_identifier, host_system_name=None, target_system_name=None, target_cpu=None, target_libc=None, compiler, abi_version=None, abi_libc_version=None, tool_paths=[], make_variables=[], builtin_sysroot=None) ``` - Creates a `CcToolchainConfigInfo` provider - +Creates a `CcToolchainConfigInfo` provider ### Parameters -ParameterDescription`ctx`[ctx](../builtins/ctx.html); - required - - The rule context. - `features`[sequence](../core/list.html); - default is `[]` - - Contains all flag specifications for one feature. - -Arguments: - -`name`: The feature's name. It is possible to introduce a feature without a change to Bazel by adding a 'feature' section to the toolchain and adding the corresponding string as feature in the `BUILD` file. - -`enabled`: If 'True', this feature is enabled unless a rule type explicitly marks it as unsupported. - -`flag_sets`: A FlagSet list. If the given feature is enabled, the flag sets will be applied for the actions are specified for. - -`env_sets`: an EnvSet list. If the given feature is enabled, the env sets will be applied for the actions they are specified for. - -`requires`: A list of feature sets defining when this feature is supported by the toolchain. The feature is supported if any of the feature sets fully apply, that is, when all features of a feature set are enabled. If `requires` is omitted, the feature is supported independently of which other features are enabled. Use this for example to filter flags depending on the build mode enabled (opt / fastbuild / dbg). - -`implies`: A string list of features or action configs that are automatically enabled when this feature is enabled. If any of the implied features or action configs cannot be enabled, this feature will (silently) not be enabled either. - -`provides`: A list of names this feature conflicts with. - -A feature cannot be enabled if: - -\- `provides` contains the name of a different feature or action config that we want to enable. - -\- `provides` contains the same value as a 'provides' in a different feature or action config that we want to enable. Use this in order to ensure that incompatible features cannot be accidentally activated at the same time, leading to hard to diagnose compiler errors. - `action_configs`[sequence](../core/list.html); - default is `[]` - - An action config corresponds to a Bazel action, and allows selection of a tool based on activated features. Action config activation occurs by the same semantics as features: a feature can 'require' or 'imply' an action config in the same way that it would another feature. - -Arguments: - -`action_name`: The name of the Bazel action that this config applies to, e.g. 'c-compile' or 'c-module-compile'. - -`enabled`: If 'True', this action is enabled unless a rule type explicitly marks it as unsupported. - -`tools`: The tool applied to the action will be the first tool with a feature set that matches the feature configuration. An error will be thrown if no tool matches a provided feature configuration - for that reason, it's a good idea to provide a default tool with an empty feature set. - -`flag_sets`: If the given action config is enabled, the flag sets will be applied to the corresponding action. - -`implies`: A list of features or action configs that are automatically enabled when this action config is enabled. If any of the implied features or action configs cannot be enabled, this action config will (silently) not be enabled either. - -`artifact_name_patterns`[sequence](../core/list.html); - default is `[]` - - The name for an artifact of a given category of input or output artifacts to an action. - -Arguments: - -`category_name`: The category of artifacts that this selection applies to. This field is compared against a list of categories defined in Bazel. Example categories include "linked\_output" or the artifact for this selection. Together with the extension it is used to create an artifact name based on the target name. - -`extension`: The extension for creating the artifact for this selection. Together with the prefix it is used to create an artifact name based on the target name. - -`cxx_builtin_include_directories`[sequence](../core/list.html); - default is `[]` - -Built-in include directories for C++ compilation. These should be the exact paths used by the compiler, and are generally relative to the exec root. - -The paths used by the compiler can be determined by 'gcc -E -xc++ - -v'. - -We currently use the C++ paths also for C compilation, which is safe as long as there are no name clashes between C++ and C header files. - -Relative paths are resolved relative to the configuration file directory. - -If the compiler has --sysroot support, then these paths should use %sysroot% rather than the include path, and specify the sysroot attribute in order to give blaze the information necessary to make the correct replacements. - -`toolchain_identifier`[string](../core/string.html); - required - -The unique identifier of the toolchain within the crosstool release. It must be possible to use this as a directory name in a path. - -It has to match the following regex: \[a-zA-Z\_\]\[\\.\\- \\w\]\* - -`host_system_name`[string](../core/string.html); or `None`; - default is `None` - - Ignored. - `target_system_name`[string](../core/string.html); or `None`; - default is `None` - - Deprecated. The GNU System Name. The string is exposed to CcToolchainInfo.target\_gnu\_system\_name. - `target_cpu`[string](../core/string.html); or `None`; - default is `None` - - Deprecated: Use cpu based constraints instead. If the string is "k8", \`target\_cpu\` will be omitted from the filename of raw FDO profile data. - `target_libc`[string](../core/string.html); or `None`; - default is `None` - - Deprecated: Use OS based constraints instead. The libc version string (e.g. "glibc-2.2.2"). If the string is "macosx", platform is assumed to be MacOS. Otherwise, Linux. The string is exposed to CcToolchainInfo.libc. - `compiler`[string](../core/string.html); - required - - The compiler string (e.g. "gcc"). The current toolchain's compiler is exposed to \`@bazel\_tools//tools/cpp:compiler (compiler\_flag)\` as a flag value. Targets that require compiler-specific flags can use the config\_settings in https://github.com/bazelbuild/rules\_cc/blob/main/cc/compiler/BUILD in select() statements or create custom config\_setting if the existing settings don't suffice. - `abi_version`[string](../core/string.html); or `None`; - default is `None` - - The abi in use, which is a gcc version. E.g.: "gcc-3.4". The string is set to C++ toolchain variable ABI. - `abi_libc_version`[string](../core/string.html); or `None`; - default is `None` - - The glibc version used by the abi we're using. The string is set to C++ toolchain variable ABI\_LIBC\_VERSION. - `tool_paths`[sequence](../core/list.html); - default is `[]` - - Tool locations. - -Arguments: - -`name`: Name of the tool. - -`path`: Location of the tool; Can be absolute path (in case of non hermetic toolchain), or path relative to the cc\_toolchain's package. - -`make_variables`[sequence](../core/list.html); - default is `[]` - - A make variable that is made accessible to rules. - `builtin_sysroot`[string](../core/string.html); or `None`; - default is `None` - - The built-in sysroot. If this attribute is not present, Bazel does not allow using a different sysroot, i.e. through the --grte\_top option. - +| Parameter | Description | +| --- | --- | +| `ctx` | [ctx](../builtins/ctx); required The rule context. | +| `features` | [sequence](../core/list); default is `[]` Contains all flag specifications for one feature. Arguments: `name`: The feature's name. It is possible to introduce a feature without a change to Bazel by adding a 'feature' section to the toolchain and adding the corresponding string as feature in the `BUILD` file. `enabled`: If 'True', this feature is enabled unless a rule type explicitly marks it as unsupported. `flag_sets`: A FlagSet list. If the given feature is enabled, the flag sets will be applied for the actions are specified for. `env_sets`: an EnvSet list. If the given feature is enabled, the env sets will be applied for the actions they are specified for. `requires`: A list of feature sets defining when this feature is supported by the toolchain. The feature is supported if any of the feature sets fully apply, that is, when all features of a feature set are enabled. If `requires` is omitted, the feature is supported independently of which other features are enabled. Use this for example to filter flags depending on the build mode enabled (opt / fastbuild / dbg). `implies`: A string list of features or action configs that are automatically enabled when this feature is enabled. If any of the implied features or action configs cannot be enabled, this feature will (silently) not be enabled either. `provides`: A list of names this feature conflicts with. A feature cannot be enabled if:- `provides` contains the name of a different feature or action config that we want to enable.- `provides` contains the same value as a 'provides' in a different feature or action config that we want to enable. Use this in order to ensure that incompatible features cannot be accidentally activated at the same time, leading to hard to diagnose compiler errors. | +| `action_configs` | [sequence](../core/list); default is `[]` An action config corresponds to a Bazel action, and allows selection of a tool based on activated features. Action config activation occurs by the same semantics as features: a feature can 'require' or 'imply' an action config in the same way that it would another feature. Arguments: `action_name`: The name of the Bazel action that this config applies to, e.g. 'c-compile' or 'c-module-compile'. `enabled`: If 'True', this action is enabled unless a rule type explicitly marks it as unsupported. `tools`: The tool applied to the action will be the first tool with a feature set that matches the feature configuration. An error will be thrown if no tool matches a provided feature configuration - for that reason, it's a good idea to provide a default tool with an empty feature set. `flag_sets`: If the given action config is enabled, the flag sets will be applied to the corresponding action. `implies`: A list of features or action configs that are automatically enabled when this action config is enabled. If any of the implied features or action configs cannot be enabled, this action config will (silently) not be enabled either. | +| `artifact_name_patterns` | [sequence](../core/list); default is `[]` The name for an artifact of a given category of input or output artifacts to an action. Arguments: `category_name`: The category of artifacts that this selection applies to. This field is compared against a list of categories defined in Bazel. Example categories include "linked\_output" or the artifact for this selection. Together with the extension it is used to create an artifact name based on the target name. `extension`: The extension for creating the artifact for this selection. Together with the prefix it is used to create an artifact name based on the target name. | +| `cxx_builtin_include_directories` | [sequence](../core/list); default is `[]` Built-in include directories for C++ compilation. These should be the exact paths used by the compiler, and are generally relative to the exec root. The paths used by the compiler can be determined by 'gcc -E -xc++ - -v'. We currently use the C++ paths also for C compilation, which is safe as long as there are no name clashes between C++ and C header files. Relative paths are resolved relative to the configuration file directory. If the compiler has --sysroot support, then these paths should use %sysroot% rather than the include path, and specify the sysroot attribute in order to give blaze the information necessary to make the correct replacements. | +| `toolchain_identifier` | [string](../core/string); required The unique identifier of the toolchain within the crosstool release. It must be possible to use this as a directory name in a path. It has to match the following regex: [a-zA-Z\_][\.\- \w]\* | +| `host_system_name` | [string](../core/string); or `None`; default is `None` Ignored. | +| `target_system_name` | [string](../core/string); or `None`; default is `None` Deprecated. The GNU System Name. The string is exposed to CcToolchainInfo.target\_gnu\_system\_name. | +| `target_cpu` | [string](../core/string); or `None`; default is `None` Deprecated: Use cpu based constraints instead. If the string is "k8", `target\_cpu` will be omitted from the filename of raw FDO profile data. | +| `target_libc` | [string](../core/string); or `None`; default is `None` Deprecated: Use OS based constraints instead. The libc version string (e.g. "glibc-2.2.2"). If the string is "macosx", platform is assumed to be MacOS. Otherwise, Linux. The string is exposed to CcToolchainInfo.libc. | +| `compiler` | [string](../core/string); required The compiler string (e.g. "gcc"). The current toolchain's compiler is exposed to `@bazel\_tools//tools/cpp:compiler (compiler\_flag)` as a flag value. Targets that require compiler-specific flags can use the config\_settings in https://github.com/bazelbuild/rules\_cc/blob/main/cc/compiler/BUILD in select() statements or create custom config\_setting if the existing settings don't suffice. | +| `abi_version` | [string](../core/string); or `None`; default is `None` The abi in use, which is a gcc version. E.g.: "gcc-3.4". The string is set to C++ toolchain variable ABI. | +| `abi_libc_version` | [string](../core/string); or `None`; default is `None` The glibc version used by the abi we're using. The string is set to C++ toolchain variable ABI\_LIBC\_VERSION. | +| `tool_paths` | [sequence](../core/list); default is `[]` Tool locations. Arguments: `name`: Name of the tool. `path`: Location of the tool; Can be absolute path (in case of non hermetic toolchain), or path relative to the cc\_toolchain's package. | +| `make_variables` | [sequence](../core/list); default is `[]` A make variable that is made accessible to rules. | +| `builtin_sysroot` | [string](../core/string); or `None`; default is `None` The built-in sysroot. If this attribute is not present, Bazel does not allow using a different sysroot, i.e. through the --grte\_top option. | ## create\_compilation\_context @@ -348,40 +143,19 @@ Arguments: CompilationContext cc_common.create_compilation_context(*, headers=unbound, system_includes=unbound, includes=unbound, quote_includes=unbound, framework_includes=unbound, defines=unbound, local_defines=unbound) ``` - Creates a `CompilationContext`. - +Creates a `CompilationContext`. ### Parameters -ParameterDescription`headers` - default is `unbound` - - Set of headers needed to compile this target - `system_includes` - default is `unbound` - - Set of search paths for header files referenced by angle brackets, i.e. #include <foo/bar/header.h>. They can be either relative to the exec root or absolute. Usually passed with -isystem - `includes` - default is `unbound` - - Set of search paths for header files referenced both by angle bracket and quotes.Usually passed with -I - `quote_includes` - default is `unbound` - - Set of search paths for header files referenced by quotes, i.e. #include "foo/bar/header.h". They can be either relative to the exec root or absolute. Usually passed with -iquote - `framework_includes` - default is `unbound` - - Set of framework search paths for header files (Apple platform only) - `defines` - default is `unbound` - - Set of defines needed to compile this target. Each define is a string. Propagated transitively to dependents. - `local_defines` - default is `unbound` - - Set of defines needed to compile this target. Each define is a string. Not propagated transitively to dependents. - +| Parameter | Description | +| --- | --- | +| `headers` | default is `unbound` Set of headers needed to compile this target | +| `system_includes` | default is `unbound` Set of search paths for header files referenced by angle brackets, i.e. #include . They can be either relative to the exec root or absolute. Usually passed with -isystem | +| `includes` | default is `unbound` Set of search paths for header files referenced both by angle bracket and quotes.Usually passed with -I | +| `quote_includes` | default is `unbound` Set of search paths for header files referenced by quotes, i.e. #include "foo/bar/header.h". They can be either relative to the exec root or absolute. Usually passed with -iquote | +| `framework_includes` | default is `unbound` Set of framework search paths for header files (Apple platform only) | +| `defines` | default is `unbound` Set of defines needed to compile this target. Each define is a string. Propagated transitively to dependents. | +| `local_defines` | default is `unbound` Set of defines needed to compile this target. Each define is a string. Not propagated transitively to dependents. | ## create\_compilation\_outputs @@ -389,20 +163,14 @@ ParameterDescription`headers` CcCompilationOutputs cc_common.create_compilation_outputs(*, objects=None, pic_objects=None) ``` - Create compilation outputs object. - +Create compilation outputs object. ### Parameters -ParameterDescription`objects`[depset](../builtins/depset.html); or `None`; - default is `None` - - List of object files. - `pic_objects`[depset](../builtins/depset.html); or `None`; - default is `None` - - List of pic object files. - +| Parameter | Description | +| --- | --- | +| `objects` | [depset](../builtins/depset); or `None`; default is `None` List of object files. | +| `pic_objects` | [depset](../builtins/depset); or `None`; default is `None` List of pic object files. | ## create\_compile\_variables @@ -410,77 +178,28 @@ ParameterDescription`objects`[depset](../builtins/depset.html); or `None`; Variables cc_common.create_compile_variables(*, cc_toolchain, feature_configuration, source_file=None, output_file=None, user_compile_flags=None, include_directories=None, quote_include_directories=None, system_include_directories=None, framework_include_directories=None, preprocessor_defines=None, thinlto_index=None, thinlto_input_bitcode_file=None, thinlto_output_object_file=None, use_pic=False, add_legacy_cxx_options=False, variables_extension=unbound) ``` - Returns variables used for compilation actions. - +Returns variables used for compilation actions. ### Parameters -ParameterDescription`cc_toolchain` - Info; - required - - cc\_toolchain for which we are creating build variables. - `feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `source_file`[File](../builtins/File.html); or [string](../core/string.html); or `None`; - default is `None` - - Optional source file path for the compilation. Please prefer passing source\_file here over appending it to the end of the command line generated from cc\_common.get\_memory\_inefficient\_command\_line, as then it's in the power of the toolchain author to properly specify and position compiler flags. - `output_file`[File](../builtins/File.html); or [string](../core/string.html); or `None`; - default is `None` - - Optional output file path of the compilation. Please prefer passing output\_file here over appending it to the end of the command line generated from cc\_common.get\_memory\_inefficient\_command\_line, as then it's in the power of the toolchain author to properly specify and position compiler flags. - `user_compile_flags`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - List of additional compilation flags (copts). - `include_directories`[depset](../builtins/depset.html); or `None`; - default is `None` - - Depset of include directories. - `quote_include_directories`[depset](../builtins/depset.html); or `None`; - default is `None` - - Depset of quote include directories. - `system_include_directories`[depset](../builtins/depset.html); or `None`; - default is `None` - - Depset of system include directories. - `framework_include_directories`[depset](../builtins/depset.html); or `None`; - default is `None` - - Depset of framework include directories. - `preprocessor_defines`[depset](../builtins/depset.html); or `None`; - default is `None` - - Depset of preprocessor defines. - `thinlto_index`[string](../core/string.html); or `None`; - default is `None` - - LTO index file path. - `thinlto_input_bitcode_file`[string](../core/string.html); or `None`; - default is `None` - - Bitcode file that is input to LTO backend. - `thinlto_output_object_file`[string](../core/string.html); or `None`; - default is `None` - - Object file that is output by LTO backend. - `use_pic`[bool](../core/bool.html); - default is `False` - - When true the compilation will generate position independent code. - `add_legacy_cxx_options`[bool](../core/bool.html); - default is `False` - - Unused. - `variables_extension`[dict](../core/dict.html); - default is `unbound` - - A dictionary of additional variables used by compile actions. - +| Parameter | Description | +| --- | --- | +| `cc_toolchain` | Info; required cc\_toolchain for which we are creating build variables. | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `source_file` | [File](../builtins/File); or [string](../core/string); or `None`; default is `None` Optional source file path for the compilation. Please prefer passing source\_file here over appending it to the end of the command line generated from cc\_common.get\_memory\_inefficient\_command\_line, as then it's in the power of the toolchain author to properly specify and position compiler flags. | +| `output_file` | [File](../builtins/File); or [string](../core/string); or `None`; default is `None` Optional output file path of the compilation. Please prefer passing output\_file here over appending it to the end of the command line generated from cc\_common.get\_memory\_inefficient\_command\_line, as then it's in the power of the toolchain author to properly specify and position compiler flags. | +| `user_compile_flags` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` List of additional compilation flags (copts). | +| `include_directories` | [depset](../builtins/depset); or `None`; default is `None` Depset of include directories. | +| `quote_include_directories` | [depset](../builtins/depset); or `None`; default is `None` Depset of quote include directories. | +| `system_include_directories` | [depset](../builtins/depset); or `None`; default is `None` Depset of system include directories. | +| `framework_include_directories` | [depset](../builtins/depset); or `None`; default is `None` Depset of framework include directories. | +| `preprocessor_defines` | [depset](../builtins/depset); or `None`; default is `None` Depset of preprocessor defines. | +| `thinlto_index` | [string](../core/string); or `None`; default is `None` LTO index file path. | +| `thinlto_input_bitcode_file` | [string](../core/string); or `None`; default is `None` Bitcode file that is input to LTO backend. | +| `thinlto_output_object_file` | [string](../core/string); or `None`; default is `None` Object file that is output by LTO backend. | +| `use_pic` | [bool](../core/bool); default is `False` When true the compilation will generate position independent code. | +| `add_legacy_cxx_options` | [bool](../core/bool); default is `False` Unused. | +| `variables_extension` | [dict](../core/dict); default is `unbound` A dictionary of additional variables used by compile actions. | ## create\_library\_to\_link @@ -488,59 +207,24 @@ ParameterDescription`cc_toolchain` LibraryToLink cc_common.create_library_to_link(*, actions, feature_configuration=None, cc_toolchain=None, static_library=None, pic_static_library=None, dynamic_library=None, interface_library=None, pic_objects=unbound, objects=unbound, alwayslink=False, dynamic_library_symlink_path='', interface_library_symlink_path='') ``` - Creates `LibraryToLink` +Creates `LibraryToLink` ### Parameters -ParameterDescription`actions` - required - -`actions` object. - `feature_configuration` - default is `None` - -`feature_configuration` to be queried. - `cc_toolchain` - default is `None` - -`CcToolchainInfo` provider to be used. - `static_library`[File](../builtins/File.html); or `None`; - default is `None` - -`File` of static library to be linked. - `pic_static_library`[File](../builtins/File.html); or `None`; - default is `None` - -`File` of pic static library to be linked. - `dynamic_library`[File](../builtins/File.html); or `None`; - default is `None` - -`File` of dynamic library to be linked. Always used for runtime and used for linking if `interface_library` is not passed. - `interface_library`[File](../builtins/File.html); or `None`; - default is `None` - -`File` of interface library to be linked. - `pic_objects`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `unbound` - - Experimental, do not use - `objects`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `unbound` - - Experimental, do not use - `alwayslink`[bool](../core/bool.html); - default is `False` - - Whether to link the static library/objects in the --whole\_archive block. - `dynamic_library_symlink_path`[string](../core/string.html); - default is `''` - - Override the default path of the dynamic library link in the solib directory. Empty string to use the default. - `interface_library_symlink_path`[string](../core/string.html); - default is `''` - - Override the default path of the interface library link in the solib directory. Empty string to use the default. - +| Parameter | Description | +| --- | --- | +| `actions` | required `actions` object. | +| `feature_configuration` | default is `None` `feature_configuration` to be queried. | +| `cc_toolchain` | default is `None` `CcToolchainInfo` provider to be used. | +| `static_library` | [File](../builtins/File); or `None`; default is `None` `File` of static library to be linked. | +| `pic_static_library` | [File](../builtins/File); or `None`; default is `None` `File` of pic static library to be linked. | +| `dynamic_library` | [File](../builtins/File); or `None`; default is `None` `File` of dynamic library to be linked. Always used for runtime and used for linking if `interface_library` is not passed. | +| `interface_library` | [File](../builtins/File); or `None`; default is `None` `File` of interface library to be linked. | +| `pic_objects` | [sequence](../core/list) of [File](../builtins/File)s; default is `unbound` Experimental, do not use | +| `objects` | [sequence](../core/list) of [File](../builtins/File)s; default is `unbound` Experimental, do not use | +| `alwayslink` | [bool](../core/bool); default is `False` Whether to link the static library/objects in the --whole\_archive block. | +| `dynamic_library_symlink_path` | [string](../core/string); default is `''` Override the default path of the dynamic library link in the solib directory. Empty string to use the default. | +| `interface_library_symlink_path` | [string](../core/string); default is `''` Override the default path of the interface library link in the solib directory. Empty string to use the default. | ## create\_link\_variables @@ -548,61 +232,24 @@ ParameterDescription`actions` Variables cc_common.create_link_variables(*, cc_toolchain, feature_configuration, library_search_directories=[], runtime_library_search_directories=[], user_link_flags=[], output_file=None, param_file=None, is_using_linker=True, is_linking_dynamic_library=False, must_keep_debug=True, use_test_only_flags=False, is_static_linking_mode=True) ``` - Returns link variables used for linking actions. - +Returns link variables used for linking actions. ### Parameters -ParameterDescription`cc_toolchain` - Info; - required - - cc\_toolchain for which we are creating build variables. - `feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `library_search_directories`[depset](../builtins/depset.html); - default is `[]` - - Depset of directories where linker will look for libraries at link time. - `runtime_library_search_directories`[depset](../builtins/depset.html); - default is `[]` - - Depset of directories where loader will look for libraries at runtime. - `user_link_flags`[sequence](../core/list.html); - default is `[]` - - List of additional link flags (linkopts). - `output_file` - default is `None` - - Optional output file path. - `param_file` - default is `None` - - Optional param file path. - `is_using_linker`[bool](../core/bool.html); - default is `True` - - True when using linker, False when archiver. Caller is responsible for keeping this in sync with action name used (is\_using\_linker = True for linking executable or dynamic library, is\_using\_linker = False for archiving static library). - `is_linking_dynamic_library`[bool](../core/bool.html); - default is `False` - - True when creating dynamic library, False when executable or static library. Caller is responsible for keeping this in sync with action name used. This field will be removed once b/65151735 is fixed. - `must_keep_debug`[bool](../core/bool.html); - default is `True` - - When set to False, bazel will expose 'strip\_debug\_symbols' variable, which is usually used to use the linker to strip debug symbols from the output file. - `use_test_only_flags`[bool](../core/bool.html); - default is `False` - - When set to true, 'is\_cc\_test' variable will be set. - `is_static_linking_mode`[bool](../core/bool.html); - default is `True` - - Unused. - +| Parameter | Description | +| --- | --- | +| `cc_toolchain` | Info; required cc\_toolchain for which we are creating build variables. | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `library_search_directories` | [depset](../builtins/depset); default is `[]` Depset of directories where linker will look for libraries at link time. | +| `runtime_library_search_directories` | [depset](../builtins/depset); default is `[]` Depset of directories where loader will look for libraries at runtime. | +| `user_link_flags` | [sequence](../core/list); default is `[]` List of additional link flags (linkopts). | +| `output_file` | default is `None` Optional output file path. | +| `param_file` | default is `None` Optional param file path. | +| `is_using_linker` | [bool](../core/bool); default is `True` True when using linker, False when archiver. Caller is responsible for keeping this in sync with action name used (is\_using\_linker = True for linking executable or dynamic library, is\_using\_linker = False for archiving static library). | +| `is_linking_dynamic_library` | [bool](../core/bool); default is `False` True when creating dynamic library, False when executable or static library. Caller is responsible for keeping this in sync with action name used. This field will be removed once b/65151735 is fixed. | +| `must_keep_debug` | [bool](../core/bool); default is `True` When set to False, bazel will expose 'strip\_debug\_symbols' variable, which is usually used to use the linker to strip debug symbols from the output file. | +| `use_test_only_flags` | [bool](../core/bool); default is `False` When set to true, 'is\_cc\_test' variable will be set. | +| `is_static_linking_mode` | [bool](../core/bool); default is `True` Unused. | ## create\_linker\_input @@ -610,28 +257,16 @@ ParameterDescription`cc_toolchain` LinkerInput cc_common.create_linker_input(*, owner, libraries=None, user_link_flags=None, additional_inputs=None) ``` - Creates a `LinkerInput`. - +Creates a `LinkerInput`. ### Parameters -ParameterDescription`owner`[Label](../builtins/Label.html); - required - - The label of the target that produced all files used in this input. - `libraries``None`; or [depset](../builtins/depset.html); - default is `None` - - List of `LibraryToLink`. - `user_link_flags``None`; or [depset](../builtins/depset.html) of [string](../core/string.html) s; or [sequence](../core/list.html) of [string](../core/string.html) s; - default is `None` - - User link flags passed as strings. Accepts either \[String\], \[\[String\]\] or depset(String). The latter is discouraged as it's only kept for compatibility purposes, the depset is flattened. If you want to propagate user\_link\_flags via unflattened depsets() wrap them in a LinkerInput so that they are not flattened till the end. - `additional_inputs``None`; or [depset](../builtins/depset.html); - default is `None` - - For additional inputs to the linking action, e.g.: linking scripts. - +| Parameter | Description | +| --- | --- | +| `owner` | [Label](../builtins/Label); required The label of the target that produced all files used in this input. | +| `libraries` | `None`; or [depset](../builtins/depset); default is `None` List of `LibraryToLink`. | +| `user_link_flags` | `None`; or [depset](../builtins/depset) of [string](../core/string)s; or [sequence](../core/list) of [string](../core/string)s; default is `None` User link flags passed as strings. Accepts either [String], [[String]] or depset(String). The latter is discouraged as it's only kept for compatibility purposes, the depset is flattened. If you want to propagate user\_link\_flags via unflattened depsets() wrap them in a LinkerInput so that they are not flattened till the end. | +| `additional_inputs` | `None`; or [depset](../builtins/depset); default is `None` For additional inputs to the linking action, e.g.: linking scripts. | ## create\_linking\_context @@ -639,16 +274,13 @@ ParameterDescription`owner`[Label](../builtins/Label.html); LinkingContext cc_common.create_linking_context(*, linker_inputs) ``` - Creates a `LinkingContext`. - +Creates a `LinkingContext`. ### Parameters -ParameterDescription`linker_inputs`[depset](../builtins/depset.html); - required - - Depset of `LinkerInput`. - +| Parameter | Description | +| --- | --- | +| `linker_inputs` | [depset](../builtins/depset); required Depset of `LinkerInput`. | ## create\_linking\_context\_from\_compilation\_outputs @@ -656,65 +288,25 @@ ParameterDescription`linker_inputs`[depset](../builtins/depset.html); tuple cc_common.create_linking_context_from_compilation_outputs(*, actions, name, feature_configuration, cc_toolchain, language='c++', disallow_static_libraries=False, disallow_dynamic_library=False, compilation_outputs, linking_contexts=[], user_link_flags=[], alwayslink=False, additional_inputs=[], variables_extension=unbound) ``` - Should be used for creating library rules that can propagate information downstream in order to be linked later by a top level rule that does transitive linking to create an executable or a dynamic library. Returns tuple of ( `CcLinkingContext`, `CcLinkingOutputs`). - +Should be used for creating library rules that can propagate information downstream in order to be linked later by a top level rule that does transitive linking to create an executable or a dynamic library. Returns tuple of (`CcLinkingContext`, `CcLinkingOutputs`). ### Parameters -ParameterDescription`actions`[actions](../builtins/actions.html); - required - -`actions` object. - `name`[string](../core/string.html); - required - - This is used for naming the output artifacts of actions created by this method. - `feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - -`feature_configuration` to be queried. - `cc_toolchain` - Info; - required - -`CcToolchainInfo` provider to be used. - `language`[string](../core/string.html); - default is `'c++'` - - Only C++ supported for now. Do not use this parameter. - `disallow_static_libraries`[bool](../core/bool.html); - default is `False` - - Whether static libraries should be created. - `disallow_dynamic_library`[bool](../core/bool.html); - default is `False` - - Whether a dynamic library should be created. - `compilation_outputs`[CcCompilationOutputs](../builtins/CcCompilationOutputs.html); - required - - Compilation outputs containing object files to link. - `linking_contexts`[sequence](../core/list.html); - default is `[]` - - Libraries from dependencies. These libraries will be linked into the output artifact of the link() call, be it a binary or a library. - `user_link_flags`[sequence](../core/list.html); - default is `[]` - - Additional list of linking options. - `alwayslink`[bool](../core/bool.html); - default is `False` - - Whether this library should always be linked. - `additional_inputs`[sequence](../core/list.html); - default is `[]` - - For additional inputs to the linking action, e.g.: linking scripts. - `variables_extension`[dict](../core/dict.html); - default is `unbound` - - Additional variables to pass to the toolchain configuration when creating link command line. - +| Parameter | Description | +| --- | --- | +| `actions` | [actions](../builtins/actions); required `actions` object. | +| `name` | [string](../core/string); required This is used for naming the output artifacts of actions created by this method. | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required `feature_configuration` to be queried. | +| `cc_toolchain` | Info; required `CcToolchainInfo` provider to be used. | +| `language` | [string](../core/string); default is `'c++'` Only C++ supported for now. Do not use this parameter. | +| `disallow_static_libraries` | [bool](../core/bool); default is `False` Whether static libraries should be created. | +| `disallow_dynamic_library` | [bool](../core/bool); default is `False` Whether a dynamic library should be created. | +| `compilation_outputs` | [CcCompilationOutputs](../builtins/CcCompilationOutputs); required Compilation outputs containing object files to link. | +| `linking_contexts` | [sequence](../core/list); default is `[]` Libraries from dependencies. These libraries will be linked into the output artifact of the link() call, be it a binary or a library. | +| `user_link_flags` | [sequence](../core/list); default is `[]` Additional list of linking options. | +| `alwayslink` | [bool](../core/bool); default is `False` Whether this library should always be linked. | +| `additional_inputs` | [sequence](../core/list); default is `[]` For additional inputs to the linking action, e.g.: linking scripts. | +| `variables_extension` | [dict](../core/dict); default is `unbound` Additional variables to pass to the toolchain configuration when creating link command line. | ## create\_lto\_compilation\_context @@ -722,16 +314,13 @@ ParameterDescription`actions`[actions](../builtins/actions.html); LtoCompilationContext cc_common.create_lto_compilation_context(*, objects={}) ``` - Create LTO compilation context - +Create LTO compilation context ### Parameters -ParameterDescription`objects`[dict](../core/dict.html); - default is `{}` - - map of full object to index object - +| Parameter | Description | +| --- | --- | +| `objects` | [dict](../core/dict); default is `{}` map of full object to index object | ## do\_not\_use\_tools\_cpp\_compiler\_present @@ -739,9 +328,7 @@ ParameterDescription`objects`[dict](../core/dict.html); None cc_common.do_not_use_tools_cpp_compiler_present ``` - Do not use this field, its only purpose is to help with migration from config\_setting.values\{'compiler') to config\_settings.flag\_values\{'@bazel\_tools//tools/cpp:compiler'\} - - +Do not use this field, its only purpose is to help with migration from config\_setting.values{'compiler') to config\_settings.flag\_values{'@bazel\_tools//tools/cpp:compiler'} ## get\_environment\_variables @@ -749,25 +336,15 @@ None cc_common.do_not_use_tools_cpp_compiler_present dict cc_common.get_environment_variables(*, feature_configuration, action_name, variables) ``` - Returns environment variables to be set for given action. - +Returns environment variables to be set for given action. ### Parameters -ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `action_name`[string](../core/string.html); - required - - Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) - `variables` - Variables; - required - - Build variables to be used for template expansion. - +| Parameter | Description | +| --- | --- | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `action_name` | [string](../core/string); required Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) | +| `variables` | Variables; required Build variables to be used for template expansion. | ## get\_execution\_requirements @@ -775,20 +352,14 @@ ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/Fe sequence cc_common.get_execution_requirements(*, feature_configuration, action_name) ``` - Returns execution requirements for given action. - +Returns execution requirements for given action. ### Parameters -ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `action_name`[string](../core/string.html); - required - - Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) - +| Parameter | Description | +| --- | --- | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `action_name` | [string](../core/string); required Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) | ## get\_memory\_inefficient\_command\_line @@ -796,25 +367,15 @@ ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/Fe sequence cc_common.get_memory_inefficient_command_line(*, feature_configuration, action_name, variables) ``` - Returns flattened command line flags for given action, using given variables for expansion. Flattens nested sets and ideally should not be used, or at least should not outlive analysis. Work on memory efficient function returning Args is ongoing. - +Returns flattened command line flags for given action, using given variables for expansion. Flattens nested sets and ideally should not be used, or at least should not outlive analysis. Work on memory efficient function returning Args is ongoing. ### Parameters -ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `action_name`[string](../core/string.html); - required - - Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) - `variables` - Variables; - required - - Build variables to be used for template expansions. - +| Parameter | Description | +| --- | --- | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `action_name` | [string](../core/string); required Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) | +| `variables` | Variables; required Build variables to be used for template expansions. | ## get\_tool\_for\_action @@ -822,20 +383,14 @@ ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/Fe string cc_common.get_tool_for_action(*, feature_configuration, action_name) ``` - Returns tool path for given action. - +Returns tool path for given action. ### Parameters -ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `action_name`[string](../core/string.html); - required - - Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) - +| Parameter | Description | +| --- | --- | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `action_name` | [string](../core/string); required Name of the action. Has to be one of the names in @bazel\_tools//tools/build\_defs/cc:action\_names.bzl (https://github.com/bazelbuild/bazel/blob/master/tools/build\_defs/cc/action\_names.bzl) | ## is\_enabled @@ -843,20 +398,14 @@ ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/Fe bool cc_common.is_enabled(*, feature_configuration, feature_name) ``` - Returns True if given feature is enabled in the feature configuration. - +Returns True if given feature is enabled in the feature configuration. ### Parameters -ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - - Feature configuration to be queried. - `feature_name`[string](../core/string.html); - required - - Name of the feature. - +| Parameter | Description | +| --- | --- | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required Feature configuration to be queried. | +| `feature_name` | [string](../core/string); required Name of the feature. | ## link @@ -864,69 +413,26 @@ ParameterDescription`feature_configuration`[FeatureConfiguration](../builtins/Fe CcLinkingOutputs cc_common.link(*, actions, name, feature_configuration, cc_toolchain, language='c++', output_type='executable', link_deps_statically=True, compilation_outputs=None, linking_contexts=[], user_link_flags=[], stamp=0, additional_inputs=[], additional_outputs=[], variables_extension={}) ``` - Should be used for C++ transitive linking. - +Should be used for C++ transitive linking. ### Parameters -ParameterDescription`actions`[actions](../builtins/actions.html); - required - -`actions` object. - `name`[string](../core/string.html); - required - - This is used for naming the output artifacts of actions created by this method. - `feature_configuration`[FeatureConfiguration](../builtins/FeatureConfiguration.html); - required - -`feature_configuration` to be queried. - `cc_toolchain` - Info; - required - -`CcToolchainInfo` provider to be used. - `language`[string](../core/string.html); - default is `'c++'` - - Only C++ supported for now. Do not use this parameter. - `output_type`[string](../core/string.html); - default is `'executable'` - - Can be either 'executable' or 'dynamic\_library'. - `link_deps_statically`[bool](../core/bool.html); - default is `True` - - True to link dependencies statically, False dynamically. - `compilation_outputs`[CcCompilationOutputs](../builtins/CcCompilationOutputs.html); or `None`; - default is `None` - - Compilation outputs containing object files to link. - `linking_contexts`[sequence](../core/list.html); - default is `[]` - - Linking contexts from dependencies to be linked into the linking context generated by this rule. - `user_link_flags`[sequence](../core/list.html); - default is `[]` - - Additional list of linker options. - `stamp`[int](../core/int.html); - default is `0` - - Whether to include build information in the linked executable, if output\_type is 'executable'. If 1, build information is always included. If 0 (the default build information is always excluded. If -1, uses the default behavior, which may be overridden by the --\[no\]stamp flag. This should be unset (or set to 0) when generating the executable output for test rules. - `additional_inputs`[sequence](../core/list.html); or [depset](../builtins/depset.html); - default is `[]` - - For additional inputs to the linking action, e.g.: linking scripts. - `additional_outputs`[sequence](../core/list.html); - default is `[]` - - For additional outputs to the linking action, e.g.: map files. - `variables_extension`[dict](../core/dict.html); - default is `{}` - - Additional variables to pass to the toolchain configuration when create link command line. - +| Parameter | Description | +| --- | --- | +| `actions` | [actions](../builtins/actions); required `actions` object. | +| `name` | [string](../core/string); required This is used for naming the output artifacts of actions created by this method. | +| `feature_configuration` | [FeatureConfiguration](../builtins/FeatureConfiguration); required `feature_configuration` to be queried. | +| `cc_toolchain` | Info; required `CcToolchainInfo` provider to be used. | +| `language` | [string](../core/string); default is `'c++'` Only C++ supported for now. Do not use this parameter. | +| `output_type` | [string](../core/string); default is `'executable'` Can be either 'executable' or 'dynamic\_library'. | +| `link_deps_statically` | [bool](../core/bool); default is `True` True to link dependencies statically, False dynamically. | +| `compilation_outputs` | [CcCompilationOutputs](../builtins/CcCompilationOutputs); or `None`; default is `None` Compilation outputs containing object files to link. | +| `linking_contexts` | [sequence](../core/list); default is `[]` Linking contexts from dependencies to be linked into the linking context generated by this rule. | +| `user_link_flags` | [sequence](../core/list); default is `[]` Additional list of linker options. | +| `stamp` | [int](../core/int); default is `0` Whether to include build information in the linked executable, if output\_type is 'executable'. If 1, build information is always included. If 0 (the default build information is always excluded. If -1, uses the default behavior, which may be overridden by the --[no]stamp flag. This should be unset (or set to 0) when generating the executable output for test rules. | +| `additional_inputs` | [sequence](../core/list); or [depset](../builtins/depset); default is `[]` For additional inputs to the linking action, e.g.: linking scripts. | +| `additional_outputs` | [sequence](../core/list); default is `[]` For additional outputs to the linking action, e.g.: map files. | +| `variables_extension` | [dict](../core/dict); default is `{}` Additional variables to pass to the toolchain configuration when create link command line. | ## merge\_cc\_infos @@ -934,20 +440,14 @@ ParameterDescription`actions`[actions](../builtins/actions.html); unknown cc_common.merge_cc_infos(*, direct_cc_infos=[], cc_infos=[]) ``` - Merges multiple `CcInfo` s into one. - +Merges multiple `CcInfo`s into one. ### Parameters -ParameterDescription`direct_cc_infos`[sequence](../core/list.html); - default is `[]` - - List of `CcInfo` s to be merged, whose headers will be exported by the direct fields in the returned provider. - `cc_infos`[sequence](../core/list.html); - default is `[]` - - List of `CcInfo` s to be merged, whose headers will not be exported by the direct fields in the returned provider. - +| Parameter | Description | +| --- | --- | +| `direct_cc_infos` | [sequence](../core/list); default is `[]` List of `CcInfo`s to be merged, whose headers will be exported by the direct fields in the returned provider. | +| `cc_infos` | [sequence](../core/list); default is `[]` List of `CcInfo`s to be merged, whose headers will not be exported by the direct fields in the returned provider. | ## merge\_compilation\_contexts @@ -955,16 +455,13 @@ ParameterDescription`direct_cc_infos`[sequence](../core/list.html); CompilationContext cc_common.merge_compilation_contexts(*, compilation_contexts=[]) ``` - Merges multiple `CompilationContexts` s into one. - +Merges multiple `CompilationContexts`s into one. ### Parameters -ParameterDescription`compilation_contexts`[sequence](../core/list.html); - default is `[]` - - List of `CompilationContexts` s to be merged. The headers of each context will be exported by the direct fields in the returned provider. - +| Parameter | Description | +| --- | --- | +| `compilation_contexts` | [sequence](../core/list); default is `[]` List of `CompilationContexts`s to be merged. The headers of each context will be exported by the direct fields in the returned provider. | ## merge\_compilation\_outputs @@ -972,10 +469,10 @@ ParameterDescription`compilation_contexts`[sequence](../core/list.html); CcCompilationOutputs cc_common.merge_compilation_outputs(*, compilation_outputs=[]) ``` - Merge compilation outputs. - +Merge compilation outputs. ### Parameters -ParameterDescription`compilation_outputs`[sequence](../core/list.html); - default is `[]` +| Parameter | Description | +| --- | --- | +| `compilation_outputs` | [sequence](../core/list); default is `[]` | \ No newline at end of file diff --git a/rules/lib/toplevel/config.mdx b/rules/lib/toplevel/config.mdx index 6cfef86fe..3ecd7c439 100644 --- a/rules/lib/toplevel/config.mdx +++ b/rules/lib/toplevel/config.mdx @@ -2,8 +2,6 @@ title: 'config' --- - - This is a top-level module for creating configuration transitions and build setting descriptors which describe what kind of build setting (if any) a rule is. ex: the following rule is marked as a build setting by setting the `build_setting` parameter of the `rule()` function. Specifically it is a build setting of type `int` and is a `flag` which means this build setting is callable on the command line. @@ -18,14 +16,14 @@ ex: the following rule is marked as a build setting by setting the `build_settin ## Members -- [bool](#bool) -- [exec](#exec) -- [int](#int) -- [none](#none) -- [string](#string) -- [string\_list](#string_list) -- [string\_set](#string_set) -- [target](#target) +* [bool](#bool) +* [exec](#exec) +* [int](#int) +* [none](#none) +* [string](#string) +* [string\_list](#string_list) +* [string\_set](#string_set) +* [target](#target) ## bool @@ -33,16 +31,13 @@ ex: the following rule is marked as a build setting by setting the `build_settin BuildSetting config.bool(*, flag=False) ``` - A bool-typed build setting - +A bool-typed build setting ### Parameters -ParameterDescription`flag`[bool](../core/bool.html); - default is `False` - - Whether or not this build setting is callable on the command line. - +| Parameter | Description | +| --- | --- | +| `flag` | [bool](../core/bool); default is `False` | ## exec @@ -50,16 +45,13 @@ ParameterDescription`flag`[bool](../core/bool.html); ExecTransitionFactory config.exec(exec_group=None) ``` - Creates an execution transition. - +Creates an execution transition. ### Parameters -ParameterDescription`exec_group`[string](../core/string.html); or `None`; - default is `None` - - The name of the exec group whose execution platform this transition will use. If not provided, this exec transition will use the target's default execution platform. - +| Parameter | Description | +| --- | --- | +| `exec_group` | [string](../core/string); or `None`; default is `None` The name of the exec group whose execution platform this transition will use. If not provided, this exec transition will use the target's default execution platform. | ## int @@ -67,16 +59,13 @@ ParameterDescription`exec_group`[string](../core/string.html); or `None`; BuildSetting config.int(*, flag=False) ``` - An integer-typed build setting - +An integer-typed build setting ### Parameters -ParameterDescription`flag`[bool](../core/bool.html); - default is `False` - - Whether or not this build setting is callable on the command line. - +| Parameter | Description | +| --- | --- | +| `flag` | [bool](../core/bool); default is `False` Whether or not this build setting is callable on the command line. | ## none @@ -84,9 +73,7 @@ ParameterDescription`flag`[bool](../core/bool.html); transition config.none() ``` - Creates a transition which removes all configuration, unsetting all flags. Intended for the case where a dependency is data-only and contains no code that needs to be built, but should only be analyzed once. - - +Creates a transition which removes all configuration, unsetting all flags. Intended for the case where a dependency is data-only and contains no code that needs to be built, but should only be analyzed once. ## string @@ -94,20 +81,14 @@ transition config.none() BuildSetting config.string(*, flag=False, allow_multiple=False) ``` - A string-typed build setting - +A string-typed build setting ### Parameters -ParameterDescription`flag`[bool](../core/bool.html); - default is `False` - - Whether or not this build setting is callable on the command line. - `allow_multiple`[bool](../core/bool.html); - default is `False` - - Deprecated, use a `string_list` setting with `repeatable = True` instead. If set, this flag is allowed to be set multiple times on the command line. The Value of the flag as accessed in transitions and build setting implementation function will be a list of strings. Insertion order and repeated values are both maintained. This list can be post-processed in the build setting implementation function if different behavior is desired. - +| Parameter | Description | +| --- | --- | +| `flag` | [bool](../core/bool); default is `False` Whether or not this build setting is callable on the command line. | +| `allow_multiple` | [bool](../core/bool); default is `False` Deprecated, use a `string_list` setting with `repeatable = True` instead. If set, this flag is allowed to be set multiple times on the command line. The Value of the flag as accessed in transitions and build setting implementation function will be a list of strings. Insertion order and repeated values are both maintained. This list can be post-processed in the build setting implementation function if different behavior is desired. | ## string\_list @@ -115,20 +96,14 @@ ParameterDescription`flag`[bool](../core/bool.html); BuildSetting config.string_list(*, flag=False, repeatable=False) ``` - A string list-typed build setting. On the command line pass a list using comma-separated value like `--//my/setting=foo,bar`. - +A string list-typed build setting. On the command line pass a list using comma-separated value like `--//my/setting=foo,bar`. ### Parameters -ParameterDescription`flag`[bool](../core/bool.html); - default is `False` - - Whether or not this build setting is callable on the command line. - `repeatable`[bool](../core/bool.html); - default is `False` - - If set, instead of expecting a comma-separated value, this flag is allowed to be set multiple times on the command line with each individual value treated as a single string to add to the list value. Insertion order and repeated values are both maintained. This list can be post-processed in the build setting implementation function if different behavior is desired. - +| Parameter | Description | +| --- | --- | +| `flag` | [bool](../core/bool); default is `False` Whether or not this build setting is callable on the command line. | +| `repeatable` | [bool](../core/bool); default is `False` If set, instead of expecting a comma-separated value, this flag is allowed to be set multiple times on the command line with each individual value treated as a single string to add to the list value. Insertion order and repeated values are both maintained. This list can be post-processed in the build setting implementation function if different behavior is desired. | ## string\_set @@ -136,22 +111,16 @@ ParameterDescription`flag`[bool](../core/bool.html); BuildSetting config.string_set(*, flag=False, repeatable=False) ``` - A string set-typed build setting. The value of this setting will be a [set](https://bazel.build/rules/lib/core/set) of strings in Starlark. On the command line, pass a set using a comma-separated value like `--//my/setting=foo,bar`. +A string set-typed build setting. The value of this setting will be a [set](https://bazel.build/rules/lib/core/set) of strings in Starlark. On the command line, pass a set using a comma-separated value like `--//my/setting=foo,bar`. Unlike with a `string_list`, the order of the elements doesn't matter and only a single instance of each element is maintained. This is recommended over `string_list` for flags where these properties are not needed as it can improve build performance by avoiding unnecessary configurations forking. - ### Parameters -ParameterDescription`flag`[bool](../core/bool.html); - default is `False` - - Whether or not this build setting is callable on the command line. - `repeatable`[bool](../core/bool.html); - default is `False` - - If set, instead of expecting a comma-separated value, this flag is allowed to be set multiple times on the command line with each individual value treated as a single string to add to the set value. Only a single instance of repeated values is maintained and the insertion order does not matter. - +| Parameter | Description | +| --- | --- | +| `flag` | [bool](../core/bool); default is `False` Whether or not this build setting is callable on the command line. | +| `repeatable` | [bool](../core/bool); default is `False` If set, instead of expecting a comma-separated value, this flag is allowed to be set multiple times on the command line with each individual value treated as a single string to add to the set value. Only a single instance of repeated values is maintained and the insertion order does not matter. | ## target @@ -159,4 +128,4 @@ ParameterDescription`flag`[bool](../core/bool.html); transition config.target() ``` - Creates a target transition. This is a no-op transition intended for the case where a transition object is needed, but doesn't want to actually change anything. Equivalent to `cfg = "target"` in `attr.label()`. +Creates a target transition. This is a no-op transition intended for the case where a transition object is needed, but doesn't want to actually change anything. Equivalent to `cfg = "target"` in `attr.label()`. \ No newline at end of file diff --git a/rules/lib/toplevel/config_common.mdx b/rules/lib/toplevel/config_common.mdx index eda97b5ad..9169b17a1 100644 --- a/rules/lib/toplevel/config_common.mdx +++ b/rules/lib/toplevel/config_common.mdx @@ -2,14 +2,12 @@ title: 'config\_common' --- - - Functions for Starlark to interact with Blaze's configurability APIs. ## Members -- [FeatureFlagInfo](#FeatureFlagInfo) -- [toolchain\_type](#toolchain_type) +* [FeatureFlagInfo](#FeatureFlagInfo) +* [toolchain\_type](#toolchain_type) ## FeatureFlagInfo @@ -17,9 +15,7 @@ Functions for Starlark to interact with Blaze's configurability APIs. Provider config_common.FeatureFlagInfo ``` - The key used to retrieve the provider containing config\_feature\_flag's value. - - +The key used to retrieve the provider containing config\_feature\_flag's value. ## toolchain\_type @@ -27,16 +23,11 @@ Provider config_common.FeatureFlagInfo toolchain_type config_common.toolchain_type(name, *, mandatory=True) ``` - Declare a rule's dependency on a toolchain type. - +Declare a rule's dependency on a toolchain type. ### Parameters -ParameterDescription`name`[string](../core/string.html); or [Label](../builtins/Label.html); - required - - The toolchain type that is required. - `mandatory`[bool](../core/bool.html); - default is `True` - - Whether the toolchain type is mandatory or optional. +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); or [Label](../builtins/Label); required The toolchain type that is required. | +| `mandatory` | [bool](../core/bool); default is `True` Whether the toolchain type is mandatory or optional. | \ No newline at end of file diff --git a/rules/lib/toplevel/coverage_common.mdx b/rules/lib/toplevel/coverage_common.mdx index e951e3914..d29ebc2ae 100644 --- a/rules/lib/toplevel/coverage_common.mdx +++ b/rules/lib/toplevel/coverage_common.mdx @@ -2,13 +2,11 @@ title: 'coverage\_common' --- - - Helper functions to access coverage-related infrastructure. ## Members -- [instrumented\_files\_info](#instrumented_files_info) +* [instrumented\_files\_info](#instrumented_files_info) ## instrumented\_files\_info @@ -16,30 +14,15 @@ Helper functions to access coverage-related infrastructure. InstrumentedFilesInfo coverage_common.instrumented_files_info(ctx, *, source_attributes=[], dependency_attributes=[], extensions=None, metadata_files=[], baseline_coverage_files=None) ``` - Creates a new [InstrumentedFilesInfo](../providers/InstrumentedFilesInfo.html) instance. Use this provider to communicate coverage-related attributes of the current build rule. - +Creates a new [InstrumentedFilesInfo](../providers/InstrumentedFilesInfo) instance. Use this provider to communicate coverage-related attributes of the current build rule. ### Parameters -ParameterDescription`ctx`[ctx](../builtins/ctx.html); - required - - The rule context. - `source_attributes`[sequence](../core/list.html); - default is `[]` - - A list of attribute names which contain source files processed by this rule. - `dependency_attributes`[sequence](../core/list.html); - default is `[]` - - A list of attribute names which might provide runtime dependencies (either code dependencies or runfiles). - `extensions`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - File extensions used to filter files from source\_attributes. For example, 'js'. If not provided (or None), then all files from source\_attributes will be added to instrumented files, if an empty list is provided, then no files from source attributes will be added. - `metadata_files`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - - Additional files required to generate coverage LCOV files after code execution. e.g. .gcno files for C++. - `baseline_coverage_files`[sequence](../core/list.html) of [File](../builtins/File.html) s; or `None`; - default is `None` +| Parameter | Description | +| --- | --- | +| `ctx` | [ctx](../builtins/ctx); required The rule context. | +| `source_attributes` | [sequence](../core/list); default is `[]` A list of attribute names which contain source files processed by this rule. | +| `dependency_attributes` | [sequence](../core/list); default is `[]` A list of attribute names which might provide runtime dependencies (either code dependencies or runfiles). | +| `extensions` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` File extensions used to filter files from source\_attributes. For example, 'js'. If not provided (or None), then all files from source\_attributes will be added to instrumented files, if an empty list is provided, then no files from source attributes will be added. | +| `metadata_files` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` Additional files required to generate coverage LCOV files after code execution. e.g. .gcno files for C++. | +| `baseline_coverage_files` | [sequence](../core/list) of [File](../builtins/File)s; or `None`; default is `None` | \ No newline at end of file diff --git a/rules/lib/toplevel/java_common.mdx b/rules/lib/toplevel/java_common.mdx index f3dae10cb..4364854c7 100644 --- a/rules/lib/toplevel/java_common.mdx +++ b/rules/lib/toplevel/java_common.mdx @@ -2,20 +2,18 @@ title: 'java\_common' --- - - Utilities for Java compilation support in Starlark. ## Members -- [BootClassPathInfo](#BootClassPathInfo) -- [compile](#compile) -- [JavaRuntimeInfo](#JavaRuntimeInfo) -- [JavaToolchainInfo](#JavaToolchainInfo) -- [merge](#merge) -- [pack\_sources](#pack_sources) -- [run\_ijar](#run_ijar) -- [stamp\_jar](#stamp_jar) +* [BootClassPathInfo](#BootClassPathInfo) +* [compile](#compile) +* [JavaRuntimeInfo](#JavaRuntimeInfo) +* [JavaToolchainInfo](#JavaToolchainInfo) +* [merge](#merge) +* [pack\_sources](#pack_sources) +* [run\_ijar](#run_ijar) +* [stamp\_jar](#stamp_jar) ## BootClassPathInfo @@ -23,9 +21,7 @@ Utilities for Java compilation support in Starlark. Provider java_common.BootClassPathInfo ``` - The provider used to supply bootclasspath information - - +The provider used to supply bootclasspath information ## compile @@ -33,111 +29,38 @@ Provider java_common.BootClassPathInfo struct java_common.compile(ctx, *, source_jars=[], source_files=[], output, output_source_jar=None, javac_opts=[], deps=[], runtime_deps=[], exports=[], plugins=[], exported_plugins=[], native_libraries=[], annotation_processor_additional_inputs=[], annotation_processor_additional_outputs=[], strict_deps='ERROR', java_toolchain, bootclasspath=None, sourcepath=[], resources=[], resource_jars=[], classpath_resources=[], neverlink=False, enable_annotation_processing=True, enable_compile_jar_action=True, add_exports=[], add_opens=[]) ``` - Compiles Java source files/jars from the implementation of a Starlark rule and returns a provider that represents the results of the compilation and can be added to the set of providers emitted by this rule. - +Compiles Java source files/jars from the implementation of a Starlark rule and returns a provider that represents the results of the compilation and can be added to the set of providers emitted by this rule. ### Parameters -ParameterDescription`ctx`[ctx](../builtins/ctx.html); - required - - The rule context. - `source_jars`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - - A list of the jars to be compiled. At least one of source\_jars or source\_files should be specified. - `source_files`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - - A list of the Java source files to be compiled. At least one of source\_jars or source\_files should be specified. - `output`[File](../builtins/File.html); - required - -`output_source_jar`[File](../builtins/File.html); or `None`; - default is `None` - - The output source jar. Defaults to \`{output\_jar}-src.jar\` if unset. - `javac_opts`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - A list of the desired javac options. - `deps`[sequence](../core/list.html) of [struct](../builtins/struct.html) s; - default is `[]` - - A list of dependencies. - `runtime_deps`[sequence](../core/list.html) of [struct](../builtins/struct.html) s; - default is `[]` - - A list of runtime dependencies. - `exports`[sequence](../core/list.html) of [struct](../builtins/struct.html) s; - default is `[]` - - A list of exports. - `plugins`[sequence](../core/list.html) of [struct](../builtins/struct.html) s; or [sequence](../core/list.html) of [struct](../builtins/struct.html) s; - default is `[]` - - A list of plugins. - `exported_plugins`[sequence](../core/list.html) of [struct](../builtins/struct.html) s; or [sequence](../core/list.html) of [struct](../builtins/struct.html) s; - default is `[]` - - A list of exported plugins. - `native_libraries`[sequence](../core/list.html) of [CcInfo](../providers/CcInfo.html) s; - default is `[]` - - CC native library dependencies that are needed for this library. - `annotation_processor_additional_inputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - - A list of inputs that the Java compilation action will take in addition to the Java sources for annotation processing. - `annotation_processor_additional_outputs`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - - A list of outputs that the Java compilation action will output in addition to the class jar from annotation processing. - `strict_deps`[string](../core/string.html); - default is `'ERROR'` - - A string that specifies how to handle strict deps. Possible values: 'OFF', 'ERROR', 'WARN' and 'DEFAULT'. For more details see [`--strict_java_deps flag`](/docs/user-manual#flag--strict_java_deps) `. By default 'ERROR'. - ``java_toolchain` - Info; - required - - A JavaToolchainInfo to be used for this compilation. Mandatory. - `bootclasspath` - default is `None` - - A BootClassPathInfo to be used for this compilation. If present, overrides the bootclasspath associated with the provided java\_toolchain. - `sourcepath`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - -`resources`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - -`resource_jars`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - -`classpath_resources`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - -`neverlink`[bool](../core/bool.html); - default is `False` - -`enable_annotation_processing`[bool](../core/bool.html); - default is `True` - - Disables annotation processing in this compilation, causing any annotation processors provided in plugins or in exported\_plugins of deps to be ignored. - `enable_compile_jar_action`[bool](../core/bool.html); - default is `True` - - Enables header compilation or ijar creation. If set to False, it forces use of the full class jar in the compilation classpaths of any dependants. Doing so is intended for use by non-library targets such as binaries that do not have dependants. - `add_exports`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Allow this library to access the given /. - `add_opens`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Allow this library to reflectively access the given /. - +| Parameter | Description | +| --- | --- | +| `ctx` | [ctx](../builtins/ctx); required The rule context. | +| `source_jars` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` A list of the jars to be compiled. At least one of source\_jars or source\_files should be specified. | +| `source_files` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` A list of the Java source files to be compiled. At least one of source\_jars or source\_files should be specified. | +| `output` | [File](../builtins/File); required | +| `output_source_jar` | [File](../builtins/File); or `None`; default is `None` The output source jar. Defaults to `{output\_jar}-src.jar` if unset. | +| `javac_opts` | [sequence](../core/list) of [string](../core/string)s; default is `[]` A list of the desired javac options. | +| `deps` | [sequence](../core/list) of [struct](../builtins/struct)s; default is `[]` A list of dependencies. | +| `runtime_deps` | [sequence](../core/list) of [struct](../builtins/struct)s; default is `[]` A list of runtime dependencies. | +| `exports` | [sequence](../core/list) of [struct](../builtins/struct)s; default is `[]` A list of exports. | +| `plugins` | [sequence](../core/list) of [struct](../builtins/struct)s; or [sequence](../core/list) of [struct](../builtins/struct)s; default is `[]` A list of plugins. | +| `exported_plugins` | [sequence](../core/list) of [struct](../builtins/struct)s; or [sequence](../core/list) of [struct](../builtins/struct)s; default is `[]` A list of exported plugins. | +| `native_libraries` | [sequence](../core/list) of [CcInfo](../providers/CcInfo)s; default is `[]` CC native library dependencies that are needed for this library. | +| `annotation_processor_additional_inputs` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` A list of inputs that the Java compilation action will take in addition to the Java sources for annotation processing. | +| `annotation_processor_additional_outputs` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` A list of outputs that the Java compilation action will output in addition to the class jar from annotation processing. | +| `strict_deps` | [string](../core/string); default is `'ERROR'` A string that specifies how to handle strict deps. Possible values: 'OFF', 'ERROR', 'WARN' and 'DEFAULT'. For more details see [`--strict_java_deps flag`](/docs/user-manual#flag--strict_java_deps). By default 'ERROR'. | +| `java_toolchain` | Info; required A JavaToolchainInfo to be used for this compilation. Mandatory. | +| `bootclasspath` | default is `None` A BootClassPathInfo to be used for this compilation. If present, overrides the bootclasspath associated with the provided java\_toolchain. | +| `sourcepath` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` | +| `resources` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` | +| `resource_jars` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` | +| `classpath_resources` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` | +| `neverlink` | [bool](../core/bool); default is `False` | +| `enable_annotation_processing` | [bool](../core/bool); default is `True` Disables annotation processing in this compilation, causing any annotation processors provided in plugins or in exported\_plugins of deps to be ignored. | +| `enable_compile_jar_action` | [bool](../core/bool); default is `True` Enables header compilation or ijar creation. If set to False, it forces use of the full class jar in the compilation classpaths of any dependants. Doing so is intended for use by non-library targets such as binaries that do not have dependants. | +| `add_exports` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Allow this library to access the given /. | +| `add_opens` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Allow this library to reflectively access the given /. | ## JavaRuntimeInfo @@ -145,9 +68,7 @@ ParameterDescription`ctx`[ctx](../builtins/ctx.html); Provider java_common.JavaRuntimeInfo ``` - The key used to retrieve the provider that contains information about the Java runtime being used. - - +The key used to retrieve the provider that contains information about the Java runtime being used. ## JavaToolchainInfo @@ -155,9 +76,7 @@ Provider java_common.JavaRuntimeInfo Provider java_common.JavaToolchainInfo ``` - The key used to retrieve the provider that contains information about the Java toolchain being used. - - +The key used to retrieve the provider that contains information about the Java toolchain being used. ## merge @@ -165,16 +84,13 @@ Provider java_common.JavaToolchainInfo struct java_common.merge(providers) ``` - Merges the given providers into a single JavaInfo. - +Merges the given providers into a single JavaInfo. ### Parameters -ParameterDescription`providers`[sequence](../core/list.html) of [struct](../builtins/struct.html) s; - required - - The list of providers to merge. - +| Parameter | Description | +| --- | --- | +| `providers` | [sequence](../core/list) of [struct](../builtins/struct)s; required The list of providers to merge. | ## pack\_sources @@ -182,37 +98,21 @@ ParameterDescription`providers`[sequence](../core/list.html) of [struct](../buil File java_common.pack_sources(actions, *, output_source_jar=None, sources=[], source_jars=[], java_toolchain) ``` - Packs sources and source jars into a single source jar file. The return value is typically passed to +Packs sources and source jars into a single source jar file. The return value is typically passed to `JavaInfo#source_jar` .At least one of parameters output\_jar or output\_source\_jar is required. - ### Parameters -ParameterDescription`actions`[actions](../builtins/actions.html); - required - - ctx.actions - `output_source_jar`[File](../builtins/File.html); or `None`; - default is `None` - - The output source jar. - `sources`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - - A list of Java source files to be packed into the source jar. - `source_jars`[sequence](../core/list.html) of [File](../builtins/File.html) s; - default is `[]` - - A list of source jars to be packed into the source jar. - `java_toolchain` - Info; - required - - A JavaToolchainInfo to used to find the ijar tool. - +| Parameter | Description | +| --- | --- | +| `actions` | [actions](../builtins/actions); required ctx.actions | +| `output_source_jar` | [File](../builtins/File); or `None`; default is `None` The output source jar. | +| `sources` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` A list of Java source files to be packed into the source jar. | +| `source_jars` | [sequence](../core/list) of [File](../builtins/File)s; default is `[]` A list of source jars to be packed into the source jar. | +| `java_toolchain` | Info; required A JavaToolchainInfo to used to find the ijar tool. | ## run\_ijar @@ -220,29 +120,16 @@ ParameterDescription`actions`[actions](../builtins/actions.html); File java_common.run_ijar(actions, *, jar, target_label=None, java_toolchain) ``` - Runs ijar on a jar, stripping it of its method bodies. This helps reduce rebuilding of dependent jars during any recompiles consisting only of simple changes to method implementations. The return value is typically passed to `JavaInfo#compile_jar`. - +Runs ijar on a jar, stripping it of its method bodies. This helps reduce rebuilding of dependent jars during any recompiles consisting only of simple changes to method implementations. The return value is typically passed to `JavaInfo#compile_jar`. ### Parameters -ParameterDescription`actions`[actions](../builtins/actions.html); - required - - ctx.actions - `jar`[File](../builtins/File.html); - required - - The jar to run ijar on. - `target_label`[Label](../builtins/Label.html); or `None`; - default is `None` - - A target label to stamp the jar with. Used for `add_dep` support. Typically, you would pass `ctx.label` to stamp the jar with the current rule's label. - `java_toolchain` - Info; - required - - A JavaToolchainInfo to used to find the ijar tool. - +| Parameter | Description | +| --- | --- | +| `actions` | [actions](../builtins/actions); required ctx.actions | +| `jar` | [File](../builtins/File); required The jar to run ijar on. | +| `target_label` | [Label](../builtins/Label); or `None`; default is `None` A target label to stamp the jar with. Used for `add_dep` support. Typically, you would pass `ctx.label` to stamp the jar with the current rule's label. | +| `java_toolchain` | Info; required A JavaToolchainInfo to used to find the ijar tool. | ## stamp\_jar @@ -250,25 +137,13 @@ ParameterDescription`actions`[actions](../builtins/actions.html); File java_common.stamp_jar(actions, *, jar, target_label, java_toolchain) ``` - Stamps a jar with a target label for `add_dep` support. The return value is typically passed to `JavaInfo#compile_jar`. Prefer to use `run_ijar` when possible. - +Stamps a jar with a target label for `add_dep` support. The return value is typically passed to `JavaInfo#compile_jar`. Prefer to use `run_ijar` when possible. ### Parameters -ParameterDescription`actions`[actions](../builtins/actions.html); - required - - ctx.actions - `jar`[File](../builtins/File.html); - required - - The jar to run stamp\_jar on. - `target_label`[Label](../builtins/Label.html); - required - - A target label to stamp the jar with. Used for `add_dep` support. Typically, you would pass `ctx.label` to stamp the jar with the current rule's label. - `java_toolchain` - Info; - required - - A JavaToolchainInfo to used to find the stamp\_jar tool. +| Parameter | Description | +| --- | --- | +| `actions` | [actions](../builtins/actions); required ctx.actions | +| `jar` | [File](../builtins/File); required The jar to run stamp\_jar on. | +| `target_label` | [Label](../builtins/Label); required A target label to stamp the jar with. Used for `add_dep` support. Typically, you would pass `ctx.label` to stamp the jar with the current rule's label. | +| `java_toolchain` | Info; required A JavaToolchainInfo to used to find the stamp\_jar tool. | \ No newline at end of file diff --git a/rules/lib/toplevel/native.mdx b/rules/lib/toplevel/native.mdx index e8a3a9240..0e317499a 100644 --- a/rules/lib/toplevel/native.mdx +++ b/rules/lib/toplevel/native.mdx @@ -2,27 +2,24 @@ title: 'native' --- - - A built-in module to support native rules and other package helper functions. All native rules appear as functions in this module, e.g. `native.cc_library`. Note that the native module is only available in the loading phase (i.e. for macros, not for rule implementations). Attributes will ignore `None` values, and treat them as if the attribute was unset. - The following functions are also available: ## Members -- [existing\_rule](#existing_rule) -- [existing\_rules](#existing_rules) -- [exports\_files](#exports_files) -- [glob](#glob) -- [module\_name](#module_name) -- [module\_version](#module_version) -- [package\_default\_visibility](#package_default_visibility) -- [package\_group](#package_group) -- [package\_name](#package_name) -- [package\_relative\_label](#package_relative_label) -- [repo\_name](#repo_name) -- [repository\_name](#repository_name) -- [subpackages](#subpackages) +* [existing\_rule](#existing_rule) +* [existing\_rules](#existing_rules) +* [exports\_files](#exports_files) +* [glob](#glob) +* [module\_name](#module_name) +* [module\_version](#module_version) +* [package\_default\_visibility](#package_default_visibility) +* [package\_group](#package_group) +* [package\_name](#package_name) +* [package\_relative\_label](#package_relative_label) +* [repo\_name](#repo_name) +* [repository\_name](#repository_name) +* [subpackages](#subpackages) ## existing\_rule @@ -30,30 +27,27 @@ The following functions are also available: unknown native.existing_rule(name) ``` - Returns an immutable dict-like object that describes the attributes of a rule instantiated in this thread's package, or `None` if no rule instance of that name exists. +Returns an immutable dict-like object that describes the attributes of a rule instantiated in this thread's package, or `None` if no rule instance of that name exists. -Here, an _immutable dict-like object_ means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. +Here, an *immutable dict-like object* means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. The result contains an entry for each attribute, with the exception of private ones (whose names do not start with a letter) and a few unrepresentable legacy attribute types. In addition, the dict contains entries for the rule instance's `name` and `kind` (for example, `'cc_binary'`). The values of the result represent attribute values as follows: -- Attributes of type str, int, and bool are represented as is. -- Labels are converted to strings of the form `':foo'` for targets in the same package or `'//pkg:name'` for targets in a different package. -- Lists are represented as tuples, and dicts are converted to new, mutable dicts. Their elements are recursively converted in the same fashion. -- `select` values are returned with their contents transformed as described above. -- Attributes for which no value was specified during rule instantiation and whose default value is computed are excluded from the result. (Computed defaults cannot be computed until the analysis phase.). +* Attributes of type str, int, and bool are represented as is. +* Labels are converted to strings of the form `':foo'` for targets in the same package or `'//pkg:name'` for targets in a different package. +* Lists are represented as tuples, and dicts are converted to new, mutable dicts. Their elements are recursively converted in the same fashion. +* `select` values are returned with their contents transformed as described above. +* Attributes for which no value was specified during rule instantiation and whose default value is computed are excluded from the result. (Computed defaults cannot be computed until the analysis phase.). If possible, use this function only in [implementation functions of rule finalizer symbolic macros](https://bazel.build/extending/macros#finalizers). Use of this function in other contexts is not recommened, and will be disabled in a future Bazel release; it makes `BUILD` files brittle and order-dependent. Also, beware that it differs subtly from the two other conversions of rule attribute values from internal form to Starlark: one used by computed defaults, the other used by `ctx.attr.foo`. - ### Parameters -ParameterDescription`name`[string](../core/string.html); - required - - The name of the target. - +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); required | ## existing\_rules @@ -61,38 +55,27 @@ ParameterDescription`name`[string](../core/string.html); unknown native.existing_rules() ``` - Returns an immutable dict-like object describing the rules so far instantiated in this thread's package. Each entry of the dict-like object maps the name of the rule instance to the result that would be returned by `existing_rule(name)`. +Returns an immutable dict-like object describing the rules so far instantiated in this thread's package. Each entry of the dict-like object maps the name of the rule instance to the result that would be returned by `existing_rule(name)`. -Here, an _immutable dict-like object_ means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. +Here, an *immutable dict-like object* means a deeply immutable object `x` supporting dict-like iteration, `len(x)`, `name in x`, `x[name]`, `x.get(name)`, `x.items()`, `x.keys()`, and `x.values()`. If possible, use this function only in [implementation functions of rule finalizer symbolic macros](https://bazel.build/extending/macros#finalizers). Use of this function in other contexts is not recommened, and will be disabled in a future Bazel release; it makes `BUILD` files brittle and order-dependent. - - ## exports\_files ``` None native.exports_files(srcs, visibility=None, licenses=None) ``` - Specifies a list of files belonging to this package that are exported to other packages. - +Specifies a list of files belonging to this package that are exported to other packages. ### Parameters -ParameterDescription`srcs`[sequence](../core/list.html) of [string](../core/string.html) s; - required - - The list of files to export. - `visibility`[sequence](../core/list.html); or `None`; - default is `None` - - A visibility declaration can to be specified. The files will be visible to the targets specified. If no visibility is specified, the files will be visible to every package. - `licenses`[sequence](../core/list.html) of [string](../core/string.html) s; or `None`; - default is `None` - - Licenses to be specified. - +| Parameter | Description | +| --- | --- | +| `srcs` | [sequence](../core/list) of [string](../core/string)s; required The list of files to export. | +| `visibility` | [sequence](../core/list); or `None`; default is `None` A visibility declaration can to be specified. The files will be visible to the targets specified. If no visibility is specified, the files will be visible to every package. | +| `licenses` | [sequence](../core/list) of [string](../core/string)s; or `None`; default is `None` Licenses to be specified. | ## glob @@ -100,33 +83,21 @@ ParameterDescription`srcs`[sequence](../core/list.html) of [string](../core/stri sequence native.glob(include=[], exclude=[], exclude_directories=1, allow_empty=unbound) ``` - Glob returns a new, mutable, sorted list of every file in the current package that: +Glob returns a new, mutable, sorted list of every file in the current package that: -- Matches at least one pattern in `include`. -- Does not match any of the patterns in `exclude` (default `[]`). +* Matches at least one pattern in `include`. +* Does not match any of the patterns in `exclude` (default `[]`). If the `exclude_directories` argument is enabled (set to `1`), files of type directory will be omitted from the results (default `1`). - ### Parameters -ParameterDescription`include`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - The list of glob patterns to include. - `exclude`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - The list of glob patterns to exclude. - `exclude_directories`[int](../core/int.html); - default is `1` - - A flag whether to exclude directories or not. - `allow_empty` - default is `unbound` - - Whether we allow glob patterns to match nothing. If \`allow\_empty\` is False, each individual include pattern must match something and also the final result must be non-empty (after the matches of the \`exclude\` patterns are excluded). - +| Parameter | Description | +| --- | --- | +| `include` | [sequence](../core/list) of [string](../core/string)s; default is `[]` The list of glob patterns to include. | +| `exclude` | [sequence](../core/list) of [string](../core/string)s; default is `[]` The list of glob patterns to exclude. | +| `exclude_directories` | [int](../core/int); default is `1` A flag whether to exclude directories or not. | +| `allow_empty` | default is `unbound` Whether we allow glob patterns to match nothing. If `allow\_empty` is False, each individual include pattern must match something and also the final result must be non-empty (after the matches of the `exclude` patterns are excluded). | ## module\_name @@ -134,10 +105,8 @@ ParameterDescription`include`[sequence](../core/list.html) of [string](../core/s string native.module_name() ``` - The name of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the name of the module hosting the extension. It's the same as the `module.name` field seen in `module_ctx.modules`. - May return `None`. - - +The name of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the name of the module hosting the extension. It's the same as the `module.name` field seen in `module_ctx.modules`. +May return `None`. ## module\_version @@ -145,10 +114,8 @@ string native.module_name() string native.module_version() ``` - The version of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the version of the module hosting the extension. It's the same as the `module.version` field seen in `module_ctx.modules`. - May return `None`. - - +The version of the Bazel module associated with the repo this package is in. If this package is from a repo defined in WORKSPACE instead of MODULE.bazel, this is empty. For repos generated by module extensions, this is the version of the module hosting the extension. It's the same as the `module.version` field seen in `module_ctx.modules`. +May return `None`. ## package\_default\_visibility @@ -156,9 +123,7 @@ string native.module_version() List native.package_default_visibility() ``` - Returns the default visibility of the package being evaluated. This is the value of the `default_visibility` parameter of `package()`, extended to include the package itself. - - +Returns the default visibility of the package being evaluated. This is the value of the `default_visibility` parameter of `package()`, extended to include the package itself. ## package\_group @@ -166,24 +131,15 @@ List native.package_default_visibility() None native.package_group(*, name, packages=[], includes=[]) ``` - This function defines a set of packages and assigns a label to the group. The label can be referenced in `visibility` attributes. - +This function defines a set of packages and assigns a label to the group. The label can be referenced in `visibility` attributes. ### Parameters -ParameterDescription`name`[string](../core/string.html); - required - - The unique name for this rule. - `packages`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - A complete enumeration of packages in this group. - `includes`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - Other package groups that are included in this one. - +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); required The unique name for this rule. | +| `packages` | [sequence](../core/list) of [string](../core/string)s; default is `[]` A complete enumeration of packages in this group. | +| `includes` | [sequence](../core/list) of [string](../core/string)s; default is `[]` Other package groups that are included in this one. | ## package\_name @@ -191,9 +147,7 @@ ParameterDescription`name`[string](../core/string.html); string native.package_name() ``` - The name of the package being evaluated, without the repository name. For example, in the BUILD file `some/package/BUILD`, its value will be `some/package`. If the BUILD file calls a function defined in a .bzl file, `package_name()` will match the caller BUILD file package. The value will always be an empty string for the root package. - - +The name of the package being evaluated, without the repository name. For example, in the BUILD file `some/package/BUILD`, its value will be `some/package`. If the BUILD file calls a function defined in a .bzl file, `package_name()` will match the caller BUILD file package. The value will always be an empty string for the root package. ## package\_relative\_label @@ -201,22 +155,19 @@ string native.package_name() Label native.package_relative_label(input) ``` - Converts the input string into a [Label](../builtins/Label.html) object, in the context of the package currently being initialized (that is, the `BUILD` file for which the current macro is executing). If the input is already a `Label`, it is returned unchanged. +Converts the input string into a [Label](../builtins/Label) object, in the context of the package currently being initialized (that is, the `BUILD` file for which the current macro is executing). If the input is already a `Label`, it is returned unchanged. This function may only be called while evaluating a BUILD file and the macros it directly or indirectly calls; it may not be called in (for instance) a rule implementation function. The result of this function is the same `Label` value as would be produced by passing the given string to a label-valued attribute of a target declared in the BUILD file. -_Usage note:_ The difference between this function and [Label()](../builtins/Label.html#Label) is that `Label()` uses the context of the package of the `.bzl` file that called it, not the package of the `BUILD` file. Use `Label()` when you need to refer to a fixed target that is hardcoded into the macro, such as a compiler. Use `package_relative_label()` when you need to normalize a label string supplied by the BUILD file to a `Label` object. (There is no way to convert a string to a `Label` in the context of a package other than the BUILD file or the calling .bzl file. For that reason, outer macros should always prefer to pass Label objects to inner macros rather than label strings.) [`ctx.package_relative_label()`](ctx.html#package_relative_label) provides the same functionality within a rule or aspect implementation function. - +*Usage note:* The difference between this function and [Label()](../builtins/Label#Label) is that `Label()` uses the context of the package of the `.bzl` file that called it, not the package of the `BUILD` file. Use `Label()` when you need to refer to a fixed target that is hardcoded into the macro, such as a compiler. Use `package_relative_label()` when you need to normalize a label string supplied by the BUILD file to a `Label` object. (There is no way to convert a string to a `Label` in the context of a package other than the BUILD file or the calling .bzl file. For that reason, outer macros should always prefer to pass Label objects to inner macros rather than label strings.)[`ctx.package_relative_label()`](ctx#package_relative_label) provides the same functionality within a rule or aspect implementation function. ### Parameters -ParameterDescription`input`[string](../core/string.html); or [Label](../builtins/Label.html); - required - - The input label string or Label object. If a Label object is passed, it's returned as is. - +| Parameter | Description | +| --- | --- | +| `input` | [string](../core/string); or [Label](../builtins/Label); required The input label string or Label object. If a Label object is passed, it's returned as is. | ## repo\_name @@ -224,9 +175,7 @@ ParameterDescription`input`[string](../core/string.html); or [Label](../builtins string native.repo_name() ``` - The canonical name of the repository containing the package currently being evaluated, with no leading at-signs. - - +The canonical name of the repository containing the package currently being evaluated, with no leading at-signs. ## repository\_name @@ -234,13 +183,10 @@ string native.repo_name() string native.repository_name() ``` - **Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` - +**Experimental**. This API is experimental and may change at any time. Please do not depend on it. It may be enabled on an experimental basis by setting `--+incompatible_enable_deprecated_label_apis` **Deprecated.** Prefer to use [`repo_name`](#repo_name) instead, which doesn't contain the spurious leading at-sign, but behaves identically otherwise. -The canonical name of the repository containing the package currently being evaluated, with a single at-sign ( `@`) prefixed. For example, in packages that are called into existence by the WORKSPACE stanza `local_repository(name='local', path=...)` it will be set to `@local`. In packages in the main repository, it will be set to `@`. - - +The canonical name of the repository containing the package currently being evaluated, with a single at-sign (`@`) prefixed. For example, in packages that are called into existence by the WORKSPACE stanza `local_repository(name='local', path=...)` it will be set to `@local`. In packages in the main repository, it will be set to `@`. ## subpackages @@ -248,20 +194,12 @@ The canonical name of the repository containing the package currently being eval sequence native.subpackages(*, include, exclude=[], allow_empty=False) ``` - Returns a new mutable list of every direct subpackage of the current package, regardless of file-system directory depth. List returned is sorted and contains the names of subpackages relative to the current package. It is advised to prefer using the methods in bazel\_skylib.subpackages module rather than calling this function directly. - +Returns a new mutable list of every direct subpackage of the current package, regardless of file-system directory depth. List returned is sorted and contains the names of subpackages relative to the current package. It is advised to prefer using the methods in bazel\_skylib.subpackages module rather than calling this function directly. ### Parameters -ParameterDescription`include`[sequence](../core/list.html) of [string](../core/string.html) s; - required - - The list of glob patterns to include in subpackages scan. - `exclude`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - The list of glob patterns to exclude from subpackages scan. - `allow_empty`[bool](../core/bool.html); - default is `False` - - Whether we fail if the call returns an empty list. By default empty list indicates potential error in BUILD file where the call to subpackages() is superflous. Setting to true allows this function to succeed in that case. +| Parameter | Description | +| --- | --- | +| `include` | [sequence](../core/list) of [string](../core/string)s; required | +| `exclude` | [sequence](../core/list) of [string](../core/string)s; default is `[]` The list of glob patterns to exclude from subpackages scan. | +| `allow_empty` | [bool](../core/bool); default is `False` Whether we fail if the call returns an empty list. By default empty list indicates potential error in BUILD file where the call to subpackages() is superflous. Setting to true allows this function to succeed in that case. | \ No newline at end of file diff --git a/rules/lib/toplevel/platform_common.mdx b/rules/lib/toplevel/platform_common.mdx index 2534821fc..17edc7c5e 100644 --- a/rules/lib/toplevel/platform_common.mdx +++ b/rules/lib/toplevel/platform_common.mdx @@ -2,17 +2,15 @@ title: 'platform\_common' --- - - Functions for Starlark to interact with the platform APIs. ## Members -- [ConstraintSettingInfo](#ConstraintSettingInfo) -- [ConstraintValueInfo](#ConstraintValueInfo) -- [PlatformInfo](#PlatformInfo) -- [TemplateVariableInfo](#TemplateVariableInfo) -- [ToolchainInfo](#ToolchainInfo) +* [ConstraintSettingInfo](#ConstraintSettingInfo) +* [ConstraintValueInfo](#ConstraintValueInfo) +* [PlatformInfo](#PlatformInfo) +* [TemplateVariableInfo](#TemplateVariableInfo) +* [ToolchainInfo](#ToolchainInfo) ## ConstraintSettingInfo @@ -20,9 +18,8 @@ Functions for Starlark to interact with the platform APIs. Provider platform_common.ConstraintSettingInfo ``` - The constructor/key for the [ConstraintSettingInfo](../providers/ConstraintSettingInfo.html) provider. - -_Note: This API is experimental and may change at any time. It is disabled by default, but may be enabled with `--experimental_platforms_api`_ +The constructor/key for the [ConstraintSettingInfo](../providers/ConstraintSettingInfo) provider. +*Note: This API is experimental and may change at any time. It is disabled by default, but may be enabled with `--experimental_platforms_api`* ## ConstraintValueInfo @@ -30,9 +27,8 @@ _Note: This API is experimental and may change at any time. It is disabled by de Provider platform_common.ConstraintValueInfo ``` - The constructor/key for the [ConstraintValueInfo](../providers/ConstraintValueInfo.html) provider. - -_Note: This API is experimental and may change at any time. It is disabled by default, but may be enabled with `--experimental_platforms_api`_ +The constructor/key for the [ConstraintValueInfo](../providers/ConstraintValueInfo) provider. +*Note: This API is experimental and may change at any time. It is disabled by default, but may be enabled with `--experimental_platforms_api`* ## PlatformInfo @@ -40,9 +36,8 @@ _Note: This API is experimental and may change at any time. It is disabled by de Provider platform_common.PlatformInfo ``` - The constructor/key for the [PlatformInfo](../providers/PlatformInfo.html) provider. - -_Note: This API is experimental and may change at any time. It is disabled by default, but may be enabled with `--experimental_platforms_api`_ +The constructor/key for the [PlatformInfo](../providers/PlatformInfo) provider. +*Note: This API is experimental and may change at any time. It is disabled by default, but may be enabled with `--experimental_platforms_api`* ## TemplateVariableInfo @@ -50,9 +45,7 @@ _Note: This API is experimental and may change at any time. It is disabled by de Provider platform_common.TemplateVariableInfo ``` - The constructor/key for the [TemplateVariableInfo](../providers/TemplateVariableInfo.html) provider. - - +The constructor/key for the [TemplateVariableInfo](../providers/TemplateVariableInfo) provider. ## ToolchainInfo @@ -60,4 +53,4 @@ Provider platform_common.TemplateVariableInfo Provider platform_common.ToolchainInfo ``` - The constructor/key for the [ToolchainInfo](../providers/ToolchainInfo.html) provider. +The constructor/key for the [ToolchainInfo](../providers/ToolchainInfo) provider. \ No newline at end of file diff --git a/rules/lib/toplevel/proto.mdx b/rules/lib/toplevel/proto.mdx index 264650b5f..9ebc97e55 100644 --- a/rules/lib/toplevel/proto.mdx +++ b/rules/lib/toplevel/proto.mdx @@ -2,13 +2,11 @@ title: 'proto' --- - - A module for protocol message processing. ## Members -- [encode\_text](#encode_text) +* [encode\_text](#encode_text) ## encode\_text @@ -16,7 +14,7 @@ A module for protocol message processing. string proto.encode_text(x) ``` - Returns the struct argument's encoding as a text-format protocol message. +Returns the struct argument's encoding as a text-format protocol message. The data structure must be recursively composed of strings, ints, floats, or bools, or structs, sequences, and dicts of these types. A struct is converted to a message. Fields are emitted in name order. @@ -74,11 +72,10 @@ proto.encode_text(struct(foo={4: 3, 2: 1})) # key: 2 # value: 1 # } - ``` ### Parameters -ParameterDescription`x` - structure; or StarlarkEncodable; - required +| Parameter | Description | +| --- | --- | +| `x` | structure; or StarlarkEncodable; required | \ No newline at end of file diff --git a/rules/lib/toplevel/testing.mdx b/rules/lib/toplevel/testing.mdx index b3daf550c..5489113c7 100644 --- a/rules/lib/toplevel/testing.mdx +++ b/rules/lib/toplevel/testing.mdx @@ -2,15 +2,13 @@ title: 'testing' --- - - Helper methods for Starlark to access testing infrastructure. ## Members -- [analysis\_test](#analysis_test) -- [ExecutionInfo](#ExecutionInfo) -- [TestEnvironment](#TestEnvironment) +* [analysis\_test](#analysis_test) +* [ExecutionInfo](#ExecutionInfo) +* [TestEnvironment](#TestEnvironment) ## analysis\_test @@ -18,38 +16,20 @@ Helper methods for Starlark to access testing infrastructure. None testing.analysis_test(name, implementation, attrs={}, fragments=[], toolchains=[], attr_values={}) ``` - Creates a new analysis test target. +Creates a new analysis test target. The number of transitive dependencies of the test are limited. The limit is controlled by `--analysis_testing_deps_limit` flag. - ### Parameters -ParameterDescription`name`[string](../core/string.html); - required - - Name of the target. It should be a Starlark identifier, matching pattern '\[A-Za-z\_\]\[A-Za-z0-9\_\]\*'. - `implementation`[function](../core/function.html); - required - - The Starlark function implementing this analysis test. It must have exactly one parameter: [ctx](../builtins/ctx.html). The function is called during the analysis phase. It can access the attributes declared by `attrs` and populated via `attr_values`. The implementation function may not register actions. Instead, it must register a pass/fail result via providing [AnalysisTestResultInfo](../providers/AnalysisTestResultInfo.html). - `attrs`[dict](../core/dict.html); - default is `{}` - - Dictionary declaring the attributes. See the [rule](../globals/bzl.html#rule) call. Attributes are allowed to use configuration transitions defined using [analysis\_test\_transition](../globals/bzl.html#analysis_test_transition). - `fragments`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - List of configuration fragments that are available to the implementation of the analysis test. - `toolchains`[sequence](../core/list.html); - default is `[]` - - The set of toolchains the test requires. See the [rule](../globals/bzl.html#rule) call. - `attr_values`[dict](../core/dict.html) of [string](../core/string.html) s; - default is `{}` - - Dictionary of attribute values to pass to the implementation. - +| Parameter | Description | +| --- | --- | +| `name` | [string](../core/string); required Name of the target. It should be a Starlark identifier, matching pattern '[A-Za-z\_][A-Za-z0-9\_]\*'. | +| `implementation` | [function](../core/function); required The Starlark function implementing this analysis test. It must have exactly one parameter: [ctx](../builtins/ctx). The function is called during the analysis phase. It can access the attributes declared by `attrs` and populated via `attr_values`. The implementation function may not register actions. Instead, it must register a pass/fail result via providing [AnalysisTestResultInfo](../providers/AnalysisTestResultInfo). | +| `attrs` | [dict](../core/dict); default is `{}` Dictionary declaring the attributes. See the [rule](../globals/bzl#rule) call. Attributes are allowed to use configuration transitions defined using [analysis\_test\_transition](../globals/bzl#analysis_test_transition). | +| `fragments` | [sequence](../core/list) of [string](../core/string)s; default is `[]` List of configuration fragments that are available to the implementation of the analysis test. | +| `toolchains` | [sequence](../core/list); default is `[]` The set of toolchains the test requires. See the [rule](../globals/bzl#rule) call. | +| `attr_values` | [dict](../core/dict) of [string](../core/string)s; default is `{}` Dictionary of attribute values to pass to the implementation. | ## ExecutionInfo @@ -57,9 +37,7 @@ ParameterDescription`name`[string](../core/string.html); ExecutionInfo testing.ExecutionInfo ``` - [testing.ExecutionInfo](../providers/ExecutionInfo.html) provider key/constructor - - +[testing.ExecutionInfo](../providers/ExecutionInfo) provider key/constructor ## TestEnvironment @@ -67,16 +45,11 @@ ExecutionInfo testing.ExecutionInfo RunEnvironmentInfo testing.TestEnvironment(environment, inherited_environment=[]) ``` - **Deprecated: Use RunEnvironmentInfo instead.** Creates a new test environment provider. Use this provider to specify extra environment variables to be made available during test execution. - +**Deprecated: Use RunEnvironmentInfo instead.** Creates a new test environment provider. Use this provider to specify extra environment variables to be made available during test execution. ### Parameters -ParameterDescription`environment`[dict](../core/dict.html); - required - - A map of string keys and values that represent environment variables and their values. These will be made available during the test execution. - `inherited_environment`[sequence](../core/list.html) of [string](../core/string.html) s; - default is `[]` - - A sequence of names of environment variables. These variables are made available during the test execution with their current value taken from the shell environment. If a variable is contained in both `environment` and `inherited_environment`, the value inherited from the shell environment will take precedence if set. +| Parameter | Description | +| --- | --- | +| `environment` | [dict](../core/dict); required A map of string keys and values that represent environment variables and their values. These will be made available during the test execution. | +| `inherited_environment` | [sequence](../core/list) of [string](../core/string)s; default is `[]` A sequence of names of environment variables. These variables are made available during the test execution with their current value taken from the shell environment. If a variable is contained in both `environment` and `inherited_environment`, the value inherited from the shell environment will take precedence if set. | \ No newline at end of file diff --git a/rules/windows.mdx b/rules/windows.mdx index e1138c165..0052de347 100644 --- a/rules/windows.mdx +++ b/rules/windows.mdx @@ -2,8 +2,6 @@ title: 'Writing Rules on Windows' --- - - This page focuses on writing Windows-compatible rules, common problems of writing portable rules, and some solutions. @@ -54,7 +52,7 @@ Solutions: - **Use a short output root.** - Use the `--output_user_root=` flag to specify a short path for Bazel outputs. A good idea

    + Use the `--output_user_root=` flag to specify a short path for Bazel outputs. A good idea is to have a drive (or virtual drive) just for Bazel outputs (such as `D:\`), and adding this line to your `.bazelrc` file: @@ -251,20 +249,3 @@ Solutions: In Java, use `try-with-resources`. In Python, use `with open(...) as f:`. In principle, try closing handles as soon as possible. - -