docs/Lix/contributing/hacking/index.html

2372 lines
62 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/Lix/contributing/hacking/">
<link rel="prev" href="../experimental-features/">
<link rel="next" href="../testing/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>Hacking - 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="Hacking - Aux Docs" >
<meta property="og:description" content="Aux Documentation" >
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Lix/contributing/hacking.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/Lix/contributing/hacking/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Hacking - Aux Docs" >
<meta name="twitter:description" content="Aux Documentation" >
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Lix/contributing/hacking.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="#hacking" 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">
Hacking
</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 md-tabs__item--active">
<a href="../../" 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">
<a href="../../../Nixpkgs/" 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--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
Lix
</span>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Lix
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../glossary/" class="md-nav__link">
<span class="md-ellipsis">
Glossary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../quick-start/" class="md-nav__link">
<span class="md-ellipsis">
Quick Start
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Advanced-Topics/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Topics
</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="../../Command-Reference/" class="md-nav__link">
<span class="md-ellipsis">
Command 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="../../Package-Management/" class="md-nav__link">
<span class="md-ellipsis">
Package Management
</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="../../architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
<span class="md-nav__icon md-icon"></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_4_8" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Contributing
</span>
</a>
<label class="md-nav__link " for="__nav_4_8" id="__nav_4_8_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4_8">
<span class="md-nav__icon md-icon"></span>
Contributing
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../cli-guideline/" class="md-nav__link">
<span class="md-ellipsis">
CLI guideline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../cxx/" class="md-nav__link">
<span class="md-ellipsis">
C++ style guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../experimental-features/" class="md-nav__link">
<span class="md-ellipsis">
What are experimental features?
</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">
Hacking
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Hacking
</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="#building-lix-in-a-development-shell" class="md-nav__link">
<span class="md-ellipsis">
Building Lix in a development shell
</span>
</a>
<nav class="md-nav" aria-label="Building Lix in a development shell">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#setting-up-the-development-shell" class="md-nav__link">
<span class="md-ellipsis">
Setting up the development shell
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#building-from-the-development-shell" class="md-nav__link">
<span class="md-ellipsis">
Building from the development shell
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#building-lix-outside-of-development-shells" class="md-nav__link">
<span class="md-ellipsis">
Building Lix outside of development shells
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#platforms" class="md-nav__link">
<span class="md-ellipsis">
Platforms
</span>
</a>
<nav class="md-nav" aria-label="Platforms">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#building-for-multiple-platforms-at-once" class="md-nav__link">
<span class="md-ellipsis">
Building for multiple platforms at once
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#system-type" class="md-nav__link">
<span class="md-ellipsis">
System type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#compilation-environments" class="md-nav__link">
<span class="md-ellipsis">
Compilation environments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#editor-integration" class="md-nav__link">
<span class="md-ellipsis">
Editor integration
</span>
</a>
<nav class="md-nav" aria-label="Editor integration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#checking-links-in-the-manual" class="md-nav__link">
<span class="md-ellipsis">
Checking links in the manual
</span>
</a>
<nav class="md-nav" aria-label="Checking links in the manual">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#variable" class="md-nav__link">
<span class="md-ellipsis">
.. variable
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#api-documentation" class="md-nav__link">
<span class="md-ellipsis">
API documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#coverage-analysis" class="md-nav__link">
<span class="md-ellipsis">
Coverage analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#add-a-release-note" class="md-nav__link">
<span class="md-ellipsis">
Add a release note
</span>
</a>
<nav class="md-nav" aria-label="Add a release note">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#add-an-entry" class="md-nav__link">
<span class="md-ellipsis">
Add an entry
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-process" class="md-nav__link">
<span class="md-ellipsis">
Build process
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../testing/" class="md-nav__link">
<span class="md-ellipsis">
Running tests
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</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="../../language/" class="md-nav__link">
<span class="md-ellipsis">
Language
</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="../../protocols/" class="md-nav__link">
<span class="md-ellipsis">
Protocols
</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="../../release-notes/" class="md-nav__link">
<span class="md-ellipsis">
Release notes
</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="../../../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--pruned md-nav__item--nested">
<a href="../../../Nixpkgs/" class="md-nav__link">
<span class="md-ellipsis">
Nixpkgs
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</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="#building-lix-in-a-development-shell" class="md-nav__link">
<span class="md-ellipsis">
Building Lix in a development shell
</span>
</a>
<nav class="md-nav" aria-label="Building Lix in a development shell">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#setting-up-the-development-shell" class="md-nav__link">
<span class="md-ellipsis">
Setting up the development shell
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#building-from-the-development-shell" class="md-nav__link">
<span class="md-ellipsis">
Building from the development shell
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#building-lix-outside-of-development-shells" class="md-nav__link">
<span class="md-ellipsis">
Building Lix outside of development shells
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#platforms" class="md-nav__link">
<span class="md-ellipsis">
Platforms
</span>
</a>
<nav class="md-nav" aria-label="Platforms">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#building-for-multiple-platforms-at-once" class="md-nav__link">
<span class="md-ellipsis">
Building for multiple platforms at once
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#system-type" class="md-nav__link">
<span class="md-ellipsis">
System type
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#compilation-environments" class="md-nav__link">
<span class="md-ellipsis">
Compilation environments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#editor-integration" class="md-nav__link">
<span class="md-ellipsis">
Editor integration
</span>
</a>
<nav class="md-nav" aria-label="Editor integration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#checking-links-in-the-manual" class="md-nav__link">
<span class="md-ellipsis">
Checking links in the manual
</span>
</a>
<nav class="md-nav" aria-label="Checking links in the manual">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#variable" class="md-nav__link">
<span class="md-ellipsis">
.. variable
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#api-documentation" class="md-nav__link">
<span class="md-ellipsis">
API documentation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#coverage-analysis" class="md-nav__link">
<span class="md-ellipsis">
Coverage analysis
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#add-a-release-note" class="md-nav__link">
<span class="md-ellipsis">
Add a release note
</span>
</a>
<nav class="md-nav" aria-label="Add a release note">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#add-an-entry" class="md-nav__link">
<span class="md-ellipsis">
Add an entry
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#build-process" class="md-nav__link">
<span class="md-ellipsis">
Build process
</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="hacking">Hacking</h1>
<p>This section provides some notes on how to hack on Lix. To get the latest version of Lix from Forgejo:</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>git<span class="w"> </span>clone<span class="w"> </span>https://git.lix.systems/lix-project/lix
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>lix
</code></pre></div>
<p>The following instructions assume you already have some version of Nix or Lix installed locally, so that you can use it to set up the development environment. If you don't have it installed, follow the <a href="../../installation/">installation instructions</a>.</p>
<h3 id="building-lix-in-a-development-shell">Building Lix in a development shell</h3>
<h4 id="setting-up-the-development-shell">Setting up the development shell</h4>
<p>If you are using Lix or Nix with the [<code>flakes</code>] and [<code>nix-command</code>] experimental features enabled, the following command will build all dependencies and start a shell in which all environment variables are setup for those dependencies to be found:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>develop
</code></pre></div>
<p>That will use the default stdenv for your system. To get a shell with one of the other <a href="#compilation-environments">supported compilation environments</a>, specify its attribute name after a hash (which you may need to quote, depending on your shell):</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix<span class="w"> </span>develop<span class="w"> </span><span class="s2">&quot;.#native-clangStdenvPackages&quot;</span>
</code></pre></div>
<p>For classic Nix, use:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-shell<span class="w"> </span>-A<span class="w"> </span>native-clangStdenvPackages
</code></pre></div>
<h4 id="building-from-the-development-shell">Building from the development shell</h4>
<p>As always you may run <a href="https://nixos.org/manual/nixpkgs/unstable/#sec-building-stdenv-package-in-nix-shell">stdenv's phases by name</a>, e.g.:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>configurePhase
$<span class="w"> </span>buildPhase
$<span class="w"> </span>checkPhase
$<span class="w"> </span>installPhase
$<span class="w"> </span>installCheckPhase
</code></pre></div>
<p>To build manually, however, use the following:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>setup<span class="w"> </span>./build<span class="w"> </span><span class="s2">&quot;--prefix=</span><span class="nv">$out</span><span class="s2">&quot;</span><span class="w"> </span><span class="nv">$mesonFlags</span>
</code></pre></div>
<p>(A simple <code>meson setup ./build</code> will also build, but will do a different thing, not having the settings from package.nix applied).</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>compile<span class="w"> </span>-C<span class="w"> </span>build
$<span class="w"> </span>meson<span class="w"> </span><span class="nb">test</span><span class="w"> </span>-C<span class="w"> </span>build<span class="w"> </span>--suite<span class="o">=</span>check
$<span class="w"> </span>meson<span class="w"> </span>install<span class="w"> </span>-C<span class="w"> </span>build
$<span class="w"> </span>meson<span class="w"> </span><span class="nb">test</span><span class="w"> </span>-C<span class="w"> </span>build<span class="w"> </span>--suite<span class="o">=</span>installcheck
</code></pre></div>
<p>(Check and installcheck may both be done after install, allowing you to omit the --suite argument entirely, but this is the order package.nix runs them in.)</p>
<p>This will install Lix to <code>$PWD/outputs</code>, the <code>/bin</code> of which is prepended to PATH in the development shells.</p>
<p>If the tests fail and Meson helpfully has no output for why, use the <code>--print-error-logs</code> option to <code>meson test</code>.</p>
<p>If you change a setting in the buildsystem (i.e., any of the <code>meson.build</code> files), most cases will automatically regenerate the Meson configuration just before compiling.
Some cases, however, like trying to build a specific target whose name is new to the buildsystem (e.g. <code>meson compile -C build src/libmelt/libmelt.dylib</code>, when <code>libmelt.dylib</code> did not exist as a target the last time the buildsystem was generated), then you can reconfigure using new settings but existing options, and only recompiling stuff affected by the changes:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>setup<span class="w"> </span>--reconfigure<span class="w"> </span>build
</code></pre></div>
<p>Note that changes to the default values in <code>meson.options</code> or in the <code>default_options :</code> argument to <code>project()</code> are <strong>not</strong> propagated with <code>--reconfigure</code>.</p>
<p>If you want a totally clean build, you can use:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>setup<span class="w"> </span>--wipe<span class="w"> </span>build
</code></pre></div>
<p>That will work regardless of if <code>./build</code> exists or not.</p>
<p>Specific, named targets may be addressed in <code>meson build -C build &lt;target&gt;</code>, with the "target ID", if there is one, which is the first string argument passed to target functions that have one, and unrelated to the variable name, e.g.:</p>
<div class="highlight"><pre><span></span><code><span class="n">libexpr_dylib</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">library</span><span class="p">(</span><span class="s">&#39;nixexpr&#39;</span><span class="p">,</span><span class="w"> </span><span class="err"></span><span class="p">)</span>
</code></pre></div>
<p>can be addressed with:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>compile<span class="w"> </span>-C<span class="w"> </span>build<span class="w"> </span>nixexpr
</code></pre></div>
<p>All targets may be addressed as their output, relative to the build directory, e.g.:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>compile<span class="w"> </span>-C<span class="w"> </span>build<span class="w"> </span>src/libexpr/liblixexpr.so
</code></pre></div>
<p>But Meson does not consider intermediate files like object files targets.
To build a specific object file, use Ninja directly and specify the output file relative to the build directory:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>ninja<span class="w"> </span>-C<span class="w"> </span>build<span class="w"> </span>src/libexpr/liblixexpr.so.p/nixexpr.cc.o
</code></pre></div>
<p>To inspect the canonical source of truth on what the state of the buildsystem configuration is, use:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>introspect
</code></pre></div>
<h3 id="building-lix-outside-of-development-shells">Building Lix outside of development shells</h3>
<p>To build a release version of Lix for the current operating system and CPU architecture:</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>nix<span class="w"> </span>build
</code></pre></div>
<p>You can also build Lix for one of the <a href="#platforms">supported platforms</a>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>You can use <code>native-ccacheStdenvPackages</code> to drastically improve rebuild time.
By default, <a href="https://ccache.dev">ccache</a> keeps artifacts in <code>~/.cache/ccache/</code>.</p>
</div>
<h3 id="platforms">Platforms</h3>
<p>Lix can be built for various platforms, as specified in [<code>flake.nix</code>]:</p>
<ul>
<li><code>x86_64-linux</code></li>
<li><code>x86_64-darwin</code></li>
<li><code>i686-linux</code></li>
<li><code>aarch64-linux</code></li>
<li><code>aarch64-darwin</code></li>
<li><code>armv6l-linux</code></li>
<li><code>armv7l-linux</code></li>
</ul>
<p>In order to build Lix for a different platform than the one you're currently
on, you need a way for your current Nix installation to build code for that
platform. Common solutions include <a href="../../Advanced-Topics/distributed-builds/">remote builders</a> and <a href="https://nixos.org/manual/nixos/stable/options.html#opt-boot.binfmt.emulatedSystems">binary format emulation</a>
(only supported on NixOS).</p>
<p>Given such a setup, executing the build only requires selecting the respective attribute.
For example, to compile for <code>aarch64-linux</code>:</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>nix-build<span class="w"> </span>--attr<span class="w"> </span>packages.aarch64-linux.default
</code></pre></div>
<p>or for Nix with the [<code>flakes</code>] and [<code>nix-command</code>] experimental features enabled:</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>nix<span class="w"> </span>build<span class="w"> </span>.#packages.aarch64-linux.default
</code></pre></div>
<p>Cross-compiled builds are available for ARMv6 (<code>armv6l-linux</code>) and ARMv7 (<code>armv7l-linux</code>).
Add more <a href="#system-type">system types</a> to <code>crossSystems</code> in <code>flake.nix</code> to bootstrap Nix on unsupported platforms.</p>
<h4 id="building-for-multiple-platforms-at-once">Building for multiple platforms at once</h4>
<p>It is useful to perform multiple cross and native builds on the same source tree, for example to ensure that better support for one platform doesn't break the build for another.
As Lix now uses Meson, out-of-tree builds are supported first class. In the invocation</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>setup<span class="w"> </span>build
</code></pre></div>
<p>the argument after <code>setup</code> specifies the directory for this build, conventionally simply called "build", but it may be called anything, and you may run <code>meson setup &lt;somedir&gt;</code> for as many different directories as you want.
To compile the configuration for a given build directory, pass that build directory to the <code>-C</code> argument of <code>meson compile</code>:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>setup<span class="w"> </span>some-custom-build
$<span class="w"> </span>meson<span class="w"> </span>compile<span class="w"> </span>-C<span class="w"> </span>some-custom-build
</code></pre></div>
<h3 id="system-type">System type</h3>
<p>Lix uses a string with the following format to identify the <em>system type</em> or <em>platform</em> it runs on:</p>
<div class="highlight"><pre><span></span><code>&lt;cpu&gt;-&lt;os&gt;[-&lt;abi&gt;]
</code></pre></div>
<p>It is set when Lix is compiled for the given system, and determined by <a href="https://mesonbuild.com/Reference-manual_builtin_host_machine.html">Meson's <code>host_machine.cpu_family()</code> and <code>host_machine.system()</code> values</a>.</p>
<p>For historic reasons and backward-compatibility, some CPU and OS identifiers are translated from the GNU Autotools naming convention in <a href="https://git.lix.systems/lix-project/lix/blob/main/meson.build"><code>meson.build</code></a> as follows:</p>
<table>
<thead>
<tr>
<th><code>host_machine.cpu_family()</code></th>
<th>Nix</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>x86</code></td>
<td><code>i686</code></td>
</tr>
<tr>
<td><code>i686</code></td>
<td><code>i686</code></td>
</tr>
<tr>
<td><code>i686</code></td>
<td><code>i686</code></td>
</tr>
<tr>
<td><code>arm6</code></td>
<td><code>arm6l</code></td>
</tr>
<tr>
<td><code>arm7</code></td>
<td><code>arm7l</code></td>
</tr>
<tr>
<td><code>linux-gnu*</code></td>
<td><code>linux</code></td>
</tr>
<tr>
<td><code>linux-musl*</code></td>
<td><code>linux</code></td>
</tr>
</tbody>
</table>
<h3 id="compilation-environments">Compilation environments</h3>
<p>Lix can be compiled using multiple environments:</p>
<ul>
<li><code>stdenv</code>: default;</li>
<li><code>gccStdenv</code>: force the use of <code>gcc</code> compiler;</li>
<li><code>clangStdenv</code>: force the use of <code>clang</code> compiler;</li>
<li><code>ccacheStdenv</code>: enable [ccache], a compiler cache to speed up compilation.</li>
</ul>
<p>To build with one of those environments, you can use</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>nix<span class="w"> </span>build<span class="w"> </span>.#nix-ccacheStdenv
</code></pre></div>
<p>for flake-enabled Nix, or</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>nix-build<span class="w"> </span>--attr<span class="w"> </span>nix-ccacheStdenv
</code></pre></div>
<p>for classic Nix.</p>
<p>You can use any of the other supported environments in place of <code>nix-ccacheStdenv</code>.</p>
<h3 id="editor-integration">Editor integration</h3>
<p>The <code>clangd</code> LSP server is installed by default in each development shell.
See <a href="#compilation-environments">supported compilation environments</a> and instructions how to set up a shell <a href="#nix-with-flakes">with flakes</a> or in <a href="#classic-nix">classic Nix</a>.</p>
<p>Clangd requires a compilation database, which Meson generates by default. After running <code>meson setup</code>, there will already be a <code>compile_commands.json</code> file in the build directory.
Some editor configurations may prefer that file to be in the root directory, which you can accomplish with a simple:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>ln<span class="w"> </span>-sf<span class="w"> </span>./build/compile_commands.json<span class="w"> </span>./compile_commands.json
</code></pre></div>
<p>Configure your editor to use the <code>clangd</code> from the shell, either by running it inside the development shell, or by using <a href="https://github.com/nix-community/nix-direnv">nix-direnv</a> and <a href="https://github.com/direnv/direnv/wiki#editor-integration">the appropriate editor plugin</a>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>For some editors (e.g. Visual Studio Code), you may need to install a <a href="https://open-vsx.org/extension/llvm-vs-code-extensions/vscode-clangd">special extension</a> for the editor to interact with <code>clangd</code>.
Some other editors (e.g. Emacs, Vim) need a plugin to support LSP servers in general (e.g. <a href="https://github.com/emacs-lsp/lsp-mode">lsp-mode</a> for Emacs and <a href="https://github.com/prabirshrestha/vim-lsp">vim-lsp</a> for vim).
Editor-specific setup is typically opinionated, so we will not cover it here in more detail.</p>
</div>
<h4 id="checking-links-in-the-manual">Checking links in the manual</h4>
<p>The build checks for broken internal links.
This happens late in the process, so <code>nix build</code> is not suitable for iterating.
To build the manual incrementally, run:</p>
<div class="highlight"><pre><span></span><code><span class="go">meson compile -C build manual</span>
</code></pre></div>
<p>[<code>mdbook-linkcheck</code>] does not implement checking <a href="https://en.wikipedia.org/wiki/URI_fragment">URI fragments</a> yet.</p>
<h5 id="variable"><code>..</code> variable</h5>
<p><code>..</code> provides a base path for links that occur in reusable snippets or other documentation that doesn't have a base path of its own.</p>
<p>If a broken link occurs in a snippet that was inserted into multiple generated files in different directories, use <code>..</code> to reference the <code>doc/manual/src</code> directory.</p>
<p>If the <code>..</code> literal appears in an error message from the <code>mdbook-linkcheck</code> tool, the <code>..</code> replacement needs to be applied to the generated source file that mentions it.
See existing <code>..</code> logic in the [Makefile].
Regular markdown files used for the manual have a base path of their own and they can use relative paths instead of <code>..</code>.</p>
<h3 id="api-documentation">API documentation</h3>
<p>Doxygen API documentation is <a href="https://hydra.nixos.org/job/nix/master/internal-api-docs/latest/download-by-type/doc/internal-api-docs">available
online</a>. You
can also build and view it yourself:</p>
<div class="highlight"><pre><span></span><code><span class="gp">#</span><span class="c1"># nix build .#hydraJobs.internal-api-docs</span>
<span class="gp">#</span><span class="c1"># xdg-open ./result/share/doc/nix/internal-api/html/index.html</span>
</code></pre></div>
<p>or inside a <code>nix develop</code> shell by running:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>meson<span class="w"> </span>compile<span class="w"> </span>-C<span class="w"> </span>build<span class="w"> </span>internal-api-docs
$<span class="w"> </span>xdg-open<span class="w"> </span>./outputs/doc/share/doc/nix/internal-api/html/index.html
</code></pre></div>
<h3 id="coverage-analysis">Coverage analysis</h3>
<p>A coverage analysis report is <a href="https://hydra.nixos.org/job/nix/master/coverage/latest/download-by-type/report/coverage">available
online</a>. You
can build it yourself:</p>
<div class="highlight"><pre><span></span><code>## nix build .#hydraJobs.coverage
## xdg-open ./result/coverage/index.html
</code></pre></div>
<p>Metrics about the change in line/function coverage over time are also
<a href="https://hydra.nixos.org/job/nix/master/coverage#tabs-charts">available</a>.</p>
<h3 id="add-a-release-note">Add a release note</h3>
<p><code>doc/manual/rl-next</code> contains release notes entries for all unreleased changes.</p>
<p>User-visible changes should come with a release note.</p>
<h4 id="add-an-entry">Add an entry</h4>
<p>Here's what a complete entry looks like. The file name is not incorporated in the document.</p>
<div class="highlight"><pre><span></span><code>---
synopsis: Basically a title
## 1234 or gh#1234 will refer to CppNix GitHub, fj#1234 will refer to a Lix forgejo issue.
issues: [1234, fj#1234]
## Use this *only* if there is a CppNix pull request associated with this change
prs: 1238
## List of Lix Gerrit changelist numbers; if there is an associated Lix GitHub
## PR, just put in the Gerrit CL number.
cls: [123]
---
Here&#39;s one or more paragraphs that describe the change.
- It&#39;s markdown
- Add references to the manual using ..
</code></pre></div>
<p>Significant changes should add the following header, which moves them to the top.</p>
<div class="highlight"><pre><span></span><code>significance: significant
</code></pre></div>
<h4 id="build-process">Build process</h4>
<p>Releases have a precomputed <code>rl-MAJOR.MINOR.md</code>, and no <code>rl-next.md</code>.
Set <code>buildUnreleasedNotes = true;</code> in <code>flake.nix</code> to build the release notes on the fly.</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>