mirror of
https://git.gay/pyrox/aux-docs
synced 2024-11-23 09:37:56 +00:00
4152 lines
125 KiB
HTML
4152 lines
125 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/Languages-And-Frameworks/rust.section/">
|
|
|
|
|
|
<link rel="prev" href="../ruby.section/">
|
|
|
|
|
|
<link rel="next" href="../scheme.section/">
|
|
|
|
|
|
<link rel="icon" href="../../../assets/aux-logo.svg">
|
|
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
|
|
|
|
|
|
|
|
<title>Rust - 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="Rust {#rust} - Aux Docs" >
|
|
|
|
<meta property="og:description" content="Aux Documentation" >
|
|
|
|
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Languages-And-Frameworks/rust.section.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/Languages-And-Frameworks/rust.section/" >
|
|
|
|
<meta name="twitter:card" content="summary_large_image" >
|
|
|
|
<meta name="twitter:title" content="Rust {#rust} - Aux Docs" >
|
|
|
|
<meta name="twitter:description" content="Aux Documentation" >
|
|
|
|
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Languages-And-Frameworks/rust.section.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="#rust" 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">
|
|
|
|
Rust
|
|
|
|
</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--pruned md-nav__item--nested">
|
|
|
|
|
|
|
|
|
|
<a href="../../Build-Helpers/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Build Helpers
|
|
</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="../../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--active md-nav__item--nested">
|
|
|
|
|
|
|
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_7" checked>
|
|
|
|
|
|
|
|
<div class="md-nav__link md-nav__container">
|
|
<a href="../" class="md-nav__link ">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Languages And Frameworks
|
|
</span>
|
|
|
|
|
|
</a>
|
|
|
|
|
|
<label class="md-nav__link " for="__nav_6_7" id="__nav_6_7_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_7_label" aria-expanded="true">
|
|
<label class="md-nav__title" for="__nav_6_7">
|
|
<span class="md-nav__icon md-icon"></span>
|
|
Languages And Frameworks
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../agda.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Agda
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../android.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Android
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../beam.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
BEAM Languages (Erlang, Elixir & LFE)
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../bower.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Bower
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../chicken.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
CHICKEN
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../coq.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Coq and coq packages
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../crystal.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Crystal
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cuda.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
CUDA
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cuelang.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Cue (Cuelang)
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../dart.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Dart
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../dhall.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Dhall
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../dlang.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
D (Dlang)
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../dotnet.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Dotnet
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../emscripten.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Emscripten
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../gnome.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
GNOME
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../go.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Go
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../gradle.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Gradle
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../hare.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Hare
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../haskell.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Haskell
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../hy.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Hy
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../idris.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Idris
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../idris2.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Idris2
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ios.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
iOS
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../java.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Java
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../javascript.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Javascript
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../julia.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Julia
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../lisp.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
lisp-modules
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../lua.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Lua
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../maven.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Maven
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../nim.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Nim
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ocaml.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
OCaml
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../octave.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Octave
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../perl.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Perl
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../php.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
PHP
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../pkg-config.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
pkg-config
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../python.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Python
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../qt.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Qt
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../r.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
R
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../ruby.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Ruby
|
|
</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">
|
|
Rust
|
|
</span>
|
|
|
|
|
|
<span class="md-nav__icon md-icon"></span>
|
|
</label>
|
|
|
|
<a href="./" class="md-nav__link md-nav__link--active">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Rust
|
|
</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="#compiling-rust-applications-with-cargo" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
buildRustPackage: Compiling Rust applications with Cargo
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="buildRustPackage: Compiling Rust applications with Cargo">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#importing-a-cargo.lock-file" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Importing a Cargo.lock file
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cargo-features" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Cargo features
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cross-compilation" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Cross compilation
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#running-package-tests" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Running package tests
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Running package tests">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#tests-relying-on-the-structure-of-the-target-directory" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Tests relying on the structure of the target/ directory
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#disabling-package-tests" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Disabling package-tests
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-cargo-nextest" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using cargo-nextest
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#setting-test-threads" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Setting test-threads
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#building-a-package-in-debug-mode" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Building a package in debug mode
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#custom-buildinstall-procedures" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Custom build/install-procedures
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#building-a-crate-with-an-absent-or-out-of-date-cargo.lock-file" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Building a crate with an absent or out-of-date Cargo.lock file
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-non-rust-packages-that-include-rust-code" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Compiling non-Rust packages that include Rust code
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Compiling non-Rust packages that include Rust code">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#vendoring-of-dependencies" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Vendoring of dependencies
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#hooks" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Hooks
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#examples-example" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Examples!!! example
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#python-package-using-setuptools-rust" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Python package using setuptools-rust
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#python-package-using-maturin" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Python package using maturin
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#rust-package-built-with-meson" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Rust package built with meson
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-rust-crates-using-nix-instead-of-cargo" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
buildRustCrate: Compiling Rust crates using Nix instead of Cargo
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="buildRustCrate: Compiling Rust crates using Nix instead of Cargo">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#simple-operation" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Simple operation
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#handling-external-dependencies" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Handling external dependencies
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#options-and-phases-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Options and phases configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#setting-up-nix-shell" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Setting Up nix-shell
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-community-maintained-rust-toolchains" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using community maintained Rust toolchains
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Using community maintained Rust toolchains">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-rust-nightly-with-nix-shell" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using Rust nightly with nix-shell
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-rust-nightly-in-a-derivation-with-buildrustpackage" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using Rust nightly in a derivation with buildRustPackage
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-git-bisect-on-the-rust-compiler" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using git bisect on the Rust compiler
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../scheme.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Scheme
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../swift.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Swift
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../texlive.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
TeX Live
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../titanium.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Titanium
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../vim.section/" class="md-nav__link">
|
|
|
|
|
|
<span class="md-ellipsis">
|
|
Vim
|
|
</span>
|
|
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</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="#compiling-rust-applications-with-cargo" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
buildRustPackage: Compiling Rust applications with Cargo
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="buildRustPackage: Compiling Rust applications with Cargo">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#importing-a-cargo.lock-file" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Importing a Cargo.lock file
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cargo-features" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Cargo features
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#cross-compilation" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Cross compilation
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#running-package-tests" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Running package tests
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Running package tests">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#tests-relying-on-the-structure-of-the-target-directory" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Tests relying on the structure of the target/ directory
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#disabling-package-tests" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Disabling package-tests
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-cargo-nextest" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using cargo-nextest
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#setting-test-threads" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Setting test-threads
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#building-a-package-in-debug-mode" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Building a package in debug mode
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#custom-buildinstall-procedures" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Custom build/install-procedures
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#building-a-crate-with-an-absent-or-out-of-date-cargo.lock-file" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Building a crate with an absent or out-of-date Cargo.lock file
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-non-rust-packages-that-include-rust-code" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Compiling non-Rust packages that include Rust code
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Compiling non-Rust packages that include Rust code">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#vendoring-of-dependencies" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Vendoring of dependencies
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#hooks" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Hooks
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#examples-example" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Examples!!! example
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#python-package-using-setuptools-rust" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Python package using setuptools-rust
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#python-package-using-maturin" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Python package using maturin
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#rust-package-built-with-meson" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Rust package built with meson
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#compiling-rust-crates-using-nix-instead-of-cargo" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
buildRustCrate: Compiling Rust crates using Nix instead of Cargo
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="buildRustCrate: Compiling Rust crates using Nix instead of Cargo">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#simple-operation" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Simple operation
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#handling-external-dependencies" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Handling external dependencies
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#options-and-phases-configuration" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Options and phases configuration
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#setting-up-nix-shell" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Setting Up nix-shell
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-community-maintained-rust-toolchains" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using community maintained Rust toolchains
|
|
</span>
|
|
</a>
|
|
|
|
<nav class="md-nav" aria-label="Using community maintained Rust toolchains">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-rust-nightly-with-nix-shell" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using Rust nightly with nix-shell
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-rust-nightly-in-a-derivation-with-buildrustpackage" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using Rust nightly in a derivation with buildRustPackage
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#using-git-bisect-on-the-rust-compiler" class="md-nav__link">
|
|
<span class="md-ellipsis">
|
|
Using git bisect on the Rust compiler
|
|
</span>
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="md-content" data-md-component="content">
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
|
|
|
|
<h1 id="rust">Rust</h1>
|
|
<p>To install the rust compiler and cargo put</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
environment<span class="o">.</span><span class="ss">systemPackages</span> <span class="o">=</span> <span class="p">[</span>
|
|
rustc
|
|
cargo
|
|
<span class="p">];</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>into your <code>configuration.nix</code> or bring them into scope with <code>nix-shell -p rustc cargo</code>.</p>
|
|
<p>For other versions such as daily builds (beta and nightly),
|
|
use either <code>rustup</code> from nixpkgs (which will manage the rust installation in your home directory),
|
|
or use <a href="#using-community-maintained-rust-toolchains">community maintained Rust toolchains</a>.</p>
|
|
<h2 id="compiling-rust-applications-with-cargo"><code>buildRustPackage</code>: Compiling Rust applications with Cargo</h2>
|
|
<p>Rust applications are packaged by using the <code>buildRustPackage</code> helper from <code>rustPlatform</code>:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span> lib<span class="p">,</span> fetchFromGitHub<span class="p">,</span> rustPlatform <span class="p">}:</span>
|
|
|
|
rustPlatform<span class="o">.</span>buildRustPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"ripgrep"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"12.1.1"</span><span class="p">;</span>
|
|
|
|
<span class="ss">src</span> <span class="o">=</span> fetchFromGitHub <span class="p">{</span>
|
|
<span class="ss">owner</span> <span class="o">=</span> <span class="s2">"BurntSushi"</span><span class="p">;</span>
|
|
<span class="ss">repo</span> <span class="o">=</span> pname<span class="p">;</span>
|
|
<span class="ss">rev</span> <span class="o">=</span> version<span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-+s5RBC3XSgb8omTbUNLywZnP6jSxZBKSS1BmXOjRF8M="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoHash</span> <span class="o">=</span> <span class="s2">"sha256-jtBw4ahSl88L0iuCXxQgZVm1EcboWRJMNtjxLVTtzts="</span><span class="p">;</span>
|
|
|
|
<span class="ss">meta</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="ss">description</span> <span class="o">=</span> <span class="s2">"Fast line-oriented regex search tool, similar to ag and ack"</span><span class="p">;</span>
|
|
<span class="ss">homepage</span> <span class="o">=</span> <span class="s2">"https://github.com/BurntSushi/ripgrep"</span><span class="p">;</span>
|
|
<span class="ss">license</span> <span class="o">=</span> lib<span class="o">.</span>licenses<span class="o">.</span>unlicense<span class="p">;</span>
|
|
<span class="ss">maintainers</span> <span class="o">=</span> <span class="p">[];</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p><code>buildRustPackage</code> requires either a <code>cargoHash</code> (preferred) or a
|
|
<code>cargoSha256</code> attribute, computed over all crate sources of this package.
|
|
<code>cargoHash</code> supports <a href="https://www.w3.org/TR/SRI/">SRI</a> hashes and should be
|
|
preferred over <code>cargoSha256</code> which was used for traditional Nix SHA-256 hashes.
|
|
For example:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="ss">cargoHash</span> <span class="o">=</span> <span class="s2">"sha256-l1vL2ZdtDRxSGvP0X/l3nMw8+6WF67KPutJEzUROjg8="</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Exception: If the application has cargo <code>git</code> dependencies, the <code>cargoHash</code>/<code>cargoSha256</code>
|
|
approach will not work, and you will need to copy the <code>Cargo.lock</code> file of the application
|
|
to nixpkgs and continue with the next section for specifying the options of the <code>cargoLock</code>
|
|
section.</p>
|
|
<p>Both types of hashes are permitted when contributing to nixpkgs. The
|
|
Cargo hash is obtained by inserting a fake checksum into the
|
|
expression and building the package once. The correct checksum can
|
|
then be taken from the failed build. A fake hash can be used for
|
|
<code>cargoHash</code> as follows:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="ss">cargoHash</span> <span class="o">=</span> lib<span class="o">.</span>fakeHash<span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>For <code>cargoSha256</code> you can use:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="ss">cargoSha256</span> <span class="o">=</span> lib<span class="o">.</span>fakeSha256<span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Per the instructions in the <a href="https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html">Cargo Book</a>
|
|
best practices guide, Rust applications should always commit the <code>Cargo.lock</code>
|
|
file in git to ensure a reproducible build. However, a few packages do not, and
|
|
Nix depends on this file, so if it is missing you can use <code>cargoPatches</code> to
|
|
apply it in the <code>patchPhase</code>. Consider sending a PR upstream with a note to the
|
|
maintainer describing why it's important to include in the application.</p>
|
|
<p>The fetcher will verify that the <code>Cargo.lock</code> file is in sync with the <code>src</code>
|
|
attribute, and fail the build if not. It will also will compress the vendor
|
|
directory into a tar.gz archive.</p>
|
|
<p>The tarball with vendored dependencies contains a directory with the
|
|
package's <code>name</code>, which is normally composed of <code>pname</code> and
|
|
<code>version</code>. This means that the vendored dependencies hash
|
|
(<code>cargoHash</code>/<code>cargoSha256</code>) is dependent on the package name and
|
|
version. The <code>cargoDepsName</code> attribute can be used to use another name
|
|
for the directory of vendored dependencies. For example, the hash can
|
|
be made invariant to the version by setting <code>cargoDepsName</code> to
|
|
<code>pname</code>:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"broot"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"1.2.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">src</span> <span class="o">=</span> fetchCrate <span class="p">{</span>
|
|
<span class="k">inherit</span> pname version<span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-aDQA4A5mScX9or3Lyiv/5GyAehidnpKKE0grhbP1Ctc="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoHash</span> <span class="o">=</span> <span class="s2">"sha256-tbrTbutUs5aPSV+yE0IBUZAAytgmZV7Eqxia7g+9zRs="</span><span class="p">;</span>
|
|
<span class="ss">cargoDepsName</span> <span class="o">=</span> pname<span class="p">;</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h3 id="importing-a-cargo.lock-file">Importing a <code>Cargo.lock</code> file</h3>
|
|
<p>Using a vendored hash (<code>cargoHash</code>/<code>cargoSha256</code>) is tedious when using
|
|
<code>buildRustPackage</code> within a project, since it requires that the hash
|
|
is updated after every change to <code>Cargo.lock</code>. Therefore,
|
|
<code>buildRustPackage</code> also supports vendoring dependencies directly from
|
|
a <code>Cargo.lock</code> file using the <code>cargoLock</code> argument. For example:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"myproject"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"1.0.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">cargoLock</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="ss">lockFile</span> <span class="o">=</span> <span class="l">./Cargo.lock</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>This will retrieve the dependencies using fixed-output derivations from
|
|
the specified lockfile.</p>
|
|
<p>One caveat is that <code>Cargo.lock</code> cannot be patched in the <code>patchPhase</code>
|
|
because it runs after the dependencies have already been fetched. If
|
|
you need to patch or generate the lockfile you can alternatively set
|
|
<code>cargoLock.lockFileContents</code> to a string of its contents:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"myproject"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"1.0.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">cargoLock</span> <span class="o">=</span> <span class="k">let</span>
|
|
<span class="ss">fixupLockFile</span> <span class="o">=</span> path<span class="p">:</span> f <span class="p">(</span><span class="nb">builtins</span><span class="o">.</span>readFile path<span class="p">);</span>
|
|
<span class="k">in</span> <span class="p">{</span>
|
|
<span class="ss">lockFileContents</span> <span class="o">=</span> fixupLockFile <span class="l">./Cargo.lock</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Note that setting <code>cargoLock.lockFile</code> or <code>cargoLock.lockFileContents</code>
|
|
doesn't add a <code>Cargo.lock</code> to your <code>src</code>, and a <code>Cargo.lock</code> is still
|
|
required to build a rust package. A simple fix is to use:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="ss">postPatch</span> <span class="o">=</span> <span class="s s-Multiline">''</span>
|
|
<span class="s s-Multiline"> ln -s </span><span class="si">${</span><span class="l">./Cargo.lock</span><span class="si">}</span><span class="s s-Multiline"> Cargo.lock</span>
|
|
<span class="s s-Multiline"> ''</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>The output hash of each dependency that uses a git source must be
|
|
specified in the <code>outputHashes</code> attribute. For example:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"myproject"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"1.0.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">cargoLock</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="ss">lockFile</span> <span class="o">=</span> <span class="l">./Cargo.lock</span><span class="p">;</span>
|
|
<span class="ss">outputHashes</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s2">"finalfusion-0.14.0"</span> <span class="o">=</span> <span class="s2">"17f4bsdzpcshwh74w5z119xjy2if6l2wgyjy56v621skr2r8y904"</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>If you do not specify an output hash for a git dependency, building
|
|
the package will fail and inform you of which crate needs to be
|
|
added. To find the correct hash, you can first use <code>lib.fakeSha256</code> or
|
|
<code>lib.fakeHash</code> as a stub hash. Building the package (and thus the
|
|
vendored dependencies) will then inform you of the correct hash.</p>
|
|
<p>For usage outside nixpkgs, <code>allowBuiltinFetchGit</code> could be used to
|
|
avoid having to specify <code>outputHashes</code>. For example:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"myproject"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"1.0.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">cargoLock</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="ss">lockFile</span> <span class="o">=</span> <span class="l">./Cargo.lock</span><span class="p">;</span>
|
|
<span class="ss">allowBuiltinFetchGit</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h3 id="cargo-features">Cargo features</h3>
|
|
<p>You can disable default features using <code>buildNoDefaultFeatures</code>, and
|
|
extra features can be added with <code>buildFeatures</code>.</p>
|
|
<p>If you want to use different features for check phase, you can use
|
|
<code>checkNoDefaultFeatures</code> and <code>checkFeatures</code>. They are only passed to
|
|
<code>cargo test</code> and not <code>cargo build</code>. If left unset, they default to
|
|
<code>buildNoDefaultFeatures</code> and <code>buildFeatures</code>.</p>
|
|
<p>For example:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"myproject"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"1.0.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">buildNoDefaultFeatures</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
|
|
<span class="ss">buildFeatures</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"color"</span> <span class="s2">"net"</span> <span class="p">];</span>
|
|
|
|
<span class="c1"># disable network features in tests</span>
|
|
<span class="ss">checkFeatures</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"color"</span> <span class="p">];</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h3 id="cross-compilation">Cross compilation</h3>
|
|
<p>By default, Rust packages are compiled for the host platform, just like any
|
|
other package is. The <code>--target</code> passed to rust tools is computed from this.
|
|
By default, it takes the <code>stdenv.hostPlatform.config</code> and replaces components
|
|
where they are known to differ. But there are ways to customize the argument:</p>
|
|
<ul>
|
|
<li>To choose a different target by name, define
|
|
<code>stdenv.hostPlatform.rust.rustcTarget</code> as that name (a string), and that
|
|
name will be used instead.</li>
|
|
</ul>
|
|
<p>For example:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nb">import</span> <span class="l"><nixpkgs></span> <span class="p">{</span>
|
|
<span class="ss">crossSystem</span> <span class="o">=</span> <span class="p">(</span><span class="nb">import</span> <span class="l"><nixpkgs/lib></span><span class="p">)</span><span class="o">.</span>systems<span class="o">.</span>examples<span class="o">.</span>armhf-embedded <span class="o">//</span> <span class="p">{</span>
|
|
rust<span class="o">.</span><span class="ss">rustcTarget</span> <span class="o">=</span> <span class="s2">"thumbv7em-none-eabi"</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>will result in:</p>
|
|
<div class="highlight"><pre><span></span><code>--target<span class="w"> </span>thumbv7em-none-eabi
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>To pass a completely custom target, define
|
|
<code>stdenv.hostPlatform.rust.rustcTarget</code> with its name, and
|
|
<code>stdenv.hostPlatform.rust.platform</code> with the value. The value will be
|
|
serialized to JSON in a file called
|
|
<code>${stdenv.hostPlatform.rust.rustcTarget}.json</code>, and the path of that file
|
|
will be used instead.</li>
|
|
</ul>
|
|
<p>For example:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="nb">import</span> <span class="l"><nixpkgs></span> <span class="p">{</span>
|
|
<span class="ss">crossSystem</span> <span class="o">=</span> <span class="p">(</span><span class="nb">import</span> <span class="l"><nixpkgs/lib></span><span class="p">)</span><span class="o">.</span>systems<span class="o">.</span>examples<span class="o">.</span>armhf-embedded <span class="o">//</span> <span class="p">{</span>
|
|
rust<span class="o">.</span><span class="ss">rustcTarget</span> <span class="o">=</span> <span class="s2">"thumb-crazy"</span><span class="p">;</span>
|
|
rust<span class="o">.</span><span class="ss">platform</span> <span class="o">=</span> <span class="p">{</span> <span class="ss">foo</span> <span class="o">=</span> <span class="s2">""</span><span class="p">;</span> <span class="ss">bar</span> <span class="o">=</span> <span class="s2">""</span><span class="p">;</span> <span class="p">};</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>will result in:</p>
|
|
<div class="highlight"><pre><span></span><code>--target<span class="w"> </span>/nix/store/asdfasdfsadf-thumb-crazy.json<span class="w"> </span><span class="c1"># contains {"foo":"","bar":""}</span>
|
|
</code></pre></div>
|
|
<p>Note that currently custom targets aren't compiled with <code>std</code>, so <code>cargo test</code>
|
|
will fail. This can be ignored by adding <code>doCheck = false;</code> to your derivation.</p>
|
|
<h3 id="running-package-tests">Running package tests</h3>
|
|
<p>When using <code>buildRustPackage</code>, the <code>checkPhase</code> is enabled by default and runs
|
|
<code>cargo test</code> on the package to build. To make sure that we don't compile the
|
|
sources twice and to actually test the artifacts that will be used at runtime,
|
|
the tests will be ran in the <code>release</code> mode by default.</p>
|
|
<p>However, in some cases the test-suite of a package doesn't work properly in the
|
|
<code>release</code> mode. For these situations, the mode for <code>checkPhase</code> can be changed like
|
|
so:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="p">{</span>
|
|
<span class="cm">/* ... */</span>
|
|
<span class="ss">checkType</span> <span class="o">=</span> <span class="s2">"debug"</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Please note that the code will be compiled twice here: once in <code>release</code> mode
|
|
for the <code>buildPhase</code>, and again in <code>debug</code> mode for the <code>checkPhase</code>.</p>
|
|
<p>Test flags, e.g., <code>--package foo</code>, can be passed to <code>cargo test</code> via the
|
|
<code>cargoTestFlags</code> attribute.</p>
|
|
<p>Another attribute, called <code>checkFlags</code>, is used to pass arguments to the test
|
|
binary itself, as stated
|
|
<a href="https://doc.rust-lang.org/cargo/commands/cargo-test.html">here</a>.</p>
|
|
<h4 id="tests-relying-on-the-structure-of-the-target-directory">Tests relying on the structure of the <code>target/</code> directory</h4>
|
|
<p>Some tests may rely on the structure of the <code>target/</code> directory. Those tests
|
|
are likely to fail because we use <code>cargo --target</code> during the build. This means that
|
|
the artifacts
|
|
<a href="https://doc.rust-lang.org/cargo/guide/build-cache.html">are stored in <code>target/<architecture>/release/</code></a>,
|
|
rather than in <code>target/release/</code>.</p>
|
|
<p>This can only be worked around by patching the affected tests accordingly.</p>
|
|
<h4 id="disabling-package-tests">Disabling package-tests</h4>
|
|
<p>In some instances, it may be necessary to disable testing altogether (with <code>doCheck = false;</code>):</p>
|
|
<ul>
|
|
<li>If no tests exist -- the <code>checkPhase</code> should be explicitly disabled to skip
|
|
unnecessary build steps to speed up the build.</li>
|
|
<li>If tests are highly impure (e.g. due to network usage).</li>
|
|
</ul>
|
|
<p>There will obviously be some corner-cases not listed above where it's sensible to disable tests.
|
|
The above are just guidelines, and exceptions may be granted on a case-by-case basis.</p>
|
|
<p>However, please check if it's possible to disable a problematic subset of the
|
|
test suite and leave a comment explaining your reasoning.</p>
|
|
<p>This can be achieved with <code>--skip</code> in <code>checkFlags</code>:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="p">{</span>
|
|
<span class="cm">/* ... */</span>
|
|
<span class="ss">checkFlags</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="c1"># reason for disabling test</span>
|
|
<span class="s2">"--skip=example::tests:example_test"</span>
|
|
<span class="p">];</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h4 id="using-cargo-nextest">Using <code>cargo-nextest</code></h4>
|
|
<p>Tests can be run with <a href="https://github.com/nextest-rs/nextest">cargo-nextest</a>
|
|
by setting <code>useNextest = true</code>. The same options still apply, but nextest
|
|
accepts a different set of arguments and the settings might need to be
|
|
adapted to be compatible with cargo-nextest.</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="p">{</span>
|
|
<span class="cm">/* ... */</span>
|
|
<span class="ss">useNextest</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h4 id="setting-test-threads">Setting <code>test-threads</code></h4>
|
|
<p><code>buildRustPackage</code> will use parallel test threads by default,
|
|
sometimes it may be necessary to disable this so the tests run consecutively.</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="p">{</span>
|
|
<span class="cm">/* ... */</span>
|
|
<span class="ss">dontUseCargoParallelTests</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h3 id="building-a-package-in-debug-mode">Building a package in <code>debug</code> mode</h3>
|
|
<p>By default, <code>buildRustPackage</code> will use <code>release</code> mode for builds. If a package
|
|
should be built in <code>debug</code> mode, it can be configured like so:</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="p">{</span>
|
|
<span class="cm">/* ... */</span>
|
|
<span class="ss">buildType</span> <span class="o">=</span> <span class="s2">"debug"</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>In this scenario, the <code>checkPhase</code> will be ran in <code>debug</code> mode as well.</p>
|
|
<h3 id="custom-buildinstall-procedures">Custom <code>build</code>/<code>install</code>-procedures</h3>
|
|
<p>Some packages may use custom scripts for building/installing, e.g. with a <code>Makefile</code>.
|
|
In these cases, it's recommended to override the <code>buildPhase</code>/<code>installPhase</code>/<code>checkPhase</code>.</p>
|
|
<p>Otherwise, some steps may fail because of the modified directory structure of <code>target/</code>.</p>
|
|
<h3 id="building-a-crate-with-an-absent-or-out-of-date-cargo.lock-file">Building a crate with an absent or out-of-date Cargo.lock file</h3>
|
|
<p><code>buildRustPackage</code> needs a <code>Cargo.lock</code> file to get all dependencies in the
|
|
source code in a reproducible way. If it is missing or out-of-date one can use
|
|
the <code>cargoPatches</code> attribute to update or add it.</p>
|
|
<div class="highlight"><pre><span></span><code>rustPlatform<span class="o">.</span>buildRustPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="c1"># ...</span>
|
|
<span class="ss">cargoPatches</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="c1"># a patch file to add/update Cargo.lock in the source code</span>
|
|
<span class="l">./add-Cargo.lock.patch</span>
|
|
<span class="p">];</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h3 id="compiling-non-rust-packages-that-include-rust-code">Compiling non-Rust packages that include Rust code</h3>
|
|
<p>Several non-Rust packages incorporate Rust code for performance- or
|
|
security-sensitive parts. <code>rustPlatform</code> exposes several functions and
|
|
hooks that can be used to integrate Cargo in non-Rust packages.</p>
|
|
<h4 id="vendoring-of-dependencies">Vendoring of dependencies</h4>
|
|
<p>Since network access is not allowed in sandboxed builds, Rust crate
|
|
dependencies need to be retrieved using a fetcher. <code>rustPlatform</code>
|
|
provides the <code>fetchCargoTarball</code> fetcher, which vendors all
|
|
dependencies of a crate. For example, given a source path <code>src</code>
|
|
containing <code>Cargo.toml</code> and <code>Cargo.lock</code>, <code>fetchCargoTarball</code>
|
|
can be used as follows:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="ss">cargoDeps</span> <span class="o">=</span> rustPlatform<span class="o">.</span>fetchCargoTarball <span class="p">{</span>
|
|
<span class="k">inherit</span> src<span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-BoHIN/519Top1NUBjpB/oEMqi86Omt3zTQcXFWqrek0="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>The <code>src</code> attribute is required, as well as a hash specified through
|
|
one of the <code>hash</code> attribute. The following optional attributes can
|
|
also be used:</p>
|
|
<ul>
|
|
<li><code>name</code>: the name that is used for the dependencies tarball. If
|
|
<code>name</code> is not specified, then the name <code>cargo-deps</code> will be used.</li>
|
|
<li><code>sourceRoot</code>: when the <code>Cargo.lock</code>/<code>Cargo.toml</code> are in a
|
|
subdirectory, <code>sourceRoot</code> specifies the relative path to these
|
|
files.</li>
|
|
<li><code>patches</code>: patches to apply before vendoring. This is useful when
|
|
the <code>Cargo.lock</code>/<code>Cargo.toml</code> files need to be patched before
|
|
vendoring.</li>
|
|
</ul>
|
|
<p>If a <code>Cargo.lock</code> file is available, you can alternatively use the
|
|
<code>importCargoLock</code> function. In contrast to <code>fetchCargoTarball</code>, this
|
|
function does not require a hash (unless git dependencies are used)
|
|
and fetches every dependency as a separate fixed-output derivation.
|
|
<code>importCargoLock</code> can be used as follows:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="ss">cargoDeps</span> <span class="o">=</span> rustPlatform<span class="o">.</span>importCargoLock <span class="p">{</span>
|
|
<span class="ss">lockFile</span> <span class="o">=</span> <span class="l">./Cargo.lock</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>If the <code>Cargo.lock</code> file includes git dependencies, then their output
|
|
hashes need to be specified since they are not available through the
|
|
lock file. For example:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
|
<span class="ss">cargoDeps</span> <span class="o">=</span> rustPlatform<span class="o">.</span>importCargoLock <span class="p">{</span>
|
|
<span class="ss">lockFile</span> <span class="o">=</span> <span class="l">./Cargo.lock</span><span class="p">;</span>
|
|
<span class="ss">outputHashes</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="s2">"rand-0.8.3"</span> <span class="o">=</span> <span class="s2">"0ya2hia3cn31qa8894s3av2s8j5bjwb6yq92k0jsnlx7jid0jwqa"</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>If you do not specify an output hash for a git dependency, building
|
|
<code>cargoDeps</code> will fail and inform you of which crate needs to be
|
|
added. To find the correct hash, you can first use <code>lib.fakeSha256</code> or
|
|
<code>lib.fakeHash</code> as a stub hash. Building <code>cargoDeps</code> will then inform
|
|
you of the correct hash.</p>
|
|
<h4 id="hooks">Hooks</h4>
|
|
<p><code>rustPlatform</code> provides the following hooks to automate Cargo builds:</p>
|
|
<ul>
|
|
<li><code>cargoSetupHook</code>: configure Cargo to use dependencies vendored
|
|
through <code>fetchCargoTarball</code>. This hook uses the <code>cargoDeps</code>
|
|
environment variable to find the vendored dependencies. If a project
|
|
already vendors its dependencies, the variable <code>cargoVendorDir</code> can
|
|
be used instead. When the <code>Cargo.toml</code>/<code>Cargo.lock</code> files are not in
|
|
<code>sourceRoot</code>, then the optional <code>cargoRoot</code> is used to specify the
|
|
Cargo root directory relative to <code>sourceRoot</code>.</li>
|
|
<li><code>cargoBuildHook</code>: use Cargo to build a crate. If the crate to be
|
|
built is a crate in e.g. a Cargo workspace, the relative path to the
|
|
crate to build can be set through the optional <code>buildAndTestSubdir</code>
|
|
environment variable. Features can be specified with
|
|
<code>cargoBuildNoDefaultFeatures</code> and <code>cargoBuildFeatures</code>. Additional
|
|
Cargo build flags can be passed through <code>cargoBuildFlags</code>.</li>
|
|
<li><code>maturinBuildHook</code>: use <a href="https://github.com/PyO3/maturin">Maturin</a>
|
|
to build a Python wheel. Similar to <code>cargoBuildHook</code>, the optional
|
|
variable <code>buildAndTestSubdir</code> can be used to build a crate in a
|
|
Cargo workspace. Additional Maturin flags can be passed through
|
|
<code>maturinBuildFlags</code>.</li>
|
|
<li><code>cargoCheckHook</code>: run tests using Cargo. The build type for checks
|
|
can be set using <code>cargoCheckType</code>. Features can be specified with
|
|
<code>cargoCheckNoDefaultFeatures</code> and <code>cargoCheckFeatures</code>. Additional
|
|
flags can be passed to the tests using <code>checkFlags</code> and
|
|
<code>checkFlagsArray</code>. By default, tests are run in parallel. This can
|
|
be disabled by setting <code>dontUseCargoParallelTests</code>.</li>
|
|
<li><code>cargoNextestHook</code>: run tests using
|
|
<a href="https://github.com/nextest-rs/nextest">cargo-nextest</a>. The same
|
|
options for <code>cargoCheckHook</code> also applies to <code>cargoNextestHook</code>.</li>
|
|
<li><code>cargoInstallHook</code>: install binaries and static/shared libraries
|
|
that were built using <code>cargoBuildHook</code>.</li>
|
|
<li><code>bindgenHook</code>: for crates which use <code>bindgen</code> as a build dependency, lets
|
|
<code>bindgen</code> find <code>libclang</code> and <code>libclang</code> find the libraries in <code>buildInputs</code>.</li>
|
|
</ul>
|
|
<h4 id="examples-example">Examples!!! example</h4>
|
|
<h4 id="python-package-using-setuptools-rust">Python package using <code>setuptools-rust</code></h4>
|
|
<p>For Python packages using <code>setuptools-rust</code>, you can use
|
|
<code>fetchCargoTarball</code> and <code>cargoSetupHook</code> to retrieve and set up Cargo
|
|
dependencies. The build itself is then performed by
|
|
<code>buildPythonPackage</code>.</p>
|
|
<p>The following example outlines how the <code>tokenizers</code> Python package is
|
|
built. Since the Python package is in the <code>source/bindings/python</code>
|
|
directory of the <code>tokenizers</code> project's source archive, we use
|
|
<code>sourceRoot</code> to point the tooling to this directory:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchFromGitHub
|
|
<span class="p">,</span> buildPythonPackage
|
|
<span class="p">,</span> cargo
|
|
<span class="p">,</span> rustPlatform
|
|
<span class="p">,</span> rustc
|
|
<span class="p">,</span> setuptools-rust
|
|
<span class="p">}:</span>
|
|
|
|
buildPythonPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"tokenizers"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"0.10.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">src</span> <span class="o">=</span> fetchFromGitHub <span class="p">{</span>
|
|
<span class="ss">owner</span> <span class="o">=</span> <span class="s2">"huggingface"</span><span class="p">;</span>
|
|
<span class="ss">repo</span> <span class="o">=</span> pname<span class="p">;</span>
|
|
<span class="ss">rev</span> <span class="o">=</span> <span class="s2">"python-v</span><span class="si">${</span>version<span class="si">}</span><span class="s2">"</span><span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-rQ2hRV52naEf6PvRsWVCTN7B1oXAQGmnpJw4iIdhamw="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoDeps</span> <span class="o">=</span> rustPlatform<span class="o">.</span>fetchCargoTarball <span class="p">{</span>
|
|
<span class="k">inherit</span> src sourceRoot<span class="p">;</span>
|
|
<span class="ss">name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">${</span>pname<span class="si">}</span><span class="s2">-</span><span class="si">${</span>version<span class="si">}</span><span class="s2">"</span><span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-miW//pnOmww2i6SOGbkrAIdc/JMDT4FJLqdMFojZeoY="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">sourceRoot</span> <span class="o">=</span> <span class="s2">"</span><span class="si">${</span>src<span class="o">.</span>name<span class="si">}</span><span class="s2">/bindings/python"</span><span class="p">;</span>
|
|
|
|
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span>
|
|
cargo
|
|
rustPlatform<span class="o">.</span>cargoSetupHook
|
|
rustc
|
|
setuptools-rust
|
|
<span class="p">];</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>In some projects, the Rust crate is not in the main Python source
|
|
directory. In such cases, the <code>cargoRoot</code> attribute can be used to
|
|
specify the crate's directory relative to <code>sourceRoot</code>. In the
|
|
following example, the crate is in <code>src/rust</code>, as specified in the
|
|
<code>cargoRoot</code> attribute. Note that we also need to specify the correct
|
|
path for <code>fetchCargoTarball</code>.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span> buildPythonPackage
|
|
<span class="p">,</span> fetchPypi
|
|
<span class="p">,</span> rustPlatform
|
|
<span class="p">,</span> setuptools-rust
|
|
<span class="p">,</span> openssl
|
|
<span class="p">}:</span>
|
|
|
|
buildPythonPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"cryptography"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"3.4.2"</span><span class="p">;</span> <span class="c1"># Also update the hash in vectors.nix</span>
|
|
|
|
<span class="ss">src</span> <span class="o">=</span> fetchPypi <span class="p">{</span>
|
|
<span class="k">inherit</span> pname version<span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-xGDilsjLOnls3MfVbGKnj80KCUCczZxlis5PmHzpNcQ="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoDeps</span> <span class="o">=</span> rustPlatform<span class="o">.</span>fetchCargoTarball <span class="p">{</span>
|
|
<span class="k">inherit</span> src<span class="p">;</span>
|
|
<span class="ss">sourceRoot</span> <span class="o">=</span> <span class="s2">"</span><span class="si">${</span>pname<span class="si">}</span><span class="s2">-</span><span class="si">${</span>version<span class="si">}</span><span class="s2">/</span><span class="si">${</span>cargoRoot<span class="si">}</span><span class="s2">"</span><span class="p">;</span>
|
|
<span class="ss">name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">${</span>pname<span class="si">}</span><span class="s2">-</span><span class="si">${</span>version<span class="si">}</span><span class="s2">"</span><span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-PS562W4L1NimqDV2H0jl5vYhL08H9est/pbIxSdYVfo="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoRoot</span> <span class="o">=</span> <span class="s2">"src/rust"</span><span class="p">;</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h4 id="python-package-using-maturin">Python package using <code>maturin</code></h4>
|
|
<p>Python packages that use <a href="https://github.com/PyO3/maturin">Maturin</a>
|
|
can be built with <code>fetchCargoTarball</code>, <code>cargoSetupHook</code>, and
|
|
<code>maturinBuildHook</code>. For example, the following (partial) derivation
|
|
builds the <code>retworkx</code> Python package. <code>fetchCargoTarball</code> and
|
|
<code>cargoSetupHook</code> are used to fetch and set up the crate dependencies.
|
|
<code>maturinBuildHook</code> is used to perform the build.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span> lib
|
|
<span class="p">,</span> buildPythonPackage
|
|
<span class="p">,</span> rustPlatform
|
|
<span class="p">,</span> fetchFromGitHub
|
|
<span class="p">}:</span>
|
|
|
|
buildPythonPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"retworkx"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"0.6.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">src</span> <span class="o">=</span> fetchFromGitHub <span class="p">{</span>
|
|
<span class="ss">owner</span> <span class="o">=</span> <span class="s2">"Qiskit"</span><span class="p">;</span>
|
|
<span class="ss">repo</span> <span class="o">=</span> <span class="s2">"retworkx"</span><span class="p">;</span>
|
|
<span class="ss">rev</span> <span class="o">=</span> version<span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-11n30ldg3y3y6qxg3hbj837pnbwjkqw3nxq6frds647mmmprrd20="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoDeps</span> <span class="o">=</span> rustPlatform<span class="o">.</span>fetchCargoTarball <span class="p">{</span>
|
|
<span class="k">inherit</span> src<span class="p">;</span>
|
|
<span class="ss">name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">${</span>pname<span class="si">}</span><span class="s2">-</span><span class="si">${</span>version<span class="si">}</span><span class="s2">"</span><span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-heOBK8qi2nuc/Ib+I/vLzZ1fUUD/G/KTw9d7M4Hz5O0="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">format</span> <span class="o">=</span> <span class="s2">"pyproject"</span><span class="p">;</span>
|
|
|
|
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="k">with</span> rustPlatform<span class="p">;</span> <span class="p">[</span> cargoSetupHook maturinBuildHook <span class="p">];</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h4 id="rust-package-built-with-meson">Rust package built with <code>meson</code></h4>
|
|
<p>Some projects, especially GNOME applications, are built with the Meson Build System instead of calling Cargo directly. Using <code>rustPlatform.buildRustPackage</code> may successfully build the main program, but related files will be missing. Instead, you need to set up Cargo dependencies with <code>fetchCargoTarball</code> and <code>cargoSetupHook</code> and leave the rest to Meson. <code>rust</code> and <code>cargo</code> are still needed in <code>nativeBuildInputs</code> for Meson to use.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="p">{</span> lib
|
|
<span class="p">,</span> stdenv
|
|
<span class="p">,</span> fetchFromGitLab
|
|
<span class="p">,</span> meson
|
|
<span class="p">,</span> ninja
|
|
<span class="p">,</span> pkg-config
|
|
<span class="p">,</span> rustPlatform
|
|
<span class="p">,</span> rustc
|
|
<span class="p">,</span> cargo
|
|
<span class="p">,</span> wrapGAppsHook4
|
|
<span class="p">,</span> blueprint-compiler
|
|
<span class="p">,</span> libadwaita
|
|
<span class="p">,</span> libsecret
|
|
<span class="p">,</span> tracker
|
|
<span class="p">}:</span>
|
|
|
|
stdenv<span class="o">.</span>mkDerivation <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"health"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"0.95.0"</span><span class="p">;</span>
|
|
|
|
<span class="ss">src</span> <span class="o">=</span> fetchFromGitLab <span class="p">{</span>
|
|
<span class="ss">domain</span> <span class="o">=</span> <span class="s2">"gitlab.gnome.org"</span><span class="p">;</span>
|
|
<span class="ss">owner</span> <span class="o">=</span> <span class="s2">"World"</span><span class="p">;</span>
|
|
<span class="ss">repo</span> <span class="o">=</span> <span class="s2">"health"</span><span class="p">;</span>
|
|
<span class="ss">rev</span> <span class="o">=</span> version<span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-PrNPprSS98yN8b8yw2G6hzTSaoE65VbsM3q7FVB4mds="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoDeps</span> <span class="o">=</span> rustPlatform<span class="o">.</span>fetchCargoTarball <span class="p">{</span>
|
|
<span class="k">inherit</span> src<span class="p">;</span>
|
|
<span class="ss">name</span> <span class="o">=</span> <span class="s2">"</span><span class="si">${</span>pname<span class="si">}</span><span class="s2">-</span><span class="si">${</span>version<span class="si">}</span><span class="s2">"</span><span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-8fa3fa+sFi5H+49B5sr2vYPkp9C9s6CcE0zv4xB8gww="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span>
|
|
meson
|
|
ninja
|
|
pkg-config
|
|
rustPlatform<span class="o">.</span>cargoSetupHook
|
|
rustc
|
|
cargo
|
|
wrapGAppsHook4
|
|
blueprint-compiler
|
|
<span class="p">];</span>
|
|
|
|
<span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span>
|
|
libadwaita
|
|
libsecret
|
|
tracker
|
|
<span class="p">];</span>
|
|
|
|
<span class="c1"># ...</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h2 id="compiling-rust-crates-using-nix-instead-of-cargo"><code>buildRustCrate</code>: Compiling Rust crates using Nix instead of Cargo</h2>
|
|
<h3 id="simple-operation">Simple operation</h3>
|
|
<p>When run, <code>cargo build</code> produces a file called <code>Cargo.lock</code>,
|
|
containing pinned versions of all dependencies. Nixpkgs contains a
|
|
tool called <code>crate2Nix</code> (<code>nix-shell -p crate2nix</code>), which can be
|
|
used to turn a <code>Cargo.lock</code> into a Nix expression. That Nix
|
|
expression calls <code>rustc</code> directly (hence bypassing Cargo), and can
|
|
be used to compile a crate and all its dependencies.</p>
|
|
<p>See <a href="https://github.com/kolloch/crate2nix#known-restrictions"><code>crate2nix</code>'s documentation</a>
|
|
for instructions on how to use it.</p>
|
|
<h3 id="handling-external-dependencies">Handling external dependencies</h3>
|
|
<p>Some crates require external libraries. For crates from
|
|
<a href="https://crates.io">crates.io</a>, such libraries can be specified in
|
|
<code>defaultCrateOverrides</code> package in nixpkgs itself.</p>
|
|
<p>Starting from that file, one can add more overrides, to add features
|
|
or build inputs by overriding the hello crate in a separate file.</p>
|
|
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l"><nixpkgs></span> <span class="p">{};</span>
|
|
<span class="p">((</span><span class="nb">import</span> <span class="l">./hello.nix</span><span class="p">)</span><span class="o">.</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span>
|
|
<span class="ss">crateOverrides</span> <span class="o">=</span> defaultCrateOverrides <span class="o">//</span> <span class="p">{</span>
|
|
<span class="ss">hello</span> <span class="o">=</span> attrs<span class="p">:</span> <span class="p">{</span> <span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span> openssl <span class="p">];</span> <span class="p">};</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Here, <code>crateOverrides</code> is expected to be a attribute set, where the
|
|
key is the crate name without version number and the value a function.
|
|
The function gets all attributes passed to <code>buildRustCrate</code> as first
|
|
argument and returns a set that contains all attribute that should be
|
|
overwritten.</p>
|
|
<p>For more complicated cases, such as when parts of the crate's
|
|
derivation depend on the crate's version, the <code>attrs</code> argument of
|
|
the override above can be read, as in the following example, which
|
|
patches the derivation:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l"><nixpkgs></span> <span class="p">{};</span>
|
|
<span class="p">((</span><span class="nb">import</span> <span class="l">./hello.nix</span><span class="p">)</span><span class="o">.</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span>
|
|
<span class="ss">crateOverrides</span> <span class="o">=</span> defaultCrateOverrides <span class="o">//</span> <span class="p">{</span>
|
|
<span class="ss">hello</span> <span class="o">=</span> attrs<span class="p">:</span> lib<span class="o">.</span>optionalAttrs <span class="p">(</span>lib<span class="o">.</span>versionAtLeast attrs<span class="o">.</span>version <span class="s2">"1.0"</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="ss">postPatch</span> <span class="o">=</span> <span class="s s-Multiline">''</span>
|
|
<span class="s s-Multiline"> substituteInPlace lib/zoneinfo.rs \</span>
|
|
<span class="s s-Multiline"> --replace-fail "/usr/share/zoneinfo" "</span><span class="si">${</span>tzdata<span class="si">}</span><span class="s s-Multiline">/share/zoneinfo"</span>
|
|
<span class="s s-Multiline"> ''</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Another situation is when we want to override a nested
|
|
dependency. This actually works in the exact same way, since the
|
|
<code>crateOverrides</code> parameter is forwarded to the crate's
|
|
dependencies. For instance, to override the build inputs for crate
|
|
<code>libc</code> in the example above, where <code>libc</code> is a dependency of the main
|
|
crate, we could do:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l"><nixpkgs></span> <span class="p">{};</span>
|
|
<span class="p">((</span><span class="nb">import</span> hello<span class="o">.</span>nix<span class="p">)</span><span class="o">.</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span>
|
|
<span class="ss">crateOverrides</span> <span class="o">=</span> defaultCrateOverrides <span class="o">//</span> <span class="p">{</span>
|
|
<span class="ss">libc</span> <span class="o">=</span> attrs<span class="p">:</span> <span class="p">{</span> <span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[];</span> <span class="p">};</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h3 id="options-and-phases-configuration">Options and phases configuration</h3>
|
|
<p>Actually, the overrides introduced in the previous section are more
|
|
general. A number of other parameters can be overridden:</p>
|
|
<ul>
|
|
<li>The version of <code>rustc</code> used to compile the crate:</li>
|
|
</ul>
|
|
<div class="highlight"><pre><span></span><code><span class="p">(</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span> <span class="ss">rust</span> <span class="o">=</span> pkgs<span class="o">.</span>rust<span class="p">;</span> <span class="p">}</span>
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>Whether to build in release mode or debug mode (release mode by
|
|
default):</li>
|
|
</ul>
|
|
<div class="highlight"><pre><span></span><code><span class="p">(</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span> <span class="ss">release</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> <span class="p">}</span>
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>Whether to print the commands sent to <code>rustc</code> when building
|
|
(equivalent to <code>--verbose</code> in cargo:</li>
|
|
</ul>
|
|
<div class="highlight"><pre><span></span><code><span class="p">(</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span> <span class="ss">verbose</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span> <span class="p">}</span>
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>Extra arguments to be passed to <code>rustc</code>:</li>
|
|
</ul>
|
|
<div class="highlight"><pre><span></span><code><span class="p">(</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span> <span class="ss">extraRustcOpts</span> <span class="o">=</span> <span class="s2">"-Z debuginfo=2"</span><span class="p">;</span> <span class="p">}</span>
|
|
</code></pre></div>
|
|
<ul>
|
|
<li>Phases, just like in any other derivation, can be specified using
|
|
the following attributes: <code>preUnpack</code>, <code>postUnpack</code>, <code>prePatch</code>,
|
|
<code>patches</code>, <code>postPatch</code>, <code>preConfigure</code> (in the case of a Rust crate,
|
|
this is run before calling the "build" script), <code>postConfigure</code>
|
|
(after the "build" script),<code>preBuild</code>, <code>postBuild</code>, <code>preInstall</code> and
|
|
<code>postInstall</code>. As an example, here is how to create a new module
|
|
before running the build script:</li>
|
|
</ul>
|
|
<div class="highlight"><pre><span></span><code><span class="p">(</span>hello <span class="p">{})</span><span class="o">.</span>override <span class="p">{</span>
|
|
<span class="ss">preConfigure</span> <span class="o">=</span> <span class="s s-Multiline">''</span>
|
|
<span class="s s-Multiline"> echo "pub const PATH=\"</span><span class="si">${</span>hi<span class="o">.</span>out<span class="si">}</span><span class="s s-Multiline">\";" >> src/path.rs"</span>
|
|
<span class="s s-Multiline"> ''</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<h3 id="setting-up-nix-shell">Setting Up <code>nix-shell</code></h3>
|
|
<p>Oftentimes you want to develop code from within <code>nix-shell</code>. Unfortunately
|
|
<code>buildRustCrate</code> does not support common <code>nix-shell</code> operations directly
|
|
(see <a href="https://github.com/NixOS/nixpkgs/issues/37945">this issue</a>)
|
|
so we will use <code>stdenv.mkDerivation</code> instead.</p>
|
|
<p>Using the example <code>hello</code> project above, we want to do the following:</p>
|
|
<ul>
|
|
<li>Have access to <code>cargo</code> and <code>rustc</code></li>
|
|
<li>Have the <code>openssl</code> library available to a crate through it's <em>normal</em>
|
|
compilation mechanism (<code>pkg-config</code>).</li>
|
|
</ul>
|
|
<p>A typical <code>shell.nix</code> might look like:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l"><nixpkgs></span> <span class="p">{};</span>
|
|
|
|
stdenv<span class="o">.</span>mkDerivation <span class="p">{</span>
|
|
<span class="ss">name</span> <span class="o">=</span> <span class="s2">"rust-env"</span><span class="p">;</span>
|
|
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span>
|
|
rustc cargo
|
|
|
|
<span class="c1"># Example Build-time Additional Dependencies</span>
|
|
pkg-config
|
|
<span class="p">];</span>
|
|
<span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="c1"># Example Run-time Additional Dependencies</span>
|
|
openssl
|
|
<span class="p">];</span>
|
|
|
|
<span class="c1"># Set Environment Variables</span>
|
|
<span class="ss">RUST_BACKTRACE</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>You should now be able to run the following:</p>
|
|
<div class="highlight"><pre><span></span><code>$ nix-shell --pure
|
|
$ cargo build
|
|
$ cargo test
|
|
</code></pre></div>
|
|
<h2 id="using-community-maintained-rust-toolchains">Using community maintained Rust toolchains</h2>
|
|
<div class="admonition note">
|
|
<p class="admonition-title">Note</p>
|
|
<p>The following projects cannot be used within Nixpkgs since <a href="https://nixos.org/manual/nix/unstable/language/import-from-derivation">Import From Derivation</a> (IFD) is disallowed in Nixpkgs.
|
|
To package things that require Rust nightly, <code>RUSTC_BOOTSTRAP = true;</code> can sometimes be used as a hack.</p>
|
|
</div>
|
|
<p>There are two community maintained approaches to Rust toolchain management:
|
|
- <a href="https://github.com/oxalica/rust-overlay">oxalica's Rust overlay</a>
|
|
- <a href="https://github.com/nix-community/fenix">fenix</a></p>
|
|
<p>Despite their names, both projects provides a similar set of packages and overlays under different APIs.</p>
|
|
<p>Oxalica's overlay allows you to select a particular Rust version without you providing a hash or a flake input,
|
|
but comes with a larger git repository than fenix.</p>
|
|
<p>Fenix also provides rust-analyzer nightly in addition to the Rust toolchains.</p>
|
|
<p>Both oxalica's overlay and fenix better integrate with nix and cache optimizations.
|
|
Because of this and ergonomics, either of those community projects
|
|
should be preferred to the Mozilla's Rust overlay (<a href="https://github.com/mozilla/nixpkgs-mozilla">nixpkgs-mozilla</a>).</p>
|
|
<p>The following documentation demonstrates examples using fenix and oxalica's Rust overlay
|
|
with <code>nix-shell</code> and building derivations. More advanced usages like flake usage
|
|
are documented in their own repositories.</p>
|
|
<h3 id="using-rust-nightly-with-nix-shell">Using Rust nightly with <code>nix-shell</code></h3>
|
|
<p>Here is a simple <code>shell.nix</code> that provides Rust nightly (default profile) using fenix:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l"><nixpkgs></span> <span class="p">{</span> <span class="p">};</span>
|
|
<span class="k">let</span>
|
|
<span class="ss">fenix</span> <span class="o">=</span> callPackage
|
|
<span class="p">(</span>fetchFromGitHub <span class="p">{</span>
|
|
<span class="ss">owner</span> <span class="o">=</span> <span class="s2">"nix-community"</span><span class="p">;</span>
|
|
<span class="ss">repo</span> <span class="o">=</span> <span class="s2">"fenix"</span><span class="p">;</span>
|
|
<span class="c1"># commit from: 2023-03-03</span>
|
|
<span class="ss">rev</span> <span class="o">=</span> <span class="s2">"e2ea04982b892263c4d939f1cc3bf60a9c4deaa1"</span><span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-AsOim1A8KKtMWIxG+lXh5Q4P2bhOZjoUhFWJ1EuZNNk="</span><span class="p">;</span>
|
|
<span class="p">})</span>
|
|
<span class="p">{</span> <span class="p">};</span>
|
|
<span class="k">in</span>
|
|
mkShell <span class="p">{</span>
|
|
<span class="ss">name</span> <span class="o">=</span> <span class="s2">"rust-env"</span><span class="p">;</span>
|
|
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="c1"># Note: to use stable, just replace `default` with `stable`</span>
|
|
fenix<span class="o">.</span>default<span class="o">.</span>toolchain
|
|
|
|
<span class="c1"># Example Build-time Additional Dependencies</span>
|
|
pkg-config
|
|
<span class="p">];</span>
|
|
<span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="c1"># Example Run-time Additional Dependencies</span>
|
|
openssl
|
|
<span class="p">];</span>
|
|
|
|
<span class="c1"># Set Environment Variables</span>
|
|
<span class="ss">RUST_BACKTRACE</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Save this to <code>shell.nix</code>, then run:</p>
|
|
<div class="highlight"><pre><span></span><code>$ rustc --version
|
|
rustc 1.69.0-nightly (13471d3b2 2023-03-02)
|
|
</code></pre></div>
|
|
<p>To see that you are using nightly.</p>
|
|
<p>Oxalica's Rust overlay has more complete examples of <code>shell.nix</code> (and cross compilation) under its
|
|
<a href="https://github.com/oxalica/rust-overlay/tree/e53e8853aa7b0688bc270e9e6a681d22e01cf299/examples"><code>examples</code> directory</a>.</p>
|
|
<h3 id="using-rust-nightly-in-a-derivation-with-buildrustpackage">Using Rust nightly in a derivation with <code>buildRustPackage</code></h3>
|
|
<p>You can also use Rust nightly to build rust packages using <code>makeRustPlatform</code>.
|
|
The below snippet demonstrates invoking <code>buildRustPackage</code> with a Rust toolchain from oxalica's overlay:</p>
|
|
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="nb">import</span> <span class="l"><nixpkgs></span>
|
|
<span class="p">{</span>
|
|
<span class="ss">overlays</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="p">(</span><span class="nb">import</span> <span class="p">(</span>fetchTarball <span class="s2">"https://github.com/oxalica/rust-overlay/archive/master.tar.gz"</span><span class="p">))</span>
|
|
<span class="p">];</span>
|
|
<span class="p">};</span>
|
|
<span class="k">let</span>
|
|
<span class="ss">rustPlatform</span> <span class="o">=</span> makeRustPlatform <span class="p">{</span>
|
|
<span class="ss">cargo</span> <span class="o">=</span> rust-bin<span class="o">.</span>selectLatestNightlyWith <span class="p">(</span>toolchain<span class="p">:</span> toolchain<span class="o">.</span>default<span class="p">);</span>
|
|
<span class="ss">rustc</span> <span class="o">=</span> rust-bin<span class="o">.</span>selectLatestNightlyWith <span class="p">(</span>toolchain<span class="p">:</span> toolchain<span class="o">.</span>default<span class="p">);</span>
|
|
<span class="p">};</span>
|
|
<span class="k">in</span>
|
|
|
|
rustPlatform<span class="o">.</span>buildRustPackage <span class="k">rec</span> <span class="p">{</span>
|
|
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">"ripgrep"</span><span class="p">;</span>
|
|
<span class="ss">version</span> <span class="o">=</span> <span class="s2">"12.1.1"</span><span class="p">;</span>
|
|
|
|
<span class="ss">src</span> <span class="o">=</span> fetchFromGitHub <span class="p">{</span>
|
|
<span class="ss">owner</span> <span class="o">=</span> <span class="s2">"BurntSushi"</span><span class="p">;</span>
|
|
<span class="ss">repo</span> <span class="o">=</span> <span class="s2">"ripgrep"</span><span class="p">;</span>
|
|
<span class="ss">rev</span> <span class="o">=</span> version<span class="p">;</span>
|
|
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">"sha256-+s5RBC3XSgb8omTbUNLywZnP6jSxZBKSS1BmXOjRF8M="</span><span class="p">;</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="ss">cargoHash</span> <span class="o">=</span> <span class="s2">"sha256-l1vL2ZdtDRxSGvP0X/l3nMw8+6WF67KPutJEzUROjg8="</span><span class="p">;</span>
|
|
|
|
<span class="ss">doCheck</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
|
|
|
|
<span class="ss">meta</span> <span class="o">=</span> <span class="p">{</span>
|
|
<span class="ss">description</span> <span class="o">=</span> <span class="s2">"Fast line-oriented regex search tool, similar to ag and ack"</span><span class="p">;</span>
|
|
<span class="ss">homepage</span> <span class="o">=</span> <span class="s2">"https://github.com/BurntSushi/ripgrep"</span><span class="p">;</span>
|
|
<span class="ss">license</span> <span class="o">=</span> <span class="k">with</span> lib<span class="o">.</span>licenses<span class="p">;</span> <span class="p">[</span> mit unlicense <span class="p">];</span>
|
|
<span class="ss">maintainers</span> <span class="o">=</span> <span class="k">with</span> lib<span class="o">.</span>maintainers<span class="p">;</span> <span class="p">[];</span>
|
|
<span class="p">};</span>
|
|
<span class="p">}</span>
|
|
</code></pre></div>
|
|
<p>Follow the below steps to try that snippet.
|
|
1. save the above snippet as <code>default.nix</code> in that directory
|
|
2. cd into that directory and run <code>nix-build</code></p>
|
|
<p>Fenix also has examples with <code>buildRustPackage</code>,
|
|
<a href="https://github.com/ipetkov/crane">crane</a>,
|
|
<a href="https://github.com/nix-community/naersk">naersk</a>,
|
|
and cross compilation in its <a href="https://github.com/nix-community/fenix#examples">Examples</a> section.</p>
|
|
<h2 id="using-git-bisect-on-the-rust-compiler">Using <code>git bisect</code> on the Rust compiler</h2>
|
|
<p>Sometimes an upgrade of the Rust compiler (<code>rustc</code>) will break a
|
|
downstream package. In these situations, being able to <code>git bisect</code>
|
|
the <code>rustc</code> version history to find the offending commit is quite
|
|
useful. Nixpkgs makes it easy to do this.</p>
|
|
<p>First, roll back your nixpkgs to a commit in which its <code>rustc</code> used
|
|
<em>the most recent one which doesn't have the problem.</em> You'll need
|
|
to do this because of <code>rustc</code>'s extremely aggressive
|
|
version-pinning.</p>
|
|
<p>Next, add the following overlay, updating the Rust version to the
|
|
one in your rolled-back nixpkgs, and replacing <code>/git/scratch/rust</code>
|
|
with the path into which you have <code>git clone</code>d the <code>rustc</code> git
|
|
repository:</p>
|
|
<div class="highlight"><pre><span></span><code> <span class="p">(</span>final<span class="p">:</span> prev<span class="p">:</span> <span class="cm">/*lib.optionalAttrs prev.stdenv.targetPlatform.isAarch64*/</span> <span class="p">{</span>
|
|
<span class="ss">rust_1_72</span> <span class="o">=</span>
|
|
lib<span class="o">.</span>updateManyAttrsByPath <span class="p">[{</span>
|
|
<span class="ss">path</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">"packages"</span> <span class="s2">"stable"</span> <span class="p">];</span>
|
|
<span class="ss">update</span> <span class="o">=</span> old<span class="p">:</span> old<span class="o">.</span>overrideScope<span class="p">(</span>final<span class="p">:</span> prev<span class="p">:</span> <span class="p">{</span>
|
|
<span class="ss">rustc-unwrapped</span> <span class="o">=</span> prev<span class="o">.</span>rustc-unwrapped<span class="o">.</span>overrideAttrs <span class="p">(</span>_<span class="p">:</span> <span class="p">{</span>
|
|
<span class="ss">src</span> <span class="o">=</span> lib<span class="o">.</span>cleanSource <span class="l">/git/scratch/rust</span><span class="p">;</span>
|
|
<span class="c1"># do *not* put passthru.isReleaseTarball=true here</span>
|
|
<span class="p">});</span>
|
|
<span class="p">});</span>
|
|
<span class="p">}]</span>
|
|
prev<span class="o">.</span>rust_1_72<span class="p">;</span>
|
|
<span class="p">})</span>
|
|
</code></pre></div>
|
|
<p>If the problem you're troubleshooting only manifests when
|
|
cross-compiling you can uncomment the <code>lib.optionalAttrs</code> in the
|
|
example above, and replace <code>isAarch64</code> with the target that is
|
|
having problems. This will speed up your bisect quite a bit, since
|
|
the host compiler won't need to be rebuilt.</p>
|
|
<p>Now, you can start a <code>git bisect</code> in the directory where you checked
|
|
out the <code>rustc</code> source code. It is recommended to select the
|
|
endpoint commits by searching backwards from <code>origin/master</code> for the
|
|
<em>commits which added the release notes for the versions in
|
|
question.</em> If you set the endpoints to commits on the release
|
|
branches (i.e. the release tags), git-bisect will often get confused
|
|
by the complex merge-commit structures it will need to traverse.</p>
|
|
<p>The command loop you'll want to use for bisecting looks like this:</p>
|
|
<div class="highlight"><pre><span></span><code>git<span class="w"> </span>bisect<span class="w"> </span><span class="o">{</span>good,bad<span class="o">}</span><span class="w"> </span><span class="c1"># depending on result of last build</span>
|
|
git<span class="w"> </span>submodule<span class="w"> </span>update<span class="w"> </span>--init
|
|
<span class="nv">CARGO_NET_OFFLINE</span><span class="o">=</span><span class="nb">false</span><span class="w"> </span>cargo<span class="w"> </span>vendor<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>--sync<span class="w"> </span>./src/tools/cargo/Cargo.toml<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>--sync<span class="w"> </span>./src/tools/rust-analyzer/Cargo.toml<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>--sync<span class="w"> </span>./compiler/rustc_codegen_cranelift/Cargo.toml<span class="w"> </span><span class="se">\</span>
|
|
<span class="w"> </span>--sync<span class="w"> </span>./src/bootstrap/Cargo.toml
|
|
nix-build<span class="w"> </span><span class="nv">$NIXPKGS</span><span class="w"> </span>-A<span class="w"> </span>package-broken-by-rust-changes
|
|
</code></pre></div>
|
|
<p>The <code>git submodule update --init</code> and <code>cargo vendor</code> commands above
|
|
require network access, so they can't be performed from within the
|
|
<code>rustc</code> derivation, unfortunately.</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> |