CINXE.COM
Writing Rules on Windows | 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/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/bazel/css/app.css"> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/bazel/images/favicon-prod.png"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/bazel/images/touchicon-180.png"><link rel="canonical" href="https://bazel.build/versions/6.5.0/rules/windows"><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/versions/6.5.0/rules/windows" /><link rel="alternate" hreflang="x-default" href="https://bazel.build/versions/6.5.0/rules/windows" /><link rel="alternate" hreflang="zh-Hans" href="https://bazel.build/versions/6.5.0/rules/windows?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://bazel.build/versions/6.5.0/rules/windows?hl=zh-tw" /><link rel="alternate" hreflang="hi" href="https://bazel.build/versions/6.5.0/rules/windows?hl=hi" /><link rel="alternate" hreflang="id" href="https://bazel.build/versions/6.5.0/rules/windows?hl=id" /><link rel="alternate" hreflang="ja" href="https://bazel.build/versions/6.5.0/rules/windows?hl=ja" /><link rel="alternate" hreflang="ko" href="https://bazel.build/versions/6.5.0/rules/windows?hl=ko" /><link rel="alternate" hreflang="pt-BR" href="https://bazel.build/versions/6.5.0/rules/windows?hl=pt-br" /><link rel="alternate" hreflang="es-419" href="https://bazel.build/versions/6.5.0/rules/windows?hl=es-419" /><link rel="alternate" hreflang="th" href="https://bazel.build/versions/6.5.0/rules/windows?hl=th" /><link rel="alternate" hreflang="tr" href="https://bazel.build/versions/6.5.0/rules/windows?hl=tr" /><link rel="alternate" hreflang="vi" href="https://bazel.build/versions/6.5.0/rules/windows?hl=vi" /><link rel="alternate" hreflang="en-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows" /><link rel="alternate" hreflang="x-default" href="https://bazel.google.cn/versions/6.5.0/rules/windows" /><link rel="alternate" hreflang="zh-Hans-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=zh-tw" /><link rel="alternate" hreflang="hi-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=hi" /><link rel="alternate" hreflang="id-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=id" /><link rel="alternate" hreflang="ja-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=ja" /><link rel="alternate" hreflang="ko-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=ko" /><link rel="alternate" hreflang="pt-BR-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=pt-br" /><link rel="alternate" hreflang="es-419-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=es-419" /><link rel="alternate" hreflang="th-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=th" /><link rel="alternate" hreflang="tr-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=tr" /><link rel="alternate" hreflang="vi-cn" href="https://bazel.google.cn/versions/6.5.0/rules/windows?hl=vi" /><title>Writing Rules on Windows | Bazel</title> <meta property="og:title" content="Writing Rules on Windows | Bazel"><meta property="og:url" content="https://bazel.build/versions/6.5.0/rules/windows"><meta property="og:locale" content="en"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "headline": "Writing Rules on Windows" } </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> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <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/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/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/versions/6.5.0/about" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/about" class="devsite-tabs-content gc-analytics-event " 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/versions/6.5.0/start" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/start" class="devsite-tabs-content gc-analytics-event " 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/versions/6.5.0/docs" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/docs" class="devsite-tabs-content gc-analytics-event " 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/versions/6.5.0/reference" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/reference" class="devsite-tabs-content gc-analytics-event " 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/versions/6.5.0/extending" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/extending" class="devsite-tabs-content gc-analytics-event " 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/versions/6.5.0/community" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/community" class="devsite-tabs-content gc-analytics-event " 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" track-metadata-eventdetail="https://bazel.build/versions" class="devsite-tabs-content gc-analytics-event " 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> <a href="#" role="button" aria-haspopup="true" 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"></a> <div class="devsite-tabs-dropdown" 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/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.3.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/7.3.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 7.3 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/7.2.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/7.2.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 7.2 </div> </a> </li> <li class="devsite-nav-item"> <a href="https://bazel.build/versions/7.1.0" track-type="nav" track-metadata-eventdetail="https://bazel.build/versions/7.1.0" track-metadata-position="nav - versioned docs" track-metadata-module="tertiary nav" tooltip > <div class="devsite-nav-item-title"> 7.1 </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="hi" >हिंदी</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 </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/versions/6.5.0/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'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 > <a href="https://bazel.build/versions/6.5.0/extending/concepts" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/extending/concepts" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - concepts" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Concepts" track-name="concepts" > Concepts </a> </tab> <tab class="devsite-active"> <a href="https://bazel.build/versions/6.5.0/rules/rules-tutorial" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/rules/rules-tutorial" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - writing rules" track-metadata-module="primary nav" aria-label="Writing rules, selected" 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/versions/6.5.0/rules/testing" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/rules/testing" class="devsite-tabs-content gc-analytics-event " 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/versions/6.5.0/extending/platforms" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/extending/platforms" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - design docs" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Design docs" track-name="design docs" > Design docs </a> </tab> <tab > <a href="https://bazel.build/versions/6.5.0/rules/lib/starlark-overview" track-metadata-eventdetail="https://bazel.build/versions/6.5.0/rules/lib/starlark-overview" class="devsite-tabs-content gc-analytics-event " 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/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/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="/versions/6.5.0/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="/versions/6.5.0/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="/versions/6.5.0/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="/versions/6.5.0/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="/versions/6.5.0/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="/versions/6.5.0/extending/concepts" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " 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 > Concepts </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/6.5.0/rules/rules-tutorial" class="devsite-nav-title gc-analytics-event devsite-nav-has-children devsite-nav-active" 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 menu="_book"> Writing rules </span> <span class="devsite-nav-icon material-icons" data-icon="forward" menu="_book"> </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/6.5.0/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="/versions/6.5.0/extending/platforms" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Design docs" track-name="design docs" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Design docs" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Design docs </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/6.5.0/rules/lib/starlark-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="/versions/6.5.0/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="/versions/6.5.0/rules/rules-tutorial" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /versions/6.5.0/rules/rules-tutorial" track-type="bookNav" track-name="click" track-metadata-eventdetail="/versions/6.5.0/rules/rules-tutorial" ><span class="devsite-nav-text" tooltip>Creating a rule</span></a></li> <li class="devsite-nav-item"><a href="/versions/6.5.0/rules/macro-tutorial" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /versions/6.5.0/rules/macro-tutorial" track-type="bookNav" track-name="click" track-metadata-eventdetail="/versions/6.5.0/rules/macro-tutorial" ><span class="devsite-nav-text" tooltip>Creating a macro</span></a></li> <li class="devsite-nav-item"><a href="/versions/6.5.0/rules/verbs-tutorial" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /versions/6.5.0/rules/verbs-tutorial" track-type="bookNav" track-name="click" track-metadata-eventdetail="/versions/6.5.0/rules/verbs-tutorial" ><span class="devsite-nav-text" tooltip>Creating custom verbs</span></a></li> <li class="devsite-nav-item"><a href="/versions/6.5.0/rules/language" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /versions/6.5.0/rules/language" track-type="bookNav" track-name="click" track-metadata-eventdetail="/versions/6.5.0/rules/language" ><span class="devsite-nav-text" tooltip>Starlark language</span></a></li> <li class="devsite-nav-item"><a href="/versions/6.5.0/rules/bzl-style" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /versions/6.5.0/rules/bzl-style" track-type="bookNav" track-name="click" track-metadata-eventdetail="/versions/6.5.0/rules/bzl-style" ><span class="devsite-nav-text" tooltip>Starlark style guide</span></a></li> <li class="devsite-nav-item"><a href="/versions/6.5.0/rules/challenges" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /versions/6.5.0/rules/challenges" track-type="bookNav" track-name="click" track-metadata-eventdetail="/versions/6.5.0/rules/challenges" ><span class="devsite-nav-text" tooltip>Challenges</span></a></li> <li class="devsite-nav-item"><a href="/versions/6.5.0/rules/windows" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: /versions/6.5.0/rules/windows" track-type="bookNav" track-name="click" track-metadata-eventdetail="/versions/6.5.0/rules/windows" ><span class="devsite-nav-text" tooltip>Writing rules for Windows</span></a></li> <li class="devsite-nav-item devsite-nav-external"><a href="https://github.com/bazelbuild/examples/tree/HEAD/rules" class="devsite-nav-title gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Book nav link, pathname: https://github.com/bazelbuild/examples/tree/HEAD/rules" track-type="bookNav" track-name="click" track-metadata-eventdetail="https://github.com/bazelbuild/examples/tree/HEAD/rules" ><span class="devsite-nav-text" tooltip>Example rules</span><span class="devsite-nav-icon material-icons" data-icon="external" data-title="External" aria-hidden="true"></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/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.3.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 7.3" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 7.3 </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/7.2.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 7.2" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 7.2 </span> </a> </li> <li class="devsite-nav-item"> <a href="/versions/7.1.0" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: 7.1" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > 7.1 </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" 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/versions/6.5.0/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/versions/6.5.0/rules/rules-tutorial" 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="" > Writing rules </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-20241114-r00-rc02.464921008191574316" 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/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/bazel/images/touchicon-180.png" > <button> Send feedback </button> </devsite-feedback> <h1 class="devsite-page-title" tabindex="-1"> Writing Rules on Windows </h1> <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 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 "> <a class="button button-with-icon" href="https://github.com/bazelbuild/bazel/issues/new?title=%5Bbazel.build%5D+Problem+with+/versions/6.5.0/rules/windows&template=doc_issue.yml&link=https%3A%2F%2Fbazel.build/versions/6.5.0/rules/windows" 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/versions/6.5.0/rules/windows.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"> <a href="/rules/windows">Nightly</a> <!-- The lines below are updated by //scripts/docs:gen_new_toc --> <!-- BEGIN_VERSION_INDICATOR --> · <a href="/versions/7.4.0/rules/windows">7.4</a> . <a href="/versions/7.3.0/rules/windows">7.3</a> · <a href="/versions/7.2.0/rules/windows">7.2</a> · <a href="/versions/7.1.0/rules/windows">7.1</a> · <a href="/versions/7.0.0/rules/windows">7.0</a> · <strong>6.5</strong> <!-- END_VERSION_INDICATOR --> </span> <p/> <p>This page focuses on writing Windows-compatible rules, common problems of writing portable rules, and some solutions.</p> <h2 id="paths" data-text="Paths" tabindex="-1">Paths</h2> <p>Problems:</p> <ul> <li><p><strong>Length limit</strong>: maximum path length is 259 characters.</p> <p>Though Windows also supports longer paths (up to 32767 characters), many programs are built with the lower limit.</p> <p>Be aware of this about programs you run in the actions.</p></li> <li><p><strong>Working directory</strong>: is also limited to 259 characters.</p> <p>Processes cannot <code translate="no" dir="ltr">cd</code> into a directory longer than 259 characters.</p></li> <li><p><strong>Case-sensitivity</strong>: Windows paths are case-insensitive, Unix paths are case-sensitive.</p> <p>Be aware of this when creating command lines for actions.</p></li> <li><p><strong>Path separators</strong>: are backslash (<code translate="no" dir="ltr">\`), not forward slash (</code>/`).</p> <p>Bazel stores paths Unix-style with <code translate="no" dir="ltr">/</code> separators. Though some Windows programs support Unix-style paths, others don't. Some built-in commands in cmd.exe support them, some don't.</p> <p>It's best to always use <code translate="no" dir="ltr">\` separators on Windows: replace</code>/<code translate="no" dir="ltr">with</code>` when you create command lines and environment variables for actions.</p></li> <li><p><strong>Absolute paths</strong>: don't start with slash (<code translate="no" dir="ltr">/</code>).</p> <p>Absolute paths on Windows start with a drive letter, such as <code translate="no" dir="ltr">C:\foo\bar.txt</code>. There's no single filesystem root.</p> <p>Be aware of this if your rule checks if a path is absolute. Absolute paths should be avoided since they are often non-portable.</p></li> </ul> <p>Solutions:</p> <ul> <li><p><strong>Keep paths short.</strong></p> <p>Avoid long directory names, deeply nested directory structures, long file names, long workspace names, long target names.</p> <p>All of these may become path components of actions' input files, and may exhaust the path length limit.</p></li> <li><p><strong>Use a short output root.</strong></p> <p>Use the <code translate="no" dir="ltr">--output_user_root=<path></code> flag to specify a short path for Bazel outputs. A good idea is to have a drive (or virtual drive) just for Bazel outputs (such as <code translate="no" dir="ltr">D:\`), and adding this line to your</code>.bazelrc` file:</p> <pre class="prettyprint" translate="no" dir="ltr"><code translate="no" dir="ltr">build --output_user_root=D:/ </code></pre> <p>or</p> <pre class="prettyprint" translate="no" dir="ltr"><code translate="no" dir="ltr">build --output_user_root=C:/_bzl </code></pre></li> <li><p><strong>Use junctions.</strong></p> <p>Junctions are, loosely speaking<sup>[1]</sup>, directory symlinks. Junctions are easy to create and can point to directories (on the same computer) with long paths. If a build action creates a junction whose path is short but whose target is long, then tools with short path limit can access the files in the junction'ed directory.</p> <p>In <code translate="no" dir="ltr">.bat</code> files or in cmd.exe you can create junctions like so:</p> <pre class="prettyprint" translate="no" dir="ltr"><code translate="no" dir="ltr">mklink /J c:\path\to\junction c:\path\to\very\long\target\path </code></pre> <p><sup>[1]</sup>: Strictly speaking <a href="https://superuser.com/a/343079">Junctions are not Symbolic Links</a>, but for the sake of build actions you may regard Junctions as Directory Symlinks.</p></li> <li><p><strong>Replace <code translate="no" dir="ltr">/</code> with `` in paths in actions / envvars.</strong></p> <p>When you create the command line or environment variables for an action, make the paths Windows-style. Example:</p> <pre class="prettyprint lang-python" translate="no" dir="ltr"><code translate="no" dir="ltr">def as_path(p, is_windows): if is_windows: return p.replace("/", "\\") else: return p </code></pre></li> </ul> <h2 id="environment_variables" data-text="Environment variables" tabindex="-1">Environment variables</h2> <p>Problems:</p> <ul> <li><p><strong>Case-sensitivity</strong>: Windows environment variable names are case-insensitive.</p> <p>For example, in Java <code translate="no" dir="ltr">System.getenv("SystemRoot")</code> and <code translate="no" dir="ltr">System.getenv("SYSTEMROOT")</code> yields the same result. (This applies to other languages too.)</p></li> <li><p><strong>Hermeticity</strong>: actions should use as few custom environment variables as possible.</p> <p>Environment variables are part of the action's cache key. If an action uses environment variables that change often, or are custom to users, that makes the rule less cache-able.</p></li> </ul> <p>Solutions:</p> <ul> <li><p><strong>Only use upper-case environment variable names.</strong></p> <p>This works on Windows, macOS, and Linux.</p></li> <li><p><strong>Minimize action environments.</strong></p> <p>When using <code translate="no" dir="ltr">ctx.actions.run</code>, set the environment to <code translate="no" dir="ltr">ctx.configuration.default_shell_env</code>. If the action needs more environment variables, put them all in a dictionary and pass that to the action. Example:</p> <pre class="prettyprint lang-python" translate="no" dir="ltr"><code translate="no" dir="ltr">load("@bazel_skylib//lib:dicts.bzl", "dicts") def _make_env(ctx, output_file, is_windows): out_path = output_file.path if is_windows: out_path = out_path.replace("/", "\\") return dicts.add(ctx.configuration.default_shell_env, {"MY_OUTPUT": out_path}) </code></pre></li> </ul> <h2 id="actions" data-text="Actions" tabindex="-1">Actions</h2> <p>Problems:</p> <ul> <li><p><strong>Executable outputs</strong>: Every executable file must have an executable extension.</p> <p>The most common extensions are <code translate="no" dir="ltr">.exe</code> (binary files) and <code translate="no" dir="ltr">.bat</code> (Batch scripts).</p> <p>Be aware that shell scripts (<code translate="no" dir="ltr">.sh</code>) are NOT executable on Windows; you cannot specify them as <code translate="no" dir="ltr">ctx.actions.run</code>'s <code translate="no" dir="ltr">executable</code>. There's also no <code translate="no" dir="ltr">+x</code> permission that files can have, so you can't execute arbitrary files like on Linux.</p></li> <li><p><strong>Bash commands</strong>: For sake of portability, avoid running Bash commands directly in actions.</p> <p>Bash is widespread on Unix-like systems, but it's often unavailable on Windows. Bazel itself is relying less and less on Bash (MSYS2), so in the future users would be less likely to have MSYS2 installed along with Bazel. To make rules easier to use on Windows, avoid running Bash commands in actions.</p></li> <li><p><strong>Line endings</strong>: Windows uses CRLF (<code translate="no" dir="ltr">\r\n</code>), Unix-like systems uses LF (<code translate="no" dir="ltr">\n</code>).</p> <p>Be aware of this when comparing text files. Be mindful of your Git settings, especially of line endings when checking out or committing. (See Git's <code translate="no" dir="ltr">core.autocrlf</code> setting.)</p></li> </ul> <p>Solutions:</p> <ul> <li><p><strong>Use a Bash-less purpose-made rule.</strong></p> <p><code translate="no" dir="ltr">native.genrule()</code> is a wrapper for Bash commands, and it's often used to solve simple problems like copying a file or writing a text file. You can avoid relying on Bash (and reinventing the wheel): see if bazel-skylib has a purpose-made rule for your needs. None of them depends on Bash when built/tested on Windows.</p> <p>Build rule examples:</p> <ul> <li><p><code translate="no" dir="ltr">copy_file()</code> (<a href="https://github.com/bazelbuild/bazel-skylib/blob/main/rules/copy_file.bzl">source</a>, <a href="https://github.com/bazelbuild/bazel-skylib/blob/main/docs/copy_file_doc.md">documentation</a>): copies a file somewhere else, optionally making it executable</p></li> <li><p><code translate="no" dir="ltr">write_file()</code> (<a href="https://github.com/bazelbuild/bazel-skylib/blob/main/rules/write_file.bzl">source</a>, <a href="https://github.com/bazelbuild/bazel-skylib/blob/main/docs/write_file_doc.md">documentation</a>): writes a text file, with the desired line endings (<code translate="no" dir="ltr">auto</code>, <code translate="no" dir="ltr">unix</code>, or <code translate="no" dir="ltr">windows</code>), optionally making it executable (if it's a script)</p></li> <li><p><code translate="no" dir="ltr">run_binary()</code> (<a href="https://github.com/bazelbuild/bazel-skylib/blob/main/rules/run_binary.bzl">source</a>, <a href="https://github.com/bazelbuild/bazel-skylib/blob/main/docs/run_binary_doc.md">documentation</a>): runs a binary (or <code translate="no" dir="ltr">*_binary</code> rule) with given inputs and expected outputs as a build action (this is a build rule wrapper for <code translate="no" dir="ltr">ctx.actions.run</code>)</p></li> <li><p><code translate="no" dir="ltr">native_binary()</code> (<a href="https://github.com/bazelbuild/bazel-skylib/blob/main/rules/native_binary.bzl">source</a>, <a href="https://github.com/bazelbuild/bazel-skylib/blob/main/docs/native_binary_doc.md#native_binary">documentation</a>): wraps a native binary in a <code translate="no" dir="ltr">*_binary</code> rule, which you can <code translate="no" dir="ltr">bazel run</code> or use in <code translate="no" dir="ltr">run_binary()</code>'s <code translate="no" dir="ltr">tool</code> attribute or <code translate="no" dir="ltr">native.genrule()</code>'s <code translate="no" dir="ltr">tools</code> attribute</p></li> </ul> <p>Test rule examples:</p> <ul> <li><p><code translate="no" dir="ltr">diff_test()</code> (<a href="https://github.com/bazelbuild/bazel-skylib/blob/main/rules/diff_test.bzl">source</a>, <a href="https://github.com/bazelbuild/bazel-skylib/blob/main/docs/diff_test_doc.md">documentation</a>): test that compares contents of two files</p></li> <li><p><code translate="no" dir="ltr">native_test()</code> (<a href="https://github.com/bazelbuild/bazel-skylib/blob/main/rules/native_binary.bzl">source</a>, <a href="https://github.com/bazelbuild/bazel-skylib/blob/main/docs/native_binary_doc.md#native_test">documentation</a>): wraps a native binary in a <code translate="no" dir="ltr">*_test</code> rule, which you can <code translate="no" dir="ltr">bazel test</code></p></li> </ul></li> <li><p><strong>On Windows, consider using <code translate="no" dir="ltr">.bat</code> scripts for trivial things.</strong></p> <p>Instead of <code translate="no" dir="ltr">.sh</code> scripts, you can solve trivial tasks with <code translate="no" dir="ltr">.bat</code> scripts.</p> <p>For example, if you need a script that does nothing, or prints a message, or exits with a fixed error code, then a simple <code translate="no" dir="ltr">.bat</code> file will suffice. If your rule returns a <code translate="no" dir="ltr">DefaultInfo()</code> provider, the <code translate="no" dir="ltr">executable</code> field may refer to that <code translate="no" dir="ltr">.bat</code> file on Windows.</p> <p>And since file extensions don't matter on macOS and Linux, you can always use <code translate="no" dir="ltr">.bat</code> as the extension, even for shell scripts.</p> <p>Be aware that empty <code translate="no" dir="ltr">.bat</code> files cannot be executed. If you need an empty script, write one space in it.</p></li> <li><p><strong>Use Bash in a principled way.</strong></p> <p>In Starlark build and test rules, use <code translate="no" dir="ltr">ctx.actions.run_shell</code> to run Bash scripts and Bash commands as actions.</p> <p>In Starlark macros, wrap Bash scripts and commands in a <code translate="no" dir="ltr">native.sh_binary()</code> or <code translate="no" dir="ltr">native.genrule()</code>. Bazel will check if Bash is available and run the script or command through Bash.</p> <p>In Starlark repository rules, try avoiding Bash altogether. Bazel currently offers no way to run Bash commands in a principled way in repository rules.</p></li> </ul> <h2 id="deleting_files" data-text="Deleting files" tabindex="-1">Deleting files</h2> <p>Problems:</p> <ul> <li><p><strong>Files cannot be deleted while open.</strong></p> <p>Open files cannot be deleted (by default), attempts result in "Access Denied" errors. If you cannot delete a file, maybe a running process still holds it open.</p></li> <li><p><strong>Working directory of a running process cannot be deleted.</strong></p> <p>Processes have an open handle to their working directory, and the directory cannot be deleted until the process terminates.</p></li> </ul> <p>Solutions:</p> <ul> <li><p><strong>In your code, try to close files eagerly.</strong></p> <p>In Java, use <code translate="no" dir="ltr">try-with-resources</code>. In Python, use <code translate="no" dir="ltr">with open(...) as f:</code>. In principle, try closing handles as soon as possible.</p></li> </ul> <!-- TODO: - runfiles, runfiles libraries, -nolegacy_external_runfiles - runfiles envvars, runfiles manifest structure - avoid using runfiles for things that could be inputs - whether to use runfiles manifest on non-windows - how to patch tools that expect to read from the filesystem to do a lookup through the manifest file instead (including helpers in many languages) - how this applies in tests as well that rely on $TEST_SRCDIR - unzip is slow - cmd.exe has 8k command length limit - put paths in envvars instead of args - put cmd.exe commands in .bat files - use ctx.resolve_tools instead of ctx.resolve_command (Bash dep) - how to run cmd.exe actions (maybe I should write a genrule-like rule for these) --> </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-20241114-r00-rc02.464921008191574316" 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/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/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 2024-10-22 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-20241114-r00-rc02.464921008191574316" 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/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/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 2024-10-22 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="hi" >हिंदी</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>[{"dimensions": {"dimension3": "en", "dimension5": false, "dimension2": false, "dimension1": "Signed out", "dimension4": "en"}, "gaid": "UA-61082125-3", "metrics": {}, "purpose": 0}]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [{"id": "G-GBZW986TQ3", "purpose": 0}], "ga4p": [{"id": "G-GBZW986TQ3", "purpose": 0}], "gtm": [], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "article", "projectName": "Bazel", "signedIn": "False", "tenant": "bazel", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <script nonce="X25dwd6aRu2eoM8f4YuMEq4cSoCeFQ"> (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/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/bazel/js/app_loader.js', '[40,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/bazel","https://bazel-dot-devsite-v2-prod-3p.appspot.com",null,null,["/_pwa/bazel/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/bazel/images/favicon-prod.png","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/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,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,["Profiles__enable_page_saving","MiscFeatureFlags__developers_footer_dark_image","Cloud__enable_legacy_calculator_redirect","Profiles__enable_release_notes_notifications","CloudShell__cloud_code_overflow_menu","Profiles__enable_completecodelab_endpoint","TpcFeatures__enable_mirror_tenant_redirects","MiscFeatureFlags__emergency_css","Search__enable_suggestions_from_borg","Profiles__enable_dashboard_curated_recommendations","MiscFeatureFlags__enable_variable_operator","SignIn__enable_oauth_multi_account_support","Experiments__reqs_query_experiments","MiscFeatureFlags__developers_footer_image","MiscFeatureFlags__enable_project_variables","Profiles__enable_public_developer_profiles","Profiles__enable_profile_collections","Profiles__enable_recognition_badges","Profiles__enable_developer_profiles_callout","SignIn__enable_refresh_access_tokens","MiscFeatureFlags__enable_explain_this_code","BookNav__enable_tenant_cache_key","SignIn__enable_auto_login_multi_account","Profiles__enable_awarding_url","MiscFeatureFlags__enable_firebase_utm","Profiles__enable_complete_playlist_endpoint","Search__enable_ai_eligibility_checks","Cloud__enable_cloudx_ping","Cloud__enable_cloud_shell","Cloud__enable_cloudx_experiment_ids","Cloud__enable_free_trial_server_call","Cloud__enable_cloud_shell_fte_user_flow","Cloud__enable_cloud_dlp_service","MiscFeatureFlags__enable_view_transitions","Cloud__enable_llm_concierge_chat","TpcFeatures__enable_required_headers","CloudShell__cloud_shell_button","Search__enable_page_map","EngEduTelemetry__enable_engedu_telemetry","OnSwitch__enable","Concierge__enable_pushui","Search__enable_dynamic_content_confidential_banner","DevPro__enable_developer_subscriptions","Analytics__enable_clearcut_logging","Cloud__enable_cloud_facet_chat","DevPro__enable_cloud_innovators_plus","Profiles__require_profile_eligibility_for_signin"],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],[[3,4],[5,8],[2,2],[1,1],[4,5]]],null,4]]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>