docs/Nixpkgs/Languages-And-Frameworks/gnome.section/index.html

3213 lines
78 KiB
HTML
Raw 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/Languages-And-Frameworks/gnome.section/">
<link rel="prev" href="../emscripten.section/">
<link rel="next" href="../go.section/">
<link rel="icon" href="../../../assets/aux-logo.svg">
<meta name="generator" content="mkdocs-1.6.0, mkdocs-material-9.5.29">
<title>GNOME - 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="GNOME {#sec-language-gnome} - 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/gnome.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/gnome.section/" >
<meta name="twitter:card" content="summary_large_image" >
<meta name="twitter:title" content="GNOME {#sec-language-gnome} - 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/gnome.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="#sec-language-gnome" 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">
GNOME
</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 &amp; 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 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">
GNOME
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
GNOME
</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="#ssec-gnome-packaging" class="md-nav__link">
<span class="md-ellipsis">
Packaging GNOME applications
</span>
</a>
<nav class="md-nav" aria-label="Packaging GNOME applications">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ssec-gnome-settings" class="md-nav__link">
<span class="md-ellipsis">
Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-gio-modules" class="md-nav__link">
<span class="md-ellipsis">
GIO modules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-gdk-pixbuf-loaders" class="md-nav__link">
<span class="md-ellipsis">
GdkPixbuf loaders
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-icons" class="md-nav__link">
<span class="md-ellipsis">
Icons
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-icon-theme-packaging" class="md-nav__link">
<span class="md-ellipsis">
Packaging icon themes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-themes" class="md-nav__link">
<span class="md-ellipsis">
GTK Themes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-typelibs" class="md-nav__link">
<span class="md-ellipsis">
GObject introspection typelibs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-plugins" class="md-nav__link">
<span class="md-ellipsis">
Various plug-ins
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-hooks" class="md-nav__link">
<span class="md-ellipsis">
Onto wrapGApps* hooks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-updating" class="md-nav__link">
<span class="md-ellipsis">
Updating GNOME packages
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues" class="md-nav__link">
<span class="md-ellipsis">
Frequently encountered issues
</span>
</a>
<nav class="md-nav" aria-label="Frequently encountered issues">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-no-schemas" class="md-nav__link">
<span class="md-ellipsis">
GLib-GIO-ERROR **: 06:04:50.903: No GSettings schemas are installed on the system
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-missing-schema" class="md-nav__link">
<span class="md-ellipsis">
GLib-GIO-ERROR **: 06:04:50.903: Settings schema org.gnome.foo is not installed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-double-wrapped" class="md-nav__link">
<span class="md-ellipsis">
When using wrapGApps* hook with special derivers you can end up with double wrapped binaries.
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-unwrappable-package" class="md-nav__link">
<span class="md-ellipsis">
I am packaging a project that cannot be wrapped, like a library or GNOME Shell extension.
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-weird-location" class="md-nav__link">
<span class="md-ellipsis">
I need to wrap a binary outside bin and libexec directories.
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</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">
<a href="../rust.section/" class="md-nav__link">
<span class="md-ellipsis">
Rust
</span>
</a>
</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="#ssec-gnome-packaging" class="md-nav__link">
<span class="md-ellipsis">
Packaging GNOME applications
</span>
</a>
<nav class="md-nav" aria-label="Packaging GNOME applications">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ssec-gnome-settings" class="md-nav__link">
<span class="md-ellipsis">
Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-gio-modules" class="md-nav__link">
<span class="md-ellipsis">
GIO modules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-gdk-pixbuf-loaders" class="md-nav__link">
<span class="md-ellipsis">
GdkPixbuf loaders
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-icons" class="md-nav__link">
<span class="md-ellipsis">
Icons
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-icon-theme-packaging" class="md-nav__link">
<span class="md-ellipsis">
Packaging icon themes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-themes" class="md-nav__link">
<span class="md-ellipsis">
GTK Themes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-typelibs" class="md-nav__link">
<span class="md-ellipsis">
GObject introspection typelibs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-plugins" class="md-nav__link">
<span class="md-ellipsis">
Various plug-ins
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-hooks" class="md-nav__link">
<span class="md-ellipsis">
Onto wrapGApps* hooks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-updating" class="md-nav__link">
<span class="md-ellipsis">
Updating GNOME packages
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues" class="md-nav__link">
<span class="md-ellipsis">
Frequently encountered issues
</span>
</a>
<nav class="md-nav" aria-label="Frequently encountered issues">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-no-schemas" class="md-nav__link">
<span class="md-ellipsis">
GLib-GIO-ERROR **: 06:04:50.903: No GSettings schemas are installed on the system
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-missing-schema" class="md-nav__link">
<span class="md-ellipsis">
GLib-GIO-ERROR **: 06:04:50.903: Settings schema org.gnome.foo is not installed
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-double-wrapped" class="md-nav__link">
<span class="md-ellipsis">
When using wrapGApps* hook with special derivers you can end up with double wrapped binaries.
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-unwrappable-package" class="md-nav__link">
<span class="md-ellipsis">
I am packaging a project that cannot be wrapped, like a library or GNOME Shell extension.
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssec-gnome-common-issues-weird-location" class="md-nav__link">
<span class="md-ellipsis">
I need to wrap a binary outside bin and libexec directories.
</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="sec-language-gnome">GNOME</h1>
<h2 id="ssec-gnome-packaging">Packaging GNOME applications</h2>
<p>Programs in the GNOME universe are written in various languages but they all use GObject-based libraries like GLib, GTK or GStreamer. These libraries are often modular, relying on looking into certain directories to find their modules. However, due to Nixs specific file system organization, this will fail without our intervention. Fortunately, the libraries usually allow overriding the directories through environment variables, either natively or thanks to a patch in nixpkgs. <a href="#fun-wrapProgram">Wrapping</a> the executables to ensure correct paths are available to the application constitutes a significant part of packaging a modern desktop application. In this section, we will describe various modules needed by such applications, environment variables needed to make the modules load, and finally a script that will do the work for us.</p>
<h3 id="ssec-gnome-settings">Settings</h3>
<p><a href="https://developer.gnome.org/gio/stable/GSettings.html">GSettings</a> API is often used for storing settings. GSettings schemas are required, to know the type and other metadata of the stored values. GLib looks for <code>glib-2.0/schemas/gschemas.compiled</code> files inside the directories of <code>XDG_DATA_DIRS</code>.</p>
<p>On Linux, GSettings API is implemented using <a href="https://gitlab.gnome.org/GNOME/dconf">dconf</a> backend. You will need to add <code>dconf</code> <a href="#ssec-gnome-gio-modules">GIO module</a> to <code>GIO_EXTRA_MODULES</code> variable, otherwise the <code>memory</code> backend will be used and the saved settings will not be persistent.</p>
<p>Last you will need the dconf database D-Bus service itself. You can enable it using <code>programs.dconf.enable</code>.</p>
<p>Some applications will also require <code>gsettings-desktop-schemas</code> for things like reading proxy configuration or user interface customization. This dependency is often not mentioned by upstream, you should grep for <code>org.gnome.desktop</code> and <code>org.gnome.system</code> to see if the schemas are needed.</p>
<h3 id="ssec-gnome-gio-modules">GIO modules</h3>
<p>GLibs <a href="https://developer.gnome.org/gio/stable/ch01.html">GIO</a> library supports several <a href="https://developer.gnome.org/gio/stable/extending-gio.html">extension points</a>. Notably, they allow:</p>
<ul>
<li>implementing settings backends (already <a href="#ssec-gnome-settings">mentioned</a>)</li>
<li>adding TLS support</li>
<li>proxy settings</li>
<li>virtual file systems</li>
</ul>
<p>The modules are typically installed to <code>lib/gio/modules/</code> directory of a package and you need to add them to <code>GIO_EXTRA_MODULES</code> if you need any of those features.</p>
<p>In particular, we recommend:</p>
<ul>
<li>adding <code>dconf.lib</code> for any software on Linux that reads <a href="#ssec-gnome-settings">GSettings</a> (even transitively through e.g. GTKs file manager)</li>
<li>adding <code>glib-networking</code> for any software that accesses network using GIO or libsoup glib-networking contains a module that implements TLS support and loads system-wide proxy settings</li>
</ul>
<p>To allow software to use various virtual file systems, <code>gvfs</code> package can be also added. But that is usually an optional feature so we typically use <code>gvfs</code> from the system (e.g. installed globally using NixOS module).</p>
<h3 id="ssec-gnome-gdk-pixbuf-loaders">GdkPixbuf loaders</h3>
<p>GTK applications typically use <a href="https://gitlab.gnome.org/GNOME/gdk-pixbuf/">GdkPixbuf</a> to load images. But <code>gdk-pixbuf</code> package only supports basic bitmap formats like JPEG, PNG or TIFF, requiring to use third-party loader modules for other formats. This is especially painful since GTK itself includes SVG icons, which cannot be rendered without a loader provided by <code>librsvg</code>.</p>
<p>Unlike other libraries mentioned in this section, GdkPixbuf only supports a single value in its controlling environment variable <code>GDK_PIXBUF_MODULE_FILE</code>. It is supposed to point to a cache file containing information about the available loaders. Each loader package will contain a <code>lib/gdk-pixbuf-2.0/2.10.0/loaders.cache</code> file describing the default loaders in <code>gdk-pixbuf</code> package plus the loader contained in the package itself. If you want to use multiple third-party loaders, you will need to create your own cache file manually. Fortunately, this is pretty rare as <a href="https://gitlab.gnome.org/federico/gdk-pixbuf-survey/blob/master/src/modules.md">not many loaders exist</a>.</p>
<p><code>gdk-pixbuf</code> contains <a href="#ssec-gnome-hooks-gdk-pixbuf">a setup hook</a> that sets <code>GDK_PIXBUF_MODULE_FILE</code> from dependencies but as mentioned in further section, it is pretty limited. Loaders should propagate this setup hook.</p>
<h3 id="ssec-gnome-icons">Icons</h3>
<p>When an application uses icons, an icon theme should be available in <code>XDG_DATA_DIRS</code> during runtime. The package for the default, icon-less <a href="https://www.freedesktop.org/wiki/Software/icon-theme/">hicolor-icon-theme</a> (should be propagated by every icon theme) contains <a href="#ssec-gnome-hooks-hicolor-icon-theme">a setup hook</a> that will pick up icon themes from <code>buildInputs</code> and add their datadirs to <code>XDG_ICON_DIRS</code> environment variable (this is Nixpkgs specific, not actually a XDG standard variable). Unfortunately, relying on that would mean every user has to download the theme included in the package expression no matter their preference. For that reason, we leave the installation of icon theme on the user. If you use one of the desktop environments, you probably already have an icon theme installed.</p>
<p>In the rare case you need to use icons from dependencies (e.g. when an app forces an icon theme), you can use the following to pick them up:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">buildInputs</span> <span class="o">=</span> <span class="p">[</span>
pantheon<span class="o">.</span>elementary-icon-theme
<span class="p">];</span>
<span class="ss">preFixup</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> gappsWrapperArgs+=(</span>
<span class="s s-Multiline"> # The icon theme is hardcoded.</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;$XDG_ICON_DIRS&quot;</span>
<span class="s s-Multiline"> )</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>To avoid costly file system access when locating icons, GTK, <a href="https://woboq.com/blog/qicon-reads-gtk-icon-cache-in-qt57.html">as well as Qt</a>, can rely on <code>icon-theme.cache</code> files from the themes' top-level directories. These files are generated using <code>gtk-update-icon-cache</code>, which is expected to be run whenever an icon is added or removed to an icon theme (typically an application icon into <code>hicolor</code> theme) and some programs do indeed run this after icon installation. However, since packages are installed into their own prefix by Nix, this would lead to conflicts. For that reason, <code>gtk3</code> provides a <a href="#ssec-gnome-hooks-gtk-drop-icon-theme-cache">setup hook</a> that will clean the file from installation. Since most applications only ship their own icon that will be loaded on start-up, it should not affect them too much. On the other hand, icon themes are much larger and more widely used so we need to cache them. Because we recommend installing icon themes globally, we will generate the cache files from all packages in a profile using a NixOS module. You can enable the cache generation using <code>gtk.iconCache.enable</code> option if your desktop environment does not already do that.</p>
<h3 id="ssec-icon-theme-packaging">Packaging icon themes</h3>
<p>Icon themes may inherit from other icon themes. The inheritance is specified using the <code>Inherits</code> key in the <code>index.theme</code> file distributed with the icon theme. According to the <a href="https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html">icon theme specification</a>, icons not provided by the theme are looked for in its parent icon themes. Therefore the parent themes should be installed as dependencies for a more complete experience regarding the icon sets used.</p>
<p>The package <code>hicolor-icon-theme</code> provides a setup hook which makes symbolic links for the parent themes into the directory <code>share/icons</code> of the current theme directory in the nix store, making sure they can be found at runtime. For that to work the packages providing parent icon themes should be listed as propagated build dependencies, together with <code>hicolor-icon-theme</code>.</p>
<p>Also make sure that <code>icon-theme.cache</code> is installed for each theme provided by the package, and set <code>dontDropIconThemeCache</code> to <code>true</code> so that the cache file is not removed by the <code>gtk3</code> setup hook.</p>
<h3 id="ssec-gnome-themes">GTK Themes</h3>
<p>Previously, a GTK theme needed to be in <code>XDG_DATA_DIRS</code>. This is no longer necessary for most programs since GTK incorporated Adwaita theme. Some programs (for example, those designed for <a href="https://docs.elementary.io/hig">elementary HIG</a>) might require a special theme like <code>pantheon.elementary-gtk-theme</code>.</p>
<h3 id="ssec-gnome-typelibs">GObject introspection typelibs</h3>
<p><a href="https://gitlab.gnome.org/GNOME/gobject-introspection">GObject introspection</a> allows applications to use C libraries in other languages easily. It does this through <code>typelib</code> files searched in <code>GI_TYPELIB_PATH</code>.</p>
<h3 id="ssec-gnome-plugins">Various plug-ins</h3>
<p>If your application uses <a href="https://gstreamer.freedesktop.org/">GStreamer</a> or <a href="https://gitlab.gnome.org/GNOME/grilo">Grilo</a>, you should set <code>GST_PLUGIN_SYSTEM_PATH_1_0</code> and <code>GRL_PLUGIN_PATH</code>, respectively.</p>
<h2 id="ssec-gnome-hooks">Onto <code>wrapGApps*</code> hooks</h2>
<p>Given the requirements above, the package expression would become messy quickly:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">preFixup</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> for f in $(find $out/bin/ $out/libexec/ -type f -executable); do</span>
<span class="s s-Multiline"> wrapProgram &quot;$f&quot; \</span>
<span class="s s-Multiline"> --prefix GIO_EXTRA_MODULES : &quot;</span><span class="si">${</span>getLib dconf<span class="si">}</span><span class="s s-Multiline">/lib/gio/modules&quot; \</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;$out/share&quot; \</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;$out/share/gsettings-schemas/</span><span class="si">${</span>name<span class="si">}</span><span class="s s-Multiline">&quot; \</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;</span><span class="si">${</span>gsettings-desktop-schemas<span class="si">}</span><span class="s s-Multiline">/share/gsettings-schemas/</span><span class="si">${</span>gsettings-desktop-schemas<span class="o">.</span>name<span class="si">}</span><span class="s s-Multiline">&quot; \</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;</span><span class="si">${</span>hicolor-icon-theme<span class="si">}</span><span class="s s-Multiline">/share&quot; \</span>
<span class="s s-Multiline"> --prefix GI_TYPELIB_PATH : &quot;</span><span class="si">${</span>lib<span class="o">.</span>makeSearchPath <span class="s2">&quot;lib/girepository-1.0&quot;</span> <span class="p">[</span> pango json-glib <span class="p">]</span><span class="si">}</span><span class="s s-Multiline">&quot;</span>
<span class="s s-Multiline"> done</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Fortunately, we have a [family of hooks]{#ssec-gnome-hooks-wrapgappshook} that automate this. They work in conjunction with other setup hooks that populate environment variables, and will then wrap all executables in <code>bin</code> and <code>libexec</code> directories using said variables.</p>
<ul>
<li>[<code>wrapGAppsHook3</code>]{#ssec-gnome-hooks-wrapgappshook3} for GTK 3 apps. For convenience, it also adds <code>dconf.lib</code> for a GIO module implementing a GSettings backend using <code>dconf</code>, <code>gtk3</code> for GSettings schemas, and <code>librsvg</code> for GdkPixbuf loader to the closure.</li>
<li>[<code>wrapGAppsHook4</code>]{#ssec-gnome-hooks-wrapgappshook4} for GTK 4 apps. Same as <code>wrapGAppsHook3</code> but replaces <code>gtk3</code> with <code>gtk4</code>.</li>
<li>[<code>wrapGAppsNoGuiHook</code>]{#ssec-gnome-hooks-wrapgappsnoguihook} for programs without a graphical interface. Same as the above but does not bring <code>gtk3</code> and <code>librsvg</code> into the closure.</li>
</ul>
<p>The hooks do the the following:</p>
<ul>
<li>
<p><code>wrapGApps*</code> hook itself will add the packages <code>share</code> directory to <code>XDG_DATA_DIRS</code>.</p>
</li>
<li>
<p>[]{#ssec-gnome-hooks-glib} <code>glib</code> setup hook will populate <code>GSETTINGS_SCHEMAS_PATH</code> and then <code>wrapGApps*</code> hook will prepend it to <code>XDG_DATA_DIRS</code>.</p>
</li>
<li>
<p>[]{#ssec-gnome-hooks-gdk-pixbuf} <code>gdk-pixbuf</code> setup hook will populate <code>GDK_PIXBUF_MODULE_FILE</code> with the path to biggest <code>loaders.cache</code> file from the dependencies containing <a href="#ssec-gnome-gdk-pixbuf-loaders">GdkPixbuf loaders</a>. This works fine when there are only two packages containing loaders (<code>gdk-pixbuf</code> and e.g. <code>librsvg</code>) it will choose the second one, reasonably expecting that it will be bigger since it describes extra loader in addition to the default ones. But when there are more than two loader packages, this logic will break. One possible solution would be constructing a custom cache file for each package containing a program like <code>services/x11/gdk-pixbuf.nix</code> NixOS module does. <code>wrapGApps*</code> hook copies the <code>GDK_PIXBUF_MODULE_FILE</code> environment variable into the produced wrapper.</p>
</li>
<li>
<p>[]{#ssec-gnome-hooks-gtk-drop-icon-theme-cache} One of <code>gtk3</code>s setup hooks will remove <code>icon-theme.cache</code> files from packages icon theme directories to avoid conflicts. Icon theme packages should prevent this with <code>dontDropIconThemeCache = true;</code>.</p>
</li>
<li>
<p>[]{#ssec-gnome-hooks-dconf} <code>dconf.lib</code> is a dependency of <code>wrapGApps*</code> hook, which then also adds it to the <code>GIO_EXTRA_MODULES</code> variable.</p>
</li>
<li>
<p>[]{#ssec-gnome-hooks-hicolor-icon-theme} <code>hicolor-icon-theme</code>s setup hook will add icon themes to <code>XDG_ICON_DIRS</code>.</p>
</li>
<li>
<p>[]{#ssec-gnome-hooks-gobject-introspection} <code>gobject-introspection</code> setup hook populates <code>GI_TYPELIB_PATH</code> variable with <code>lib/girepository-1.0</code> directories of dependencies, which is then added to wrapper by <code>wrapGApps*</code> hook. It also adds <code>share</code> directories of dependencies to <code>XDG_DATA_DIRS</code>, which is intended to promote GIR files but it also <a href="https://github.com/NixOS/nixpkgs/issues/32790">pollutes the closures</a> of packages using <code>wrapGApps*</code> hook.</p>
</li>
<li>
<p>[]{#ssec-gnome-hooks-gst-grl-plugins} Setup hooks of <code>gst_all_1.gstreamer</code> and <code>grilo</code> will populate the <code>GST_PLUGIN_SYSTEM_PATH_1_0</code> and <code>GRL_PLUGIN_PATH</code> variables, respectively, which will then be added to the wrapper by <code>wrapGApps*</code> hook.</p>
</li>
</ul>
<p>You can also pass additional arguments to <code>makeWrapper</code> using <code>gappsWrapperArgs</code> in <code>preFixup</code> hook:</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="ss">preFixup</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> gappsWrapperArgs+=(</span>
<span class="s s-Multiline"> # Thumbnailers</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;</span><span class="si">${</span>gdk-pixbuf<span class="si">}</span><span class="s s-Multiline">/share&quot;</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;</span><span class="si">${</span>librsvg<span class="si">}</span><span class="s s-Multiline">/share&quot;</span>
<span class="s s-Multiline"> --prefix XDG_DATA_DIRS : &quot;</span><span class="si">${</span>shared-mime-info<span class="si">}</span><span class="s s-Multiline">/share&quot;</span>
<span class="s s-Multiline"> )</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h2 id="ssec-gnome-updating">Updating GNOME packages</h2>
<p>Most GNOME package offer <a href="#var-passthru-updateScript"><code>updateScript</code></a>, it is therefore possible to update to latest source tarball by running <code>nix-shell maintainers/scripts/update.nix --argstr package nautilus</code> or even en masse with <code>nix-shell maintainers/scripts/update.nix --argstr path gnome</code>. Read the packages <code>NEWS</code> file to see what changed.</p>
<h2 id="ssec-gnome-common-issues">Frequently encountered issues</h2>
<h3 id="ssec-gnome-common-issues-no-schemas"><code>GLib-GIO-ERROR **: 06:04:50.903: No GSettings schemas are installed on the system</code></h3>
<p>There are no schemas available in <code>XDG_DATA_DIRS</code>. Temporarily add a random package containing schemas like <code>gsettings-desktop-schemas</code> to <code>buildInputs</code>. <a href="#ssec-gnome-hooks-glib"><code>glib</code></a> and <a href="#ssec-gnome-hooks-wrapgappshook"><code>wrapGApps*</code></a> setup hooks will take care of making the schemas available to application and you will see the actual missing schemas with the <a href="#ssec-gnome-common-issues-missing-schema">next error</a>. Or you can try looking through the source code for the actual schemas used.</p>
<h3 id="ssec-gnome-common-issues-missing-schema"><code>GLib-GIO-ERROR **: 06:04:50.903: Settings schema org.gnome.foo is not installed</code></h3>
<p>Package is missing some GSettings schemas. You can find out the package containing the schema with <code>nix-locate org.gnome.foo.gschema.xml</code> and let the hooks handle the wrapping as <a href="#ssec-gnome-common-issues-no-schemas">above</a>.</p>
<h3 id="ssec-gnome-common-issues-double-wrapped">When using <code>wrapGApps*</code> hook with special derivers you can end up with double wrapped binaries.</h3>
<p>This is because derivers like <code>python.pkgs.buildPythonApplication</code> or <code>qt5.mkDerivation</code> have setup-hooks automatically added that produce wrappers with makeWrapper. The simplest way to workaround that is to disable the <code>wrapGApps*</code> hook automatic wrapping with <code>dontWrapGApps = true;</code> and pass the arguments it intended to pass to makeWrapper to another.</p>
<p>In the case of a Python application it could look like:</p>
<div class="highlight"><pre><span></span><code>python3<span class="o">.</span>pkgs<span class="o">.</span>buildPythonApplication <span class="p">{</span>
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">&quot;gnome-music&quot;</span><span class="p">;</span>
<span class="ss">version</span> <span class="o">=</span> <span class="s2">&quot;3.32.2&quot;</span><span class="p">;</span>
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span>
wrapGAppsHook3
gobject-introspection
<span class="c1"># ...</span>
<span class="p">];</span>
<span class="ss">dontWrapGApps</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="c1"># Arguments to be passed to `makeWrapper`, only used by buildPython*</span>
<span class="ss">preFixup</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> makeWrapperArgs+=(&quot;</span><span class="se">&#39;&#39;$</span><span class="s s-Multiline">{gappsWrapperArgs[@]}&quot;)</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>And for a QT app like:</p>
<div class="highlight"><pre><span></span><code>mkDerivation <span class="p">{</span>
<span class="ss">pname</span> <span class="o">=</span> <span class="s2">&quot;calibre&quot;</span><span class="p">;</span>
<span class="ss">version</span> <span class="o">=</span> <span class="s2">&quot;3.47.0&quot;</span><span class="p">;</span>
<span class="ss">nativeBuildInputs</span> <span class="o">=</span> <span class="p">[</span>
wrapGAppsHook3
qmake
<span class="c1"># ...</span>
<span class="p">];</span>
<span class="ss">dontWrapGApps</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
<span class="c1"># Arguments to be passed to `makeWrapper`, only used by qt5s mkDerivation</span>
<span class="ss">preFixup</span> <span class="o">=</span> <span class="s s-Multiline">&#39;&#39;</span>
<span class="s s-Multiline"> qtWrapperArgs+=(&quot;</span><span class="se">&#39;&#39;$</span><span class="s s-Multiline">{gappsWrapperArgs[@]}&quot;)</span>
<span class="s s-Multiline"> &#39;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<h3 id="ssec-gnome-common-issues-unwrappable-package">I am packaging a project that cannot be wrapped, like a library or GNOME Shell extension.</h3>
<p>You can rely on applications depending on the library setting the necessary environment variables but that is often easy to miss. Instead we recommend to patch the paths in the source code whenever possible. Here are some examples:</p>
<ul>
<li>
<p>[]{#ssec-gnome-common-issues-unwrappable-package-gnome-shell-ext} <a href="https://github.com/NixOS/nixpkgs/blob/7bb8f05f12ca3cff9da72b56caa2f7472d5732bc/pkgs/desktops/gnome-3/core/gnome-shell-extensions/default.nix#L21-L24">Replacing a <code>GI_TYPELIB_PATH</code> in GNOME Shell extension</a> we are using <code>substituteAll</code> to include the path to a typelib into a patch.</p>
</li>
<li>
<p>[]{#ssec-gnome-common-issues-unwrappable-package-gsettings} The following examples are hardcoding GSettings schema paths. To get the schema paths we use the functions</p>
</li>
<li>
<p><code>glib.getSchemaPath</code> Takes a nix package attribute as an argument.</p>
</li>
<li>
<p><code>glib.makeSchemaPath</code> Takes a package output like <code>$out</code> and a derivation name. You should use this if the schemas you need to hardcode are in the same derivation.</p>
</li>
</ul>
<p>[]{#ssec-gnome-common-issues-unwrappable-package-gsettings-vala} <a href="https://github.com/NixOS/nixpkgs/blob/7bb8f05f12ca3cff9da72b56caa2f7472d5732bc/pkgs/desktops/pantheon/apps/elementary-files/default.nix#L78-L86">Hard-coding GSettings schema path in Vala plug-in (dynamically loaded library)</a> here, <code>substituteAll</code> cannot be used since the schema comes from the same package preventing us from pass its path to the function, probably due to a <a href="https://github.com/NixOS/nix/issues/1846">Nix bug</a>.</p>
<p>[]{#ssec-gnome-common-issues-unwrappable-package-gsettings-c} <a href="https://github.com/NixOS/nixpkgs/blob/29c120c065d03b000224872251bed93932d42412/pkgs/development/libraries/glib-networking/default.nix#L31-L34">Hard-coding GSettings schema path in C library</a> nothing special other than using <a href="https://github.com/NixOS/nixpkgs/pull/67957#issuecomment-527717467">Coccinelle patch</a> to generate the patch itself.</p>
<h3 id="ssec-gnome-common-issues-weird-location">I need to wrap a binary outside <code>bin</code> and <code>libexec</code> directories.</h3>
<p>You can manually trigger the wrapping with <code>wrapGApp</code> in <code>preFixup</code> phase. It takes a path to a program as a first argument; the remaining arguments are passed directly to <a href="#fun-wrapProgram"><code>wrapProgram</code></a> function.</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.
</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>