docs/Nixpkgs/Build-Helpers/trivial-build-helpers.chapter/index.html

2673 lines
79 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Aux Documentation">
<meta name="author" content="Nixpkgs Aux, and Lix Contributors">
<link rel="canonical" href="https://docs.auxolotl.org/Nixpkgs/Build-Helpers/trivial-build-helpers.chapter/">
<link rel="prev" href="../testers.chapter/">
<link rel="next" href="../images/appimagetools.section/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>Trivial build helpers - Aux Docs</title>
<link rel="stylesheet" href="../../../assets/stylesheets/main.76a95c52.min.css">
<link rel="stylesheet" href="../../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.bunny.net/css?family=IBM+Plex+Sans:300,300i,400,400i,700,700i%7CIBM+Plex+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"IBM Plex Sans";--md-code-font:"IBM Plex Mono"}</style>
<script>__md_scope=new URL("../../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
<meta property="og:type" content="website" >
<meta property="og:title" content="Trivial build helpers {#chap-trivial-builders} - Aux Docs" >
<meta property="og:description" content="Aux Documentation" >
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Build-Helpers/trivial-build-helpers.chapter.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://docs.auxolotl.org/Nixpkgs/Build-Helpers/trivial-build-helpers.chapter/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Trivial build helpers {#chap-trivial-builders} - Aux Docs" >
<meta name="twitter:description" content="Aux Documentation" >
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Build-Helpers/trivial-build-helpers.chapter.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#chap-trivial-builders" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../../.." title="Aux Docs" class="md-header__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Aux Docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Trivial build helpers
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Dark Mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Dark Mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Light Mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Light Mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
</label>
</form>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Aux Documentation Hub
</a>
</li>
<li class="md-tabs__item">
<a href="../../../TODO/" class="md-tabs__link">
TODO
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Aux/" class="md-tabs__link">
Aux
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Lix/" class="md-tabs__link">
Lix
</a>
</li>
<li class="md-tabs__item">
<a href="../../../NixOS/appstream/" class="md-tabs__link">
NixOS
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
Nixpkgs
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Aux Docs" class="md-nav__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
Aux Docs
</label>
<div class="md-nav__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Aux Documentation Hub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../TODO/" class="md-nav__link">
<span class="md-ellipsis">
TODO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Aux/" class="md-nav__link">
<span class="md-ellipsis">
Aux
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Lix/" class="md-nav__link">
<span class="md-ellipsis">
Lix
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../NixOS/appstream/" class="md-nav__link">
<span class="md-ellipsis">
NixOS
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
Nixpkgs
</span>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Nixpkgs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../options/" class="md-nav__link">
<span class="md-ellipsis">
Options
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_3" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Build Helpers
</span>
</a>
<label class="md-nav__link " for="__nav_6_3" id="__nav_6_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6_3">
<span class="md-nav__icon md-icon"></span>
Build Helpers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../dev-shell-tools.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Development Shell helpers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../fetchers.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Fetchers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../images/" class="md-nav__link">
<span class="md-ellipsis">
Images
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../special/" class="md-nav__link">
<span class="md-ellipsis">
Special build helpers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testers.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Testers
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Trivial build helpers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Trivial build helpers
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#trivial-builder-runCommand" class="md-nav__link">
<span class="md-ellipsis">
runCommand
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-runCommandCC" class="md-nav__link">
<span class="md-ellipsis">
runCommandCC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-runCommandLocal" class="md-nav__link">
<span class="md-ellipsis">
runCommandLocal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-text-writing" class="md-nav__link">
<span class="md-ellipsis">
Writing text files
</span>
</a>
<nav class="md-nav" aria-label="Writing text files">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#trivial-builder-makeDesktopItem" class="md-nav__link">
<span class="md-ellipsis">
makeDesktopItem
</span>
</a>
<nav class="md-nav" aria-label="makeDesktopItem">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#trivial-builder-makeDesktopItem-inputs" class="md-nav__link">
<span class="md-ellipsis">
Inputs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-makeDesktopItem-examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-writeTextFile" class="md-nav__link">
<span class="md-ellipsis">
writeTextFile
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../images/appimagetools.section/" class="md-nav__link">
<span class="md-ellipsis">
Images
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../special/checkpoint-build.section/" class="md-nav__link">
<span class="md-ellipsis">
Special
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Functions/" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Hooks/" class="md-nav__link">
<span class="md-ellipsis">
Hooks
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Languages-And-Frameworks/" class="md-nav__link">
<span class="md-ellipsis">
Languages And Frameworks
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Library-Reference/asserts/" class="md-nav__link">
<span class="md-ellipsis">
Library Reference
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Module-System/module-system.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Module System
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Packages/" class="md-nav__link">
<span class="md-ellipsis">
Packages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Standard-Environment/" class="md-nav__link">
<span class="md-ellipsis">
Standard Environment
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Using-Nixpkgs/" class="md-nav__link">
<span class="md-ellipsis">
Using Nixpkgs
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#trivial-builder-runCommand" class="md-nav__link">
<span class="md-ellipsis">
runCommand
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-runCommandCC" class="md-nav__link">
<span class="md-ellipsis">
runCommandCC
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-runCommandLocal" class="md-nav__link">
<span class="md-ellipsis">
runCommandLocal
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-text-writing" class="md-nav__link">
<span class="md-ellipsis">
Writing text files
</span>
</a>
<nav class="md-nav" aria-label="Writing text files">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#trivial-builder-makeDesktopItem" class="md-nav__link">
<span class="md-ellipsis">
makeDesktopItem
</span>
</a>
<nav class="md-nav" aria-label="makeDesktopItem">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#trivial-builder-makeDesktopItem-inputs" class="md-nav__link">
<span class="md-ellipsis">
Inputs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-makeDesktopItem-examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#trivial-builder-writeTextFile" class="md-nav__link">
<span class="md-ellipsis">
writeTextFile
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="chap-trivial-builders">Trivial build helpers</h1>
<p>Nixpkgs provides a variety of wrapper functions that help build commonly useful derivations.
Like <a href="#sec-using-stdenv"><code>stdenv.mkDerivation</code></a>, each of these build helpers creates a derivation, but the arguments passed are different (usually simpler) from those required by <code>stdenv.mkDerivation</code>.</p>
<h2 id="trivial-builder-runCommand"><code>runCommand</code></h2>
<p><code>runCommand :: String -&gt; AttrSet -&gt; String -&gt; Derivation</code></p>
<p>The result of <code>runCommand name drvAttrs buildCommand</code> is a derivation that is built by running the specified shell commands.</p>
<p>By default <code>runCommand</code> runs in a stdenv with no compiler environment, whereas <a href="#trivial-builder-runCommandCC"><code>runCommandCC</code></a> uses the default stdenv, <code>pkgs.stdenv</code>.</p>
<p><code>name :: String</code>
: The name that Nix will append to the store path in the same way that <code>stdenv.mkDerivation</code> uses its <code>name</code> attribute.</p>
<p><code>drvAttr :: AttrSet</code>
: Attributes to pass to the underlying call to <a href="#chap-stdenv"><code>stdenv.mkDerivation</code></a>.</p>
<p><code>buildCommand :: String</code>
: Shell commands to run in the derivation builder.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<div class="highlight"><pre><span></span><code>You have to create a file or directory `$out` for Nix to be able to run the builder successfully.
</code></pre></div>
</div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Invocation of `runCommand`
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="p">(</span><span class="nb">import</span> <span class="l">&lt;nixpkgs&gt;</span> <span class="p">{})</span><span class="o">.</span>runCommand <span class="s2">&quot;my-example&quot;</span> <span class="p">{}</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> echo My example command is running</span>
<span class="s s-Multiline"> mkdir $out</span>
<span class="s s-Multiline"> echo I can write data to the Nix store &gt; $out/message</span>
<span class="s s-Multiline"> echo I can also run basic commands like:</span>
<span class="s s-Multiline"> echo ls</span>
<span class="s s-Multiline"> ls</span>
<span class="s s-Multiline"> echo whoami</span>
<span class="s s-Multiline"> whoami</span>
<span class="s s-Multiline"> echo date</span>
<span class="s s-Multiline"> date</span>
<span class="s s-Multiline">&#39;&#39;</span>
</code></pre></div>
</div>
<h2 id="trivial-builder-runCommandCC"><code>runCommandCC</code></h2>
<p>This works just like <code>runCommand</code>. The only difference is that it also provides a C compiler in <code>buildCommand</code>'s environment. To minimize your dependencies, you should only use this if you are sure you will need a C compiler as part of running your command.</p>
<h2 id="trivial-builder-runCommandLocal"><code>runCommandLocal</code></h2>
<p>Variant of <code>runCommand</code> that forces the derivation to be built locally, it is not substituted. This is intended for very cheap commands (&lt;1s execution time). It saves on the network round-trip and can speed up a build.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>This sets <a href="https://nixos.org/nix/manual/#adv-attr-allowSubstitutes"><code>allowSubstitutes</code> to <code>false</code></a>, so only use <code>runCommandLocal</code> if you are certain the user will always have a builder for the <code>system</code> of the derivation. This should be true for most trivial use cases (e.g., just copying some files to a different location or adding symlinks) because there the <code>system</code> is usually the same as <code>builtins.currentSystem</code>.</p>
</div>
<h2 id="trivial-builder-text-writing">Writing text files</h2>
<p>Nixpkgs provides the following functions for producing derivations which write text files or executable scripts into the Nix store.
They are useful for creating files from Nix expression, and are all implemented as convenience wrappers around <code>writeTextFile</code>.</p>
<p>Each of these functions will cause a derivation to be produced.
When you coerce the result of each of these functions to a string with <a href="https://nixos.org/manual/nix/stable/language/string-interpolation">string interpolation</a> or <a href="https://nixos.org/manual/nix/stable/language/builtins#builtins-toString"><code>builtins.toString</code></a>, it will evaluate to the <a href="https://nixos.org/manual/nix/stable/store/store-path">store path</a> of this derivation.</p>
<p>:!!! note
Some of these functions will put the resulting files within a directory inside the <a href="https://nixos.org/manual/nix/stable/language/derivations#attr-outputs">derivation output</a>.
If you need to refer to the resulting files somewhere else in a Nix expression, append their path to the derivation's store path.</p>
<p>For example, if the file destination is a directory:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">my-file</span> <span class="o">=</span> writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-file&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">destination</span> <span class="o">=</span> <span class="s2">&quot;/share/my-file&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre></div>
<p>Remember to append "/share/my-file" to the resulting store path when using it elsewhere:</p>
<p><div class="highlight"><pre><span></span><code>writeShellScript <span class="s2">&quot;evaluate-my-file.sh&quot;</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> cat </span><span class="si">${</span>my-file<span class="si">}</span><span class="s s-Multiline">/share/my-file</span>
<span class="s s-Multiline">&#39;&#39;</span>
</code></pre></div>
:</p>
<h3 id="trivial-builder-makeDesktopItem"><code>makeDesktopItem</code></h3>
<p>Write an <a href="https://specifications.freedesktop.org/desktop-entry-spec/1.4/">XDG desktop file</a> to the Nix store.</p>
<p>This function is usually used to add desktop items to a package through the <code>copyDesktopItems</code> hook.</p>
<p><code>makeDesktopItem</code> adheres to version 1.4 of the specification.</p>
<h4 id="trivial-builder-makeDesktopItem-inputs">Inputs</h4>
<p><code>makeDesktopItem</code> takes an attribute set that accepts most values from the <a href="https://specifications.freedesktop.org/desktop-entry-spec/1.4/ar01s06.html">XDG specification</a>.</p>
<p>All recognised keys from the specification are supported with the exception of the "Hidden" field. The keys are converted into camelCase format, but correspond 1:1 to their equivalent in the specification: <code>genericName</code>, <code>noDisplay</code>, <code>comment</code>, <code>icon</code>, <code>onlyShowIn</code>, <code>notShowIn</code>, <code>dbusActivatable</code>, <code>tryExec</code>, <code>exec</code>, <code>path</code>, <code>terminal</code>, <code>mimeTypes</code>, <code>categories</code>, <code>implements</code>, <code>keywords</code>, <code>startupNotify</code>, <code>startupWMClass</code>, <code>url</code>, <code>prefersNonDefaultGPU</code>.</p>
<p>The "Version" field is hardcoded to the version <code>makeDesktopItem</code> currently adheres to.</p>
<p>The following fields are either required, are of a different type than in the specification, carry specific default values, or are additional fields supported by <code>makeDesktopItem</code>:</p>
<p><code>name</code> (String)</p>
<p>: The name of the desktop file in the Nix store.</p>
<p><code>type</code> (String; <em>optional</em>)</p>
<p>: Default value: <code>"Application"</code></p>
<p><code>desktopName</code> (String)</p>
<p>: Corresponds to the "Name" field of the specification.</p>
<p><code>actions</code> (List of Attribute set; <em>optional</em>)</p>
<p>: A list of attribute sets {name, exec?, icon?}</p>
<p><code>extraConfig</code> (Attribute set; <em>optional</em>)</p>
<p>: Additional key/value pairs to be added verbatim to the desktop file. Attributes need to be prefixed with 'X-'.</p>
<h4 id="trivial-builder-makeDesktopItem-examples">Examples</h4>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage 1 of `makeDesktopItem`
</code></pre></div>
<p>Write a desktop file <code>/nix/store/&lt;store path&gt;/my-program.desktop</code> to the Nix store.</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>makeDesktopItem<span class="p">}:</span>
makeDesktopItem <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-program&quot;</span><span class="p">;</span>
<span class="ss">desktopName</span> <span class="o">=</span> <span class="s2">&quot;My Program&quot;</span><span class="p">;</span>
<span class="ss">genericName</span> <span class="o">=</span> <span class="s2">&quot;Video Player&quot;</span><span class="p">;</span>
<span class="ss">noDisplay</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">comment</span> <span class="o">=</span> <span class="s2">&quot;Cool video player&quot;</span><span class="p">;</span>
<span class="ss">icon</span> <span class="o">=</span> <span class="s2">&quot;/path/to/icon&quot;</span><span class="p">;</span>
<span class="ss">onlyShowIn</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;KDE&quot;</span> <span class="p">];</span>
<span class="ss">dbusActivatable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">tryExec</span> <span class="o">=</span> <span class="s2">&quot;my-program&quot;</span><span class="p">;</span>
<span class="ss">exec</span> <span class="o">=</span> <span class="s2">&quot;my-program --someflag&quot;</span><span class="p">;</span>
<span class="ss">path</span> <span class="o">=</span> <span class="s2">&quot;/some/working/path&quot;</span><span class="p">;</span>
<span class="ss">terminal</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
actions<span class="o">.</span><span class="ss">example</span> <span class="o">=</span> <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;New Window&quot;</span><span class="p">;</span>
<span class="ss">exec</span> <span class="o">=</span> <span class="s2">&quot;my-program --new-window&quot;</span><span class="p">;</span>
<span class="ss">icon</span> <span class="o">=</span> <span class="s2">&quot;/some/icon&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="ss">mimeTypes</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;video/mp4&quot;</span> <span class="p">];</span>
<span class="ss">categories</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;Utility&quot;</span> <span class="p">];</span>
<span class="ss">implements</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;org.my-program&quot;</span> <span class="p">];</span>
<span class="ss">keywords</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&quot;Video&quot;</span> <span class="s2">&quot;Player&quot;</span> <span class="p">];</span>
<span class="ss">startupNotify</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">startupWMClass</span> <span class="o">=</span> <span class="s2">&quot;MyProgram&quot;</span><span class="p">;</span>
<span class="ss">prefersNonDefaultGPU</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
extraConfig<span class="o">.</span><span class="ss">X-SomeExtension</span> <span class="o">=</span> <span class="s2">&quot;somevalue&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
</div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage 2 of `makeDesktopItem`
</code></pre></div>
<p>Override the <code>hello</code> package to add a desktop item.</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> copyDesktopItems
<span class="p">,</span> hello
<span class="p">,</span> makeDesktopItem <span class="p">}:</span>
hello<span class="o">.</span>overrideAttrs <span class="p">{</span>
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span> copyDesktopItems <span class="p">];</span>
<span class="ss">desktopItems</span> <span class="o">=</span> <span class="p">[(</span>makeDesktopItem <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;hello&quot;</span><span class="p">;</span>
<span class="ss">desktopName</span> <span class="o">=</span> <span class="s2">&quot;Hello&quot;</span><span class="p">;</span>
<span class="ss">exec</span> <span class="o">=</span> <span class="s2">&quot;hello&quot;</span><span class="p">;</span>
<span class="p">})];</span>
<span class="p">}</span>
</code></pre></div>
</div>
<h3 id="trivial-builder-writeTextFile"><code>writeTextFile</code></h3>
<p>Write a text file to the Nix store.</p>
<p><code>writeTextFile</code> takes an attribute set with the following possible attributes:</p>
<p><code>name</code> (String)</p>
<p>: Corresponds to the name used in the Nix store path identifier.</p>
<p><code>text</code> (String)</p>
<p>: The contents of the file.</p>
<p><code>executable</code> (Bool, <em>optional</em>)</p>
<p>: Make this file have the executable bit set.</p>
<p>Default: <code>false</code></p>
<p><code>destination</code> (String, <em>optional</em>)</p>
<p>: A subpath under the derivation's output path into which to put the file.
Subdirectories are created automatically when the derivation is realised.</p>
<p>By default, the store path itself will be a file containing the text contents.</p>
<p>Default: <code>""</code></p>
<p><code>checkPhase</code> (String, <em>optional</em>)</p>
<p>: Commands to run after generating the file.</p>
<p>Default: <code>""</code></p>
<p><code>meta</code> (Attribute set, <em>optional</em>)</p>
<p>: Additional metadata for the derivation.</p>
<p>Default: <code>{}</code></p>
<p><code>allowSubstitutes</code> (Bool, <em>optional</em>)</p>
<p>: Whether to allow substituting from a binary cache.
Passed through to <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes#adv-attr-allowSubstitutes"><code>allowSubsitutes</code></a> of the underlying call to <code>builtins.derivation</code>.</p>
<p>It defaults to <code>false</code>, as running the derivation's simple <code>builder</code> executable locally is assumed to be faster than network operations.
Set it to true if the <code>checkPhase</code> step is expensive.</p>
<p>Default: <code>false</code></p>
<p><code>preferLocalBuild</code> (Bool, <em>optional</em>)</p>
<p>: Whether to prefer building locally, even if faster <a href="https://nixos.org/manual/nix/stable/command-ref/conf-file#conf-substituters">remote build machines</a> are available.</p>
<p>Passed through to <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes#adv-attr-preferLocalBuild"><code>preferLocalBuild</code></a> of the underlying call to <code>builtins.derivation</code>.</p>
<p>It defaults to <code>true</code> for the same reason <code>allowSubstitutes</code> defaults to <code>false</code>.</p>
<p>Default: <code>true</code></p>
<p><code>derivationArgs</code> (Attribute set, <em>optional</em>)</p>
<p>: Extra arguments to pass to the underlying call to <code>stdenv.mkDerivation</code>.</p>
<p>Default: <code>{}</code></p>
<p>The resulting store path will include some variation of the name, and it will be a file unless <code>destination</code> is used, in which case it will be a directory.</p>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage 1 of `writeTextFile`
</code></pre></div>
<p>Write <code>my-file</code> to <code>/nix/store/&lt;store path&gt;/some/subpath/my-cool-script</code>, making it executable.
Also run a check on the resulting file in a <code>checkPhase</code>, and supply values for the less-used options.</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-cool-script&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> #!/bin/sh</span>
<span class="s s-Multiline"> echo &quot;This is my cool script!&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">executable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">destination</span> <span class="o">=</span> <span class="s2">&quot;/some/subpath/my-cool-script&quot;</span><span class="p">;</span>
<span class="ss">checkPhase</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> </span><span class="si">${</span>pkgs<span class="o">.</span>shellcheck<span class="si">}</span><span class="s s-Multiline">/bin/shellcheck $out/some/subpath/my-cool-script</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">meta</span> <span class="o">=</span> <span class="p">{</span>
<span class="ss">license</span> <span class="o">=</span> pkgs<span class="o">.</span>lib<span class="o">.</span>licenses<span class="o">.</span>cc0<span class="p">;</span>
<span class="p">};</span>
<span class="ss">allowSubstitutes</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">preferLocalBuild</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
</div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<h1 id="usage-2-of-writetextfile">Usage 2 of <code>writeTextFile</code></h1>
</div>
<p>Write the string <code>Contents of File</code> to <code>/nix/store/&lt;store path&gt;</code>.
See also the <a href="#trivial-builder-writeText"></a> helper function.</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-file&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<h1 id="usage-3-of-writetextfile">Usage 3 of <code>writeTextFile</code></h1>
</div>
<p>Write an executable script <code>my-script</code> to <code>/nix/store/&lt;store path&gt;/bin/my-script</code>.
See also the <a href="#trivial-builder-writeScriptBin"></a> helper function.</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-script&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> echo &quot;hi&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">executable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">destination</span> <span class="o">=</span> <span class="s2">&quot;/bin/my-script&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="trivial-builder-writeText"><code>writeText</code></h3>
<p>Write a text file to the Nix store</p>
<p><code>writeText</code> takes the following arguments:
a string.</p>
<p><code>name</code> (String)</p>
<p>: The name used in the Nix store path.</p>
<p><code>text</code> (String)</p>
<p>: The contents of the file.</p>
<p>The store path will include the name, and it will be a file.</p>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage of `writeText`
</code></pre></div>
<p>Write the string <code>Contents of File</code> to <code>/nix/store/&lt;store path&gt;</code>:</p>
<div class="highlight"><pre><span></span><code>writeText <span class="s2">&quot;my-file&quot;</span>
<span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span>
</code></pre></div>
</div>
<p>This is equivalent to:</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-file&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="trivial-builder-writeTextDir"><code>writeTextDir</code></h3>
<p>Write a text file within a subdirectory of the Nix store.</p>
<p><code>writeTextDir</code> takes the following arguments:</p>
<p><code>path</code> (String)</p>
<p>: The destination within the Nix store path under which to create the file.</p>
<p><code>text</code> (String)</p>
<p>: The contents of the file.</p>
<p>The store path will be a directory.</p>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage of `writeTextDir`
</code></pre></div>
<p>Write the string <code>Contents of File</code> to <code>/nix/store/&lt;store path&gt;/share/my-file</code>:</p>
<div class="highlight"><pre><span></span><code>writeTextDir <span class="s2">&quot;share/my-file&quot;</span>
<span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span>
</code></pre></div>
</div>
<p>This is equivalent to:</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-file&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">destination</span> <span class="o">=</span> <span class="s2">&quot;share/my-file&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="trivial-builder-writeScript"><code>writeScript</code></h3>
<p>Write an executable script file to the Nix store.</p>
<p><code>writeScript</code> takes the following arguments:</p>
<p><code>name</code> (String)</p>
<p>: The name used in the Nix store path.</p>
<p><code>text</code> (String)</p>
<p>: The contents of the file.</p>
<p>The created file is marked as executable.
The store path will include the name, and it will be a file.</p>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage of `writeScript`
</code></pre></div>
<p>Write the string <code>Contents of File</code> to <code>/nix/store/&lt;store path&gt;</code> and make the file executable.</p>
<div class="highlight"><pre><span></span><code>writeScript <span class="s2">&quot;my-file&quot;</span>
<span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span>
</code></pre></div>
</div>
<p>This is equivalent to:</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-file&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> Contents of File</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">executable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="trivial-builder-writeScriptBin"><code>writeScriptBin</code></h3>
<p>Write a script within a <code>bin</code> subirectory of a directory in the Nix store.
This is for consistency with the convention of software packages placing executables under <code>bin</code>.</p>
<p><code>writeScriptBin</code> takes the following arguments:</p>
<p><code>name</code> (String)</p>
<p>: The name used in the Nix store path and within the file created under the store path.</p>
<p><code>text</code> (String)</p>
<p>: The contents of the file.</p>
<p>The created file is marked as executable.
The file's contents will be put into <code>/nix/store/&lt;store path&gt;/bin/&lt;name&gt;</code>.
The store path will include the name, and it will be a directory.</p>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage of `writeScriptBin`
</code></pre></div>
<div class="highlight"><pre><span></span><code>writeScriptBin <span class="s2">&quot;my-script&quot;</span>
<span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> echo &quot;hi&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span>
</code></pre></div>
</div>
<p>This is equivalent to:</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-script&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> echo &quot;hi&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">executable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">destination</span> <span class="o">=</span> <span class="s2">&quot;bin/my-script&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="trivial-builder-writeShellScript"><code>writeShellScript</code></h3>
<p>Write a Bash script to the store.</p>
<p><code>writeShellScript</code> takes the following arguments:</p>
<p><code>name</code> (String)</p>
<p>: The name used in the Nix store path.</p>
<p><code>text</code> (String)</p>
<p>: The contents of the file.</p>
<p>The created file is marked as executable.
The store path will include the name, and it will be a file.</p>
<p>This function is almost exactly like <a href="#trivial-builder-writeScript"></a>, except that it prepends to the file a <a href="https://en.wikipedia.org/wiki/Shebang_%28Unix%29">shebang</a> line that points to the version of Bash used in Nixpkgs.</p>
<!-- this cannot be changed in practice, so there is no point pretending it's somehow generic -->
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage of `writeShellScript`
</code></pre></div>
<div class="highlight"><pre><span></span><code>writeShellScript <span class="s2">&quot;my-script&quot;</span>
<span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> echo &quot;hi&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span>
</code></pre></div>
</div>
<p>This is equivalent to:</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-script&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> #! </span><span class="si">${</span>pkgs<span class="o">.</span>runtimeShell<span class="si">}</span>
<span class="s s-Multiline"> echo &quot;hi&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">executable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="trivial-builder-writeShellScriptBin"><code>writeShellScriptBin</code></h3>
<p>Write a Bash script to a "bin" subdirectory of a directory in the Nix store.</p>
<p><code>writeShellScriptBin</code> takes the following arguments:</p>
<p><code>name</code> (String)</p>
<p>: The name used in the Nix store path and within the file generated under the store path.</p>
<p><code>text</code> (String)</p>
<p>: The contents of the file.</p>
<p>The file's contents will be put into <code>/nix/store/&lt;store path&gt;/bin/&lt;name&gt;</code>.
The store path will include the the name, and it will be a directory.</p>
<p>This function is a combination of <a href="#trivial-builder-writeShellScript"></a> and <a href="#trivial-builder-writeScriptBin"></a>.</p>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Usage of `writeShellScriptBin`
</code></pre></div>
<div class="highlight"><pre><span></span><code>writeShellScriptBin <span class="s2">&quot;my-script&quot;</span>
<span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> echo &quot;hi&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span>
</code></pre></div>
</div>
<p>This is equivalent to:</p>
<div class="highlight"><pre><span></span><code>writeTextFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;my-script&quot;</span><span class="p">;</span>
<span class="ss">text</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> #! </span><span class="si">${</span>pkgs<span class="o">.</span>runtimeShell<span class="si">}</span>
<span class="s s-Multiline"> echo &quot;hi&quot;</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">executable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">destination</span> <span class="o">=</span> <span class="s2">&quot;bin/my-script&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h2 id="trivial-builder-concatText"><code>concatTextFile</code>, <code>concatText</code>, <code>concatScript</code></h2>
<p>These functions concatenate <code>files</code> to the Nix store in a single file. This is useful for configuration files structured in lines of text. <code>concatTextFile</code> takes an attribute set and expects two arguments, <code>name</code> and <code>files</code>. <code>name</code> corresponds to the name used in the Nix store path. <code>files</code> will be the files to be concatenated. You can also set <code>executable</code> to true to make this file have the executable bit set.
<code>concatText</code> and<code>concatScript</code> are simple wrappers over <code>concatTextFile</code>.</p>
<p>Here are a few examples:
```nix "Writes my-file to /nix/store/<store path>
concatTextFile {
name = "my-file";
files = [ drv1 "${drv2}/path/to/file" ];
}</p>
<h1 id="see-also-the-concattext-helper-function-below-writes-executable-my-file-to-nixstorebinmy-file">See also the <code>concatText</code> helper function below. "Writes executable my-file to /nix/store/<store path>/bin/my-file</h1>
<p>concatTextFile {
name = "my-file";
files = [ drv1 "${drv2}/path/to/file" ];
executable = true;
destination = "/bin/my-file";
}</p>
<h1 id="writes-contents-of-files-to-nixstore">Writes contents of files to /nix/store/<store path></h1>
<p>concatText "my-file" [ file1 file2 ] "Writes contents of files to /nix/store/<store path>
concatScript "my-file" [ file1 file2 ]
<div class="highlight"><pre><span></span><code>## `writeShellApplication` {#trivial-builder-writeShellApplication}
`writeShellApplication` is similar to `writeShellScriptBin` and `writeScriptBin` but supports runtime dependencies with `runtimeInputs`.
Writes an executable shell script to `/nix/store/&lt;store path&gt;/bin/&lt;name&gt;` and checks its syntax with [`shellcheck`](https://github.com/koalaman/shellcheck) and the `bash`&#39;s `-n` option.
Some basic Bash options are set by default (`errexit`, `nounset`, and `pipefail`), but can be overridden with `bashOptions`.
Extra arguments may be passed to `stdenv.mkDerivation` by setting `derivationArgs`; note that variables set in this manner will be set when the shell script is _built,_ not when it&#39;s run.
Runtime environment variables can be set with the `runtimeEnv` argument.
For example, the following shell application can refer to `curl` directly, rather than needing to write `${curl}/bin/curl`:
```nix
writeShellApplication {
name = &quot;show-nixos-org&quot;;
runtimeInputs = [ curl w3m ];
text = &#39;&#39;
curl -s &#39;https://nixos.org&#39; | w3m -dump -T text/html
&#39;&#39;;
}
</code></pre></div></p>
<h2 id="trivial-builder-symlinkJoin"><code>symlinkJoin</code></h2>
<p>This can be used to put many derivations into the same directory structure. It works by creating a new derivation and adding symlinks to each of the paths listed. It expects two arguments, <code>name</code>, and <code>paths</code>. <code>name</code> is the name used in the Nix store path for the created derivation. <code>paths</code> is a list of paths that will be symlinked. These paths can be to Nix store derivations or any other subdirectory contained within.
Here is an example:
<div class="highlight"><pre><span></span><code><span class="c1"># adds symlinks of hello and stack to current build and prints &quot;links added&quot;</span>
symlinkJoin <span class="p">{</span> <span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;myexample&quot;</span><span class="p">;</span> <span class="ss">paths</span> <span class="o">=</span> <span class="p">[</span> pkgs<span class="o">.</span>hello pkgs<span class="o">.</span>stack <span class="p">];</span> <span class="ss">postBuild</span> <span class="o">=</span> <span class="s2">&quot;echo links added&quot;</span><span class="p">;</span> <span class="p">}</span>
</code></pre></div>
This creates a derivation with a directory structure like the following:
<div class="highlight"><pre><span></span><code>/nix/store/sglsr5g079a5235hy29da3mq3hv8sjmm-myexample
|-- bin
| |-- hello -&gt; /nix/store/qy93dp4a3rqyn2mz63fbxjg228hffwyw-hello-2.10/bin/hello
| `-- stack -&gt; /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/bin/stack
`-- share
|-- bash-completion
| `-- completions
| `-- stack -&gt; /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/bash-completion/completions/stack
|-- fish
| `-- vendor_completions.d
| `-- stack.fish -&gt; /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/fish/vendor_completions.d/stack.fish
...
</code></pre></div></p>
<h2 id="trivial-builder-writeReferencesToFile"><code>writeReferencesToFile</code></h2>
<p>Deprecated. Use <a href="#trivial-builder-writeClosure"><code>writeClosure</code></a> instead.</p>
<h2 id="trivial-builder-writeClosure"><code>writeClosure</code></h2>
<p>Given a list of <a href="https://nixos.org/manual/nix/stable/glossary#gloss-store-path">store paths</a> (or string-like expressions coercible to store paths), write their collective <a href="https://nixos.org/manual/nix/stable/glossary#gloss-closure">closure</a> to a text file.</p>
<p>The result is equivalent to the output of <code>nix-store -q --requisites</code>.</p>
<p>For example,</p>
<div class="highlight"><pre><span></span><code>writeClosure <span class="p">[</span> <span class="p">(</span>writeScriptBin <span class="s2">&quot;hi&quot;</span> <span class="s s-Multiline">&#39;&#39;</span><span class="si">${</span>hello<span class="si">}</span><span class="s s-Multiline">/bin/hello&#39;&#39;</span><span class="p">)</span> <span class="p">]</span>
</code></pre></div>
<p>produces an output path <code>/nix/store/&lt;hash&gt;-runtime-deps</code> containing</p>
<div class="highlight"><pre><span></span><code>/nix/store/&lt;hash&gt;-hello-2.10
/nix/store/&lt;hash&gt;-hi
/nix/store/&lt;hash&gt;-libidn2-2.3.0
/nix/store/&lt;hash&gt;-libunistring-0.9.10
/nix/store/&lt;hash&gt;-glibc-2.32-40
</code></pre></div>
<p>You can see that this includes <code>hi</code>, the original input path,
<code>hello</code>, which is a direct reference, but also
the other paths that are indirectly required to run <code>hello</code>.</p>
<h2 id="trivial-builder-writeDirectReferencesToFile"><code>writeDirectReferencesToFile</code></h2>
<p>Writes the set of references to the output file, that is, their immediate dependencies.</p>
<p>This produces the equivalent of <code>nix-store -q --references</code>.</p>
<p>For example,</p>
<div class="highlight"><pre><span></span><code>writeDirectReferencesToFile <span class="p">(</span>writeScriptBin <span class="s2">&quot;hi&quot;</span> <span class="s s-Multiline">&#39;&#39;</span><span class="si">${</span>hello<span class="si">}</span><span class="s s-Multiline">/bin/hello&#39;&#39;</span><span class="p">)</span>
</code></pre></div>
<p>produces an output path <code>/nix/store/&lt;hash&gt;-runtime-references</code> containing</p>
<div class="highlight"><pre><span></span><code>/nix/store/&lt;hash&gt;-hello-2.10
</code></pre></div>
<p>but none of <code>hello</code>'s dependencies because those are not referenced directly
by <code>hi</code>'s output.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Licenced MIT
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
<div class="md-social">
<a href="https://git.auxolotl.org/auxolotl/docs" target="_blank" rel="noopener" title="Aux Docs Repo" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</a>
<a href="https://forum.aux.computer/" target="_blank" rel="noopener" title="Aux Forum" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.103 0C18.666 0 24 5.485 24 11.997c0 6.51-5.33 11.99-11.9 11.99L0 24V11.79C0 5.28 5.532 0 12.103 0zm.116 4.563a7.395 7.395 0 0 0-6.337 3.57 7.247 7.247 0 0 0-.148 7.22L4.4 19.61l4.794-1.074a7.424 7.424 0 0 0 8.136-1.39 7.256 7.256 0 0 0 1.737-7.997 7.375 7.375 0 0 0-6.84-4.585h-.008z"/></svg>
</a>
<a href="https://wiki.auxolotl.org/" target="_blank" rel="noopener" title="Aux Wiki" class="md-social__link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.801 13.557c.148.098.288.202.417.313 1.854 1.6 3.127 4.656 2.582 7.311-1.091-.255-5.747-1.055-7.638-3.383-.91-1.12-1.366-2.081-1.569-2.885a5.65 5.65 0 0 0 .034-.219c.089.198.197.35.313.466.24.24.521.335.766.372.304.046.594-.006.806-.068l.001.001c.05-.015.433-.116.86-.342.325-.173 2.008-.931 3.428-1.566Zm-7.384 1.435C9.156 16.597 6.6 18.939.614 18.417c.219-1.492 1.31-3.019 2.51-4.11.379-.345.906-.692 1.506-1.009.286.168.598.332.939.486 2.689 1.221 3.903 1.001 4.89.573a1.3 1.3 0 0 0 .054-.025 6.156 6.156 0 0 0-.096.66Zm4.152-.462c.38-.341.877-.916 1.383-1.559-.389-.15-.866-.371-1.319-.591-.598-.29-1.305-.283-2.073-.315a4.685 4.685 0 0 1-.804-.103c.014-.123.027-.246.038-.369.062.104.673.057.871.057.354 0 1.621.034 3.074-.574 1.452-.608 2.55-1.706 3.022-3.225.474-1.52.22-3.091-.168-3.952-.169.709-1.453 2.381-1.926 2.871-.473.489-2.381 2.296-2.972 2.921-.7.74-.688.793-1.332 1.302-.202.19-.499.402-.563.53.027-.338.039-.675.027-.997a7.653 7.653 0 0 0-.032-.523c.322-.059.567-.522.567-.861 0-.224-.106-.247-.271-.229.075-.894.382-3.923 1.254-4.281.218.109.831.068.649-.295-.182-.364-.825-.074-1.081.266-.28.374-.956 2.046-.92 4.324-.113.014-.174.033-.322.033-.171 0-.321-.04-.433-.05.034-2.275-.714-3.772-.84-4.169-.12-.375-.491-.596-.781-.596-.146 0-.272.056-.333.179-.182.363.459.417.677.308.706.321 1.156 3.519 1.254 4.277-.125-.006-.199.035-.199.233 0 .311.17.756.452.843a.442.442 0 0 0-.007.03s-.287.99-.413 2.189a4.665 4.665 0 0 1-.718-.225c-.714-.286-1.355-.583-2.019-.566-.664.018-1.366.023-1.804-.036-.438-.058-.649-.15-.649-.15s-.234.365.257 1.075c.42.607 1.055 1.047 1.644 1.18.589.134 1.972.18 2.785-.377.16-.109.317-.228.459-.34a8.717 8.717 0 0 0-.013.626c-.289.753-.571 1.993-.268 3.338 0-.001.701-.842.787-2.958.006-.144.009-.271.01-.383.052-.248.103-.518.148-.799.072.135.151.277.234.413.511.842 1.791 1.37 2.383 1.49.091.019.187.032.285.038Zm-1.12.745c-.188.055-.445.1-.713.059-.21-.031-.45-.11-.655-.316-.169-.168-.312-.419-.401-.789a9.837 9.837 0 0 0 .039-.82l.049-.243c.563.855 1.865 1.398 2.476 1.522.036.008.072.014.109.02l-.013.009c-.579.415-.76.503-.891.558Zm6.333-2.818c-.257.114-4.111 1.822-5.246 2.363.98-.775 3.017-3.59 3.699-4.774 1.062.661 1.468 1.109 1.623 1.441.101.217.09.38.096.515a.57.57 0 0 1-.172.455Zm-9.213 1.62a1.606 1.606 0 0 1-.19.096c-.954.414-2.126.61-4.728-.571-2.023-.918-3.024-2.157-3.371-2.666.476.161 1.471.473 2.157.524.282.021.703.068 1.167.125.021.209.109.486.345.829l.001.001c.451.651 1.134 1.119 1.765 1.262.622.141 2.083.182 2.942-.407a3.12 3.12 0 0 0 .132-.093l.001.179a6.052 6.052 0 0 0-.221.721Zm5.512-1.271a17.49 17.49 0 0 1-1.326-.589c.437.042 1.054.083 1.692.108-.121.162-.244.323-.366.481Zm.932-1.26c-.12.17-.245.343-.373.517-.241.018-.478.03-.709.038a29.05 29.05 0 0 1-.741-.048c.608-.065 1.228-.252 1.823-.507Zm.22-.315c-.809.382-1.679.648-2.507.648-.472 0-.833.018-1.139.039v.001c-.324-.031-.665-.039-1.019-.054a3.555 3.555 0 0 1-.152-.009c.102-.002.192-.006.249-.006.363 0 1.662.034 3.151-.589 1.508-.632 2.645-1.773 3.136-3.351.37-1.186.31-2.402.086-3.312.458-.336.86-.651 1.147-.91.501-.451.743-.733.848-.869.199.206.714.864.685 2.138-.036 1.611-.606 3.187-1.501 4.154a9.099 9.099 0 0 1-1.321 1.132 11.978 11.978 0 0 0-.644-.422l-.089-.055-.051.091c-.184.332-.5.825-.879 1.374ZM4.763 5.817c-.157 1.144.113 2.323.652 3.099.539.776 2.088 2.29 3.614 2.505.991.14 2.055.134 2.055.134s-.593-.576-1.114-1.66c-.521-1.085-.948-2.104-1.734-2.786-.785-.681-1.601-1.416-2.045-1.945-.444-.53-.59-.86-.59-.86s-.656.175-.838 1.513Zm14.301 4.549a9.162 9.162 0 0 0 1.3-1.12c.326-.352.611-.782.845-1.265 1.315.145 2.399.371 2.791.434 0 0-.679 1.971-3.945 3.022l-.016-.035c-.121-.26-.385-.594-.975-1.036Zm-11.634.859a8.537 8.537 0 0 1-.598-.224c-1.657-.693-2.91-1.944-3.449-3.678-.498-1.601-.292-3.251.091-4.269.225.544.758 1.34 1.262 2.01a3.58 3.58 0 0 0-.172.726c-.163 1.197.123 2.428.687 3.24.416.599 1.417 1.62 2.555 2.193-.128.002-.253.003-.376.002Zm-1.758-.077c-.958-.341-1.901-.787-2.697-1.368C-.07 7.559 0 6.827 0 6.827s1.558-.005 3.088.179c.03.126.065.251.104.377.557 1.791 1.851 3.086 3.562 3.803l.047.019a4.254 4.254 0 0 1-.267-.026h-.001c-.401-.053-.595-.135-.595-.135l-.157-.069-.092.144-.017.029Zm6.807-1.59c.086.017.136.058.136.145 0 .197-.242.5-.597.597l-.01-.161a.887.887 0 0 0 .283-.243c.078-.099.142-.217.188-.338Zm-1.591.006c.033.1.076.197.129.282.061.097.134.18.217.24l-.021.083c-.276-.093-.424-.293-.424-.466 0-.078.035-.119.099-.139Zm-.025-.664c-.275-.816-.795-2.022-1.505-2.179-.296.072-.938.096-.691-.145.246-.24 1.085-.048 1.283.217.145.194.744.806 1.011 1.737l.032.227a.324.324 0 0 0-.13.143Zm1.454-.266c.251-.99.889-1.639 1.039-1.841.197-.265 1.036-.457 1.283-.217.247.241-.395.217-.691.145-.69.152-1.2 1.296-1.481 2.109a.364.364 0 0 0-.067-.059.37.37 0 0 0-.092-.043l.009-.094Zm4.802-2.708a9.875 9.875 0 0 1-.596.705c-.304.315-1.203 1.176-1.963 1.916.647-.955 1.303-1.806 2.184-2.376.123-.08.249-.161.375-.245Z"/></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../../..", "features": ["content.tooltips", "search.highlight", "navigation.tabs", "navigation.indexes", "navigation.prune"], "search": "../../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../../assets/javascripts/bundle.fe8b6f2b.min.js"></script>
</body>
</html>