docs/Nixpkgs/Build-Helpers/fetchers.chapter/index.html

2829 lines
100 KiB
HTML
Raw Permalink Normal View History

2024-07-24 19:14:02 +00:00
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Aux Documentation">
<meta name="author" content="Nixpkgs Aux, and Lix Contributors">
<link rel="canonical" href="https://docs.auxolotl.org/Nixpkgs/Build-Helpers/fetchers.chapter/">
<link rel="prev" href="../dev-shell-tools.chapter/">
<link rel="next" href="../images/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>Fetchers - 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="Fetchers {#chap-pkgs-fetchers} - Aux Docs" >
<meta property="og:description" content="Aux Documentation" >
<meta property="og:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Build-Helpers/fetchers.chapter.png" >
<meta property="og:image:type" content="image/png" >
<meta property="og:image:width" content="1200" >
<meta property="og:image:height" content="630" >
<meta property="og:url" content="https://docs.auxolotl.org/Nixpkgs/Build-Helpers/fetchers.chapter/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="Fetchers {#chap-pkgs-fetchers} - Aux Docs" >
<meta name="twitter:description" content="Aux Documentation" >
<meta name="twitter:image" content="https://docs.auxolotl.org/assets/images/social/Nixpkgs/Build-Helpers/fetchers.chapter.png" >
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#chap-pkgs-fetchers" 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">
Fetchers
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Dark Mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Dark Mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="indigo" data-md-color-accent="blue" aria-label="Light Mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Light Mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
</label>
</form>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../../.." class="md-tabs__link">
Aux Documentation Hub
</a>
</li>
<li class="md-tabs__item">
<a href="../../../TODO/" class="md-tabs__link">
TODO
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Aux/" class="md-tabs__link">
Aux
</a>
</li>
<li class="md-tabs__item">
<a href="../../../Lix/" class="md-tabs__link">
Lix
</a>
</li>
<li class="md-tabs__item">
<a href="../../../NixOS/appstream/" class="md-tabs__link">
NixOS
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../" class="md-tabs__link">
Nixpkgs
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../../.." title="Aux Docs" class="md-nav__button md-logo" aria-label="Aux Docs" data-md-component="logo">
<img src="../../../assets/aux-logo.svg" alt="logo">
</a>
Aux Docs
</label>
<div class="md-nav__source">
<a href="https://git.auxolotl.org/auxolotl/docs" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M16.777 0a2.9 2.9 0 1 1-2.529 4.322H12.91a4.266 4.266 0 0 0-4.265 4.195v2.118a7.076 7.076 0 0 1 4.147-1.42l.118-.002h1.338a2.9 2.9 0 0 1 5.43 1.422 2.9 2.9 0 0 1-5.43 1.422H12.91a4.266 4.266 0 0 0-4.265 4.195v2.319A2.9 2.9 0 0 1 7.222 24 2.9 2.9 0 0 1 5.8 18.57V8.589a7.109 7.109 0 0 1 6.991-7.108l.118-.001h1.338A2.9 2.9 0 0 1 16.778 0ZM7.223 19.905a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Zm9.554-10.464a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.39Zm0-7.735a1.194 1.194 0 1 0 0 2.389 1.194 1.194 0 0 0 0-2.389Z"/></svg>
</div>
<div class="md-source__repository">
auxolotl/docs
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../.." class="md-nav__link">
<span class="md-ellipsis">
Aux Documentation Hub
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../../TODO/" class="md-nav__link">
<span class="md-ellipsis">
TODO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Aux/" class="md-nav__link">
<span class="md-ellipsis">
Aux
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../Lix/" class="md-nav__link">
<span class="md-ellipsis">
Lix
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../../NixOS/appstream/" class="md-nav__link">
<span class="md-ellipsis">
NixOS
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" checked>
<div class="md-nav__link md-nav__container">
<a href="../../" class="md-nav__link ">
<span class="md-ellipsis">
Nixpkgs
</span>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Nixpkgs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../options/" class="md-nav__link">
<span class="md-ellipsis">
Options
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_3" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Build Helpers
</span>
</a>
<label class="md-nav__link " for="__nav_6_3" id="__nav_6_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_3_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_6_3">
<span class="md-nav__icon md-icon"></span>
Build Helpers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../dev-shell-tools.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Development Shell helpers
</span>
</a>
</li>
<li class="md-nav__item 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">
Fetchers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Fetchers
</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="#chap-pkgs-fetchers-caveats" class="md-nav__link">
<span class="md-ellipsis">
Caveats
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-updating-source-hashes" class="md-nav__link">
<span class="md-ellipsis">
Updating source hashes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-secure-hashes" class="md-nav__link">
<span class="md-ellipsis">
Obtaining hashes securely
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-fetchurl" class="md-nav__link">
<span class="md-ellipsis">
fetchurl
</span>
</a>
<nav class="md-nav" aria-label="fetchurl">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-fetchurl-inputs" class="md-nav__link">
<span class="md-ellipsis">
Inputs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-pkgs-fetchers-fetchurl-passthru-outputs" class="md-nav__link">
<span class="md-ellipsis">
Passthru outputs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-pkgs-fetchers-fetchurl-examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../images/" class="md-nav__link">
<span class="md-ellipsis">
Images
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../special/" class="md-nav__link">
<span class="md-ellipsis">
Special build helpers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../testers.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Testers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../trivial-build-helpers.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Trivial build helpers
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../images/appimagetools.section/" class="md-nav__link">
<span class="md-ellipsis">
Images
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../special/checkpoint-build.section/" class="md-nav__link">
<span class="md-ellipsis">
Special
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Functions/" class="md-nav__link">
<span class="md-ellipsis">
Functions
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Hooks/" class="md-nav__link">
<span class="md-ellipsis">
Hooks
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Languages-And-Frameworks/" class="md-nav__link">
<span class="md-ellipsis">
Languages And Frameworks
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Library-Reference/asserts/" class="md-nav__link">
<span class="md-ellipsis">
Library Reference
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Module-System/module-system.chapter/" class="md-nav__link">
<span class="md-ellipsis">
Module System
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Packages/" class="md-nav__link">
<span class="md-ellipsis">
Packages
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Standard-Environment/" class="md-nav__link">
<span class="md-ellipsis">
Standard Environment
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
<li class="md-nav__item md-nav__item--pruned md-nav__item--nested">
<a href="../../Using-Nixpkgs/" class="md-nav__link">
<span class="md-ellipsis">
Using Nixpkgs
</span>
<span class="md-nav__icon md-icon"></span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#chap-pkgs-fetchers-caveats" class="md-nav__link">
<span class="md-ellipsis">
Caveats
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-updating-source-hashes" class="md-nav__link">
<span class="md-ellipsis">
Updating source hashes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-secure-hashes" class="md-nav__link">
<span class="md-ellipsis">
Obtaining hashes securely
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-fetchurl" class="md-nav__link">
<span class="md-ellipsis">
fetchurl
</span>
</a>
<nav class="md-nav" aria-label="fetchurl">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#sec-pkgs-fetchers-fetchurl-inputs" class="md-nav__link">
<span class="md-ellipsis">
Inputs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-pkgs-fetchers-fetchurl-passthru-outputs" class="md-nav__link">
<span class="md-ellipsis">
Passthru outputs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-pkgs-fetchers-fetchurl-examples" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="chap-pkgs-fetchers">Fetchers</h1>
<p>Building software with Nix often requires downloading source code and other files from the internet.
To this end, we use functions that we call <em>fetchers</em>, which obtain remote sources via various protocols and services.</p>
<p>Nix provides built-in fetchers such as <a href="https://nixos.org/manual/nix/stable/language/builtins.html#builtins-fetchTarball"><code>builtins.fetchTarball</code></a>.
Nixpkgs provides its own fetchers, which work differently:</p>
<ul>
<li>A built-in fetcher will download and cache files at evaluation time and produce a <a href="https://nixos.org/manual/nix/stable/glossary#gloss-store-path">store path</a>.
A Nixpkgs fetcher will create a (<a href="https://nixos.org/manual/nix/stable/glossary#gloss-fixed-output-derivation">fixed-output</a>) <a href="https://nixos.org/manual/nix/stable/glossary#gloss-derivation">derivation</a>, and files are downloaded at build time.</li>
<li>Built-in fetchers will invalidate their cache after <a href="https://nixos.org/manual/nix/stable/command-ref/conf-file#conf-tarball-ttl"><code>tarball-ttl</code></a> expires, and will require network activity to check if the cache entry is up to date.
Nixpkgs fetchers only re-download if the specified hash changes or the store object is not available.</li>
<li>Built-in fetchers do not use <a href="https://nixos.org/manual/nix/stable/command-ref/conf-file#conf-substituters">substituters</a>.
Derivations produced by Nixpkgs fetchers will use any configured binary cache transparently.</li>
</ul>
<p>This significantly reduces the time needed to evaluate Nixpkgs, and allows <a href="https://nixos.org/hydra">Hydra</a> to retain and re-distribute sources used by Nixpkgs in the <a href="https://cache.nixos.org">public binary cache</a>.
For these reasons, Nix's built-in fetchers are not allowed in Nixpkgs.</p>
<p>The following table summarises the differences:</p>
<table>
<thead>
<tr>
<th>Fetchers</th>
<th>Download</th>
<th>Output</th>
<th>Cache</th>
<th>Re-download when</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>builtins.fetch*</code></td>
<td>evaluation time</td>
<td>store path</td>
<td><code>/nix/store</code>, <code>~/.cache/nix</code></td>
<td><code>tarball-ttl</code> expires, cache miss in <code>~/.cache/nix</code>, output store object not in local store</td>
</tr>
<tr>
<td><code>pkgs.fetch*</code></td>
<td>build time</td>
<td>derivation</td>
<td><code>/nix/store</code>, substituters</td>
<td>output store object not available</td>
</tr>
</tbody>
</table>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p><code>pkgs.fetchFrom*</code> helpers retrieve <em>snapshots</em> of version-controlled sources, as opposed to the entire version history, which is more efficient.
<code>pkgs.fetchgit</code> by default also has the same behaviour, but can be changed through specific attributes given to it.</p>
</div>
<h2 id="chap-pkgs-fetchers-caveats">Caveats</h2>
<p>Because Nixpkgs fetchers are fixed-output derivations, an <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes#adv-attr-outputHash">output hash</a> has to be specified, usually indirectly through a <code>hash</code> attribute.
This hash refers to the derivation output, which can be different from the remote source itself!</p>
<p>This has the following implications that you should be aware of:</p>
<ul>
<li>
<p>Use Nix (or Nix-aware) tooling to produce the output hash.</p>
</li>
<li>
<p>When changing any fetcher parameters, always update the output hash.
Use one of the methods from <a href="#sec-pkgs-fetchers-updating-source-hashes"></a>.
Otherwise, existing store objects that match the output hash will be re-used rather than fetching new content.</p>
</li>
</ul>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>A similar problem arises while testing changes to a fetcher's implementation.
If the output of the derivation already exists in the Nix store, test failures can go undetected.
The <a href="#tester-invalidateFetcherByDrvHash"><code>invalidateFetcherByDrvHash</code></a> function helps prevent reusing cached derivations.</p>
</div>
<h2 id="sec-pkgs-fetchers-updating-source-hashes">Updating source hashes</h2>
<p>There are several ways to obtain the hash corresponding to a remote source.
Unless you understand how the fetcher you're using calculates the hash from the downloaded contents, you should use <a href="#sec-pkgs-fetchers-updating-source-hashes-fakehash-method">the fake hash method</a>.</p>
<ol>
<li>
<p>[]{#sec-pkgs-fetchers-updating-source-hashes-fakehash-method} The fake hash method: In your package recipe, set the hash to one of</p>
</li>
<li>
<p><code>""</code></p>
</li>
<li><code>lib.fakeHash</code></li>
<li><code>lib.fakeSha256</code></li>
<li><code>lib.fakeSha512</code></li>
</ol>
<p>Attempt to build, extract the calculated hashes from error messages, and put them into the recipe.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>You must use one of these four fake hashes and not some arbitrarily-chosen hash.
See <a href="#sec-pkgs-fetchers-secure-hashes"></a> for details.</p>
</div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code> # Update source hash with the fake hash method
</code></pre></div>
<p>Consider the following recipe that produces a plain file:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchurl <span class="p">}:</span>
fetchurl <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.05/.version&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-ZHl1emidXVojm83LCVrwULpwIzKE/mYwfztVkvpruOM=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>A common mistake is to update a fetcher parameter, such as <code>url</code>, without updating the hash:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchurl <span class="p">}:</span>
fetchurl <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/.version&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-ZHl1emidXVojm83LCVrwULpwIzKE/mYwfztVkvpruOM=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p><strong>This will produce the same output as before!</strong>
Set the hash to an empty string:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchurl <span class="p">}:</span>
fetchurl <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/.version&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>When building the package, use the error message to determine the correct hash:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>some<span class="w"> </span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
error:<span class="w"> </span><span class="nb">hash</span><span class="w"> </span>mismatch<span class="w"> </span><span class="k">in</span><span class="w"> </span>fixed-output<span class="w"> </span>derivation<span class="w"> </span><span class="s1">&#39;/nix/store/7yynn53jpc93l76z9zdjj4xdxgynawcw-version.drv&#39;</span>:
<span class="w"> </span>specified:<span class="w"> </span>sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<span class="o">=</span>
<span class="w"> </span>got:<span class="w"> </span>sha256-BZqI7r0MNP29yGH5+yW2tjU9OOpOCEvwWKrWCv5CQ0I<span class="o">=</span>
error:<span class="w"> </span>build<span class="w"> </span>of<span class="w"> </span><span class="s1">&#39;/nix/store/bqdjcw5ij5ymfbm41dq230chk9hdhqff-version.drv&#39;</span><span class="w"> </span>failed
</code></pre></div>
</div>
<ol>
<li>
<p>Prefetch the source with <a href="https://search.nixos.org/packages?buckets={%22package_attr_set%22%3A[%22No%20package%20set%22]%2C%22package_license_set%22%3A[]%2C%22package_maintainers_set%22%3A[]%2C%22package_platforms%22%3A[]}&amp;query=nix-prefetch"><code>nix-prefetch-&lt;type&gt; &lt;URL&gt;</code></a>, where <code>&lt;type&gt;</code> is one of</p>
</li>
<li>
<p><code>url</code></p>
</li>
<li><code>git</code></li>
<li><code>hg</code></li>
<li><code>cvs</code></li>
<li><code>bzr</code></li>
<li><code>svn</code></li>
</ol>
<p>The hash is printed to stdout.</p>
<ol>
<li>Prefetch by package source (with <code>nix-prefetch-url '&lt;nixpkgs&gt;' -A &lt;package&gt;.src</code>, where <code>&lt;package&gt;</code> is package attribute name).
The hash is printed to stdout.</li>
</ol>
<p>This works well when you've upgraded the existing package version and want to find out new hash, but is useless if the package can't be accessed by attribute or the package has multiple sources (<code>.srcs</code>, architecture-dependent sources, etc).</p>
<ol>
<li>Upstream hash: use it when upstream provides <code>sha256</code> or <code>sha512</code>.
Don't use it when upstream provides <code>md5</code>, compute <code>sha256</code> instead.</li>
</ol>
<p>A little nuance is that <code>nix-prefetch-*</code> tools produce hashes with the <code>nix32</code> encoding (a Nix-specific base32 adaptation), but upstream usually provides hexadecimal (<code>base16</code>) encoding.
Fetchers understand both formats.
Nixpkgs does not standardise on any one format.</p>
<p>You can convert between hash formats with <a href="https://nixos.org/manual/nix/stable/command-ref/nix-hash"><code>nix-hash</code></a>.</p>
<ol>
<li>Extract the hash from a local source archive with <code>sha256sum</code>.
Use <code>nix-prefetch-url file:///path/to/archive</code> if you want the custom Nix <code>base32</code> hash.</li>
</ol>
<h2 id="sec-pkgs-fetchers-secure-hashes">Obtaining hashes securely</h2>
<p>It's always a good idea to avoid Man-in-the-Middle (MITM) attacks when downloading source contents.
Otherwise, you could unknowingly download malware instead of the intended source, and instead of the actual source hash, you'll end up using the hash of malware.
Here are security considerations for this scenario:</p>
<ul>
<li>
<p><code>http://</code> URLs are not secure to prefetch hashes.</p>
</li>
<li>
<p>Upstream hashes should be obtained via a secure protocol.</p>
</li>
<li>
<p><code>https://</code> URLs give you more protections when using <code>nix-prefetch-*</code> or for upstream hashes.</p>
</li>
<li>
<p><code>https://</code> URLs are secure when using the <a href="#sec-pkgs-fetchers-updating-source-hashes-fakehash-method">fake hash method</a> <em>only if</em> you use one of the listed fake hashes.
If you use any other hash, the download will be exposed to MITM attacks even if you use HTTPS URLs.</p>
</li>
</ul>
<p>In more concrete terms, if you use any other hash, the <a href="https://curl.se/docs/manpage.html#-k"><code>--insecure</code> flag</a> will be passed to the underlying call to <code>curl</code> when downloading content.</p>
<p>[]{#fetchurl}</p>
<h2 id="sec-pkgs-fetchers-fetchurl"><code>fetchurl</code></h2>
<p><code>fetchurl</code> returns a <a href="https://nixos.org/manual/nix/stable/glossary.html#gloss-fixed-output-derivation">fixed-output derivation</a> which downloads content from a given URL and stores the unaltered contents within the Nix store.</p>
<p>It uses {manpage}<code>curl(1)</code> internally, and allows its behaviour to be modified by specifying a few attributes in the argument to <code>fetchurl</code> (see the documentation for attributes <code>curlOpts</code>, <code>curlOptsList</code>, and <code>netrcPhase</code>).</p>
<p>The resulting <a href="https://nixos.org/manual/nix/stable/store/store-path">store path</a> is determined by the hash given to <code>fetchurl</code>, and also the <code>name</code> (or <code>pname</code> and <code>version</code>) values.</p>
<p>If neither <code>name</code> nor <code>pname</code> and <code>version</code> are specified when calling <code>fetchurl</code>, it will default to using the <a href="https://nixos.org/manual/nix/stable/language/builtins.html#builtins-baseNameOf">basename</a> of <code>url</code> or the first element of <code>urls</code>.
If <code>pname</code> and <code>version</code> are specified, <code>fetchurl</code> will use those values and will ignore <code>name</code>, even if it is also specified.</p>
<h3 id="sec-pkgs-fetchers-fetchurl-inputs">Inputs</h3>
<p><code>fetchurl</code> requires an attribute set with the following attributes:</p>
<p><code>url</code> (String; <em>optional</em>)
: The URL to download from.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Either <code>url</code> or <code>urls</code> must be specified, but not both.</p>
</div>
<p>All URLs of the format <a href="https://curl.se/docs/url-syntax.html#rfc-3986-plus">specified here</a> are supported.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>urls</code> (List of String; <em>optional</em>)
: A list of URLs, specifying download locations for the same content.
Each URL will be tried in order until one of them succeeds with some content or all of them fail.
See <a href="#ex-fetchers-fetchurl-nixpkgs-version-multiple-urls"></a> to understand how this attribute affects the behaviour of <code>fetchurl</code>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Either <code>url</code> or <code>urls</code> must be specified, but not both.</p>
</div>
<p><em>Default value:</em> <code>[]</code>.</p>
<p><code>hash</code> (String; <em>optional</em>)
: Hash of the derivation output of <code>fetchurl</code>, following the format for integrity metadata as defined by <a href="https://www.w3.org/TR/SRI/">SRI</a>.
For more information, see <a href="#chap-pkgs-fetchers-caveats"></a>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It is recommended that you use the <code>hash</code> attribute instead of the other hash-specific attributes that exist for backwards compatibility.</p>
</div>
<p>If <code>hash</code> is not specified, you must specify <code>outputHash</code> and <code>outputHashAlgo</code>, or one of <code>sha512</code>, <code>sha256</code>, or <code>sha1</code>.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>outputHash</code> (String; <em>optional</em>)
: Hash of the derivation output of <code>fetchurl</code> in the format expected by Nix.
See <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHash">the documentation on the Nix manual</a> for more information about its format.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It is recommended that you use the <code>hash</code> attribute instead.</p>
</div>
<p>If <code>outputHash</code> is specified, you must also specify <code>outputHashAlgo</code>.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>outputHashAlgo</code> (String; <em>optional</em>)
: Algorithm used to generate the value specified in <code>outputHash</code>.
See <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHashAlgo">the documentation on the Nix manual</a> for more information about the values it supports.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It is recommended that you use the <code>hash</code> attribute instead.</p>
</div>
<p>The value specified in <code>outputHashAlgo</code> will be ignored if <code>outputHash</code> isn't also specified.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>sha1</code> (String; <em>optional</em>)
: SHA-1 hash of the derivation output of <code>fetchurl</code> in the format expected by Nix.
See <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHash">the documentation on the Nix manual</a> for more information about its format.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It is recommended that you use the <code>hash</code> attribute instead.</p>
</div>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>sha256</code> (String; <em>optional</em>)
: SHA-256 hash of the derivation output of <code>fetchurl</code> in the format expected by Nix.
See <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHash">the documentation on the Nix manual</a> for more information about its format.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It is recommended that you use the <code>hash</code> attribute instead.</p>
</div>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>sha512</code> (String; <em>optional</em>)
: SHA-512 hash of the derivation output of <code>fetchurl</code> in the format expected by Nix.
See <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHash">the documentation on the Nix manual</a> for more information about its format.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It is recommended that you use the <code>hash</code> attribute instead.</p>
</div>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>name</code> (String; <em>optional</em>)
: The symbolic name of the downloaded file when saved in the Nix store.
See <a href="#sec-pkgs-fetchers-fetchurl">the <code>fetchurl</code> overview</a> for details on how the name of the file is decided.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>pname</code> (String; <em>optional</em>)
: A base name, which will be combined with <code>version</code> to form the symbolic name of the downloaded file when saved in the Nix store.
See <a href="#sec-pkgs-fetchers-fetchurl">the <code>fetchurl</code> overview</a> for details on how the name of the file is decided.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>If <code>pname</code> is specified, you must also specify <code>version</code>, otherwise <code>fetchurl</code> will ignore the value of <code>pname</code>.</p>
</div>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>version</code> (String; <em>optional</em>)
: A version, which will be combined with <code>pname</code> to form the symbolic name of the downloaded file when saved in the Nix store.
See <a href="#sec-pkgs-fetchers-fetchurl">the <code>fetchurl</code> overview</a> for details on how the name of the file is decided.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>recursiveHash</code> (Boolean; <em>optional</em>) []{#sec-pkgs-fetchers-fetchurl-inputs-recursiveHash}
: If set to <code>true</code>, will signal to Nix that the hash given to <code>fetchurl</code> was calculated using the <code>"recursive"</code> mode.
See <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-outputHashMode">the documentation on the Nix manual</a> for more information about the existing modes.</p>
<p>By default, <code>fetchurl</code> uses <code>"recursive"</code> mode when the <code>executable</code> attribute is set to <code>true</code>, so you don't need to specify <code>recursiveHash</code> in this case.</p>
<p><em>Default value:</em> <code>false</code>.</p>
<p><code>executable</code> (Boolean; <em>optional</em>)
: If <code>true</code>, sets the executable bit on the downloaded file.</p>
<p><em>Default value</em>: <code>false</code>.</p>
<p><code>downloadToTemp</code> (Boolean; <em>optional</em>) []{#sec-pkgs-fetchers-fetchurl-inputs-downloadToTemp}
: If <code>true</code>, saves the downloaded file to a temporary location instead of the expected Nix store location.
This is useful when used in conjunction with <code>postFetch</code> attribute, otherwise <code>fetchurl</code> will not produce any meaningful output.</p>
<p>The location of the downloaded file will be set in the <code>$downloadedFile</code> variable, which should be used by the script in the <code>postFetch</code> attribute.
See <a href="#ex-fetchers-fetchurl-nixpkgs-version-postfetch"></a> to understand how to work with this attribute.</p>
<p><em>Default value:</em> <code>false</code>.</p>
<p><code>postFetch</code> (String; <em>optional</em>)
: Script executed after the file has been downloaded successfully, and before <code>fetchurl</code> finishes running.
Useful for post-processing, to check or transform the file in some way.
See <a href="#ex-fetchers-fetchurl-nixpkgs-version-postfetch"></a> to understand how to work with this attribute.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>netrcPhase</code> (String or Null; <em>optional</em>)
: Script executed to create a {manpage}<code>netrc(5)</code> file to be used with {manpage}<code>curl(1)</code>.
The script should create the <code>netrc</code> file (note that it does not begin with a ".") in the directory it's currently running in (<code>$PWD</code>).</p>
<p>The script is executed during the setup done by <code>fetchurl</code> before it runs any of its code to download the specified content.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>If specified, <code>fetchurl</code> will automatically alter its invocation of {manpage}<code>curl(1)</code> to use the <code>netrc</code> file, so you don't need to add anything to <code>curlOpts</code> or <code>curlOptsList</code>.</p>
</div>
<p>{.caution}
Since <code>netrcPhase</code> needs to be specified in your source Nix code, any secrets that you put directly in it will be world-readable by design (both in your source code, and when the derivation gets created in the Nix store).</p>
<p>If you want to avoid this behaviour, see the documentation of <code>netrcImpureEnvVars</code> for an alternative way of dealing with these secrets.</p>
<p><em>Default value</em>: <code>null</code>.</p>
<p><code>netrcImpureEnvVars</code> (List of String; <em>optional</em>)
: If specified, <code>fetchurl</code> will add these environment variable names to the list of <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-impureEnvVars">impure environment variables</a>, which will be passed from the environment of the calling user to the builder running the <code>fetchurl</code> code.</p>
<p>This is useful when used with <code>netrcPhase</code> to hide any secrets that are used in it, because the script in <code>netrcPhase</code> only needs to reference the environment variables with the secrets in them instead.
However, note that these are called <em>impure</em> variables for a reason:
the environment that starts the build needs to have these variables declared for everything to work properly, which means that additional setup is required outside what Nix controls.</p>
<p><em>Default value:</em> <code>[]</code>.</p>
<p><code>curlOpts</code> (String; <em>optional</em>)
: If specified, this value will be appended to the invocation of {manpage}<code>curl(1)</code> when downloading the URL(s) given to <code>fetchurl</code>.
Multiple arguments can be separated by spaces normally, but values with whitespaces will be interpreted as multiple arguments (instead of a single value), even if the value is escaped.
See <code>curlOptsList</code> for a way to pass values with whitespaces in them.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>curlOptsList</code> (List of String; <em>optional</em>)
: If specified, each element of this list will be passed as an argument to the invocation of {manpage}<code>curl(1)</code> when downloading the URL(s) given to <code>fetchurl</code>.
This allows passing values that contain spaces, with no escaping needed.</p>
<p><em>Default value:</em> <code>[]</code>.</p>
<p><code>showURLs</code> (Boolean; <em>optional</em>)
: If set to <code>true</code>, this will stop <code>fetchurl</code> from downloading anything at all.
Instead, it will output a list of all the URLs it would've used to download the content (after resolving <code>mirror://</code> URLs, for example).
This is useful for debugging.</p>
<p><em>Default value:</em> <code>false</code>.</p>
<p><code>meta</code> (Attribute Set; <em>optional</em>)
: Specifies any <a href="#chap-meta">meta-attributes</a> for the derivation returned by <code>fetchurl</code>.</p>
<p><em>Default value:</em> <code>{}</code>.</p>
<p><code>passthru</code> (Attribute Set; <em>optional</em>)
: Specifies any extra <a href="#chap-passthru"><code>passthru</code></a> attributes for the derivation returned by <code>fetchurl</code>.
Note that <code>fetchurl</code> defines <a href="#ssec-pkgs-fetchers-fetchurl-passthru-outputs"><code>passthru</code> attributes of its own</a>.
Attributes specified in <code>passthru</code> can override the default attributes returned by <code>fetchurl</code>.</p>
<p><em>Default value:</em> <code>{}</code>.</p>
<p><code>preferLocalBuild</code> (Boolean; <em>optional</em>)
: This is the same attribute as <a href="https://nixos.org/manual/nix/stable/language/advanced-attributes.html#adv-attr-preferLocalBuild">defined in the Nix manual</a>.
It is <code>true</code> by default because making a remote machine download the content just duplicates network traffic (since the local machine might download the results from the derivation anyway), but this could be useful in cases where network access is restricted on local machines.</p>
<p><em>Default value:</em> <code>true</code>.</p>
<p><code>nativeBuildInputs</code> (List of Attribute Set; <em>optional</em>)
: Additional packages needed to download the content.
This is useful if you need extra packages for <code>postFetch</code> or <code>netrcPhase</code>, for example.
Has the same semantics as in <a href="#var-stdenv-nativeBuildInputs"></a>.
See <a href="#ex-fetchers-fetchurl-nixpkgs-version-postfetch"></a> to understand how this can be used with <code>postFetch</code>.</p>
<p><em>Default value:</em> <code>[]</code>.</p>
<h3 id="ssec-pkgs-fetchers-fetchurl-passthru-outputs">Passthru outputs</h3>
<p><code>fetchurl</code> also defines its own <a href="#chap-passthru"><code>passthru</code></a> attributes:</p>
<p><code>url</code> (String)</p>
<p>: The same <code>url</code> attribute passed in the argument to <code>fetchurl</code>.</p>
<h3 id="ssec-pkgs-fetchers-fetchurl-examples">Examples</h3>
<div class="admonition example">
<p class="admonition-title">Example</p>
<div class="highlight"><pre><span></span><code># Using `fetchurl` to download a file
</code></pre></div>
<p>The following package downloads a small file from a URL and shows the most common way to use <code>fetchurl</code>:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchurl <span class="p">}:</span>
fetchurl <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/.version&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-BZqI7r0MNP29yGH5+yW2tjU9OOpOCEvwWKrWCv5CQ0I=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>After building the package, the file will be downloaded and place into the Nix store:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
/nix/store/4g9y3x851wqrvim4zcz5x2v3zivmsq8n-version
$<span class="w"> </span>cat<span class="w"> </span>/nix/store/4g9y3x851wqrvim4zcz5x2v3zivmsq8n-version
<span class="m">23</span>.11
</code></pre></div>
</div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<h1 id="using-fetchurl-to-download-a-file-with-multiple-possible-urls">Using <code>fetchurl</code> to download a file with multiple possible URLs</h1>
</div>
<p>The following package adapts <a href="#ex-fetchers-fetchurl-nixpkgs-version"></a> to use multiple URLs.
The first URL was crafted to intentionally return an error to illustrate how <code>fetchurl</code> will try multiple URLs until it finds one that works (or all URLs fail).</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchurl <span class="p">}:</span>
fetchurl <span class="p">{</span>
<span class="ss">urls</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/does-not-exist&quot;</span>
<span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/.version&quot;</span>
<span class="p">];</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-BZqI7r0MNP29yGH5+yW2tjU9OOpOCEvwWKrWCv5CQ0I=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>After building the package, both URLs will be used to download the file:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>some<span class="w"> </span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
trying<span class="w"> </span>https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/does-not-exist
<span class="o">(</span>some<span class="w"> </span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
curl:<span class="w"> </span><span class="o">(</span><span class="m">22</span><span class="o">)</span><span class="w"> </span>The<span class="w"> </span>requested<span class="w"> </span>URL<span class="w"> </span>returned<span class="w"> </span>error:<span class="w"> </span><span class="m">404</span>
trying<span class="w"> </span>https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/.version
<span class="o">(</span>some<span class="w"> </span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
/nix/store/n9asny31z32q7sdw6a8r1gllrsfy53kl-does-not-exist
$<span class="w"> </span>cat<span class="w"> </span>/nix/store/n9asny31z32q7sdw6a8r1gllrsfy53kl-does-not-exist
<span class="m">23</span>.11
</code></pre></div>
<p>However, note that the name of the file was derived from the first URL (this is further explained in <a href="#sec-pkgs-fetchers-fetchurl">the <code>fetchurl</code> overview</a>).
To ensure the result will have the same name regardless of which URLs are used, we can modify the package:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchurl <span class="p">}:</span>
fetchurl <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;nixpkgs-version&quot;</span><span class="p">;</span>
<span class="ss">urls</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/does-not-exist&quot;</span>
<span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/.version&quot;</span>
<span class="p">];</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-BZqI7r0MNP29yGH5+yW2tjU9OOpOCEvwWKrWCv5CQ0I=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>After building the package, the result will have the name we specified:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
/nix/store/zczb6wl3al6jm9sm5h3pr6nqn0i5ji9z-nixpkgs-version
</code></pre></div>
<div class="admonition example">
<p class="admonition-title">Example</p>
<h1 id="manipulating-the-content-downloaded-by-fetchurl">Manipulating the content downloaded by <code>fetchurl</code></h1>
</div>
<p>It might be useful to manipulate the content downloaded by <code>fetchurl</code> directly in its derivation.
In this example, we'll adapt <a href="#ex-fetchers-fetchurl-nixpkgs-version"></a> to append the result of running the <code>hello</code> package to the contents we download, purely to illustrate how to manipulate the content.</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchurl<span class="p">,</span> hello<span class="p">,</span> lib <span class="p">}:</span>
fetchurl <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://raw.githubusercontent.com/NixOS/nixpkgs/23.11/.version&quot;</span><span class="p">;</span>
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span> hello <span class="p">];</span>
<span class="ss">downloadToTemp</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="ss">postFetch</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> </span><span class="si">${</span>lib<span class="o">.</span>getExe hello<span class="si">}</span><span class="s s-Multiline"> &gt;&gt; $downloadedFile</span>
<span class="s s-Multiline"> mv $downloadedFile $out</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-ceooQQYmDx5+0nfg40uU3NNI2yKrixP7HZ/xLZUNv+w=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>After building the package, the resulting file will have "Hello, world!" appended to it:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
/nix/store/ifi6pp7q0ag5h7c5v9h1c1c7bhd10c7f-version
$<span class="w"> </span>cat<span class="w"> </span>/nix/store/ifi6pp7q0ag5h7c5v9h1c1c7bhd10c7f-version
<span class="m">23</span>.11
Hello,<span class="w"> </span>world!
</code></pre></div>
<p>Note that the <code>hash</code> specified in the package is different than the hash specified in <a href="#ex-fetchers-fetchurl-nixpkgs-version"></a>, because the contents of the output have changed (even though the actual file that was downloaded is the same).
See <a href="#chap-pkgs-fetchers-caveats"></a> for more details on how to work with the <code>hash</code> attribute when the output changes.</p>
<h2 id="sec-pkgs-fetchers-fetchzip"><code>fetchzip</code></h2>
<p>Returns a <a href="https://nixos.org/manual/nix/stable/glossary.html#gloss-fixed-output-derivation">fixed-output derivation</a> which downloads an archive from a given URL and decompresses it.</p>
<p>Despite its name, <code>fetchzip</code> is not limited to <code>.zip</code> files but can also be used with <a href="#tar-files">various compressed tarball formats</a> by default.
This can extended by specifying additional attributes, see <a href="#ex-fetchers-fetchzip-rar-archive"></a> to understand how to do that.</p>
<h3 id="sec-pkgs-fetchers-fetchzip-inputs">Inputs</h3>
<p><code>fetchzip</code> requires an attribute set, and most attributes are passed to the underlying call to <a href="#sec-pkgs-fetchers-fetchurl"><code>fetchurl</code></a>.</p>
<p>The attributes below are treated differently by <code>fetchzip</code> when compared to what <code>fetchurl</code> expects:</p>
<p><code>name</code> (String; <em>optional</em>)
: Works as defined in <code>fetchurl</code>, but has a different default value than <code>fetchurl</code>.</p>
<p><em>Default value:</em> <code>"source"</code>.</p>
<p><code>nativeBuildInputs</code> (List of Attribute Set; <em>optional</em>)
: Works as defined in <code>fetchurl</code>, but it is also augmented by <code>fetchzip</code> to include packages to deal with additional archives (such as <code>.zip</code>).</p>
<p><em>Default value:</em> <code>[]</code>.</p>
<p><code>postFetch</code> (String; <em>optional</em>)
: Works as defined in <code>fetchurl</code>, but it is also augmented with the code needed to make <code>fetchzip</code> work.</p>
<p>{.caution}
It is only safe to modify files in <code>$out</code> in <code>postFetch</code>.
Consult the implementation of <code>fetchzip</code> for anything more involved.</p>
<p><em>Default value:</em> <code>""</code>.</p>
<p><code>stripRoot</code> (Boolean; <em>optional</em>)
: If <code>true</code>, the decompressed contents are moved one level up the directory tree.</p>
<p>This is useful for archives that decompress into a single directory which commonly includes some values that change with time, such as version numbers.
When this is the case (and <code>stripRoot</code> is <code>true</code>), <code>fetchzip</code> will remove this directory and make the decompressed contents available in the top-level directory.</p>
<p><a href="#ex-fetchers-fetchzip-simple-striproot"></a> shows what this attribute does.</p>
<p>This attribute is <strong>not</strong> passed through to <code>fetchurl</code>.</p>
<p><em>Default value:</em> <code>true</code>.</p>
<p><code>extension</code> (String or Null; <em>optional</em>)
: If set, the archive downloaded by <code>fetchzip</code> will be renamed to a filename with the extension specified in this attribute.</p>
<p>This is useful when making <code>fetchzip</code> support additional types of archives, because the implementation may use the extension of an archive to determine whether they can decompress it.
If the URL you're using to download the contents doesn't end with the extension associated with the archive, use this attribute to fix the filename of the archive.</p>
<p>This attribute is <strong>not</strong> passed through to <code>fetchurl</code>.</p>
<p><em>Default value:</em> <code>null</code>.</p>
<p><code>recursiveHash</code> (Boolean; <em>optional</em>)
: Works <a href="#sec-pkgs-fetchers-fetchurl-inputs-recursiveHash">as defined in <code>fetchurl</code></a>, but its default value is different than for <code>fetchurl</code>.</p>
<p><em>Default value:</em> <code>true</code>.</p>
<p><code>downloadToTemp</code> (Boolean; <em>optional</em>)
: Works <a href="#sec-pkgs-fetchers-fetchurl-inputs-downloadToTemp">as defined in <code>fetchurl</code></a>, but its default value is different than for <code>fetchurl</code>.</p>
<p><em>Default value:</em> <code>true</code>.</p>
<p><code>extraPostFetch</code> <strong>DEPRECATED</strong>
: This attribute is deprecated.
Please use <code>postFetch</code> instead.</p>
<p>This attribute is <strong>not</strong> passed through to <code>fetchurl</code>.</p>
<h3 id="sec-pkgs-fetchers-fetchzip-examples">Examples</h3>
<p>:!!! example</p>
<h1 id="using-fetchzip-to-output-contents-directly">Using <code>fetchzip</code> to output contents directly</h1>
<p>The following recipe shows how to use <code>fetchzip</code> to decompress a <code>.tar.gz</code> archive:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchzip <span class="p">}:</span>
fetchzip <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0.tar.gz&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-3ABYlME9R8klcpJ7MQpyFEFwHmxDDEzIYBqu/CpDYmg=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>This archive has all its contents in a directory named <code>patchelf-0.18.0</code>.
This means that after decompressing, you'd have to enter this directory to see the contents of the archive.
However, <code>fetchzip</code> makes this easier through the attribute <code>stripRoot</code> (enabled by default).</p>
<p>After building the recipe, the derivation output will show all the files in the archive at the top level:</p>
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
/nix/store/1b7h3fvmgrcddvs0m299hnqxlgli1yjw-source
$<span class="w"> </span>ls<span class="w"> </span>/nix/store/1b7h3fvmgrcddvs0m299hnqxlgli1yjw-source
aclocal.m4<span class="w"> </span>completions<span class="w"> </span>configure.ac<span class="w"> </span>m4<span class="w"> </span>Makefile.in<span class="w"> </span>patchelf.spec<span class="w"> </span>README.md<span class="w"> </span>tests
build-aux<span class="w"> </span>configure<span class="w"> </span>COPYING<span class="w"> </span>Makefile.am<span class="w"> </span>patchelf.1<span class="w"> </span>patchelf.spec.in<span class="w"> </span>src<span class="w"> </span>version
</code></pre></div>
<p>If <code>stripRoot</code> is set to <code>false</code>, the derivation output will be the decompressed archive as-is:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchzip <span class="p">}:</span>
fetchzip <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0.tar.gz&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-uv3FuKE4DqpHT3yfE0qcnq0gYjDNQNKZEZt2+PUAneg=&quot;</span><span class="p">;</span>
<span class="ss">stripRoot</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>{.caution}
The hash changed!
Whenever changing attributes of a Nixpkgs fetcher, <a href="#chap-pkgs-fetchers-caveats">remember to invalidate the hash</a>, otherwise you won't get the results you're expecting!</p>
<p>After building the recipe:</p>
<p><div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
/nix/store/2hy5bxw7xgbgxkn0i4x6hjr8w3dbx16c-source
$<span class="w"> </span>ls<span class="w"> </span>/nix/store/2hy5bxw7xgbgxkn0i4x6hjr8w3dbx16c-source
patchelf-0.18.0
</code></pre></div>
:</p>
<p>:!!! example</p>
<h1 id="using-fetchzip-to-decompress-a-rar-file">Using <code>fetchzip</code> to decompress a <code>.rar</code> file</h1>
<p>The <code>unrar</code> package provides a <a href="#ssec-setup-hooks">setup hook</a> to decompress <code>.rar</code> archives during the <a href="#ssec-unpack-phase">unpack phase</a>, which can be used with <code>fetchzip</code> to decompress those archives:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchzip<span class="p">,</span> unrar <span class="p">}:</span>
fetchzip <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://archive.org/download/SpaceCadet_Plus95/Space_Cadet.rar&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-fC+zsR8BY6vXpUkVd6i1jF0IZZxVKVvNi6VWCKT+pA4=&quot;</span><span class="p">;</span>
<span class="ss">stripRoot</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span> unrar <span class="p">];</span>
<span class="p">}</span>
</code></pre></div>
<p>Since this particular <code>.rar</code> file doesn't put its contents in a directory inside the archive, <code>stripRoot</code> must be set to <code>false</code>.</p>
<p>After building the recipe, the derivation output will show the decompressed files:</p>
<p><div class="highlight"><pre><span></span><code>$<span class="w"> </span>nix-build
<span class="o">(</span>output<span class="w"> </span>removed<span class="w"> </span><span class="k">for</span><span class="w"> </span>clarity<span class="o">)</span>
/nix/store/zpn7knxfva6rfjja2gbb4p3l9w1f0d36-source
$<span class="w"> </span>ls<span class="w"> </span>/nix/store/zpn7knxfva6rfjja2gbb4p3l9w1f0d36-source
FONT.DAT<span class="w"> </span>PINBALL.DAT<span class="w"> </span>PINBALL.EXE<span class="w"> </span>PINBALL2.MID<span class="w"> </span>TABLE.BMP<span class="w"> </span>WMCONFIG.EXE
MSCREATE.DIR<span class="w"> </span>PINBALL.DOC<span class="w"> </span>PINBALL.MID<span class="w"> </span>Sounds<span class="w"> </span>WAVEMIX.INF
</code></pre></div>
:</p>
<h2 id="fetchpatch"><code>fetchpatch</code></h2>
<p><code>fetchpatch</code> works very similarly to <code>fetchurl</code> with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example, it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.</p>
<ul>
<li><code>relative</code>: Similar to using <code>git-diff</code>'s <code>--relative</code> flag, only keep changes inside the specified directory, making paths relative to it.</li>
<li><code>stripLen</code>: Remove the first <code>stripLen</code> components of pathnames in the patch.</li>
<li><code>decode</code>: Pipe the downloaded data through this command before processing it as a patch.</li>
<li><code>extraPrefix</code>: Prefix pathnames by this string.</li>
<li><code>excludes</code>: Exclude files matching these patterns (applies after the above arguments).</li>
<li><code>includes</code>: Include only files matching these patterns (applies after the above arguments).</li>
<li><code>revert</code>: Revert the patch.</li>
</ul>
<p>Note that because the checksum is computed after applying these effects, using or modifying these arguments will have no effect unless the <code>hash</code> argument is changed as well.</p>
<p>Most other fetchers return a directory rather than a single file.</p>
<h2 id="fetchdebianpatch"><code>fetchDebianPatch</code></h2>
<p>A wrapper around <code>fetchpatch</code>, which takes:
- <code>patch</code> and <code>hash</code>: the patch's filename,
and its hash after normalization by <code>fetchpatch</code> ;
- <code>pname</code>: the Debian source package's name ;
- <code>version</code>: the upstream version number ;
- <code>debianRevision</code>: the <a href="https://www.debian.org/doc/debian-policy/ch-controlfields.html#version">Debian revision number</a> if applicable ;
- the <code>area</code> of the Debian archive: <code>main</code> (default), <code>contrib</code>, or <code>non-free</code>.</p>
<p>Here is an example of <code>fetchDebianPatch</code> in action:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> lib
<span class="p">,</span> fetchDebianPatch
<span class="p">,</span> buildPythonPackage
<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">&quot;pysimplesoap&quot;</span><span class="p">;</span>
<span class="ss">version</span> <span class="o">=</span> <span class="s2">&quot;1.16.2&quot;</span><span class="p">;</span>
<span class="ss">src</span> <span class="o">=</span> <span class="l">&lt;...&gt;</span><span class="p">;</span>
<span class="ss">patches</span> <span class="o">=</span> <span class="p">[</span>
<span class="p">(</span>fetchDebianPatch <span class="p">{</span>
<span class="k">inherit</span> pname version<span class="p">;</span>
<span class="ss">debianRevision</span> <span class="o">=</span> <span class="s2">&quot;5&quot;</span><span class="p">;</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;Add-quotes-to-SOAPAction-header-in-SoapClient.patch&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-xA8Wnrpr31H8wy3zHSNfezFNjUJt1HbSXn3qUMzeKc0=&quot;</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>Patches are fetched from <code>sources.debian.org</code>, and so must come from a
package version that was uploaded to the Debian archive. Packages may
be removed from there once that specific version isn't in any suite
anymore (stable, testing, unstable, etc.), so maintainers should use
<code>copy-tarballs.pl</code> to archive the patch if it needs to be available
longer-term.</p>
<h2 id="fetchsvn"><code>fetchsvn</code></h2>
<p>Used with Subversion. Expects <code>url</code> to a Subversion directory, <code>rev</code>, and <code>hash</code>.</p>
<h2 id="fetchgit"><code>fetchgit</code></h2>
<p>Used with Git. Expects <code>url</code> to a Git repo, <code>rev</code>, and <code>hash</code>. <code>rev</code> in this case can be full the git commit id (SHA1 hash) or a tag name like <code>refs/tags/v1.0</code>.</p>
<p>Additionally, the following optional arguments can be given: <code>fetchSubmodules = true</code> makes <code>fetchgit</code> also fetch the submodules of a repository. If <code>deepClone</code> is set to true, the entire repository is cloned as opposing to just creating a shallow clone. <code>deepClone = true</code> also implies <code>leaveDotGit = true</code> which means that the <code>.git</code> directory of the clone won't be removed after checkout.</p>
<p>If only parts of the repository are needed, <code>sparseCheckout</code> can be used. This will prevent git from fetching unnecessary blobs from server, see <a href="https://git-scm.com/docs/git-sparse-checkout">git sparse-checkout</a> for more information:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> stdenv<span class="p">,</span> fetchgit <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">&quot;hello&quot;</span><span class="p">;</span>
<span class="ss">src</span> <span class="o">=</span> fetchgit <span class="p">{</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://...&quot;</span><span class="p">;</span>
<span class="ss">sparseCheckout</span> <span class="o">=</span> <span class="p">[</span>
<span class="s2">&quot;directory/to/be/included&quot;</span>
<span class="s2">&quot;another/directory&quot;</span>
<span class="p">];</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=&quot;</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">}</span>
</code></pre></div>
<h2 id="fetchfossil"><code>fetchfossil</code></h2>
<p>Used with Fossil. Expects <code>url</code> to a Fossil archive, <code>rev</code>, and <code>hash</code>.</p>
<h2 id="fetchcvs"><code>fetchcvs</code></h2>
<p>Used with CVS. Expects <code>cvsRoot</code>, <code>tag</code>, and <code>hash</code>.</p>
<h2 id="fetchhg"><code>fetchhg</code></h2>
<p>Used with Mercurial. Expects <code>url</code>, <code>rev</code>, and <code>hash</code>.</p>
<p>A number of fetcher functions wrap part of <code>fetchurl</code> and <code>fetchzip</code>. They are mainly convenience functions intended for commonly used destinations of source code in Nixpkgs. These wrapper fetchers are listed below.</p>
<h2 id="fetchfromgitea"><code>fetchFromGitea</code></h2>
<p><code>fetchFromGitea</code> expects five arguments. <code>domain</code> is the gitea server name. <code>owner</code> is a string corresponding to the Gitea user or organization that controls this repository. <code>repo</code> corresponds to the name of the software repository. These are located at the top of every Gitea HTML page as <code>owner</code>/<code>repo</code>. <code>rev</code> corresponds to the Git commit hash or tag (e.g <code>v1.0</code>) that will be downloaded from Git. Finally, <code>hash</code> corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but <code>hash</code> is currently preferred.</p>
<h2 id="fetchfromgithub"><code>fetchFromGitHub</code></h2>
<p><code>fetchFromGitHub</code> expects four arguments. <code>owner</code> is a string corresponding to the GitHub user or organization that controls this repository. <code>repo</code> corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as <code>owner</code>/<code>repo</code>. <code>rev</code> corresponds to the Git commit hash or tag (e.g <code>v1.0</code>) that will be downloaded from Git. Finally, <code>hash</code> corresponds to the hash of the extracted directory. Again, other hash algorithms are also available, but <code>hash</code> is currently preferred.</p>
<p>To use a different GitHub instance, use <code>githubBase</code> (defaults to <code>"github.com"</code>).</p>
<p><code>fetchFromGitHub</code> uses <code>fetchzip</code> to download the source archive generated by GitHub for the specified revision. If <code>leaveDotGit</code>, <code>deepClone</code> or <code>fetchSubmodules</code> are set to <code>true</code>, <code>fetchFromGitHub</code> will use <code>fetchgit</code> instead. Refer to its section for documentation of these options.</p>
<h2 id="fetchfromgitlab"><code>fetchFromGitLab</code></h2>
<p>This is used with GitLab repositories. It behaves similarly to <code>fetchFromGitHub</code>, and expects <code>owner</code>, <code>repo</code>, <code>rev</code>, and <code>hash</code>.</p>
<p>To use a specific GitLab instance, use <code>domain</code> (defaults to <code>"gitlab.com"</code>).</p>
<h2 id="fetchfromgitiles"><code>fetchFromGitiles</code></h2>
<p>This is used with Gitiles repositories. The arguments expected are similar to <code>fetchgit</code>.</p>
<h2 id="fetchfrombitbucket"><code>fetchFromBitbucket</code></h2>
<p>This is used with BitBucket repositories. The arguments expected are very similar to <code>fetchFromGitHub</code> above.</p>
<h2 id="fetchfromsavannah"><code>fetchFromSavannah</code></h2>
<p>This is used with Savannah repositories. The arguments expected are very similar to <code>fetchFromGitHub</code> above.</p>
<h2 id="fetchfromrepoorcz"><code>fetchFromRepoOrCz</code></h2>
<p>This is used with repo.or.cz repositories. The arguments expected are very similar to <code>fetchFromGitHub</code> above.</p>
<h2 id="fetchfromsourcehut"><code>fetchFromSourcehut</code></h2>
<p>This is used with sourcehut repositories. Similar to <code>fetchFromGitHub</code> above,
it expects <code>owner</code>, <code>repo</code>, <code>rev</code> and <code>hash</code>, but don't forget the tilde (~)
in front of the username! Expected arguments also include <code>vc</code> ("git" (default)
or "hg"), <code>domain</code> and <code>fetchSubmodules</code>.</p>
<p>If <code>fetchSubmodules</code> is <code>true</code>, <code>fetchFromSourcehut</code> uses <code>fetchgit</code>
or <code>fetchhg</code> with <code>fetchSubmodules</code> or <code>fetchSubrepos</code> set to <code>true</code>,
respectively. Otherwise, the fetcher uses <code>fetchzip</code>.</p>
<h2 id="requirefile"><code>requireFile</code></h2>
<p><code>requireFile</code> allows requesting files that cannot be fetched automatically, but whose content is known.
This is a useful last-resort workaround for license restrictions that prohibit redistribution, or for downloads that are only accessible after authenticating interactively in a browser.
If the requested file is present in the Nix store, the resulting derivation will not be built, because its expected output is already available.
Otherwise, the builder will run, but fail with a message explaining to the user how to provide the file. The following code, for example:</p>
<p><div class="highlight"><pre><span></span><code>requireFile <span class="p">{</span>
<span class="ss">name</span> <span class="o">=</span> <span class="s2">&quot;jdk-</span><span class="si">${</span>version<span class="si">}</span><span class="s2">_linux-x64_bin.tar.gz&quot;</span><span class="p">;</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;https://www.oracle.com/java/technologies/javase-jdk11-downloads.html&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;sha256-lL00+F7jjT71nlKJ7HRQuUQ7kkxVYlZh//5msD8sjeI=&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
results in this error message:
<div class="highlight"><pre><span></span><code>***
Unfortunately, we cannot download file jdk-11.0.10_linux-x64_bin.tar.gz automatically.
Please go to https://www.oracle.com/java/technologies/javase-jdk11-downloads.html to download it yourself, and add it to the Nix store
using either
nix-store --add-fixed sha256 jdk-11.0.10_linux-x64_bin.tar.gz
or
nix-prefetch-url --type sha256 file:///path/to/jdk-11.0.10_linux-x64_bin.tar.gz
***
</code></pre></div></p>
<p>This function should only be used by non-redistributable software with an unfree license that we need to require the user to download manually.
It produces packages that cannot be built automatically.</p>
<h2 id="fetchtorrent"><code>fetchtorrent</code></h2>
<p><code>fetchtorrent</code> expects two arguments. <code>url</code> which can either be a Magnet URI (Magnet Link) such as <code>magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c</code> or an HTTP URL pointing to a <code>.torrent</code> file. It can also take a <code>config</code> argument which will craft a <code>settings.json</code> configuration file and give it to <code>transmission</code>, the underlying program that is performing the fetch. The available config options for <code>transmission</code> can be found <a href="https://github.com/transmission/transmission/blob/main/docs/Editing-Configuration-Files.md#options">here</a></p>
<div class="highlight"><pre><span></span><code><span class="p">{</span> fetchtorrent <span class="p">}:</span>
fetchtorrent <span class="p">{</span>
<span class="ss">config</span> <span class="o">=</span> <span class="p">{</span> <span class="ss">peer-limit-global</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span> <span class="p">};</span>
<span class="ss">url</span> <span class="o">=</span> <span class="s2">&quot;magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c&quot;</span><span class="p">;</span>
<span class="ss">hash</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="fetchtorrent-parameters">Parameters</h3>
<ul>
<li>
<p><code>url</code>: Magnet URI (Magnet Link) such as <code>magnet:?xt=urn:btih:dd8255ecdc7ca55fb0bbf81323d87062db1f6d1c</code> or an HTTP URL pointing to a <code>.torrent</code> file.</p>
</li>
<li>
<p><code>backend</code>: Which bittorrent program to use. Default: <code>"transmission"</code>. Valid values are <code>"rqbit"</code> or <code>"transmission"</code>. These are the two most suitable torrent clients for fetching in a fixed-output derivation at the time of writing, as they can be easily exited after usage. <code>rqbit</code> is written in Rust and has a smaller closure size than <code>transmission</code>, and the performance and peer discovery properties differs between these clients, requiring experimentation to decide upon which is the best.</p>
</li>
<li>
<p><code>config</code>: When using <code>transmission</code> as the <code>backend</code>, a json configuration can
be supplied to transmission. Refer to the <a href="https://github.com/transmission/transmission/blob/main/docs/Editing-Configuration-Files.md">upstream documentation</a> for information on how to configure.</p>
</li>
</ul>
</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.
</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>