CINXE.COM

Configurations  |  Bazel

<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="157101835696-ooapojlodmuabs2do2vuhhnf90bccmoi.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Bazel"> <meta property="og:type" content="website"><meta name="theme-color" content="#0c713a"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/bazel/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:300,400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/css/app.css"> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/favicon-prod.png"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/touchicon-180.png"><link rel="canonical" href="https://bazel.build/extending/config"><link rel="search" type="application/opensearchdescription+xml" title="Bazel" href="https://bazel.build/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://bazel.build/extending/config" /><link rel="alternate" hreflang="x-default" href="https://bazel.build/extending/config" /><link rel="alternate" hreflang="ar" href="https://bazel.build/extending/config?hl=ar" /><link rel="alternate" hreflang="bn" href="https://bazel.build/extending/config?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://bazel.build/extending/config?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://bazel.build/extending/config?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://bazel.build/extending/config?hl=fa" /><link rel="alternate" hreflang="he" href="https://bazel.build/extending/config?hl=he" /><link rel="alternate" hreflang="hi" href="https://bazel.build/extending/config?hl=hi" /><link rel="alternate" hreflang="id" href="https://bazel.build/extending/config?hl=id" /><link rel="alternate" hreflang="ja" href="https://bazel.build/extending/config?hl=ja" /><link rel="alternate" hreflang="ko" href="https://bazel.build/extending/config?hl=ko" /><link rel="alternate" hreflang="pt-BR" href="https://bazel.build/extending/config?hl=pt-br" /><link rel="alternate" hreflang="es-419" href="https://bazel.build/extending/config?hl=es-419" /><link rel="alternate" hreflang="th" href="https://bazel.build/extending/config?hl=th" /><link rel="alternate" hreflang="tr" href="https://bazel.build/extending/config?hl=tr" /><link rel="alternate" hreflang="vi" href="https://bazel.build/extending/config?hl=vi" /><link rel="alternate" hreflang="en-cn" href="https://bazel.google.cn/extending/config" /><link rel="alternate" hreflang="x-default" href="https://bazel.google.cn/extending/config" /><link rel="alternate" hreflang="ar-cn" href="https://bazel.google.cn/extending/config?hl=ar" /><link rel="alternate" hreflang="bn-cn" href="https://bazel.google.cn/extending/config?hl=bn" /><link rel="alternate" hreflang="zh-Hans-cn" href="https://bazel.google.cn/extending/config?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant-cn" href="https://bazel.google.cn/extending/config?hl=zh-tw" /><link rel="alternate" hreflang="fa-cn" href="https://bazel.google.cn/extending/config?hl=fa" /><link rel="alternate" hreflang="he-cn" href="https://bazel.google.cn/extending/config?hl=he" /><link rel="alternate" hreflang="hi-cn" href="https://bazel.google.cn/extending/config?hl=hi" /><link rel="alternate" hreflang="id-cn" href="https://bazel.google.cn/extending/config?hl=id" /><link rel="alternate" hreflang="ja-cn" href="https://bazel.google.cn/extending/config?hl=ja" /><link rel="alternate" hreflang="ko-cn" href="https://bazel.google.cn/extending/config?hl=ko" /><link rel="alternate" hreflang="pt-BR-cn" href="https://bazel.google.cn/extending/config?hl=pt-br" /><link rel="alternate" hreflang="es-419-cn" href="https://bazel.google.cn/extending/config?hl=es-419" /><link rel="alternate" hreflang="th-cn" href="https://bazel.google.cn/extending/config?hl=th" /><link rel="alternate" hreflang="tr-cn" href="https://bazel.google.cn/extending/config?hl=tr" /><link rel="alternate" hreflang="vi-cn" href="https://bazel.google.cn/extending/config?hl=vi" /><title>Configurations &nbsp;|&nbsp; Bazel</title> <meta property="og:title" content="Configurations &nbsp;|&nbsp; Bazel"><meta property="og:url" content="https://bazel.build/extending/config"><meta property="og:locale" content="en"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Configurations" } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="bazel-theme" type="article" layout="docs" display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <a href="#main-content" class="skip-link button"> Skip to main content </a> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner" data-nosnippet> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="bazel" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <img src="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/lockup.svg" class="devsite-site-logo" alt="Bazel"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab > <a href="https://bazel.build/about" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/about" track-type="nav" track-metadata-position="nav - about bazel" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: About Bazel" track-name="about bazel" > About Bazel </a> </tab> <tab > <a href="https://bazel.build/start" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/start" track-type="nav" track-metadata-position="nav - getting started" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Getting started" track-name="getting started" > Getting started </a> </tab> <tab > <a href="https://bazel.build/docs" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/docs" track-type="nav" track-metadata-position="nav - user guide" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: User guide" track-name="user guide" > User guide </a> </tab> <tab > <a href="https://bazel.build/reference" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/reference" track-type="nav" track-metadata-position="nav - reference" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" > Reference </a> </tab> <tab class="devsite-active"> <a href="https://bazel.build/extending" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/extending" track-type="nav" track-metadata-position="nav - extending" track-metadata-module="primary nav" aria-label="Extending, selected" data-category="Site-Wide Custom Events" data-label="Tab: Extending" track-name="extending" > Extending </a> </tab> <tab > <a href="https://bazel.build/community" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/community" track-type="nav" track-metadata-position="nav - community" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" > Community </a> </tab> <tab class="devsite-dropdown "> <a href="https://bazel.build/versions" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/versions" track-type="nav" track-metadata-position="nav - versioned docs" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Versioned docs" track-name="versioned docs" > Versioned docs </a> <button aria-haspopup="menu" aria-expanded="false" aria-label="Dropdown menu for Versioned docs" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions" track-metadata-position="nav - versioned docs" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Versioned docs" track-name="versioned docs" class="devsite-tabs-dropdown-toggle devsite-icon devsite-icon-arrow-drop-down"></button> <div class="devsite-tabs-dropdown" role="menu" aria-label="submenu" hidden> <div class="devsite-tabs-dropdown-content"> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/8.0.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/8.0.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 8.0 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/7.6.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/7.6.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 7.6 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/7.5.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/7.5.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 7.5 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/7.4.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/7.4.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 7.4 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/7.0.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/7.0.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 7.0 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/6.5.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/6.5.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 6.5 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://docs.bazel.build/versions/5.4.1/bazel-overview.html" track-type="nav" track-metadata-eventdetail="https://docs.bazel.build/versions/5.4.1/bazel-overview.html" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 5.4.1 </div> </a> </li> </ul> </div> <div class="devsite-tabs-dropdown-column "> <ul class="devsite-tabs-dropdown-section "> <li class="devsite-nav-item"> <a href="https://bazel.build/" track-type="nav" track-metadata-eventdetail="https://bazel.build/" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> Nightly </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> More… </div> </a> </li> </ul> </div> </div> </div> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Bazel" tenant-name="Bazel" > <form class="devsite-search-form" action="https://bazel.build/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <a class="devsite-header-link devsite-top-button button gc-analytics-event " href="//github.com/bazelbuild/bazel/" data-category="Site-Wide Custom Events" data-label="Site header link: GitHub" > GitHub </a> <devsite-user enable-profiles id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section "> <div class="devsite-header-background"> <div class="devsite-product-id-row" > <div class="devsite-product-description-row"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://bazel.build/extending" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Lower Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="" > Guides to maximize Bazel&#39;s power through advanced concepts and extensions </a> </li> </ul> </div> </div> <div class="devsite-doc-set-nav-row"> <devsite-tabs class="lower-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Lower tabs"> <tab class="devsite-active"> <a href="https://bazel.build/extending/concepts" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/extending/concepts" track-type="nav" track-metadata-position="nav - concepts" track-metadata-module="primary nav" aria-label="Concepts, selected" data-category="Site-Wide Custom Events" data-label="Tab: Concepts" track-name="concepts" > Concepts </a> </tab> <tab > <a href="https://bazel.build/rules/rules-tutorial" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/rules/rules-tutorial" track-type="nav" track-metadata-position="nav - writing rules" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Writing rules" track-name="writing rules" > Writing rules </a> </tab> <tab > <a href="https://bazel.build/rules/testing" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/rules/testing" track-type="nav" track-metadata-position="nav - distributing rules" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Distributing rules" track-name="distributing rules" > Distributing rules </a> </tab> <tab > <a href="https://bazel.build/rules/lib/overview" class="devsite-tabs-content gc-analytics-event " track-metadata-eventdetail="https://bazel.build/rules/lib/overview" track-type="nav" track-metadata-position="nav - apis" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: APIs" track-name="apis" > APIs </a> </tab> </nav> </devsite-tabs> </div> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars > <div class="devsite-book-nav-filter" > <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="/" class="devsite-site-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Site logo" track-type="globalNav" track-name="bazel" track-metadata-position="nav" track-metadata-eventDetail="nav"> <picture> <img src="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/lockup.svg" class="devsite-site-logo" alt="Bazel"> </picture> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/about" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: About Bazel" track-name="about bazel" data-category="Site-Wide Custom Events" data-label="Responsive Tab: About Bazel" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > About Bazel </span> </a> </li> <li class="devsite-nav-item"> <a href="/start" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Getting started" track-name="getting started" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Getting started" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Getting started </span> </a> </li> <li class="devsite-nav-item"> <a href="/docs" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: User guide" track-name="user guide" data-category="Site-Wide Custom Events" data-label="Responsive Tab: User guide" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > User guide </span> </a> </li> <li class="devsite-nav-item"> <a href="/reference" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Reference" track-name="reference" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Reference" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Reference </span> </a> </li> <li class="devsite-nav-item"> <a href="/extending" class="devsite-nav-title gc-analytics-event devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Extending" track-name="extending" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Extending" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Extending </span> </a> <ul class="devsite-nav-responsive-tabs"> <li class="devsite-nav-item"> <a href="/extending/concepts" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" data-category="Site-Wide Custom Events" data-label="Tab: Concepts" track-name="concepts" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Concepts" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip menu="_book"> Concepts </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> <li class="devsite-nav-item"> <a href="/rules/rules-tutorial" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Writing rules" track-name="writing rules" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Writing rules" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Writing rules </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/rules/testing" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Distributing rules" track-name="distributing rules" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Distributing rules" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Distributing rules </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/rules/lib/overview" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: APIs" track-name="apis" data-category="Site-Wide Custom Events" data-label="Responsive Tab: APIs" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > APIs </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> </ul> </li> <li class="devsite-nav-item"> <a href="/community" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Community" track-name="community" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Community" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Community </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Versioned docs" track-name="versioned docs" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Versioned docs" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Versioned docs </span> </a> <ul class="devsite-nav-responsive-tabs devsite-nav-has-menu "> <li class="devsite-nav-item"> <span class="devsite-nav-title" tooltip data-category="Site-Wide Custom Events" data-label="Tab: Versioned docs" track-name="versioned docs" > <span class="devsite-nav-text" tooltip menu="Versioned docs"> More </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="Versioned docs"> </span> </span> </li> </ul> </li> <li class="devsite-nav-item"> <a href="//github.com/bazelbuild/bazel/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: GitHub" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > GitHub </span> </a> </li> </ul> </div> <div class="devsite-mobile-nav-bottom"> <ul class="devsite-nav-list" menu="_book"> <li class="devsite-nav-item"><a href="/extending/concepts" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/concepts" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/concepts" ><span class="devsite-nav-text" tooltip>Overview</span></a></li> <li class="devsite-nav-item"><a href="/extending/rules" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/rules" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/rules" ><span class="devsite-nav-text" tooltip>Rules</span></a></li> <li class="devsite-nav-item"><a href="/extending/macros" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/macros" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/macros" ><span class="devsite-nav-text" tooltip>Symbolic macros</span></a></li> <li class="devsite-nav-item"><a href="/extending/legacy-macros" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/legacy-macros" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/legacy-macros" ><span class="devsite-nav-text" tooltip>Legacy macros</span></a></li> <li class="devsite-nav-item"><a href="/extending/depsets" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/depsets" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/depsets" ><span class="devsite-nav-text" tooltip>Depsets</span></a></li> <li class="devsite-nav-item"><a href="/extending/aspects" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/aspects" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/aspects" ><span class="devsite-nav-text" tooltip>Aspects</span></a></li> <li class="devsite-nav-item"><a href="/extending/config" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/config" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/config" ><span class="devsite-nav-text" tooltip>Configuring</span></a></li> <li class="devsite-nav-item"><a href="/extending/platforms" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/platforms" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/platforms" ><span class="devsite-nav-text" tooltip>Platforms</span></a></li> <li class="devsite-nav-item"><a href="/extending/toolchains" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/toolchains" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/toolchains" ><span class="devsite-nav-text" tooltip>Toolchains</span></a></li> <li class="devsite-nav-item"><a href="/extending/exec-groups" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/exec-groups" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/exec-groups" ><span class="devsite-nav-text" tooltip>Execution groups</span></a></li> <li class="devsite-nav-item"><a href="/extending/auto-exec-groups" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /extending/auto-exec-groups" track-type="bookNav" track-name="click" track-metadata-eventdetail="/extending/auto-exec-groups" ><span class="devsite-nav-text" tooltip>Automatic execution groups</span></a></li> </ul> <ul class="devsite-nav-list" menu="Versioned docs" aria-label="Side menu" hidden> <li class="devsite-nav-item"> <a href="/versions/8.0.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 8.0" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 8.0 </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/7.6.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 7.6" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 7.6 </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/7.5.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 7.5" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 7.5 </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/7.4.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 7.4" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 7.4 </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/7.0.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 7.0" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 7.0 </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/6.5.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 6.5" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 6.5 </span> </a> </li> <li class="devsite-nav-item"> <a href="https://docs.bazel.build/versions/5.4.1/bazel-overview.html" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 5.4.1" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 5.4.1 </span> </a> </li> <li class="devsite-nav-item"> <a href="/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Nightly" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Nightly </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: More…" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > More… </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" id="main-content" class="devsite-main-content" has-book-nav has-sidebar > <div class="devsite-sidebar"> <div class="devsite-sidebar-content"> <devsite-toc class="devsite-nav" role="navigation" aria-label="On this page" depth="2" scrollbars ></devsite-toc> <devsite-recommendations-sidebar class="nocontent devsite-nav"> </devsite-recommendations-sidebar> </div> </div> <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://bazel.build/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Bazel" > Bazel </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://bazel.build/extending" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="" > Extending </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://bazel.build/extending/concepts" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="3" track-type="globalNav" track-name="breadcrumb" track-metadata-position="3" track-metadata-eventdetail="" > Concepts </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <devsite-feedback position="header" project-name="Bazel" product-id="5052038" bucket="https-bazel-build" context="" version="t-devsite-webserver-20250320-r00-rc00.467841579120382285" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="header" class="nocontent" project-icon="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/touchicon-180.png" > <button> Send feedback </button> </devsite-feedback> <h1 class="devsite-page-title" tabindex="-1"> Configurations <div class="devsite-actions" data-nosnippet> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> </div> </h1> <div class="devsite-page-title-meta"><devsite-view-release-notes></devsite-view-release-notes></div> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <div class="devsite-article-body clearfix "> <p><devsite-mathjax config="TeX-AMS-MML_SVG"></devsite-mathjax></p> <a class="button button-with-icon" href="https://github.com/bazelbuild/bazel/issues/new?title=%5Bbazel.build%5D+Problem+with+/extending/config&template=doc_issue.yml&link=https%3A%2F%2Fbazel.build/extending/config" target="_blank"> Report an issue<span class="material-icons icon-after" aria-hidden="true" translate="no">open_in_new</span> </a> <a class="button button-with-icon" href="https://github.com/bazelbuild/bazel/tree/master/site/en/extending/config.md" target="_blank"> View source<span class="material-icons icon-after" aria-hidden="true" translate="no">open_in_new</span> </a> <span style="float: right; line-height: 36px"> <strong>Nightly</strong> <!-- The lines below are updated by //scripts/docs:gen_new_toc --> <!-- BEGIN_VERSION_INDICATOR --> · <a href="/versions/8.1.0/extending/config">8.1</a> · <a href="/versions/8.0.0/extending/config">8.0</a> · <a href="/versions/7.6.0/extending/config">7.6</a> · <a href="/versions/7.5.0/extending/config">7.5</a> · <a href="/versions/7.4.0/extending/config">7.4</a> <!-- END_VERSION_INDICATOR --> </span> <p/> <p>This page covers the benefits and basic usage of Starlark configurations, Bazel&#39;s API for customizing how your project builds. It includes how to define build settings and provides examples.</p> <p>This makes it possible to:</p> <ul> <li>define custom flags for your project, obsoleting the need for <a href="/docs/configurable-attributes#custom-keys"><code translate="no" dir="ltr">--define</code></a></li> <li>write <a href="/rules/lib/builtins/transition#transition">transitions</a> to configure deps in different configurations than their parents (such as <code translate="no" dir="ltr">--compilation_mode=opt</code> or <code translate="no" dir="ltr">--cpu=arm</code>)</li> <li>bake better defaults into rules (such as automatically build <code translate="no" dir="ltr">//my:android_app</code> with a specified SDK)</li> </ul> <p>and more, all completely from .bzl files (no Bazel release required). See the <code translate="no" dir="ltr">bazelbuild/examples</code> repo for <a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations" class="external">examples</a>.</p> <h2 id="user-defined-build-settings" data-text="User-defined build settings" tabindex="-1">User-defined build settings</h2> <p>A build setting is a single piece of <a href="/extending/rules#configurations">configuration</a> information. Think of a configuration as a key/value map. Setting <code translate="no" dir="ltr">--cpu=ppc</code> and <code translate="no" dir="ltr">--copt=&quot;-DFoo&quot;</code> produces a configuration that looks like <code translate="no" dir="ltr">{cpu: ppc, copt: &quot;-DFoo&quot;}</code>. Each entry is a build setting.</p> <p>Traditional flags like <code translate="no" dir="ltr">cpu</code> and <code translate="no" dir="ltr">copt</code> 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 <code translate="no" dir="ltr">.bzl</code> files (and thus, don&#39;t need a bazel release to register changes). They also can be set via the command line (if they&#39;re designated as <code translate="no" dir="ltr">flags</code>, see more below), but can also be set via <a href="#user-defined-transitions">user-defined transitions</a>.</p> <h3 id="defining-build-settings" data-text="Defining build settings" tabindex="-1">Defining build settings</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/basic_build_setting" class="external">End to end example</a> </p> <h4 id="rule-parameter" data-text="The build_setting rule() parameter" tabindex="-1">The <code translate="no" dir="ltr">build_setting</code> <code translate="no" dir="ltr">rule()</code> parameter</h4> <p>Build settings are rules like any other rule and are differentiated using the Starlark <code translate="no" dir="ltr">rule()</code> function&#39;s <code translate="no" dir="ltr">build_setting</code> <a href="/rules/lib/globals/bzl#rule.build_setting">attribute</a>.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/buildsettings/build_settings.bzl</span> <span class="devsite-syntax-n">string_flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">config</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">string</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <p>The <code translate="no" dir="ltr">build_setting</code> attribute takes a function that designates the type of the build setting. The type is limited to a set of basic Starlark types like <code translate="no" dir="ltr">bool</code> and <code translate="no" dir="ltr">string</code>. See the <code translate="no" dir="ltr">config</code> module <a href="/rules/lib/toplevel/config">documentation</a> for details. More complicated typing can be done in the rule&#39;s implementation function. More on this below.</p> <p>The <code translate="no" dir="ltr">config</code> module&#39;s functions takes an optional boolean parameter, <code translate="no" dir="ltr">flag</code>, which is set to false by default. if <code translate="no" dir="ltr">flag</code> 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 <a href="/rules/lib/builtins/transition#transition">transitions</a>. Not all settings should be settable by users. For example, if you as a rule writer have some debug mode that you&#39;d like to turn on inside test rules, you don&#39;t want to give users the ability to indiscriminately turn on that feature inside other non-test rules.</p> <h4 id="ctx-build-setting-value" data-text="Using ctx.build_setting_value" tabindex="-1">Using ctx.build_setting_value</h4> <p>Like all rules, build setting rules have <a href="/extending/rules#implementation-function">implementation functions</a>. The basic Starlark-type value of the build settings can be accessed via the <code translate="no" dir="ltr">ctx.build_setting_value</code> method. This method is only available to <a href="/rules/lib/builtins/ctx"><code translate="no" dir="ltr">ctx</code></a> 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&#39;s how you would implement an <code translate="no" dir="ltr">enum</code>-typed build setting:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/buildsettings/build_settings.bzl</span> <span class="devsite-syntax-n">TemperatureProvider</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">provider</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">fields</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s1">'type'</span><span class="devsite-syntax-p">])</span> <span class="devsite-syntax-n">temperatures</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"HOT"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"LUKEWARM"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"ICED"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">raw_temperature</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">build_setting_value</span> <span class="devsite-syntax-k">if</span> <span class="devsite-syntax-n">raw_temperature</span> <span class="devsite-syntax-ow">not</span> <span class="devsite-syntax-ow">in</span> <span class="devsite-syntax-n">temperatures</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">fail</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nb">str</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-o">+</span> <span class="devsite-syntax-s2">" build setting allowed to take values {"</span> <span class="devsite-syntax-o">+</span> <span class="devsite-syntax-s2">", "</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">join</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">temperatures</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-o">+</span> <span class="devsite-syntax-s2">"} but was set to unallowed value "</span> <span class="devsite-syntax-o">+</span> <span class="devsite-syntax-n">raw_temperature</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-n">TemperatureProvider</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nb">type</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">raw_temperature</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">temperature</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">config</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">string</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code><aside class="note"><strong>Note:</strong><span> 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.</span></aside> <h4 id="multi-set-string-flags" data-text="Defining multi-set string flags" tabindex="-1">Defining multi-set string flags</h4> <p>String settings have an additional <code translate="no" dir="ltr">allow_multiple</code> 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:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/buildsettings/build_settings.bzl</span> <span class="devsite-syntax-n">allow_multiple_flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">config</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">string</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">allow_multiple</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/BUILD</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"//example/buildsettings:build_settings.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"allow_multiple_flag"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">allow_multiple_flag</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"roasts"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting_default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"medium"</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <p>Each setting of the flag is treated as a single value:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code translate="no" dir="ltr">$<span class="devsite-syntax-w"> </span>bazel<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>//my/target<span class="devsite-syntax-w"> </span>--//example:roasts<span class="devsite-syntax-o">=</span>blonde<span class="devsite-syntax-w"> </span><span class="devsite-syntax-se">\</span> <span class="devsite-syntax-w"> </span>--//example:roasts<span class="devsite-syntax-o">=</span>medium,dark </code></pre></devsite-code> <p>The above is parsed to <code translate="no" dir="ltr">{&quot;//example:roasts&quot;: [&quot;blonde&quot;, &quot;medium,dark&quot;]}</code> and <code translate="no" dir="ltr">ctx.build_setting_value</code> returns the list <code translate="no" dir="ltr">[&quot;blonde&quot;, &quot;medium,dark&quot;]</code>.</p> <h4 id="instantiating-build-settings" data-text="Instantiating build settings" tabindex="-1">Instantiating build settings</h4> <p>Rules defined with the <code translate="no" dir="ltr">build_setting</code> parameter have an implicit mandatory <code translate="no" dir="ltr">build_setting_default</code> attribute. This attribute takes on the same type as declared by the <code translate="no" dir="ltr">build_setting</code> param.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/buildsettings/build_settings.bzl</span> <span class="devsite-syntax-n">FlavorProvider</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">provider</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">fields</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s1">'type'</span><span class="devsite-syntax-p">])</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-n">FlavorProvider</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-nb">type</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">build_setting_value</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">flavor</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">config</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">string</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/BUILD</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"//example/buildsettings:build_settings.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"flavor"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">flavor</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"favorite_flavor"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting_default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"APPLE"</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <h3 id="predefined-settings" data-text="Predefined settings" tabindex="-1">Predefined settings</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/use_skylib_build_setting" class="external">End to end example</a> </p> <p>The <a href="https://github.com/bazelbuild/bazel-skylib" class="external">Skylib</a> library includes a set of predefined settings you can instantiate without having to write custom Starlark.</p> <p>For example, to define a setting that accepts a limited set of string values:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/BUILD</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"@bazel_skylib//rules:common_settings.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"string_flag"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">string_flag</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"myflag"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">values</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"a"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"b"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"c"</span><span class="devsite-syntax-p">],</span> <span class="devsite-syntax-n">build_setting_default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"a"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <p>For a complete list, see <a href="https://github.com/bazelbuild/bazel-skylib/blob/main/rules/common_settings.bzl" class="external">Common build setting rules</a>.</p> <h3 id="using-build-settings" data-text="Using build settings" tabindex="-1">Using build settings</h3> <h4 id="depending-on-build-settings" data-text="Depending on build settings" tabindex="-1">Depending on build settings</h4> <p>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.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/rules.bzl</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"//example/buildsettings:build_settings.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"FlavorProvider"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_rule_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-k">if</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">flavor</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-n">FlavorProvider</span><span class="devsite-syntax-p">]</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">type</span> <span class="devsite-syntax-o">==</span> <span class="devsite-syntax-s2">"ORANGE"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-o">...</span> <span class="devsite-syntax-n">drink_rule</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_rule_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attrs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"flavor"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/BUILD</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"//example:rules.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"drink_rule"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"//example/buildsettings:build_settings.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"flavor"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">flavor</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"favorite_flavor"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting_default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"APPLE"</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">drink_rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"my_drink"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">flavor</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">":favorite_flavor"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <p>Languages may wish to create a canonical set of build settings which all rules for that language depend on. Though the native concept of <code translate="no" dir="ltr">fragments</code> 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:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># kotlin/rules.bzl</span> <span class="devsite-syntax-n">_KOTLIN_CONFIG</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"_compiler"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"//kotlin/config:compiler-flag"</span><span class="devsite-syntax-p">),</span> <span class="devsite-syntax-s2">"_mode"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"//kotlin/config:mode-flag"</span><span class="devsite-syntax-p">),</span> <span class="devsite-syntax-o">...</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-o">...</span> <span class="devsite-syntax-n">kotlin_library</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_rule_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attrs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">dicts</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">add</span><span class="devsite-syntax-p">({</span> <span class="devsite-syntax-s2">"library-attr"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">string</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-p">},</span> <span class="devsite-syntax-n">_KOTLIN_CONFIG</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">kotlin_binary</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_binary_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attrs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">dicts</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">add</span><span class="devsite-syntax-p">({</span> <span class="devsite-syntax-s2">"binary-attr"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-p">},</span> <span class="devsite-syntax-n">_KOTLIN_CONFIG</span><span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <h4 id="build-settings-command-line" data-text="Using build settings on the command line" tabindex="-1">Using build settings on the command line</h4> <p>Similar to most native flags, you can use the command line to set build settings <a href="#rule-parameter">that are marked as flags</a>. The build setting&#39;s name is its full target path using <code translate="no" dir="ltr">name=value</code> syntax:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code translate="no" dir="ltr">$<span class="devsite-syntax-w"> </span>bazel<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>//my/target<span class="devsite-syntax-w"> </span>--//example:string_flag<span class="devsite-syntax-o">=</span>some-value<span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1"># allowed</span> $<span class="devsite-syntax-w"> </span>bazel<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>//my/target<span class="devsite-syntax-w"> </span>--//example:string_flag<span class="devsite-syntax-w"> </span>some-value<span class="devsite-syntax-w"> </span><span class="devsite-syntax-c1"># not allowed</span> </code></pre></devsite-code> <p>Special boolean syntax is supported:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code translate="no" dir="ltr">$<span class="devsite-syntax-w"> </span>bazel<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>//my/target<span class="devsite-syntax-w"> </span>--//example:boolean_flag $<span class="devsite-syntax-w"> </span>bazel<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>//my/target<span class="devsite-syntax-w"> </span>--no//example:boolean_flag </code></pre></devsite-code> <h4 id="using-build-setting-aliases" data-text="Using build setting aliases" tabindex="-1">Using build setting aliases</h4> <p>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.</p> <p>Set an alias by adding <code translate="no" dir="ltr">--flag_alias=ALIAS_NAME=TARGET_PATH</code> to your <code translate="no" dir="ltr">.bazelrc</code> . For example, to set an alias to <code translate="no" dir="ltr">coffee</code>:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># .bazelrc</span> build<span class="devsite-syntax-w"> </span>--flag_alias<span class="devsite-syntax-o">=</span><span class="devsite-syntax-nv">coffee</span><span class="devsite-syntax-o">=</span>//experimental/user/starlark_configurations/basic_build_setting:coffee-temp </code></pre></devsite-code> <p>Best Practice: Setting an alias multiple times results in the most recent one taking precedence. Use unique alias names to avoid unintended parsing results.</p> <p>To make use of the alias, type it in place of the build setting target path. With the above example of <code translate="no" dir="ltr">coffee</code> set in the user&#39;s <code translate="no" dir="ltr">.bazelrc</code>:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code translate="no" dir="ltr">$<span class="devsite-syntax-w"> </span>bazel<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>//my/target<span class="devsite-syntax-w"> </span>--coffee<span class="devsite-syntax-o">=</span>ICED </code></pre></devsite-code> <p>instead of</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Bash"><code translate="no" dir="ltr">$<span class="devsite-syntax-w"> </span>bazel<span class="devsite-syntax-w"> </span>build<span class="devsite-syntax-w"> </span>//my/target<span class="devsite-syntax-w"> </span>--//experimental/user/starlark_configurations/basic_build_setting:coffee-temp<span class="devsite-syntax-o">=</span>ICED </code></pre></devsite-code> <p>Best Practice: While it possible to set aliases on the command line, leaving them in a <code translate="no" dir="ltr">.bazelrc</code> reduces command line clutter.</p> <h3 id="label-typed-build-settings" data-text="Label-typed build settings" tabindex="-1">Label-typed build settings</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/label_typed_build_setting" class="external">End to end example</a> </p> <p>Unlike other build settings, label-typed settings cannot be defined using the <code translate="no" dir="ltr">build_setting</code> rule parameter. Instead, bazel has two built-in rules: <code translate="no" dir="ltr">label_flag</code> and <code translate="no" dir="ltr">label_setting</code>. These rules forward the providers of the actual target to which the build setting is set. <code translate="no" dir="ltr">label_flag</code> and <code translate="no" dir="ltr">label_setting</code> can be read/written by transitions and <code translate="no" dir="ltr">label_flag</code> can be set by the user like other <code translate="no" dir="ltr">build_setting</code> rules can. Their only difference is they can&#39;t customely defined.</p> <p>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 <a href="/rules/lib/globals/bzl#configuration_field"><code translate="no" dir="ltr">configuration_field</code></a> API.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/rules.bzl</span> <span class="devsite-syntax-n">MyProvider</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">provider</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">fields</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"my_field"</span><span class="devsite-syntax-p">])</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_dep_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-n">MyProvider</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">my_field</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"yeehaw"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">dep_rule</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_dep_impl</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_parent_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-k">if</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">my_field_provider</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-n">MyProvider</span><span class="devsite-syntax-p">]</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">my_field</span> <span class="devsite-syntax-o">==</span> <span class="devsite-syntax-s2">"cowabunga"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-o">...</span> <span class="devsite-syntax-n">parent_rule</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_parent_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attrs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"my_field_provider"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">()</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/BUILD</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"//example:rules.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"dep_rule"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"parent_rule"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">dep_rule</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"dep"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">parent_rule</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"parent"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">my_field_provider</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">":my_field_provider"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">label_flag</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"my_field_provider"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting_default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">":dep"</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <h3 id="build-settings-and-select" data-text="Build settings and select()" tabindex="-1">Build settings and select()</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/select_on_build_setting" class="external">End to end example</a> </p> <p>Users can configure attributes on build settings by using <a href="/reference/be/functions#select"><code translate="no" dir="ltr">select()</code></a>. Build setting targets can be passed to the <code translate="no" dir="ltr">flag_values</code> attribute of <code translate="no" dir="ltr">config_setting</code>. The value to match to the configuration is passed as a <code translate="no" dir="ltr">String</code> then parsed to the type of the build setting for matching.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-n">config_setting</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"my_config"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">flag_values</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"//example:favorite_flavor"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"MANGO"</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <h2 id="user-defined-transitions" data-text="User-defined transitions" tabindex="-1">User-defined transitions</h2> <p>A configuration <a href="/rules/lib/builtins/transition#transition">transition</a> maps the transformation from one configured target to another within the build graph.</p> <aside class="special"><strong>Important:</strong><span> Transitions have <a href="#memory-performance-considerations">memory and performance impact</a>.</span></aside> <h3 id="defining" data-text="Defining" tabindex="-1">Defining</h3> <p>Transitions define configuration changes between rules. For example, a request like &quot;compile my dependency for a different CPU than its parent&quot; is handled by a transition.</p> <p>Formally, a transition is a function from an input configuration to one or more output configurations. Most transitions are 1:1 such as &quot;override the input configuration with <code translate="no" dir="ltr">--cpu=ppc</code>&quot;. 1:2+ transitions can also exist but come with special restrictions.</p> <p>In Starlark, transitions are defined much like rules, with a defining <code translate="no" dir="ltr">transition()</code> <a href="/rules/lib/builtins/transition#transition">function</a> and an implementation function.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/transitions.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">_ignore</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//example:favorite_flavor"</span> <span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"MINT"</span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">hot_chocolate_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//example:favorite_flavor"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <p>The <code translate="no" dir="ltr">transition()</code> function takes in an implementation function, a set of build settings to read(<code translate="no" dir="ltr">inputs</code>), and a set of build settings to write (<code translate="no" dir="ltr">outputs</code>). The implementation function has two parameters, <code translate="no" dir="ltr">settings</code> and <code translate="no" dir="ltr">attr</code>. <code translate="no" dir="ltr">settings</code> is a dictionary {<code translate="no" dir="ltr">String</code>:<code translate="no" dir="ltr">Object</code>} of all settings declared in the <code translate="no" dir="ltr">inputs</code> parameter to <code translate="no" dir="ltr">transition()</code>.</p> <p><code translate="no" dir="ltr">attr</code> is a dictionary of attributes and values of the rule to which the transition is attached. When attached as an <a href="#outgoing-edge-transitions">outgoing edge transition</a>, the values of these attributes are all configured post-select() resolution. When attached as an <a href="#incoming-edge-transitions">incoming edge transition</a>, <code translate="no" dir="ltr">attr</code> does not include any attributes that use a selector to resolve their value. If an incoming edge transition on <code translate="no" dir="ltr">--foo</code> reads attribute <code translate="no" dir="ltr">bar</code> and then also selects on <code translate="no" dir="ltr">--foo</code> to set attribute <code translate="no" dir="ltr">bar</code>, then there&#39;s a chance for the incoming edge transition to read the wrong value of <code translate="no" dir="ltr">bar</code> in the transition.</p> <aside class="note"><strong>Note:</strong><span> Since transitions are attached to rule definitions and <code translate="no" dir="ltr">select()</code>s are attached to rule instantiations (such as targets), errors related to <code translate="no" dir="ltr">select()</code>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.</span></aside> <p>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 <code translate="no" dir="ltr">outputs</code> 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.</p> <h3 id="defining-1-2-transitions" data-text="Defining 1:2+ transitions" tabindex="-1">Defining 1:2+ transitions</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/multi_arch_binary" class="external">End to end example</a> </p> <p><a href="#outgoing-edge-transitions">Outgoing edge transition</a> can map a single input configuration to two or more output configurations. This is useful for defining rules that bundle multi-architecture code.</p> <p>1:2+ transitions are defined by returning a list of dictionaries in the transition implementation function.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/transitions.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">_ignore</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">[</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//example:favorite_flavor"</span> <span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"LATTE"</span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//example:favorite_flavor"</span> <span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"MOCHA"</span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-p">]</span> <span class="devsite-syntax-n">coffee_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//example:favorite_flavor"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <p>They can also set custom keys that the rule implementation function can use to read individual dependencies:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/transitions.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">_ignore</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"Apple deps"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"ppc"</span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-s2">"Linux deps"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"x86"</span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">multi_arch_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <h3 id="attaching-transitions" data-text="Attaching transitions" tabindex="-1">Attaching transitions</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/attaching_transitions_to_rules" class="external">End to end example</a> </p> <p>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&#39; configurations (outgoing edge transition).</p> <p>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.</p> <h3 id="incoming-edge-transitions" data-text="Incoming edge transitions" tabindex="-1">Incoming edge transitions</h3> <p>Incoming edge transitions are activated by attaching a <code translate="no" dir="ltr">transition</code> object (created by <code translate="no" dir="ltr">transition()</code>) to <code translate="no" dir="ltr">rule()</code>&#39;s <code translate="no" dir="ltr">cfg</code> parameter:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/rules.bzl</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"example/transitions:transitions.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"hot_chocolate_transition"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">drink_rule</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">cfg</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">hot_chocolate_transition</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-o">...</span> </code></pre></devsite-code> <p>Incoming edge transitions must be 1:1 transitions.</p> <h3 id="outgoing-edge-transitions" data-text="Outgoing edge transitions" tabindex="-1">Outgoing edge transitions</h3> <p>Outgoing edge transitions are activated by attaching a <code translate="no" dir="ltr">transition</code> object (created by <code translate="no" dir="ltr">transition()</code>) to an attribute&#39;s <code translate="no" dir="ltr">cfg</code> parameter:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/rules.bzl</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"example/transitions:transitions.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"coffee_transition"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">drink_rule</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attrs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"dep"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">cfg</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">coffee_transition</span><span class="devsite-syntax-p">)}</span> <span class="devsite-syntax-o">...</span> </code></pre></devsite-code> <p>Outgoing edge transitions can be 1:1 or 1:2+.</p> <p>See <a href="#accessing-attributes-with-transitions">Accessing attributes with transitions</a> for how to read these keys.</p> <h3 id="transitions-native-options" data-text="Transitions on native options" tabindex="-1">Transitions on native options</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/transition_on_native_flag" class="external">End to end example</a> </p> <p>Starlark transitions can also declare reads and writes on native build configuration options via a special prefix to the option name.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/transitions.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">_ignore</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"k8"</span><span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">cpu_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">]</span> </code></pre></devsite-code> <h4 id="unsupported-native-options" data-text="Unsupported native options" tabindex="-1">Unsupported native options</h4> <p>Bazel doesn&#39;t support transitioning on <code translate="no" dir="ltr">--define</code> with <code translate="no" dir="ltr">&quot;//command_line_option:define&quot;</code>. Instead, use a custom <a href="#user-defined-build-settings">build setting</a>. In general, new usages of <code translate="no" dir="ltr">--define</code> are discouraged in favor of build settings.</p> <p>Bazel doesn&#39;t support transitioning on <code translate="no" dir="ltr">--config</code>. This is because <code translate="no" dir="ltr">--config</code> is an &quot;expansion&quot; flag that expands to other flags.</p> <p>Crucially, <code translate="no" dir="ltr">--config</code> may include flags that don&#39;t affect build configuration, such as <a href="/docs/user-manual#spawn-strategy"><code translate="no" dir="ltr">--spawn_strategy</code></a> . Bazel, by design, can&#39;t bind such flags to individual targets. This means there&#39;s no coherent way to apply them in transitions.</p> <p>As a workaround, you can explicitly itemize the flags that <em>are</em> part of the configuration in your transition. This requires maintaining the <code translate="no" dir="ltr">--config</code>&#39;s expansion in two places, which is a known UI blemish.</p> <h3 id="transitions-multiple-build-settings" data-text="Transitions on allow multiple build settings" tabindex="-1">Transitions on allow multiple build settings</h3> <p>When setting build settings that <a href="#defining-multi-set-string-flags">allow multiple values</a>, the value of the setting must be set with a list.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/buildsettings/build_settings.bzl</span> <span class="devsite-syntax-n">string_flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">config</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">string</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">flag</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">allow_multiple</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/BUILD</span> <span class="devsite-syntax-n">load</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-s2">"//example/buildsettings:build_settings.bzl"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"string_flag"</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-n">string_flag</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">name</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"roasts"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">build_setting_default</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-s2">"medium"</span><span class="devsite-syntax-p">)</span> </code></pre></devsite-code><div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/rules.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_transition_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-c1"># Using a value of just "dark" here will throw an error</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//example:roasts"</span> <span class="devsite-syntax-p">:</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"dark"</span><span class="devsite-syntax-p">]},</span> <span class="devsite-syntax-n">coffee_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_transition_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//example:roasts"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <h3 id="no-op-transitions" data-text="No-op transitions" tabindex="-1">No-op transitions</h3> <p>If a transition returns <code translate="no" dir="ltr">{}</code>, <code translate="no" dir="ltr">[]</code>, or <code translate="no" dir="ltr">None</code>, this is shorthand for keeping all settings at their original values. This can be more convenient than explicitly setting each output to itself.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/transitions.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">_ignore</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">if</span> <span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//example:already_chosen"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-ow">is</span> <span class="devsite-syntax-kc">True</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{}</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"//example:favorite_flavor"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"dark chocolate"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"//example:include_marshmallows"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"yes"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"//example:desired_temperature"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"38C"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">hot_chocolate_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//example:already_chosen"</span><span class="devsite-syntax-p">],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span> <span class="devsite-syntax-s2">"//example:favorite_flavor"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"//example:include_marshmallows"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-s2">"//example:desired_temperature"</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">)</span> </code></pre></devsite-code> <h3 id="accessing-attributes-with-transitions" data-text="Accessing attributes with transitions" tabindex="-1">Accessing attributes with transitions</h3> <p><a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations/read_attr_in_transition" class="external">End to end example</a> </p> <p>When <a href="#outgoing-edge-transitions">attaching a transition to an outgoing edge</a> (regardless of whether the transition is a 1:1 or 1:2+ transition), <code translate="no" dir="ltr">ctx.attr</code> is forced to be a list if it isn&#39;t already. The order of elements in this list is unspecified.</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/rules.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_transition_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//example:favorite_flavor"</span> <span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"LATTE"</span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-n">coffee_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_transition_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//example:favorite_flavor"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_rule_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-c1"># Note: List access even though "dep" is not declared as list</span> <span class="devsite-syntax-n">transitioned_dep</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">dep</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-mi">0</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-c1"># Note: Access doesn't change, other_deps was already a list</span> <span class="devsite-syntax-k">for</span> <span class="devsite-syntax-n">other_dep</span> <span class="devsite-syntax-ow">in</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">other_deps</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-c1"># ...</span> <span class="devsite-syntax-n">coffee_rule</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_rule_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attrs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"dep"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">cfg</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">coffee_transition</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-s2">"other_deps"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label_list</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">cfg</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">coffee_transition</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">})</span> </code></pre></devsite-code> <p>If the transition is <code translate="no" dir="ltr">1:2+</code> and sets custom keys, <code translate="no" dir="ltr">ctx.split_attr</code> can be used to read individual deps for each key:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Python"><code translate="no" dir="ltr"><span class="devsite-syntax-c1"># example/transitions/rules.bzl</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">_ignore</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">settings</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">return</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"Apple deps"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"ppc"</span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-s2">"Linux deps"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-p">{</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-s2">"x86"</span><span class="devsite-syntax-p">},</span> <span class="devsite-syntax-p">}</span> <span class="devsite-syntax-n">multi_arch_transition</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">transition</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">inputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[],</span> <span class="devsite-syntax-n">outputs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"//command_line_option:cpu"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-p">)</span> <span class="devsite-syntax-k">def</span><span class="devsite-syntax-w"> </span><span class="devsite-syntax-nf">_rule_impl</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-p">):</span> <span class="devsite-syntax-n">apple_dep</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">split_attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">dep</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"Apple deps"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-n">linux_dep</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">split_attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">dep</span><span class="devsite-syntax-p">[</span><span class="devsite-syntax-s2">"Linux deps"</span><span class="devsite-syntax-p">]</span> <span class="devsite-syntax-c1"># ctx.attr has a list of all deps for all keys. Order is not guaranteed.</span> <span class="devsite-syntax-n">all_deps</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">ctx</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">dep</span> <span class="devsite-syntax-n">multi_arch_rule</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">rule</span><span class="devsite-syntax-p">(</span> <span class="devsite-syntax-n">implementation</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">_rule_impl</span><span class="devsite-syntax-p">,</span> <span class="devsite-syntax-n">attrs</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-p">{</span> <span class="devsite-syntax-s2">"dep"</span><span class="devsite-syntax-p">:</span> <span class="devsite-syntax-n">attr</span><span class="devsite-syntax-o">.</span><span class="devsite-syntax-n">label</span><span class="devsite-syntax-p">(</span><span class="devsite-syntax-n">cfg</span> <span class="devsite-syntax-o">=</span> <span class="devsite-syntax-n">multi_arch_transition</span><span class="devsite-syntax-p">)</span> <span class="devsite-syntax-p">})</span> </code></pre></devsite-code> <p>See <a href="https://github.com/bazelbuild/examples/tree/main/configurations/multi_arch_binary">complete example</a> here.</p> <h2 id="integration-platforms-toolchains" data-text="Integration with platforms and toolchains" tabindex="-1">Integration with platforms and toolchains</h2> <p>Many native flags today, like <code translate="no" dir="ltr">--cpu</code> and <code translate="no" dir="ltr">--crosstool_top</code> are related to toolchain resolution. In the future, explicit transitions on these types of flags will likely be replaced by transitioning on the <a href="/extending/platforms">target platform</a>.</p> <h2 id="memory-performance-considerations" data-text="Memory and performance considerations" tabindex="-1">Memory and performance considerations</h2> <p>Adding transitions, and therefore new configurations, to your build comes at a cost: larger build graphs, less comprehensible build graphs, and slower builds. It&#39;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.</p> <h3 id="badly-behaved-builds" data-text="Badly behaved builds: a case study" tabindex="-1">Badly behaved builds: a case study</h3> <p><img src="/static/rules/scalability-graph.png" alt="Scalability graph" title="Scalability graph"></p> <p><strong>Figure 1.</strong> Scalability graph showing a top level target and its dependencies.</p> <p>This graph shows a top level target, <code translate="no" dir="ltr">//pkg:app</code>, which depends on two targets, a <code translate="no" dir="ltr">//pkg:1_0</code> and <code translate="no" dir="ltr">//pkg:1_1</code>. Both these targets depend on two targets, <code translate="no" dir="ltr">//pkg:2_0</code> and <code translate="no" dir="ltr">//pkg:2_1</code>. Both these targets depend on two targets, <code translate="no" dir="ltr">//pkg:3_0</code> and <code translate="no" dir="ltr">//pkg:3_1</code>. This continues on until <code translate="no" dir="ltr">//pkg:n_0</code> and <code translate="no" dir="ltr">//pkg:n_1</code>, which both depend on a single target, <code translate="no" dir="ltr">//pkg:dep</code>.</p> <p>Building <code translate="no" dir="ltr">//pkg:app</code> requires \(2n+2\) targets:</p> <ul> <li><code translate="no" dir="ltr">//pkg:app</code></li> <li><code translate="no" dir="ltr">//pkg:dep</code></li> <li><code translate="no" dir="ltr">//pkg:i_0</code> and <code translate="no" dir="ltr">//pkg:i_1</code> for \(i\) in \([1..n]\)</li> </ul> <p>Imagine you <a href="#user-defined-build-settings">implement</a> a flag <code translate="no" dir="ltr">--//foo:owner=&lt;STRING&gt;</code> and <code translate="no" dir="ltr">//pkg:i_b</code> applies</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Text only"><code translate="no" dir="ltr">depConfig = myConfig + depConfig.owner="$(myConfig.owner)$(b)" </code></pre></devsite-code> <p>In other words, <code translate="no" dir="ltr">//pkg:i_b</code> appends <code translate="no" dir="ltr">b</code> to the old value of <code translate="no" dir="ltr">--owner</code> for all its deps.</p> <p>This produces the following <a href="/reference/glossary#configured-target">configured targets</a>:</p> <div></div><devsite-code><pre class="devsite-click-to-copy" translate="no" dir="ltr" is-upgraded syntax="Scilab"><code translate="no" dir="ltr"><span class="devsite-syntax-c1">//pkg:app //foo:owner=""</span> <span class="devsite-syntax-c1">//pkg:1_0 //foo:owner=""</span> <span class="devsite-syntax-c1">//pkg:1_1 //foo:owner=""</span> <span class="devsite-syntax-c1">//pkg:2_0 (via //pkg:1_0) //foo:owner="0"</span> <span class="devsite-syntax-c1">//pkg:2_0 (via //pkg:1_1) //foo:owner="1"</span> <span class="devsite-syntax-c1">//pkg:2_1 (via //pkg:1_0) //foo:owner="0"</span> <span class="devsite-syntax-c1">//pkg:2_1 (via //pkg:1_1) //foo:owner="1"</span> <span class="devsite-syntax-c1">//pkg:3_0 (via //pkg:1_0 → //pkg:2_0) //foo:owner="00"</span> <span class="devsite-syntax-c1">//pkg:3_0 (via //pkg:1_0 → //pkg:2_1) //foo:owner="01"</span> <span class="devsite-syntax-c1">//pkg:3_0 (via //pkg:1_1 → //pkg:2_0) //foo:owner="10"</span> <span class="devsite-syntax-c1">//pkg:3_0 (via //pkg:1_1 → //pkg:2_1) //foo:owner="11"</span> <span class="devsite-syntax-p">...</span> </code></pre></devsite-code> <p><code translate="no" dir="ltr">//pkg:dep</code> produces \(2^n\) configured targets: <code translate="no" dir="ltr">config.owner=</code> &quot;\(b_0b_1...b_n\)&quot; for all \(b_i\) in \(\{0,1\}\).</p> <p>This makes the build graph exponentially larger than the target graph, with corresponding memory and performance consequences.</p> <p>TODO: Add strategies for measurement and mitigation of these issues.</p> <h2 id="further-reading" data-text="Further reading" tabindex="-1">Further reading</h2> <p>For more details on modifying build configurations, see:</p> <ul> <li><a href="https://docs.google.com/document/d/1vc8v-kXjvgZOdQdnxPTaV0rrLxtP2XwnD2tAZlYJOqw/edit?usp=sharing" class="external">Starlark Build Configuration</a> </li> <li><a href="https://bazel.build/community/roadmaps-configurability" class="external">Bazel Configurability Roadmap</a> </li> <li>Full <a href="https://github.com/bazelbuild/examples/tree/HEAD/configurations" class="external">set</a> of end to end examples</li> </ul> </div> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-feedback position="footer" project-name="Bazel" product-id="5052038" bucket="https-bazel-build" context="" version="t-devsite-webserver-20250320-r00-rc00.467841579120382285" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="footer" class="nocontent" project-icon="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/touchicon-180.png" > <button> Send feedback </button> </devsite-feedback> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Except as otherwise noted, the content of this page is licensed under the <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a>, and code samples are licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 License</a>. For details, see the <a href="https://developers.google.com/site-policies">Google Developers Site Policies</a>. Java is a registered trademark of Oracle and/or its affiliates.</p> <p>Last updated 2025-03-24 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-thumb-rating-feedback"> <devsite-feedback position="thumb-rating" project-name="Bazel" product-id="5052038" bucket="https-bazel-build" context="" version="t-devsite-webserver-20250320-r00-rc00.467841579120382285" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="thumb-rating" class="nocontent" project-icon="https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/touchicon-180.png" > <button> Need to tell us more? </button> </devsite-feedback> </template> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-03-24 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">About</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/community/users" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Who's using Bazel </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/contribute/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Contribute </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/contribute/contribution-policy" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Governance model </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/release" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Release model </a> </li> <li class="devsite-footer-linkbox-item"> <a href="/brand" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 5)" > Brand guidelines </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Stay connected</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="//blog.bazel.build" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Blog </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//github.com/bazelbuild/bazel" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > GitHub </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//twitter.com/bazelbuild" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Twitter </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//youtube.com/user/googleOSPO" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > YouTube </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Support</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/help" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Support </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//github.com/bazelbuild/bazel/issues" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Issue tracker </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//slack.bazel.build" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 3)" > Slack </a> </li> <li class="devsite-footer-linkbox-item"> <a href="//stackoverflow.com/questions/tagged/bazel" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 4)" > Stack Overflow </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/terms" data-category="Site-Wide Custom Events" data-label="Footer Terms link" > Terms </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[{&#34;dimensions&#34;: {&#34;dimension3&#34;: &#34;en&#34;, &#34;dimension4&#34;: &#34;en&#34;, &#34;dimension2&#34;: false, &#34;dimension1&#34;: &#34;Signed out&#34;, &#34;dimension5&#34;: false}, &#34;gaid&#34;: &#34;UA-61082125-3&#34;, &#34;metrics&#34;: {}, &#34;purpose&#34;: 0}]</script> <script type="application/json" tag-management>{&#34;at&#34;: &#34;True&#34;, &#34;ga4&#34;: [{&#34;id&#34;: &#34;G-GBZW986TQ3&#34;, &#34;purpose&#34;: 0}], &#34;ga4p&#34;: [{&#34;id&#34;: &#34;G-GBZW986TQ3&#34;, &#34;purpose&#34;: 0}], &#34;gtm&#34;: [], &#34;parameters&#34;: {&#34;internalUser&#34;: &#34;False&#34;, &#34;language&#34;: {&#34;machineTranslated&#34;: &#34;False&#34;, &#34;requested&#34;: &#34;en&#34;, &#34;served&#34;: &#34;en&#34;}, &#34;pageType&#34;: &#34;article&#34;, &#34;projectName&#34;: &#34;Bazel&#34;, &#34;signedIn&#34;: &#34;False&#34;, &#34;tenant&#34;: &#34;bazel&#34;, &#34;recommendations&#34;: {&#34;sourcePage&#34;: &#34;&#34;, &#34;sourceType&#34;: 0, &#34;sourceRank&#34;: 0, &#34;sourceIdenticalDescriptions&#34;: 0, &#34;sourceTitleWords&#34;: 0, &#34;sourceDescriptionWords&#34;: 0, &#34;experiment&#34;: &#34;&#34;}, &#34;experiment&#34;: {&#34;ids&#34;: &#34;&#34;}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <script nonce="E66GDOglxdm4M2vxTrJItbrJo3XplR"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/js/app_loader.js', '[40,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933","https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel","https://bazel-dot-devsite-v2-prod-3p.appspot.com",null,null,["/_pwa/bazel/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/favicon-prod.png","https://www.gstatic.com/devrel-devsite/prod/v17c4f87be230ffee20589ee6dca0a2318ead9eddb228ec5c58233202ff69a933/bazel/images/lockup.svg","https://fonts.googleapis.com/css?family=Roboto:300,400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,116,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyCNm9YxQumEXwGJgTDjxoxXK6m1F-9720Q","AIzaSyCc76DZePGtoyUjqKrLdsMGk_ry7sljLbY","bazel.build","AIzaSyB9bqgQ2t11WJsOX8qNsCQ6U-w91mmqF-I","AIzaSyAdYnStPdzjcJJtQ0mvIaeaMKj7_t6J_Fg",null,null,null,["MiscFeatureFlags__enable_framebox_badge_methods","Profiles__enable_developer_profiles_callout","Profiles__enable_dashboard_curated_recommendations","Analytics__enable_clearcut_logging","Cloud__enable_llm_concierge_chat","MiscFeatureFlags__developers_footer_image","SignIn__enable_auto_login_multi_account","DevPro__enable_developer_subscriptions","TpcFeatures__enable_mirror_tenant_redirects","TpcFeatures__enable_unmirrored_page_left_nav","Concierge__enable_actions_menu","Profiles__enable_complete_playlist_endpoint","BookNav__enable_tenant_cache_key","Cloud__enable_cloud_shell_fte_user_flow","Profiles__enable_join_program_group_endpoint","Profiles__require_profile_eligibility_for_signin","Profiles__enable_page_saving","MiscFeatureFlags__developers_footer_dark_image","CloudShell__cloud_code_overflow_menu","MiscFeatureFlags__enable_view_transitions","MiscFeatureFlags__enable_variable_operator_index_yaml","Search__enable_suggestions_from_borg","SignIn__enable_refresh_access_tokens","Cloud__enable_cloud_dlp_service","Cloud__enable_legacy_calculator_redirect","Concierge__enable_pushui","Profiles__enable_purchase_prompts","Experiments__reqs_query_experiments","Profiles__enable_recognition_badges","MiscFeatureFlags__enable_firebase_utm","Profiles__enable_awarding_url","Profiles__enable_completecodelab_endpoint","CloudShell__cloud_shell_button","Profiles__enable_stripe_subscription_management","Cloud__enable_free_trial_server_call","MiscFeatureFlags__enable_variable_operator","MiscFeatureFlags__enable_project_variables","Profiles__enable_profile_collections","Profiles__enable_release_notes_notifications","Search__enable_ai_eligibility_checks","SignIn__enable_oauth_multi_account_support","Cloud__enable_cloudx_experiment_ids","Cloud__enable_cloud_shell","Cloud__enable_cloudx_ping","Search__enable_dynamic_content_confidential_banner","MiscFeatureFlags__enable_explain_this_code","DevPro__enable_devpro_offers","OnSwitch__enable","Cloud__enable_cloud_facet_chat","EngEduTelemetry__enable_engedu_telemetry","Search__enable_page_map","MiscFeatureFlags__emergency_css","DevPro__enable_cloud_innovators_plus","Profiles__enable_public_developer_profiles","Profiles__enable_completequiz_endpoint"],null,null,"AIzaSyA58TaKli1DculwmAmbpzLVGuWc8eCQgQc","https://developerscontentserving-pa.googleapis.com","AIzaSyDWBU60w0P9hEkr29kkksYs8Z7gvZ8u_wc","https://developerscontentsearch-pa.googleapis.com",2,4,null,"https://developerprofiles-pa.googleapis.com",[40,"bazel","Bazel","bazel.build",null,"bazel-dot-devsite-v2-prod-3p.appspot.com",null,null,[null,1,null,null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],null,null,null,null,[1,1,1],[1,1,null,1,1]],null,[56,null,null,null,null,null,"/images/lockup.svg",null,null,null,null,1,null,null,null,null,null,null,null,null,null,1,null,null,null,null,[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,7,1,18,20,22,23,29,37,39,40,43],null,[[],[1,1]],[[["UA-61082125-3"],["UA-61082125-4"],null,null,["UA-61082125-5"],null,null,[["G-GBZW986TQ3"],null,null,[["G-GBZW986TQ3",1]]],[["UA-61082125-3",1]],null,[["UA-61082125-5",1]],null,1],[[4,5],[1,1],[3,4],[5,8],[2,2]]],null,4],null,null,1,null,"https://developerscontentinsights-pa.googleapis.com","AIzaSyBUwhBSZ2D08LlB5muaB5af2QQjzrjYbIw"]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10