From 5b8a71496879d819291c6d7d919f90a7e60d60ad Mon Sep 17 00:00:00 2001 From: GetPsyched Date: Tue, 12 Nov 2024 15:50:44 +0400 Subject: [PATCH] nixos-render-docs: init redirects system Co-authored-by: Valentin Gagarin --- ci/OWNERS | 5 + doc/README.md | 8 +- doc/doc-support/package.nix | 2 + doc/redirects.json | 4190 +++++++++++++++++ .../contributing-to-this-manual.chapter.md | 6 + nixos/doc/manual/default.nix | 1 + nixos/doc/manual/redirects.json | 2177 +++++++++ pkgs/by-name/ni/nixos-render-docs/README.md | 77 + .../src/nixos_render_docs/manual.py | 37 +- .../src/nixos_render_docs/redirects.js | 3 + .../src/nixos_render_docs/redirects.py | 174 + .../ni/nixos-render-docs/src/pyproject.toml | 3 + .../src/tests/test_auto_id_prefix.py | 7 +- .../src/tests/test_redirects.py | 259 + 14 files changed, 6937 insertions(+), 12 deletions(-) create mode 100644 doc/redirects.json create mode 100644 nixos/doc/manual/redirects.json create mode 100644 pkgs/by-name/ni/nixos-render-docs/README.md create mode 100644 pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.js create mode 100644 pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.py create mode 100644 pkgs/by-name/ni/nixos-render-docs/src/tests/test_redirects.py diff --git a/ci/OWNERS b/ci/OWNERS index 2c9d3c0fa690..4bb5e09c7f3a 100644 --- a/ci/OWNERS +++ b/ci/OWNERS @@ -105,6 +105,11 @@ nixos/modules/installer/tools/nix-fallback-paths.nix @NixOS/nix-team @raitobeza /nixos/modules/system/activation/bootspec.nix @grahamc @cole-h @raitobezarius /nixos/modules/system/activation/bootspec.cue @grahamc @cole-h @raitobezarius +# NixOS Render Docs +/pkgs/by-name/ni/nixos-render-docs @fricklerhandwerk @GetPsyched @hsjobeki +/doc/redirects.json @fricklerhandwerk @GetPsyched @hsjobeki +/nixos/doc/manual/redirects.json @fricklerhandwerk @GetPsyched @hsjobeki + # NixOS integration test driver /nixos/lib/test-driver @tfc diff --git a/doc/README.md b/doc/README.md index 36e1dd9adef1..eb664ce59059 100644 --- a/doc/README.md +++ b/doc/README.md @@ -21,7 +21,7 @@ Rendered documentation: - [Unstable (from master)](https://nixos.org/manual/nixpkgs/unstable/) - [Stable (from latest release)](https://nixos.org/manual/nixpkgs/stable/) -The rendering tool is [nixos-render-docs](../pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs), sometimes abbreviated `nrd`. +The rendering tool is [nixos-render-docs](../pkgs/by-name/ni/nixos-render-docs), sometimes abbreviated `nrd`. ## Contributing to this documentation @@ -42,6 +42,12 @@ It is a daemon, that: 2. HTTP serves the manual, injecting a script that triggers reload on changes 3. opens the manual in the default browser +### Testing redirects + +Once you have a successful build, you can open the relevant HTML (path mentioned above) in a browser along with the anchor, and observe the redirection. + +Note that if you already loaded the page and *then* input the anchor, you will need to perform a reload. This is because browsers do not re-run client JS code when only the anchor has changed. + ## Syntax As per [RFC 0072](https://github.com/NixOS/rfcs/pull/72), all new documentation content should be written in [CommonMark](https://commonmark.org/) Markdown dialect. diff --git a/doc/doc-support/package.nix b/doc/doc-support/package.nix index e763f82efd7c..f1d9996120ce 100644 --- a/doc/doc-support/package.nix +++ b/doc/doc-support/package.nix @@ -31,6 +31,7 @@ stdenvNoCC.mkDerivation ( ../anchor-use.js ../anchor.min.js ../manpage-urls.json + ../redirects.json ]; }; @@ -62,6 +63,7 @@ stdenvNoCC.mkDerivation ( nixos-render-docs manual html \ --manpage-urls ./manpage-urls.json \ + --redirects ./redirects.json \ --revision ${nixpkgs.rev or "master"} \ --stylesheet style.css \ --stylesheet highlightjs/mono-blue.css \ diff --git a/doc/redirects.json b/doc/redirects.json new file mode 100644 index 000000000000..de640eed00c1 --- /dev/null +++ b/doc/redirects.json @@ -0,0 +1,4190 @@ +{ + "nixpkgs-manual": [ + "index.html#nixpkgs-manual" + ], + "preface": [ + "index.html#preface" + ], + "overview-of-nixpkgs": [ + "index.html#overview-of-nixpkgs" + ], + "part-using": [ + "index.html#part-using" + ], + "chap-platform-support": [ + "index.html#chap-platform-support" + ], + "chap-packageconfig": [ + "index.html#chap-packageconfig" + ], + "sec-allow-broken": [ + "index.html#sec-allow-broken" + ], + "sec-allow-unsupported-system": [ + "index.html#sec-allow-unsupported-system" + ], + "sec-allow-unfree": [ + "index.html#sec-allow-unfree" + ], + "sec-allow-insecure": [ + "index.html#sec-allow-insecure" + ], + "sec-modify-via-packageOverrides": [ + "index.html#sec-modify-via-packageOverrides" + ], + "sec-config-options-reference": [ + "index.html#sec-config-options-reference" + ], + "sec-declarative-package-management": [ + "index.html#sec-declarative-package-management" + ], + "sec-building-environment": [ + "index.html#sec-building-environment" + ], + "sec-getting-documentation": [ + "index.html#sec-getting-documentation" + ], + "sec-gnu-info-setup": [ + "index.html#sec-gnu-info-setup" + ], + "chap-overlays": [ + "index.html#chap-overlays" + ], + "sec-overlays-install": [ + "index.html#sec-overlays-install" + ], + "sec-overlays-argument": [ + "index.html#sec-overlays-argument" + ], + "sec-overlays-lookup": [ + "index.html#sec-overlays-lookup" + ], + "sec-overlays-definition": [ + "index.html#sec-overlays-definition" + ], + "sec-overlays-alternatives": [ + "index.html#sec-overlays-alternatives" + ], + "sec-overlays-alternatives-blas-lapack": [ + "index.html#sec-overlays-alternatives-blas-lapack" + ], + "sec-overlays-alternatives-mpi": [ + "index.html#sec-overlays-alternatives-mpi" + ], + "chap-overrides": [ + "index.html#chap-overrides" + ], + "sec-pkg-override": [ + "index.html#sec-pkg-override" + ], + "sec-pkg-overrideAttrs": [ + "index.html#sec-pkg-overrideAttrs" + ], + "sec-pkg-overrideDerivation": [ + "index.html#sec-pkg-overrideDerivation" + ], + "sec-lib-makeOverridable": [ + "index.html#sec-lib-makeOverridable" + ], + "id-1.4": [ + "index.html#id-1.4" + ], + "chap-functions": [ + "index.html#chap-functions" + ], + "sec-functions-library": [ + "index.html#sec-functions-library" + ], + "sec-functions-library-asserts": [ + "index.html#sec-functions-library-asserts" + ], + "sec-functions-library-attrsets": [ + "index.html#sec-functions-library-attrsets" + ], + "map-attrs-recursive-example": [ + "index.html#map-attrs-recursive-example" + ], + "map-attrs-recursive-cond-example": [ + "index.html#map-attrs-recursive-cond-example" + ], + "sec-functions-library-strings": [ + "index.html#sec-functions-library-strings" + ], + "sec-functions-library-versions": [ + "index.html#sec-functions-library-versions" + ], + "sec-functions-library-trivial": [ + "index.html#sec-functions-library-trivial" + ], + "sec-functions-library-fixedPoints": [ + "index.html#sec-functions-library-fixedPoints" + ], + "sec-functions-library-lists": [ + "index.html#sec-functions-library-lists" + ], + "sec-functions-library-debug": [ + "index.html#sec-functions-library-debug" + ], + "sec-functions-library-options": [ + "index.html#sec-functions-library-options" + ], + "sec-functions-library-path": [ + "index.html#sec-functions-library-path" + ], + "sec-functions-library-filesystem": [ + "index.html#sec-functions-library-filesystem" + ], + "sec-functions-library-fileset": [ + "index.html#sec-functions-library-fileset" + ], + "sec-fileset": [ + "index.html#sec-fileset" + ], + "sec-fileset-overview": [ + "index.html#sec-fileset-overview" + ], + "sec-fileset-path-coercion": [ + "index.html#sec-fileset-path-coercion" + ], + "sec-fileset-path-coercion-example": [ + "index.html#sec-fileset-path-coercion-example" + ], + "sec-functions-library-sources": [ + "index.html#sec-functions-library-sources" + ], + "sec-functions-library-cli": [ + "index.html#sec-functions-library-cli" + ], + "sec-functions-library-generators": [ + "index.html#sec-functions-library-generators" + ], + "sec-functions-library-gvariant": [ + "index.html#sec-functions-library-gvariant" + ], + "sec-functions-library-customisation": [ + "index.html#sec-functions-library-customisation" + ], + "ex-makeScope": [ + "index.html#ex-makeScope" + ], + "ex-makeScope-callPackage": [ + "index.html#ex-makeScope-callPackage" + ], + "sec-functions-library-meta": [ + "index.html#sec-functions-library-meta" + ], + "sec-functions-library-derivations": [ + "index.html#sec-functions-library-derivations" + ], + "sec-generators": [ + "index.html#sec-generators" + ], + "sec-debug": [ + "index.html#sec-debug" + ], + "sec-prefer-remote-fetch": [ + "index.html#sec-prefer-remote-fetch" + ], + "sec-pkgs-nix-gitignore": [ + "index.html#sec-pkgs-nix-gitignore" + ], + "sec-pkgs-nix-gitignore-usage": [ + "index.html#sec-pkgs-nix-gitignore-usage" + ], + "sec-pkgs-nix-gitignore-usage-recursive": [ + "index.html#sec-pkgs-nix-gitignore-usage-recursive" + ], + "module-system": [ + "index.html#module-system" + ], + "module-system-introduction": [ + "index.html#module-system-introduction" + ], + "module-system-lib-evalModules": [ + "index.html#module-system-lib-evalModules" + ], + "module-system-lib-evalModules-parameters": [ + "index.html#module-system-lib-evalModules-parameters" + ], + "module-system-lib-evalModules-param-modules": [ + "index.html#module-system-lib-evalModules-param-modules" + ], + "module-system-lib-evalModules-param-specialArgs": [ + "index.html#module-system-lib-evalModules-param-specialArgs" + ], + "module-system-lib-evalModules-param-class": [ + "index.html#module-system-lib-evalModules-param-class" + ], + "module-system-lib-evalModules-param-prefix": [ + "index.html#module-system-lib-evalModules-param-prefix" + ], + "module-system-lib-evalModules-return-value": [ + "index.html#module-system-lib-evalModules-return-value" + ], + "module-system-lib-evalModules-return-value-options": [ + "index.html#module-system-lib-evalModules-return-value-options" + ], + "module-system-lib-evalModules-return-value-config": [ + "index.html#module-system-lib-evalModules-return-value-config" + ], + "module-system-lib-evalModules-return-value-type": [ + "index.html#module-system-lib-evalModules-return-value-type" + ], + "module-system-lib-evalModules-return-value-extendModules": [ + "index.html#module-system-lib-evalModules-return-value-extendModules" + ], + "module-system-lib-evalModules-return-value-_module": [ + "index.html#module-system-lib-evalModules-return-value-_module" + ], + "module-system-lib-evalModules-return-value-_type": [ + "index.html#module-system-lib-evalModules-return-value-_type" + ], + "module-system-lib-evalModules-return-value-_configurationClass": [ + "index.html#module-system-lib-evalModules-return-value-_configurationClass" + ], + "part-stdenv": [ + "index.html#part-stdenv" + ], + "chap-stdenv": [ + "index.html#chap-stdenv" + ], + "sec-using-stdenv": [ + "index.html#sec-using-stdenv" + ], + "sec-building-stdenv-package-in-nix-shell": [ + "index.html#sec-building-stdenv-package-in-nix-shell" + ], + "sec-tools-of-stdenv": [ + "index.html#sec-tools-of-stdenv" + ], + "ssec-stdenv-dependencies": [ + "index.html#ssec-stdenv-dependencies" + ], + "ssec-stdenv-dependencies-overview": [ + "index.html#ssec-stdenv-dependencies-overview" + ], + "ssec-stdenv-dependencies-overview-example": [ + "index.html#ssec-stdenv-dependencies-overview-example" + ], + "ssec-stdenv-dependencies-reference": [ + "index.html#ssec-stdenv-dependencies-reference" + ], + "footnote-stdenv-ignored-build-platform.__back.0": [ + "index.html#footnote-stdenv-ignored-build-platform.__back.0" + ], + "footnote-stdenv-native-dependencies-in-path.__back.0": [ + "index.html#footnote-stdenv-native-dependencies-in-path.__back.0" + ], + "ssec-stdenv-dependencies-propagated": [ + "index.html#ssec-stdenv-dependencies-propagated" + ], + "footnote-stdenv-find-inputs-location.__back.0": [ + "index.html#footnote-stdenv-find-inputs-location.__back.0" + ], + "variables-specifying-dependencies": [ + "index.html#variables-specifying-dependencies" + ], + "var-stdenv-depsBuildBuild": [ + "index.html#var-stdenv-depsBuildBuild" + ], + "var-stdenv-nativeBuildInputs": [ + "index.html#var-stdenv-nativeBuildInputs" + ], + "var-stdenv-depsBuildTarget": [ + "index.html#var-stdenv-depsBuildTarget" + ], + "var-stdenv-depsHostHost": [ + "index.html#var-stdenv-depsHostHost" + ], + "var-stdenv-buildInputs": [ + "index.html#var-stdenv-buildInputs" + ], + "var-stdenv-depsTargetTarget": [ + "index.html#var-stdenv-depsTargetTarget" + ], + "var-stdenv-depsBuildBuildPropagated": [ + "index.html#var-stdenv-depsBuildBuildPropagated" + ], + "var-stdenv-propagatedNativeBuildInputs": [ + "index.html#var-stdenv-propagatedNativeBuildInputs" + ], + "var-stdenv-depsBuildTargetPropagated": [ + "index.html#var-stdenv-depsBuildTargetPropagated" + ], + "var-stdenv-depsHostHostPropagated": [ + "index.html#var-stdenv-depsHostHostPropagated" + ], + "var-stdenv-propagatedBuildInputs": [ + "index.html#var-stdenv-propagatedBuildInputs" + ], + "var-stdenv-depsTargetTargetPropagated": [ + "index.html#var-stdenv-depsTargetTargetPropagated" + ], + "ssec-stdenv-attributes": [ + "index.html#ssec-stdenv-attributes" + ], + "variables-affecting-stdenv-initialisation": [ + "index.html#variables-affecting-stdenv-initialisation" + ], + "var-stdenv-NIX_DEBUG": [ + "index.html#var-stdenv-NIX_DEBUG" + ], + "attributes-affecting-build-properties": [ + "index.html#attributes-affecting-build-properties" + ], + "var-stdenv-enableParallelBuilding": [ + "index.html#var-stdenv-enableParallelBuilding" + ], + "mkderivation-recursive-attributes": [ + "index.html#mkderivation-recursive-attributes" + ], + "sec-stdenv-phases": [ + "index.html#sec-stdenv-phases" + ], + "ssec-controlling-phases": [ + "index.html#ssec-controlling-phases" + ], + "variables-affecting-phase-control": [ + "index.html#variables-affecting-phase-control" + ], + "var-stdenv-phases": [ + "index.html#var-stdenv-phases" + ], + "var-stdenv-prePhases": [ + "index.html#var-stdenv-prePhases" + ], + "var-stdenv-preConfigurePhases": [ + "index.html#var-stdenv-preConfigurePhases" + ], + "var-stdenv-preBuildPhases": [ + "index.html#var-stdenv-preBuildPhases" + ], + "var-stdenv-preInstallPhases": [ + "index.html#var-stdenv-preInstallPhases" + ], + "var-stdenv-preFixupPhases": [ + "index.html#var-stdenv-preFixupPhases" + ], + "var-stdenv-preDistPhases": [ + "index.html#var-stdenv-preDistPhases" + ], + "var-stdenv-postPhases": [ + "index.html#var-stdenv-postPhases" + ], + "ssec-unpack-phase": [ + "index.html#ssec-unpack-phase" + ], + "tar-files": [ + "index.html#tar-files" + ], + "zip-files": [ + "index.html#zip-files" + ], + "directories-in-the-nix-store": [ + "index.html#directories-in-the-nix-store" + ], + "variables-controlling-the-unpack-phase": [ + "index.html#variables-controlling-the-unpack-phase" + ], + "var-stdenv-src": [ + "index.html#var-stdenv-src" + ], + "var-stdenv-sourceRoot": [ + "index.html#var-stdenv-sourceRoot" + ], + "var-stdenv-setSourceRoot": [ + "index.html#var-stdenv-setSourceRoot" + ], + "var-stdenv-preUnpack": [ + "index.html#var-stdenv-preUnpack" + ], + "var-stdenv-postUnpack": [ + "index.html#var-stdenv-postUnpack" + ], + "var-stdenv-dontUnpack": [ + "index.html#var-stdenv-dontUnpack" + ], + "var-stdenv-dontMakeSourcesWritable": [ + "index.html#var-stdenv-dontMakeSourcesWritable" + ], + "var-stdenv-unpackCmd": [ + "index.html#var-stdenv-unpackCmd" + ], + "ssec-patch-phase": [ + "index.html#ssec-patch-phase" + ], + "variables-controlling-the-patch-phase": [ + "index.html#variables-controlling-the-patch-phase" + ], + "var-stdenv-dontPatch": [ + "index.html#var-stdenv-dontPatch" + ], + "var-stdenv-patches": [ + "index.html#var-stdenv-patches" + ], + "var-stdenv-patchFlags": [ + "index.html#var-stdenv-patchFlags" + ], + "var-stdenv-prePatch": [ + "index.html#var-stdenv-prePatch" + ], + "var-stdenv-postPatch": [ + "index.html#var-stdenv-postPatch" + ], + "ssec-configure-phase": [ + "index.html#ssec-configure-phase" + ], + "variables-controlling-the-configure-phase": [ + "index.html#variables-controlling-the-configure-phase" + ], + "var-stdenv-configureScript": [ + "index.html#var-stdenv-configureScript" + ], + "var-stdenv-configureFlags": [ + "index.html#var-stdenv-configureFlags" + ], + "var-stdenv-dontConfigure": [ + "index.html#var-stdenv-dontConfigure" + ], + "var-stdenv-configureFlagsArray": [ + "index.html#var-stdenv-configureFlagsArray" + ], + "var-stdenv-dontAddPrefix": [ + "index.html#var-stdenv-dontAddPrefix" + ], + "var-stdenv-prefix": [ + "index.html#var-stdenv-prefix" + ], + "var-stdenv-prefixKey": [ + "index.html#var-stdenv-prefixKey" + ], + "var-stdenv-dontAddStaticConfigureFlags": [ + "index.html#var-stdenv-dontAddStaticConfigureFlags" + ], + "var-stdenv-dontAddDisableDepTrack": [ + "index.html#var-stdenv-dontAddDisableDepTrack" + ], + "var-stdenv-dontFixLibtool": [ + "index.html#var-stdenv-dontFixLibtool" + ], + "footnote-stdenv-sys-lib-search-path.__back.0": [ + "index.html#footnote-stdenv-sys-lib-search-path.__back.0" + ], + "var-stdenv-dontDisableStatic": [ + "index.html#var-stdenv-dontDisableStatic" + ], + "var-stdenv-configurePlatforms": [ + "index.html#var-stdenv-configurePlatforms" + ], + "footnote-stdenv-build-time-guessing-impurity.__back.0": [ + "index.html#footnote-stdenv-build-time-guessing-impurity.__back.0" + ], + "var-stdenv-preConfigure": [ + "index.html#var-stdenv-preConfigure" + ], + "var-stdenv-postConfigure": [ + "index.html#var-stdenv-postConfigure" + ], + "build-phase": [ + "index.html#build-phase" + ], + "variables-controlling-the-build-phase": [ + "index.html#variables-controlling-the-build-phase" + ], + "var-stdenv-dontBuild": [ + "index.html#var-stdenv-dontBuild" + ], + "var-stdenv-makefile": [ + "index.html#var-stdenv-makefile" + ], + "var-stdenv-makeFlags": [ + "index.html#var-stdenv-makeFlags" + ], + "var-stdenv-makeFlagsArray": [ + "index.html#var-stdenv-makeFlagsArray" + ], + "var-stdenv-buildFlags": [ + "index.html#var-stdenv-buildFlags" + ], + "var-stdenv-preBuild": [ + "index.html#var-stdenv-preBuild" + ], + "var-stdenv-postBuild": [ + "index.html#var-stdenv-postBuild" + ], + "ssec-check-phase": [ + "index.html#ssec-check-phase" + ], + "variables-controlling-the-check-phase": [ + "index.html#variables-controlling-the-check-phase" + ], + "var-stdenv-doCheck": [ + "index.html#var-stdenv-doCheck" + ], + "makeflags-makeflagsarray-makefile": [ + "index.html#makeflags-makeflagsarray-makefile" + ], + "var-stdenv-checkTarget": [ + "index.html#var-stdenv-checkTarget" + ], + "var-stdenv-checkFlags": [ + "index.html#var-stdenv-checkFlags" + ], + "var-stdenv-checkInputs": [ + "index.html#var-stdenv-checkInputs" + ], + "var-stdenv-nativeCheckInputs": [ + "index.html#var-stdenv-nativeCheckInputs" + ], + "var-stdenv-preCheck": [ + "index.html#var-stdenv-preCheck" + ], + "var-stdenv-postCheck": [ + "index.html#var-stdenv-postCheck" + ], + "ssec-install-phase": [ + "index.html#ssec-install-phase" + ], + "variables-controlling-the-install-phase": [ + "index.html#variables-controlling-the-install-phase" + ], + "var-stdenv-dontInstall": [ + "index.html#var-stdenv-dontInstall" + ], + "makeflags-makeflagsarray-makefile-1": [ + "index.html#makeflags-makeflagsarray-makefile-1" + ], + "var-stdenv-installTargets": [ + "index.html#var-stdenv-installTargets" + ], + "var-stdenv-installFlags": [ + "index.html#var-stdenv-installFlags" + ], + "var-stdenv-preInstall": [ + "index.html#var-stdenv-preInstall" + ], + "var-stdenv-postInstall": [ + "index.html#var-stdenv-postInstall" + ], + "ssec-fixup-phase": [ + "index.html#ssec-fixup-phase" + ], + "variables-controlling-the-fixup-phase": [ + "index.html#variables-controlling-the-fixup-phase" + ], + "var-stdenv-dontFixup": [ + "index.html#var-stdenv-dontFixup" + ], + "var-stdenv-dontStrip": [ + "index.html#var-stdenv-dontStrip" + ], + "var-stdenv-dontStripHost": [ + "index.html#var-stdenv-dontStripHost" + ], + "var-stdenv-dontStripTarget": [ + "index.html#var-stdenv-dontStripTarget" + ], + "var-stdenv-dontMoveSbin": [ + "index.html#var-stdenv-dontMoveSbin" + ], + "var-stdenv-stripAllList": [ + "index.html#var-stdenv-stripAllList" + ], + "var-stdenv-stripAllListTarget": [ + "index.html#var-stdenv-stripAllListTarget" + ], + "var-stdenv-stripAllFlags": [ + "index.html#var-stdenv-stripAllFlags" + ], + "var-stdenv-stripDebugList": [ + "index.html#var-stdenv-stripDebugList" + ], + "var-stdenv-stripDebugListTarget": [ + "index.html#var-stdenv-stripDebugListTarget" + ], + "var-stdenv-stripDebugFlags": [ + "index.html#var-stdenv-stripDebugFlags" + ], + "var-stdenv-stripExclude": [ + "index.html#var-stdenv-stripExclude" + ], + "var-stdenv-dontPatchELF": [ + "index.html#var-stdenv-dontPatchELF" + ], + "var-stdenv-dontPatchShebangs": [ + "index.html#var-stdenv-dontPatchShebangs" + ], + "var-stdenv-dontPruneLibtoolFiles": [ + "index.html#var-stdenv-dontPruneLibtoolFiles" + ], + "var-stdenv-forceShare": [ + "index.html#var-stdenv-forceShare" + ], + "var-stdenv-setupHook": [ + "index.html#var-stdenv-setupHook" + ], + "var-stdenv-preFixup": [ + "index.html#var-stdenv-preFixup" + ], + "var-stdenv-postFixup": [ + "index.html#var-stdenv-postFixup" + ], + "stdenv-separateDebugInfo": [ + "index.html#stdenv-separateDebugInfo" + ], + "ex-gdb-debug-symbols-socat": [ + "index.html#ex-gdb-debug-symbols-socat" + ], + "ssec-installCheck-phase": [ + "index.html#ssec-installCheck-phase" + ], + "variables-controlling-the-installcheck-phase": [ + "index.html#variables-controlling-the-installcheck-phase" + ], + "var-stdenv-doInstallCheck": [ + "index.html#var-stdenv-doInstallCheck" + ], + "var-stdenv-installCheckTarget": [ + "index.html#var-stdenv-installCheckTarget" + ], + "var-stdenv-installCheckFlags": [ + "index.html#var-stdenv-installCheckFlags" + ], + "var-stdenv-installCheckInputs": [ + "index.html#var-stdenv-installCheckInputs" + ], + "var-stdenv-nativeInstallCheckInputs": [ + "index.html#var-stdenv-nativeInstallCheckInputs" + ], + "var-stdenv-preInstallCheck": [ + "index.html#var-stdenv-preInstallCheck" + ], + "var-stdenv-postInstallCheck": [ + "index.html#var-stdenv-postInstallCheck" + ], + "ssec-distribution-phase": [ + "index.html#ssec-distribution-phase" + ], + "variables-controlling-the-distribution-phase": [ + "index.html#variables-controlling-the-distribution-phase" + ], + "var-stdenv-doDist": [ + "index.html#var-stdenv-doDist" + ], + "var-stdenv-distTarget": [ + "index.html#var-stdenv-distTarget" + ], + "var-stdenv-distFlags": [ + "index.html#var-stdenv-distFlags" + ], + "var-stdenv-tarballs": [ + "index.html#var-stdenv-tarballs" + ], + "var-stdenv-dontCopyDist": [ + "index.html#var-stdenv-dontCopyDist" + ], + "var-stdenv-preDist": [ + "index.html#var-stdenv-preDist" + ], + "var-stdenv-postDist": [ + "index.html#var-stdenv-postDist" + ], + "ssec-stdenv-functions": [ + "index.html#ssec-stdenv-functions" + ], + "fun-makeWrapper": [ + "index.html#fun-makeWrapper" + ], + "fun-remove-references-to": [ + "index.html#fun-remove-references-to" + ], + "fun-runHook": [ + "index.html#fun-runHook" + ], + "fun-substitute": [ + "index.html#fun-substitute" + ], + "fun-substitute-replace-fail": [ + "index.html#fun-substitute-replace-fail" + ], + "fun-substitute-replace-warn": [ + "index.html#fun-substitute-replace-warn" + ], + "fun-substitute-replace-quiet": [ + "index.html#fun-substitute-replace-quiet" + ], + "fun-substitute-subst-var": [ + "index.html#fun-substitute-subst-var" + ], + "fun-substitute-subst-var-by": [ + "index.html#fun-substitute-subst-var-by" + ], + "fun-substituteInPlace": [ + "index.html#fun-substituteInPlace" + ], + "fun-substituteAll": [ + "index.html#fun-substituteAll" + ], + "fun-substituteAllInPlace": [ + "index.html#fun-substituteAllInPlace" + ], + "fun-stripHash": [ + "index.html#fun-stripHash" + ], + "fun-wrapProgram": [ + "index.html#fun-wrapProgram" + ], + "fun-prependToVar": [ + "index.html#fun-prependToVar" + ], + "fun-appendToVar": [ + "index.html#fun-appendToVar" + ], + "ssec-setup-hooks": [ + "index.html#ssec-setup-hooks" + ], + "move-docs.sh": [ + "index.html#move-docs.sh" + ], + "compress-man-pages.sh": [ + "index.html#compress-man-pages.sh" + ], + "strip.sh": [ + "index.html#strip.sh" + ], + "patch-shebangs.sh": [ + "index.html#patch-shebangs.sh" + ], + "patch-shebangs.sh-invocation": [ + "index.html#patch-shebangs.sh-invocation" + ], + "patch-shebangs.sh-invocation-flags": [ + "index.html#patch-shebangs.sh-invocation-flags" + ], + "patch-shebangs.sh-invocation-examples": [ + "index.html#patch-shebangs.sh-invocation-examples" + ], + "audit-tmpdir.sh": [ + "index.html#audit-tmpdir.sh" + ], + "multiple-outputs.sh": [ + "index.html#multiple-outputs.sh" + ], + "move-sbin.sh": [ + "index.html#move-sbin.sh" + ], + "move-lib64.sh": [ + "index.html#move-lib64.sh" + ], + "move-systemd-user-units.sh": [ + "index.html#move-systemd-user-units.sh" + ], + "set-source-date-epoch-to-latest.sh": [ + "index.html#set-source-date-epoch-to-latest.sh" + ], + "bintools-wrapper": [ + "index.html#bintools-wrapper" + ], + "footnote-stdenv-per-platform-wrapper.__back.0": [ + "index.html#footnote-stdenv-per-platform-wrapper.__back.0" + ], + "cc-wrapper": [ + "index.html#cc-wrapper" + ], + "stdenv-other-hooks": [ + "index.html#stdenv-other-hooks" + ], + "compiler-linker-wrapper-hooks": [ + "index.html#compiler-linker-wrapper-hooks" + ], + "sec-purity-in-nixpkgs": [ + "index.html#sec-purity-in-nixpkgs" + ], + "sec-hardening-in-nixpkgs": [ + "index.html#sec-hardening-in-nixpkgs" + ], + "sec-hardening-flags-enabled-by-default": [ + "index.html#sec-hardening-flags-enabled-by-default" + ], + "format": [ + "index.html#format" + ], + "stackprotector": [ + "index.html#stackprotector" + ], + "fortify": [ + "index.html#fortify" + ], + "fortify3": [ + "index.html#fortify3" + ], + "pic": [ + "index.html#pic" + ], + "strictoverflow": [ + "index.html#strictoverflow" + ], + "relro": [ + "index.html#relro" + ], + "bindnow": [ + "index.html#bindnow" + ], + "zerocallusedregs": [ + "index.html#zerocallusedregs" + ], + "sec-hardening-flags-disabled-by-default": [ + "index.html#sec-hardening-flags-disabled-by-default" + ], + "pie": [ + "index.html#pie" + ], + "shadowstack": [ + "index.html#shadowstack" + ], + "trivialautovarinit": [ + "index.html#trivialautovarinit" + ], + "stackclashprotection": [ + "index.html#stackclashprotection" + ], + "pacret": [ + "index.html#pacret" + ], + "footnote-stdenv-ignored-build-platform": [ + "index.html#footnote-stdenv-ignored-build-platform" + ], + "footnote-stdenv-native-dependencies-in-path": [ + "index.html#footnote-stdenv-native-dependencies-in-path" + ], + "footnote-stdenv-find-inputs-location": [ + "index.html#footnote-stdenv-find-inputs-location" + ], + "footnote-stdenv-sys-lib-search-path": [ + "index.html#footnote-stdenv-sys-lib-search-path" + ], + "footnote-stdenv-build-time-guessing-impurity": [ + "index.html#footnote-stdenv-build-time-guessing-impurity" + ], + "footnote-stdenv-per-platform-wrapper": [ + "index.html#footnote-stdenv-per-platform-wrapper" + ], + "chap-meta": [ + "index.html#chap-meta" + ], + "sec-standard-meta-attributes": [ + "index.html#sec-standard-meta-attributes" + ], + "var-meta-description": [ + "index.html#var-meta-description" + ], + "var-meta-longDescription": [ + "index.html#var-meta-longDescription" + ], + "var-meta-branch": [ + "index.html#var-meta-branch" + ], + "var-meta-homepage": [ + "index.html#var-meta-homepage" + ], + "var-meta-downloadPage": [ + "index.html#var-meta-downloadPage" + ], + "var-meta-changelog": [ + "index.html#var-meta-changelog" + ], + "var-meta-license": [ + "index.html#var-meta-license" + ], + "var-meta-sourceProvenance": [ + "index.html#var-meta-sourceProvenance" + ], + "var-meta-maintainers": [ + "index.html#var-meta-maintainers" + ], + "var-meta-mainProgram": [ + "index.html#var-meta-mainProgram" + ], + "var-meta-priority": [ + "index.html#var-meta-priority" + ], + "var-meta-platforms": [ + "index.html#var-meta-platforms" + ], + "var-meta-badPlatforms": [ + "index.html#var-meta-badPlatforms" + ], + "var-meta-timeout": [ + "index.html#var-meta-timeout" + ], + "var-meta-hydraPlatforms": [ + "index.html#var-meta-hydraPlatforms" + ], + "var-meta-broken": [ + "index.html#var-meta-broken" + ], + "sec-meta-license": [ + "index.html#sec-meta-license" + ], + "lib.licenses.free-free": [ + "index.html#lib.licenses.free-free" + ], + "lib.licenses.unfreeredistributable-unfree-redistributable": [ + "index.html#lib.licenses.unfreeredistributable-unfree-redistributable" + ], + "lib.licenses.unfree-unfree": [ + "index.html#lib.licenses.unfree-unfree" + ], + "lib.licenses.unfreeredistributablefirmware-unfree-redistributable-firmware": [ + "index.html#lib.licenses.unfreeredistributablefirmware-unfree-redistributable-firmware" + ], + "sec-meta-sourceProvenance": [ + "index.html#sec-meta-sourceProvenance" + ], + "lib.sourceTypes.fromSource": [ + "index.html#lib.sourceTypes.fromSource" + ], + "lib.sourceTypes.binaryNativeCode": [ + "index.html#lib.sourceTypes.binaryNativeCode" + ], + "lib.sourceTypes.binaryFirmware": [ + "index.html#lib.sourceTypes.binaryFirmware" + ], + "lib.sourceTypes.binaryBytecode": [ + "index.html#lib.sourceTypes.binaryBytecode" + ], + "chap-passthru": [ + "index.html#chap-passthru" + ], + "var-stdenv-passthru": [ + "index.html#var-stdenv-passthru" + ], + "special-variables": [ + "index.html#special-variables" + ], + "ex-accessing-passthru": [ + "index.html#ex-accessing-passthru" + ], + "sec-common-passthru-attributes": [ + "index.html#sec-common-passthru-attributes" + ], + "var-passthru-tests": [ + "index.html#var-passthru-tests" + ], + "var-meta-tests": [ + "index.html#var-meta-tests" + ], + "var-passthru-tests-packages": [ + "index.html#var-passthru-tests-packages" + ], + "var-meta-tests-packages": [ + "index.html#var-meta-tests-packages" + ], + "var-passthru-tests-nixos": [ + "index.html#var-passthru-tests-nixos" + ], + "var-meta-tests-nixos": [ + "index.html#var-meta-tests-nixos" + ], + "var-passthru-updateScript": [ + "index.html#var-passthru-updateScript" + ], + "var-passthru-updateScript-command": [ + "index.html#var-passthru-updateScript-command" + ], + "var-passthru-updateScript-set-command": [ + "index.html#var-passthru-updateScript-set-command" + ], + "var-passthru-updateScript-set-attrPath": [ + "index.html#var-passthru-updateScript-set-attrPath" + ], + "var-passthru-updateScript-set-supportedFeatures": [ + "index.html#var-passthru-updateScript-set-supportedFeatures" + ], + "var-passthru-updateScript-env-UPDATE_NIX_NAME": [ + "index.html#var-passthru-updateScript-env-UPDATE_NIX_NAME" + ], + "var-passthru-updateScript-env-UPDATE_NIX_PNAME": [ + "index.html#var-passthru-updateScript-env-UPDATE_NIX_PNAME" + ], + "var-passthru-updateScript-env-UPDATE_NIX_OLD_VERSION": [ + "index.html#var-passthru-updateScript-env-UPDATE_NIX_OLD_VERSION" + ], + "var-passthru-updateScript-env-UPDATE_NIX_ATTR_PATH": [ + "index.html#var-passthru-updateScript-env-UPDATE_NIX_ATTR_PATH" + ], + "var-passthru-updateScript-execution": [ + "index.html#var-passthru-updateScript-execution" + ], + "var-passthru-updateScript-supported-features": [ + "index.html#var-passthru-updateScript-supported-features" + ], + "var-passthru-updateScript-commit": [ + "index.html#var-passthru-updateScript-commit" + ], + "var-passthru-updateScript-commit-attrPath": [ + "index.html#var-passthru-updateScript-commit-attrPath" + ], + "var-passthru-updateScript-commit-oldVersion": [ + "index.html#var-passthru-updateScript-commit-oldVersion" + ], + "var-passthru-updateScript-commit-newVersion": [ + "index.html#var-passthru-updateScript-commit-newVersion" + ], + "var-passthru-updateScript-commit-files": [ + "index.html#var-passthru-updateScript-commit-files" + ], + "var-passthru-updateScript-commit-commitBody": [ + "index.html#var-passthru-updateScript-commit-commitBody" + ], + "var-passthru-updateScript-commit-commitMessage": [ + "index.html#var-passthru-updateScript-commit-commitMessage" + ], + "var-passthru-updateScript-example-commit": [ + "index.html#var-passthru-updateScript-example-commit" + ], + "chap-multiple-output": [ + "index.html#chap-multiple-output" + ], + "sec-multiple-outputs-using-split-packages": [ + "index.html#sec-multiple-outputs-using-split-packages" + ], + "sec-multiple-outputs-": [ + "index.html#sec-multiple-outputs-" + ], + "multiple-output-file-binaries-first-convention": [ + "index.html#multiple-output-file-binaries-first-convention" + ], + "multiple-output-file-type-groups": [ + "index.html#multiple-output-file-type-groups" + ], + "outputdev": [ + "index.html#outputdev" + ], + "outputbin": [ + "index.html#outputbin" + ], + "outputlib": [ + "index.html#outputlib" + ], + "outputdoc": [ + "index.html#outputdoc" + ], + "outputdevdoc": [ + "index.html#outputdevdoc" + ], + "outputman": [ + "index.html#outputman" + ], + "outputdevman": [ + "index.html#outputdevman" + ], + "outputinfo": [ + "index.html#outputinfo" + ], + "sec-multiple-outputs-caveats": [ + "index.html#sec-multiple-outputs-caveats" + ], + "chap-cross": [ + "index.html#chap-cross" + ], + "sec-cross-intro": [ + "index.html#sec-cross-intro" + ], + "sec-cross-packaging": [ + "index.html#sec-cross-packaging" + ], + "ssec-cross-platform-parameters": [ + "index.html#ssec-cross-platform-parameters" + ], + "ssec-cross-dependency-categorization": [ + "index.html#ssec-cross-dependency-categorization" + ], + "possible-dependency-types": [ + "index.html#possible-dependency-types" + ], + "ssec-cross-cookbook": [ + "index.html#ssec-cross-cookbook" + ], + "cross-qa-fails-to-find-binutils": [ + "index.html#cross-qa-fails-to-find-binutils" + ], + "cross-qa-avoid-compiling-gcc-cross-compiler": [ + "index.html#cross-qa-avoid-compiling-gcc-cross-compiler" + ], + "cross-qa-build-c-program-in-build-environment": [ + "index.html#cross-qa-build-c-program-in-build-environment" + ], + "cross-testsuite-runs-host-code": [ + "index.html#cross-testsuite-runs-host-code" + ], + "cross-meson-runs-host-code": [ + "index.html#cross-meson-runs-host-code" + ], + "cross-static-on-non-static-platform": [ + "index.html#cross-static-on-non-static-platform" + ], + "sec-cross-usage": [ + "index.html#sec-cross-usage" + ], + "sec-cross-infra": [ + "index.html#sec-cross-infra" + ], + "ssec-cross-dependency-implementation": [ + "index.html#ssec-cross-dependency-implementation" + ], + "ssec-bootstrapping": [ + "index.html#ssec-bootstrapping" + ], + "chap-platform-notes": [ + "index.html#chap-platform-notes" + ], + "sec-darwin": [ + "index.html#sec-darwin" + ], + "sec-darwin-troubleshooting": [ + "index.html#sec-darwin-troubleshooting" + ], + "sec-darwin-troubleshooting-using-sdks": [ + "index.html#sec-darwin-troubleshooting-using-sdks" + ], + "sec-darwin-troubleshooting-using-deployment-targets": [ + "index.html#sec-darwin-troubleshooting-using-deployment-targets" + ], + "sec-darwin-troubleshooting-picking-sdk-version": [ + "index.html#sec-darwin-troubleshooting-picking-sdk-version" + ], + "sec-darwin-troubleshooting-darwin-defaults": [ + "index.html#sec-darwin-troubleshooting-darwin-defaults" + ], + "sec-darwin-troubleshooting-xcrun": [ + "index.html#sec-darwin-troubleshooting-xcrun" + ], + "sec-darwin-troubleshooting-xcodebuild": [ + "index.html#sec-darwin-troubleshooting-xcodebuild" + ], + "sec-darwin-troubleshooting-xcodebuild-absolute-paths": [ + "index.html#sec-darwin-troubleshooting-xcodebuild-absolute-paths" + ], + "sec-darwin-troubleshooting-libiconv": [ + "index.html#sec-darwin-troubleshooting-libiconv" + ], + "sec-darwin-troubleshooting-install-name": [ + "index.html#sec-darwin-troubleshooting-install-name" + ], + "sec-darwin-troubleshooting-install-name-linker-flags": [ + "index.html#sec-darwin-troubleshooting-install-name-linker-flags" + ], + "sec-darwin-troubleshooting-install-name-install_name_tool": [ + "index.html#sec-darwin-troubleshooting-install-name-install_name_tool" + ], + "sec-darwin-troubleshooting-install-name-fixDarwinDylibNames": [ + "index.html#sec-darwin-troubleshooting-install-name-fixDarwinDylibNames" + ], + "sec-darwin-troubleshooting-propagating-sdks": [ + "index.html#sec-darwin-troubleshooting-propagating-sdks" + ], + "sec-darwin-legacy-frameworks": [ + "index.html#sec-darwin-legacy-frameworks" + ], + "sec-darwin-legacy-frameworks-overrides": [ + "index.html#sec-darwin-legacy-frameworks-overrides" + ], + "sec-darwin-legacy-cross-compilation": [ + "index.html#sec-darwin-legacy-cross-compilation" + ], + "part-builders": [ + "index.html#part-builders" + ], + "chap-pkgs-fetchers": [ + "index.html#chap-pkgs-fetchers" + ], + "chap-pkgs-fetchers-caveats": [ + "index.html#chap-pkgs-fetchers-caveats" + ], + "sec-pkgs-fetchers-updating-source-hashes": [ + "index.html#sec-pkgs-fetchers-updating-source-hashes" + ], + "sec-pkgs-fetchers-updating-source-hashes-fakehash-method": [ + "index.html#sec-pkgs-fetchers-updating-source-hashes-fakehash-method" + ], + "ex-fetchers-update-fod-hash": [ + "index.html#ex-fetchers-update-fod-hash" + ], + "sec-pkgs-fetchers-secure-hashes": [ + "index.html#sec-pkgs-fetchers-secure-hashes" + ], + "sec-pkgs-fetchers-proxy": [ + "index.html#sec-pkgs-fetchers-proxy" + ], + "fetchurl": [ + "index.html#fetchurl" + ], + "sec-pkgs-fetchers-fetchurl": [ + "index.html#sec-pkgs-fetchers-fetchurl" + ], + "sec-pkgs-fetchers-fetchurl-inputs": [ + "index.html#sec-pkgs-fetchers-fetchurl-inputs" + ], + "sec-pkgs-fetchers-fetchurl-inputs-recursiveHash": [ + "index.html#sec-pkgs-fetchers-fetchurl-inputs-recursiveHash" + ], + "sec-pkgs-fetchers-fetchurl-inputs-downloadToTemp": [ + "index.html#sec-pkgs-fetchers-fetchurl-inputs-downloadToTemp" + ], + "ssec-pkgs-fetchers-fetchurl-passthru-outputs": [ + "index.html#ssec-pkgs-fetchers-fetchurl-passthru-outputs" + ], + "ssec-pkgs-fetchers-fetchurl-examples": [ + "index.html#ssec-pkgs-fetchers-fetchurl-examples" + ], + "ex-fetchers-fetchurl-nixpkgs-version": [ + "index.html#ex-fetchers-fetchurl-nixpkgs-version" + ], + "ex-fetchers-fetchurl-nixpkgs-version-multiple-urls": [ + "index.html#ex-fetchers-fetchurl-nixpkgs-version-multiple-urls" + ], + "ex-fetchers-fetchurl-nixpkgs-version-postfetch": [ + "index.html#ex-fetchers-fetchurl-nixpkgs-version-postfetch" + ], + "sec-pkgs-fetchers-fetchzip": [ + "index.html#sec-pkgs-fetchers-fetchzip" + ], + "sec-pkgs-fetchers-fetchzip-inputs": [ + "index.html#sec-pkgs-fetchers-fetchzip-inputs" + ], + "sec-pkgs-fetchers-fetchzip-examples": [ + "index.html#sec-pkgs-fetchers-fetchzip-examples" + ], + "ex-fetchers-fetchzip-simple-striproot": [ + "index.html#ex-fetchers-fetchzip-simple-striproot" + ], + "ex-fetchers-fetchzip-rar-archive": [ + "index.html#ex-fetchers-fetchzip-rar-archive" + ], + "fetchpatch": [ + "index.html#fetchpatch" + ], + "fetchdebianpatch": [ + "index.html#fetchdebianpatch" + ], + "fetchsvn": [ + "index.html#fetchsvn" + ], + "fetchgit": [ + "index.html#fetchgit" + ], + "fetchfossil": [ + "index.html#fetchfossil" + ], + "fetchcvs": [ + "index.html#fetchcvs" + ], + "fetchhg": [ + "index.html#fetchhg" + ], + "fetchfromgitea": [ + "index.html#fetchfromgitea" + ], + "fetchfromgithub": [ + "index.html#fetchfromgithub" + ], + "fetchfromgitlab": [ + "index.html#fetchfromgitlab" + ], + "fetchfromgitiles": [ + "index.html#fetchfromgitiles" + ], + "fetchfrombitbucket": [ + "index.html#fetchfrombitbucket" + ], + "fetchfromsavannah": [ + "index.html#fetchfromsavannah" + ], + "fetchfromrepoorcz": [ + "index.html#fetchfromrepoorcz" + ], + "fetchfromsourcehut": [ + "index.html#fetchfromsourcehut" + ], + "requirefile": [ + "index.html#requirefile" + ], + "fetchtorrent": [ + "index.html#fetchtorrent" + ], + "fetchtorrent-parameters": [ + "index.html#fetchtorrent-parameters" + ], + "chap-trivial-builders": [ + "index.html#chap-trivial-builders" + ], + "trivial-builder-runCommandWith": [ + "index.html#trivial-builder-runCommandWith" + ], + "trivial-builder-runCommandWith-Type": [ + "index.html#trivial-builder-runCommandWith-Type" + ], + "trivial-builder-runCommandWith-Inputs": [ + "index.html#trivial-builder-runCommandWith-Inputs" + ], + "ex-runcommandwith": [ + "index.html#ex-runcommandwith" + ], + "trivial-builder-runCommand": [ + "index.html#trivial-builder-runCommand" + ], + "trivial-builder-runCommand-Type": [ + "index.html#trivial-builder-runCommand-Type" + ], + "trivial-builder-runCommand-Input": [ + "index.html#trivial-builder-runCommand-Input" + ], + "ex-runcommand-simple": [ + "index.html#ex-runcommand-simple" + ], + "trivial-builder-text-writing": [ + "index.html#trivial-builder-text-writing" + ], + "trivial-builder-makeDesktopItem": [ + "index.html#trivial-builder-makeDesktopItem" + ], + "trivial-builder-makeDesktopItem-inputs": [ + "index.html#trivial-builder-makeDesktopItem-inputs" + ], + "trivial-builder-makeDesktopItem-examples": [ + "index.html#trivial-builder-makeDesktopItem-examples" + ], + "ex-makeDesktopItem": [ + "index.html#ex-makeDesktopItem" + ], + "ex2-makeDesktopItem": [ + "index.html#ex2-makeDesktopItem" + ], + "trivial-builder-writeTextFile": [ + "index.html#trivial-builder-writeTextFile" + ], + "ex-writeTextFile": [ + "index.html#ex-writeTextFile" + ], + "ex2-writeTextFile": [ + "index.html#ex2-writeTextFile" + ], + "ex3-writeTextFile": [ + "index.html#ex3-writeTextFile" + ], + "trivial-builder-writeText": [ + "index.html#trivial-builder-writeText" + ], + "ex-writeText": [ + "index.html#ex-writeText" + ], + "trivial-builder-writeTextDir": [ + "index.html#trivial-builder-writeTextDir" + ], + "ex-writeTextDir": [ + "index.html#ex-writeTextDir" + ], + "trivial-builder-writeScript": [ + "index.html#trivial-builder-writeScript" + ], + "ex-writeScript": [ + "index.html#ex-writeScript" + ], + "trivial-builder-writeScriptBin": [ + "index.html#trivial-builder-writeScriptBin" + ], + "ex-writeScriptBin": [ + "index.html#ex-writeScriptBin" + ], + "trivial-builder-writeShellScript": [ + "index.html#trivial-builder-writeShellScript" + ], + "ex-writeShellScript": [ + "index.html#ex-writeShellScript" + ], + "trivial-builder-writeShellScriptBin": [ + "index.html#trivial-builder-writeShellScriptBin" + ], + "ex-writeShellScriptBin": [ + "index.html#ex-writeShellScriptBin" + ], + "trivial-builder-concatText": [ + "index.html#trivial-builder-concatText" + ], + "trivial-builder-writeShellApplication": [ + "index.html#trivial-builder-writeShellApplication" + ], + "trivial-builder-symlinkJoin": [ + "index.html#trivial-builder-symlinkJoin" + ], + "trivial-builder-writeReferencesToFile": [ + "index.html#trivial-builder-writeReferencesToFile" + ], + "trivial-builder-writeClosure": [ + "index.html#trivial-builder-writeClosure" + ], + "trivial-builder-writeDirectReferencesToFile": [ + "index.html#trivial-builder-writeDirectReferencesToFile" + ], + "chap-testers": [ + "index.html#chap-testers" + ], + "tester-hasPkgConfigModules": [ + "index.html#tester-hasPkgConfigModules" + ], + "tester-hasPkgConfigModule": [ + "index.html#tester-hasPkgConfigModule" + ], + "ex-haspkgconfigmodules-defaultvalues": [ + "index.html#ex-haspkgconfigmodules-defaultvalues" + ], + "ex-haspkgconfigmodules-explicitmodules": [ + "index.html#ex-haspkgconfigmodules-explicitmodules" + ], + "tester-lycheeLinkCheck": [ + "index.html#tester-lycheeLinkCheck" + ], + "ex-lycheelinkcheck": [ + "index.html#ex-lycheelinkcheck" + ], + "tester-lycheeLinkCheck-return": [ + "index.html#tester-lycheeLinkCheck-return" + ], + "tester-lycheeLinkCheck-inputs": [ + "index.html#tester-lycheeLinkCheck-inputs" + ], + "tester-shellcheck": [ + "index.html#tester-shellcheck" + ], + "ex-shellcheck": [ + "index.html#ex-shellcheck" + ], + "tester-shellcheck-inputs": [ + "index.html#tester-shellcheck-inputs" + ], + "tester-shellcheck-param-src": [ + "index.html#tester-shellcheck-param-src" + ], + "tester-shellcheck-return": [ + "index.html#tester-shellcheck-return" + ], + "tester-testVersion": [ + "index.html#tester-testVersion" + ], + "ex-testversion-hello": [ + "index.html#ex-testversion-hello" + ], + "ex-testversion-different-commandversion": [ + "index.html#ex-testversion-different-commandversion" + ], + "tester-testBuildFailure": [ + "index.html#tester-testBuildFailure" + ], + "ex-testBuildFailure-showingenvironmentchanges": [ + "index.html#ex-testBuildFailure-showingenvironmentchanges" + ], + "tester-testEqualContents": [ + "index.html#tester-testEqualContents" + ], + "ex-testEqualContents-toyexample": [ + "index.html#ex-testEqualContents-toyexample" + ], + "tester-testEqualDerivation": [ + "index.html#tester-testEqualDerivation" + ], + "ex-testEqualDerivation-hello": [ + "index.html#ex-testEqualDerivation-hello" + ], + "tester-invalidateFetcherByDrvHash": [ + "index.html#tester-invalidateFetcherByDrvHash" + ], + "ex-invalidateFetcherByDrvHash-nix": [ + "index.html#ex-invalidateFetcherByDrvHash-nix" + ], + "tester-runCommand": [ + "index.html#tester-runCommand" + ], + "ex-tester-runCommand-nix": [ + "index.html#ex-tester-runCommand-nix" + ], + "tester-runNixOSTest": [ + "index.html#tester-runNixOSTest" + ], + "ex-runNixOSTest-hello": [ + "index.html#ex-runNixOSTest-hello" + ], + "tester-nixosTest": [ + "index.html#tester-nixosTest" + ], + "tester-nixosTest-parameter": [ + "index.html#tester-nixosTest-parameter" + ], + "tester-nixosTest-result": [ + "index.html#tester-nixosTest-result" + ], + "chap-devShellTools": [ + "index.html#chap-devShellTools" + ], + "sec-devShellTools-valueToString": [ + "index.html#sec-devShellTools-valueToString" + ], + "sec-devShellTools-unstructuredDerivationInputEnv": [ + "index.html#sec-devShellTools-unstructuredDerivationInputEnv" + ], + "sec-devShellTools-derivationOutputEnv": [ + "index.html#sec-devShellTools-derivationOutputEnv" + ], + "chap-special": [ + "index.html#chap-special" + ], + "sec-fakeNss": [ + "index.html#sec-fakeNss" + ], + "sec-fakeNss-inputs": [ + "index.html#sec-fakeNss-inputs" + ], + "sec-fakeNss-examples": [ + "index.html#sec-fakeNss-examples" + ], + "ex-fakeNss-dockerTools-buildImage": [ + "index.html#ex-fakeNss-dockerTools-buildImage" + ], + "ex-fakeNss-overriding": [ + "index.html#ex-fakeNss-overriding" + ], + "sec-fhs-environments": [ + "index.html#sec-fhs-environments" + ], + "sec-pkgs.makeSetupHook": [ + "index.html#sec-pkgs.makeSetupHook" + ], + "sec-pkgs.makeSetupHook-usage": [ + "index.html#sec-pkgs.makeSetupHook-usage" + ], + "sec-pkgs.makeSetupHook-usage-example": [ + "index.html#sec-pkgs.makeSetupHook-usage-example" + ], + "sec-pkgs.makeSetupHook-attributes": [ + "index.html#sec-pkgs.makeSetupHook-attributes" + ], + "sec-pkgs-mkShell": [ + "index.html#sec-pkgs-mkShell" + ], + "sec-pkgs-mkShell-usage": [ + "index.html#sec-pkgs-mkShell-usage" + ], + "sec-pkgs-mkShell-attributes": [ + "index.html#sec-pkgs-mkShell-attributes" + ], + "sec-pkgs-mkShell-variants": [ + "index.html#sec-pkgs-mkShell-variants" + ], + "sec-pkgs-mkShell-building": [ + "index.html#sec-pkgs-mkShell-building" + ], + "sec-vm-tools": [ + "index.html#sec-vm-tools" + ], + "vm-tools-createEmptyImage": [ + "index.html#vm-tools-createEmptyImage" + ], + "vm-tools-createEmptyImage-attributes": [ + "index.html#vm-tools-createEmptyImage-attributes" + ], + "vm-tools-runInLinuxVM": [ + "index.html#vm-tools-runInLinuxVM" + ], + "vm-tools-runInLinuxVM-attributes": [ + "index.html#vm-tools-runInLinuxVM-attributes" + ], + "vm-tools-runInLinuxVM-examples": [ + "index.html#vm-tools-runInLinuxVM-examples" + ], + "vm-tools-extractFs": [ + "index.html#vm-tools-extractFs" + ], + "vm-tools-extractFs-attributes": [ + "index.html#vm-tools-extractFs-attributes" + ], + "vm-tools-extractFs-examples": [ + "index.html#vm-tools-extractFs-examples" + ], + "vm-tools-extractMTDfs": [ + "index.html#vm-tools-extractMTDfs" + ], + "vm-tools-runInLinuxImage": [ + "index.html#vm-tools-runInLinuxImage" + ], + "vm-tools-makeImageTestScript": [ + "index.html#vm-tools-makeImageTestScript" + ], + "vm-tools-makeImageTestScript-examples": [ + "index.html#vm-tools-makeImageTestScript-examples" + ], + "vm-tools-diskImageFuns": [ + "index.html#vm-tools-diskImageFuns" + ], + "vm-tools-diskImageFuns-images": [ + "index.html#vm-tools-diskImageFuns-images" + ], + "vm-tools-diskImageFuns-attributes": [ + "index.html#vm-tools-diskImageFuns-attributes" + ], + "vm-tools-diskImageFuns-examples": [ + "index.html#vm-tools-diskImageFuns-examples" + ], + "vm-tools-diskImageExtraFuns": [ + "index.html#vm-tools-diskImageExtraFuns" + ], + "vm-tools-diskImages": [ + "index.html#vm-tools-diskImages" + ], + "sec-checkpoint-build": [ + "index.html#sec-checkpoint-build" + ], + "sec-checkpoint-build-example": [ + "index.html#sec-checkpoint-build-example" + ], + "chap-images": [ + "index.html#chap-images" + ], + "sec-pkgs-appimageTools": [ + "index.html#sec-pkgs-appimageTools" + ], + "ssec-pkgs-appimageTools-wrapping": [ + "index.html#ssec-pkgs-appimageTools-wrapping" + ], + "ex-wrapping-appimage-from-github": [ + "index.html#ex-wrapping-appimage-from-github" + ], + "ex-wrapping-appimage-with-extrapkgs": [ + "index.html#ex-wrapping-appimage-with-extrapkgs" + ], + "ssec-pkgs-appimageTools-extracting": [ + "index.html#ssec-pkgs-appimageTools-extracting" + ], + "ex-extracting-appimage": [ + "index.html#ex-extracting-appimage" + ], + "ex-extracting-appimage-with-postextract": [ + "index.html#ex-extracting-appimage-with-postextract" + ], + "sec-pkgs-dockerTools": [ + "index.html#sec-pkgs-dockerTools" + ], + "ssec-pkgs-dockerTools-buildImage": [ + "index.html#ssec-pkgs-dockerTools-buildImage" + ], + "ssec-pkgs-dockerTools-buildImage-inputs": [ + "index.html#ssec-pkgs-dockerTools-buildImage-inputs" + ], + "ssec-pkgs-dockerTools-buildImage-passthru-outputs": [ + "index.html#ssec-pkgs-dockerTools-buildImage-passthru-outputs" + ], + "ssec-pkgs-dockerTools-buildImage-examples": [ + "index.html#ssec-pkgs-dockerTools-buildImage-examples" + ], + "ex-dockerTools-buildImage": [ + "index.html#ex-dockerTools-buildImage" + ], + "ex-dockerTools-buildImage-runAsRoot": [ + "index.html#ex-dockerTools-buildImage-runAsRoot" + ], + "ex-dockerTools-buildImage-extraCommands": [ + "index.html#ex-dockerTools-buildImage-extraCommands" + ], + "ex-dockerTools-buildImage-creatednow": [ + "index.html#ex-dockerTools-buildImage-creatednow" + ], + "ssec-pkgs-dockerTools-buildLayeredImage": [ + "index.html#ssec-pkgs-dockerTools-buildLayeredImage" + ], + "ssec-pkgs-dockerTools-buildLayeredImage-examples": [ + "index.html#ssec-pkgs-dockerTools-buildLayeredImage-examples" + ], + "ex-dockerTools-buildLayeredImage-hello": [ + "index.html#ex-dockerTools-buildLayeredImage-hello" + ], + "ssec-pkgs-dockerTools-streamLayeredImage": [ + "index.html#ssec-pkgs-dockerTools-streamLayeredImage" + ], + "ssec-pkgs-dockerTools-streamLayeredImage-inputs": [ + "index.html#ssec-pkgs-dockerTools-streamLayeredImage-inputs" + ], + "dockerTools-buildLayeredImage-arg-contents": [ + "index.html#dockerTools-buildLayeredImage-arg-contents" + ], + "dockerTools-buildLayeredImage-arg-config": [ + "index.html#dockerTools-buildLayeredImage-arg-config" + ], + "dockerTools-buildLayeredImage-arg-uid": [ + "index.html#dockerTools-buildLayeredImage-arg-uid" + ], + "dockerTools-buildLayeredImage-arg-gid": [ + "index.html#dockerTools-buildLayeredImage-arg-gid" + ], + "dockerTools-buildLayeredImage-arg-uname": [ + "index.html#dockerTools-buildLayeredImage-arg-uname" + ], + "dockerTools-buildLayeredImage-arg-gname": [ + "index.html#dockerTools-buildLayeredImage-arg-gname" + ], + "dockerTools-buildLayeredImage-arg-maxLayers": [ + "index.html#dockerTools-buildLayeredImage-arg-maxLayers" + ], + "ssec-pkgs-dockerTools-streamLayeredImage-passthru-outputs": [ + "index.html#ssec-pkgs-dockerTools-streamLayeredImage-passthru-outputs" + ], + "ssec-pkgs-dockerTools-streamLayeredImage-examples": [ + "index.html#ssec-pkgs-dockerTools-streamLayeredImage-examples" + ], + "ex-dockerTools-streamLayeredImage-hello": [ + "index.html#ex-dockerTools-streamLayeredImage-hello" + ], + "ex-dockerTools-streamLayeredImage-exploringlayers": [ + "index.html#ex-dockerTools-streamLayeredImage-exploringlayers" + ], + "ex-dockerTools-streamLayeredImage-configclosure": [ + "index.html#ex-dockerTools-streamLayeredImage-configclosure" + ], + "ssec-pkgs-dockerTools-fetchFromRegistry": [ + "index.html#ssec-pkgs-dockerTools-fetchFromRegistry" + ], + "ssec-pkgs-dockerTools-pullImage": [ + "index.html#ssec-pkgs-dockerTools-pullImage" + ], + "ssec-pkgs-dockerTools-pullImage-inputs": [ + "index.html#ssec-pkgs-dockerTools-pullImage-inputs" + ], + "ssec-pkgs-dockerTools-pullImage-examples": [ + "index.html#ssec-pkgs-dockerTools-pullImage-examples" + ], + "ex-dockerTools-pullImage-niximage": [ + "index.html#ex-dockerTools-pullImage-niximage" + ], + "ex-dockerTools-pullImage-differentregistry": [ + "index.html#ex-dockerTools-pullImage-differentregistry" + ], + "ex-dockerTools-pullImage-nixprefetchdocker": [ + "index.html#ex-dockerTools-pullImage-nixprefetchdocker" + ], + "ssec-pkgs-dockerTools-exportImage": [ + "index.html#ssec-pkgs-dockerTools-exportImage" + ], + "ssec-pkgs-dockerTools-exportImage-inputs": [ + "index.html#ssec-pkgs-dockerTools-exportImage-inputs" + ], + "ssec-pkgs-dockerTools-exportImage-examples": [ + "index.html#ssec-pkgs-dockerTools-exportImage-examples" + ], + "ex-dockerTools-exportImage-hello": [ + "index.html#ex-dockerTools-exportImage-hello" + ], + "ex-dockerTools-exportImage-importingDocker": [ + "index.html#ex-dockerTools-exportImage-importingDocker" + ], + "ex-dockerTools-exportImage-naming": [ + "index.html#ex-dockerTools-exportImage-naming" + ], + "ex-dockerTools-exportImage-fromImagePath": [ + "index.html#ex-dockerTools-exportImage-fromImagePath" + ], + "ssec-pkgs-dockerTools-helpers": [ + "index.html#ssec-pkgs-dockerTools-helpers" + ], + "sssec-pkgs-dockerTools-helpers-usrBinEnv": [ + "index.html#sssec-pkgs-dockerTools-helpers-usrBinEnv" + ], + "sssec-pkgs-dockerTools-helpers-binSh": [ + "index.html#sssec-pkgs-dockerTools-helpers-binSh" + ], + "sssec-pkgs-dockerTools-helpers-caCertificates": [ + "index.html#sssec-pkgs-dockerTools-helpers-caCertificates" + ], + "ssec-pkgs-dockerTools-fakeNss": [ + "index.html#ssec-pkgs-dockerTools-fakeNss" + ], + "sssec-pkgs-dockerTools-helpers-fakeNss": [ + "index.html#sssec-pkgs-dockerTools-helpers-fakeNss" + ], + "ssec-pkgs-dockerTools-shadowSetup": [ + "index.html#ssec-pkgs-dockerTools-shadowSetup" + ], + "ssec-pkgs-dockerTools-helpers-examples": [ + "index.html#ssec-pkgs-dockerTools-helpers-examples" + ], + "ex-dockerTools-helpers-buildImage": [ + "index.html#ex-dockerTools-helpers-buildImage" + ], + "ex-dockerTools-helpers-buildLayeredImage": [ + "index.html#ex-dockerTools-helpers-buildLayeredImage" + ], + "ex-dockerTools-shadowSetup-buildImage": [ + "index.html#ex-dockerTools-shadowSetup-buildImage" + ], + "ex-dockerTools-shadowSetup-buildLayeredImage": [ + "index.html#ex-dockerTools-shadowSetup-buildLayeredImage" + ], + "ssec-pkgs-dockerTools-buildNixShellImage-arguments": [ + "index.html#ssec-pkgs-dockerTools-buildNixShellImage-arguments" + ], + "ssec-pkgs-dockerTools-buildNixShellImage": [ + "index.html#ssec-pkgs-dockerTools-buildNixShellImage" + ], + "ssec-pkgs-dockerTools-buildNixShellImage-example": [ + "index.html#ssec-pkgs-dockerTools-buildNixShellImage-example" + ], + "ssec-pkgs-dockerTools-buildNixShellImage-examples": [ + "index.html#ssec-pkgs-dockerTools-buildNixShellImage-examples" + ], + "ex-dockerTools-buildNixShellImage-hello": [ + "index.html#ex-dockerTools-buildNixShellImage-hello" + ], + "ssec-pkgs-dockerTools-streamNixShellImage": [ + "index.html#ssec-pkgs-dockerTools-streamNixShellImage" + ], + "ssec-pkgs-dockerTools-streamNixShellImage-inputs": [ + "index.html#ssec-pkgs-dockerTools-streamNixShellImage-inputs" + ], + "ssec-pkgs-dockerTools-streamNixShellImage-examples": [ + "index.html#ssec-pkgs-dockerTools-streamNixShellImage-examples" + ], + "ex-dockerTools-streamNixShellImage-hello": [ + "index.html#ex-dockerTools-streamNixShellImage-hello" + ], + "ex-dockerTools-streamNixShellImage-extendingBuildInputs": [ + "index.html#ex-dockerTools-streamNixShellImage-extendingBuildInputs" + ], + "ex-dockerTools-streamNixShellImage-addingShellHook": [ + "index.html#ex-dockerTools-streamNixShellImage-addingShellHook" + ], + "sec-pkgs-ociTools": [ + "index.html#sec-pkgs-ociTools" + ], + "ssec-pkgs-ociTools-buildContainer": [ + "index.html#ssec-pkgs-ociTools-buildContainer" + ], + "ssec-pkgs-ociTools-buildContainer-inputs": [ + "index.html#ssec-pkgs-ociTools-buildContainer-inputs" + ], + "ssec-pkgs-ociTools-buildContainer-examples": [ + "index.html#ssec-pkgs-ociTools-buildContainer-examples" + ], + "ex-ociTools-buildContainer-bash": [ + "index.html#ex-ociTools-buildContainer-bash" + ], + "sec-pkgs-portableService": [ + "index.html#sec-pkgs-portableService" + ], + "ssec-pkgs-portableService-inputs": [ + "index.html#ssec-pkgs-portableService-inputs" + ], + "ssec-pkgs-portableService-examples": [ + "index.html#ssec-pkgs-portableService-examples" + ], + "ex-pkgs-portableService": [ + "index.html#ex-pkgs-portableService" + ], + "ex-portableService-hello": [ + "index.html#ex-portableService-hello" + ], + "ex-portableService-symlinks": [ + "index.html#ex-portableService-symlinks" + ], + "sec-make-disk-image": [ + "index.html#sec-make-disk-image" + ], + "sec-make-disk-image-features": [ + "index.html#sec-make-disk-image-features" + ], + "sec-make-disk-image-features-common": [ + "index.html#sec-make-disk-image-features-common" + ], + "sec-make-disk-image-features-full-image": [ + "index.html#sec-make-disk-image-features-full-image" + ], + "sec-make-disk-image-features-reproducibility": [ + "index.html#sec-make-disk-image-features-reproducibility" + ], + "sec-make-disk-image-usage": [ + "index.html#sec-make-disk-image-usage" + ], + "sec-pkgs-binary-cache": [ + "index.html#sec-pkgs-binary-cache" + ], + "sec-pkgs-binary-cache-example": [ + "index.html#sec-pkgs-binary-cache-example" + ], + "ex-mkbinarycache-copying-package-closure": [ + "index.html#ex-mkbinarycache-copying-package-closure" + ], + "chap-hooks": [ + "index.html#chap-hooks" + ], + "setup-hook-autoconf": [ + "index.html#setup-hook-autoconf" + ], + "setup-hook-automake": [ + "index.html#setup-hook-automake" + ], + "setup-hook-autopatchelfhook": [ + "index.html#setup-hook-autopatchelfhook" + ], + "aws-c-common": [ + "index.html#aws-c-common" + ], + "bmake-hook": [ + "index.html#bmake-hook" + ], + "breakpointhook": [ + "index.html#breakpointhook" + ], + "cernlib-hook": [ + "index.html#cernlib-hook" + ], + "cmake": [ + "index.html#cmake" + ], + "cmake-variables-controlling": [ + "index.html#cmake-variables-controlling" + ], + "cmake-exclusive-variables": [ + "index.html#cmake-exclusive-variables" + ], + "cmake-flags": [ + "index.html#cmake-flags" + ], + "cmake-build-dir": [ + "index.html#cmake-build-dir" + ], + "dont-use-cmake-configure": [ + "index.html#dont-use-cmake-configure" + ], + "desktop-file-utils": [ + "index.html#desktop-file-utils" + ], + "setup-hook-gdk-pixbuf": [ + "index.html#setup-hook-gdk-pixbuf" + ], + "ghc": [ + "index.html#ghc" + ], + "gnome-platform": [ + "index.html#gnome-platform" + ], + "haredo-hook": [ + "index.html#haredo-hook" + ], + "haredo-hook-buildPhase": [ + "index.html#haredo-hook-buildPhase" + ], + "haredo-hook-haredoBuildTargets": [ + "index.html#haredo-hook-haredoBuildTargets" + ], + "haredo-hook-dontUseHaredoBuild": [ + "index.html#haredo-hook-dontUseHaredoBuild" + ], + "haredo-hook-checkPhase": [ + "index.html#haredo-hook-checkPhase" + ], + "haredo-hook-haredoCheckTargets": [ + "index.html#haredo-hook-haredoCheckTargets" + ], + "haredo-hook-dontUseHaredoCheck": [ + "index.html#haredo-hook-dontUseHaredoCheck" + ], + "haredo-hook-installPhase": [ + "index.html#haredo-hook-installPhase" + ], + "haredo-hook-haredoInstallTargets": [ + "index.html#haredo-hook-haredoInstallTargets" + ], + "haredo-hook-dontUseHaredoInstall": [ + "index.html#haredo-hook-dontUseHaredoInstall" + ], + "installshellfiles": [ + "index.html#installshellfiles" + ], + "installshellfiles-installbin": [ + "index.html#installshellfiles-installbin" + ], + "installshellfiles-installbin-exampleusage": [ + "index.html#installshellfiles-installbin-exampleusage" + ], + "installshellfiles-installmanpage": [ + "index.html#installshellfiles-installmanpage" + ], + "installshellfiles-installmanpage-exampleusage": [ + "index.html#installshellfiles-installmanpage-exampleusage" + ], + "installshellfiles-installshellcompletion": [ + "index.html#installshellfiles-installshellcompletion" + ], + "installshellfiles-installshellcompletion-exampleusage": [ + "index.html#installshellfiles-installshellcompletion-exampleusage" + ], + "installshellfiles-installshellcompletion-exampleusage-guarded": [ + "index.html#installshellfiles-installshellcompletion-exampleusage-guarded" + ], + "just-hook": [ + "index.html#just-hook" + ], + "just-hook-justFlags": [ + "index.html#just-hook-justFlags" + ], + "just-hook-buildPhase": [ + "index.html#just-hook-buildPhase" + ], + "just-hook-dontUseJustBuild": [ + "index.html#just-hook-dontUseJustBuild" + ], + "just-hook-checkPhase": [ + "index.html#just-hook-checkPhase" + ], + "just-hook-dontUseJustCheck": [ + "index.html#just-hook-dontUseJustCheck" + ], + "just-hook-installPhase": [ + "index.html#just-hook-installPhase" + ], + "just-hook-dontUseJustInstall": [ + "index.html#just-hook-dontUseJustInstall" + ], + "libiconv-libintl": [ + "index.html#libiconv-libintl" + ], + "setup-hook-libxml2": [ + "index.html#setup-hook-libxml2" + ], + "meson": [ + "index.html#meson" + ], + "meson-variables-controlling": [ + "index.html#meson-variables-controlling" + ], + "meson-exclusive-variables": [ + "index.html#meson-exclusive-variables" + ], + "meson-flags": [ + "index.html#meson-flags" + ], + "meson-build-dir": [ + "index.html#meson-build-dir" + ], + "meson-wrap-mode": [ + "index.html#meson-wrap-mode" + ], + "meson-build-type": [ + "index.html#meson-build-type" + ], + "meson-auto-features": [ + "index.html#meson-auto-features" + ], + "meson-check-flags": [ + "index.html#meson-check-flags" + ], + "meson-install-flags": [ + "index.html#meson-install-flags" + ], + "meson-install-tags": [ + "index.html#meson-install-tags" + ], + "dont-use-meson-configure": [ + "index.html#dont-use-meson-configure" + ], + "dont-use-meson-check": [ + "index.html#dont-use-meson-check" + ], + "dont-use-meson-install": [ + "index.html#dont-use-meson-install" + ], + "meson-honored-variables": [ + "index.html#meson-honored-variables" + ], + "setup-hook-mpi-check": [ + "index.html#setup-hook-mpi-check" + ], + "ninja": [ + "index.html#ninja" + ], + "sec-patchRcPathHooks": [ + "index.html#sec-patchRcPathHooks" + ], + "setup-hook-perl": [ + "index.html#setup-hook-perl" + ], + "setup-hook-pkg-config": [ + "index.html#setup-hook-pkg-config" + ], + "sec-postgresqlTestHook": [ + "index.html#sec-postgresqlTestHook" + ], + "sec-postgresqlTestHook-variables": [ + "index.html#sec-postgresqlTestHook-variables" + ], + "sec-postgresqlTestHook-hooks": [ + "index.html#sec-postgresqlTestHook-hooks" + ], + "sec-postgresqlTestHook-tcp": [ + "index.html#sec-postgresqlTestHook-tcp" + ], + "premake-hook": [ + "index.html#premake-hook" + ], + "premake-hook-premakefile": [ + "index.html#premake-hook-premakefile" + ], + "premake-hook-premakeFlagsArray": [ + "index.html#premake-hook-premakeFlagsArray" + ], + "setup-hook-python": [ + "index.html#setup-hook-python" + ], + "scons": [ + "index.html#scons" + ], + "tauri-hook": [ + "index.html#tauri-hook" + ], + "tauri-hook-example-code-snippet": [ + "index.html#tauri-hook-example-code-snippet" + ], + "tauri-hook-variables-controlling": [ + "index.html#tauri-hook-variables-controlling" + ], + "tauri-hook-exclusive-variables": [ + "index.html#tauri-hook-exclusive-variables" + ], + "tauri-build-flags": [ + "index.html#tauri-build-flags" + ], + "tauri-bundle-type": [ + "index.html#tauri-bundle-type" + ], + "dont-tauri-build": [ + "index.html#dont-tauri-build" + ], + "dont-tauri-install": [ + "index.html#dont-tauri-install" + ], + "tauri-hook-honored-variables": [ + "index.html#tauri-hook-honored-variables" + ], + "tetex-tex-live": [ + "index.html#tetex-tex-live" + ], + "unzip": [ + "index.html#unzip" + ], + "validatepkgconfig": [ + "index.html#validatepkgconfig" + ], + "versioncheckhook": [ + "index.html#versioncheckhook" + ], + "waf-hook": [ + "index.html#waf-hook" + ], + "waf-hook-variables-controlling": [ + "index.html#waf-hook-variables-controlling" + ], + "waf-hook-exclusive-variables": [ + "index.html#waf-hook-exclusive-variables" + ], + "waf-path": [ + "index.html#waf-path" + ], + "waf-flags": [ + "index.html#waf-flags" + ], + "dont-use-waf-configure": [ + "index.html#dont-use-waf-configure" + ], + "dont-use-waf-build": [ + "index.html#dont-use-waf-build" + ], + "dont-use-waf-install": [ + "index.html#dont-use-waf-install" + ], + "waf-hook-similar-variables": [ + "index.html#waf-hook-similar-variables" + ], + "waf-hook-honored-variables": [ + "index.html#waf-hook-honored-variables" + ], + "zig-hook": [ + "index.html#zig-hook" + ], + "zig-hook-example-code-snippet": [ + "index.html#zig-hook-example-code-snippet" + ], + "zig-hook-variables-controlling": [ + "index.html#zig-hook-variables-controlling" + ], + "zig-hook-exclusive-variables": [ + "index.html#zig-hook-exclusive-variables" + ], + "dont-use-zig-build": [ + "index.html#dont-use-zig-build" + ], + "dont-use-zig-check": [ + "index.html#dont-use-zig-check" + ], + "dont-use-zig-install": [ + "index.html#dont-use-zig-install" + ], + "zig-hook-similar-variables": [ + "index.html#zig-hook-similar-variables" + ], + "zig-hook-variables-honored": [ + "index.html#zig-hook-variables-honored" + ], + "xcbuildhook": [ + "index.html#xcbuildhook" + ], + "xfce4-dev-tools": [ + "index.html#xfce4-dev-tools" + ], + "dontUseXdtAutogenPhase": [ + "index.html#dontUseXdtAutogenPhase" + ], + "chap-language-support": [ + "index.html#chap-language-support" + ], + "example-navigte-nix-repl": [ + "index.html#example-navigte-nix-repl" + ], + "example-list-haskellPackages": [ + "index.html#example-list-haskellPackages" + ], + "agda": [ + "index.html#agda" + ], + "how-to-use-agda": [ + "index.html#how-to-use-agda" + ], + "compiling-agda": [ + "index.html#compiling-agda" + ], + "writing-agda-packages": [ + "index.html#writing-agda-packages" + ], + "building-agda-packages": [ + "index.html#building-agda-packages" + ], + "installing-agda-packages": [ + "index.html#installing-agda-packages" + ], + "maintaining-the-agda-package-set-on-nixpkgs": [ + "index.html#maintaining-the-agda-package-set-on-nixpkgs" + ], + "adding-agda-packages-to-nixpkgs": [ + "index.html#adding-agda-packages-to-nixpkgs" + ], + "agda-maintaining-packages": [ + "index.html#agda-maintaining-packages" + ], + "android": [ + "index.html#android" + ], + "using-androidenv-with-android-studio": [ + "index.html#using-androidenv-with-android-studio" + ], + "deploying-an-android-sdk-installation-with-plugins": [ + "index.html#deploying-an-android-sdk-installation-with-plugins" + ], + "using-predefined-android-package-compositions": [ + "index.html#using-predefined-android-package-compositions" + ], + "spawning-emulator-instances": [ + "index.html#spawning-emulator-instances" + ], + "notes-on-environment-variables-in-android-projects": [ + "index.html#notes-on-environment-variables-in-android-projects" + ], + "notes-on-improving-build.gradle-compatibility": [ + "index.html#notes-on-improving-build.gradle-compatibility" + ], + "querying-the-available-versions-of-each-plugin": [ + "index.html#querying-the-available-versions-of-each-plugin" + ], + "updating-the-generated-expressions": [ + "index.html#updating-the-generated-expressions" + ], + "building-an-android-application-with-ant": [ + "index.html#building-an-android-application-with-ant" + ], + "sec-beam": [ + "index.html#sec-beam" + ], + "beam-introduction": [ + "index.html#beam-introduction" + ], + "available-versions-and-deprecations-schedule": [ + "index.html#available-versions-and-deprecations-schedule" + ], + "elixir": [ + "index.html#elixir" + ], + "beam-structure": [ + "index.html#beam-structure" + ], + "build-tools": [ + "index.html#build-tools" + ], + "build-tools-rebar3": [ + "index.html#build-tools-rebar3" + ], + "build-tools-other": [ + "index.html#build-tools-other" + ], + "how-to-install-beam-packages": [ + "index.html#how-to-install-beam-packages" + ], + "ex-beam-ephemeral-shell": [ + "index.html#ex-beam-ephemeral-shell" + ], + "ex-beam-declarative-shell": [ + "index.html#ex-beam-declarative-shell" + ], + "packaging-beam-applications": [ + "index.html#packaging-beam-applications" + ], + "packaging-erlang-applications": [ + "index.html#packaging-erlang-applications" + ], + "rebar3-packages": [ + "index.html#rebar3-packages" + ], + "erlang-mk-packages": [ + "index.html#erlang-mk-packages" + ], + "mix-packages": [ + "index.html#mix-packages" + ], + "mix-release-elixir-phoenix-example": [ + "index.html#mix-release-elixir-phoenix-example" + ], + "mix-release-javascript-deps": [ + "index.html#mix-release-javascript-deps" + ], + "mix-release-mix-deps": [ + "index.html#mix-release-mix-deps" + ], + "mix2nix": [ + "index.html#mix2nix" + ], + "fixed-output-derivation": [ + "index.html#fixed-output-derivation" + ], + "mix-release-example": [ + "index.html#mix-release-example" + ], + "example-of-creating-a-service-for-an-elixir---phoenix-project": [ + "index.html#example-of-creating-a-service-for-an-elixir---phoenix-project" + ], + "how-to-develop": [ + "index.html#how-to-develop" + ], + "creating-a-shell": [ + "index.html#creating-a-shell" + ], + "beam-using-overlays": [ + "index.html#beam-using-overlays" + ], + "beam-using-overlays-shell.nix": [ + "index.html#beam-using-overlays-shell.nix" + ], + "elixir---phoenix-project": [ + "index.html#elixir---phoenix-project" + ], + "sec-bower": [ + "index.html#sec-bower" + ], + "ssec-bower2nix-usage": [ + "index.html#ssec-bower2nix-usage" + ], + "ex-bowerJson": [ + "index.html#ex-bowerJson" + ], + "ssec-build-bower-components": [ + "index.html#ssec-build-bower-components" + ], + "ex-buildBowerComponents": [ + "index.html#ex-buildBowerComponents" + ], + "ex-bowerGulpFile": [ + "index.html#ex-bowerGulpFile" + ], + "ex-buildBowerComponentsDefaultNix": [ + "index.html#ex-buildBowerComponentsDefaultNix" + ], + "ssec-bower2nix-troubleshooting": [ + "index.html#ssec-bower2nix-troubleshooting" + ], + "enocache-errors-from-buildbowercomponents": [ + "index.html#enocache-errors-from-buildbowercomponents" + ], + "sec-chicken": [ + "index.html#sec-chicken" + ], + "sec-chicken-using": [ + "index.html#sec-chicken-using" + ], + "sec-chicken-updating-eggs": [ + "index.html#sec-chicken-updating-eggs" + ], + "sec-chicken-adding-eggs": [ + "index.html#sec-chicken-adding-eggs" + ], + "sec-chicken-override-scope": [ + "index.html#sec-chicken-override-scope" + ], + "sec-language-coq": [ + "index.html#sec-language-coq" + ], + "coq-derivation-coq": [ + "index.html#coq-derivation-coq" + ], + "coq-packages-attribute-sets-coqpackages": [ + "index.html#coq-packages-attribute-sets-coqpackages" + ], + "coq-overriding-packages": [ + "index.html#coq-overriding-packages" + ], + "coq-override": [ + "index.html#coq-override" + ], + "coq-overrideCoqDerivation": [ + "index.html#coq-overrideCoqDerivation" + ], + "coq-overrideAttrs": [ + "index.html#coq-overrideAttrs" + ], + "crystal": [ + "index.html#crystal" + ], + "building-a-crystal-package": [ + "index.html#building-a-crystal-package" + ], + "cuda": [ + "index.html#cuda" + ], + "adding-a-new-cuda-release": [ + "index.html#adding-a-new-cuda-release" + ], + "updating-cuda-redistributables": [ + "index.html#updating-cuda-redistributables" + ], + "updating-cutensor": [ + "index.html#updating-cutensor" + ], + "updating-supported-compilers-and-gpus": [ + "index.html#updating-supported-compilers-and-gpus" + ], + "updating-the-cuda-toolkit": [ + "index.html#updating-the-cuda-toolkit" + ], + "updating-the-cuda-package-set": [ + "index.html#updating-the-cuda-package-set" + ], + "cuda-docker-podman": [ + "index.html#cuda-docker-podman" + ], + "specifying-what-devices-to-expose-to-the-container": [ + "index.html#specifying-what-devices-to-expose-to-the-container" + ], + "using-docker-compose": [ + "index.html#using-docker-compose" + ], + "cuelang": [ + "index.html#cuelang" + ], + "cuelang-quickstart": [ + "index.html#cuelang-quickstart" + ], + "cuelang-writeCueValidator": [ + "index.html#cuelang-writeCueValidator" + ], + "sec-language-dart": [ + "index.html#sec-language-dart" + ], + "ssec-dart-applications": [ + "index.html#ssec-dart-applications" + ], + "ssec-dart-applications-patching-dependencies": [ + "index.html#ssec-dart-applications-patching-dependencies" + ], + "ssec-dart-applications-build-tools": [ + "index.html#ssec-dart-applications-build-tools" + ], + "ssec-dart-applications-nix-shell": [ + "index.html#ssec-dart-applications-nix-shell" + ], + "ssec-dart-applications-nix-shell-deps": [ + "index.html#ssec-dart-applications-nix-shell-deps" + ], + "ssec-dart-flutter": [ + "index.html#ssec-dart-flutter" + ], + "ssec-dart-flutter-nix-shell": [ + "index.html#ssec-dart-flutter-nix-shell" + ], + "ssec-dart-flutter-nix-shell-enter": [ + "index.html#ssec-dart-flutter-nix-shell-enter" + ], + "sec-language-dhall": [ + "index.html#sec-language-dhall" + ], + "ssec-dhall-remote-imports": [ + "index.html#ssec-dhall-remote-imports" + ], + "ssec-dhall-packaging-expression": [ + "index.html#ssec-dhall-packaging-expression" + ], + "ssec-dhall-package-contents": [ + "index.html#ssec-dhall-package-contents" + ], + "ssec-dhall-packaging-functions": [ + "index.html#ssec-dhall-packaging-functions" + ], + "ssec-dhall-dhall-to-nixpkgs": [ + "index.html#ssec-dhall-dhall-to-nixpkgs" + ], + "ssec-dhall-remote-imports-as-fod": [ + "index.html#ssec-dhall-remote-imports-as-fod" + ], + "ssec-dhall-overriding-dependency-versions": [ + "index.html#ssec-dhall-overriding-dependency-versions" + ], + "ssec-dhall-overrides": [ + "index.html#ssec-dhall-overrides" + ], + "dlang": [ + "index.html#dlang" + ], + "dub-lockfiles": [ + "index.html#dub-lockfiles" + ], + "builddubpackage-parameters": [ + "index.html#builddubpackage-parameters" + ], + "dotnet": [ + "index.html#dotnet" + ], + "local-development-workflow": [ + "index.html#local-development-workflow" + ], + "using-many-sdks-in-a-workflow": [ + "index.html#using-many-sdks-in-a-workflow" + ], + "dotnet-sdk-vs-dotnetcorepackages.sdk": [ + "index.html#dotnet-sdk-vs-dotnetcorepackages.sdk" + ], + "dotnetcorepackages.sdk-vs-dotnetcorepackages.runtime-vs-dotnetcorepackages.aspnetcore": [ + "index.html#dotnetcorepackages.sdk-vs-dotnetcorepackages.runtime-vs-dotnetcorepackages.aspnetcore" + ], + "packaging-a-dotnet-application": [ + "index.html#packaging-a-dotnet-application" + ], + "dotnet-global-tools": [ + "index.html#dotnet-global-tools" + ], + "packaging-dotnet-global-tools": [ + "index.html#packaging-dotnet-global-tools" + ], + "generating-and-updating-nuget-dependencies": [ + "index.html#generating-and-updating-nuget-dependencies" + ], + "emscripten": [ + "index.html#emscripten" + ], + "declarative-usage": [ + "index.html#declarative-usage" + ], + "usage-1-pkgs.zlib.override": [ + "index.html#usage-1-pkgs.zlib.override" + ], + "usage-2-pkgs.buildemscriptenpackage": [ + "index.html#usage-2-pkgs.buildemscriptenpackage" + ], + "declarative-debugging": [ + "index.html#declarative-debugging" + ], + "sec-language-gnome": [ + "index.html#sec-language-gnome" + ], + "ssec-gnome-packaging": [ + "index.html#ssec-gnome-packaging" + ], + "ssec-gnome-settings": [ + "index.html#ssec-gnome-settings" + ], + "ssec-gnome-gio-modules": [ + "index.html#ssec-gnome-gio-modules" + ], + "ssec-gnome-gdk-pixbuf-loaders": [ + "index.html#ssec-gnome-gdk-pixbuf-loaders" + ], + "ssec-gnome-icons": [ + "index.html#ssec-gnome-icons" + ], + "ssec-icon-theme-packaging": [ + "index.html#ssec-icon-theme-packaging" + ], + "ssec-gnome-themes": [ + "index.html#ssec-gnome-themes" + ], + "ssec-gnome-typelibs": [ + "index.html#ssec-gnome-typelibs" + ], + "ssec-gnome-plugins": [ + "index.html#ssec-gnome-plugins" + ], + "ssec-gnome-hooks": [ + "index.html#ssec-gnome-hooks" + ], + "ssec-gnome-hooks-wrapgappshook": [ + "index.html#ssec-gnome-hooks-wrapgappshook" + ], + "ssec-gnome-hooks-wrapgappshook3": [ + "index.html#ssec-gnome-hooks-wrapgappshook3" + ], + "ssec-gnome-hooks-wrapgappshook4": [ + "index.html#ssec-gnome-hooks-wrapgappshook4" + ], + "ssec-gnome-hooks-wrapgappsnoguihook": [ + "index.html#ssec-gnome-hooks-wrapgappsnoguihook" + ], + "ssec-gnome-hooks-glib": [ + "index.html#ssec-gnome-hooks-glib" + ], + "ssec-gnome-hooks-gdk-pixbuf": [ + "index.html#ssec-gnome-hooks-gdk-pixbuf" + ], + "ssec-gnome-hooks-gtk-drop-icon-theme-cache": [ + "index.html#ssec-gnome-hooks-gtk-drop-icon-theme-cache" + ], + "ssec-gnome-hooks-dconf": [ + "index.html#ssec-gnome-hooks-dconf" + ], + "ssec-gnome-hooks-hicolor-icon-theme": [ + "index.html#ssec-gnome-hooks-hicolor-icon-theme" + ], + "ssec-gnome-hooks-gobject-introspection": [ + "index.html#ssec-gnome-hooks-gobject-introspection" + ], + "ssec-gnome-hooks-gst-grl-plugins": [ + "index.html#ssec-gnome-hooks-gst-grl-plugins" + ], + "ssec-gnome-updating": [ + "index.html#ssec-gnome-updating" + ], + "ssec-gnome-common-issues": [ + "index.html#ssec-gnome-common-issues" + ], + "ssec-gnome-common-issues-no-schemas": [ + "index.html#ssec-gnome-common-issues-no-schemas" + ], + "ssec-gnome-common-issues-missing-schema": [ + "index.html#ssec-gnome-common-issues-missing-schema" + ], + "ssec-gnome-common-issues-double-wrapped": [ + "index.html#ssec-gnome-common-issues-double-wrapped" + ], + "ssec-gnome-common-issues-unwrappable-package": [ + "index.html#ssec-gnome-common-issues-unwrappable-package" + ], + "ssec-gnome-common-issues-unwrappable-package-gnome-shell-ext": [ + "index.html#ssec-gnome-common-issues-unwrappable-package-gnome-shell-ext" + ], + "ssec-gnome-common-issues-unwrappable-package-gsettings": [ + "index.html#ssec-gnome-common-issues-unwrappable-package-gsettings" + ], + "ssec-gnome-common-issues-unwrappable-package-gsettings-vala": [ + "index.html#ssec-gnome-common-issues-unwrappable-package-gsettings-vala" + ], + "ssec-gnome-common-issues-unwrappable-package-gsettings-c": [ + "index.html#ssec-gnome-common-issues-unwrappable-package-gsettings-c" + ], + "ssec-gnome-common-issues-weird-location": [ + "index.html#ssec-gnome-common-issues-weird-location" + ], + "sec-language-go": [ + "index.html#sec-language-go" + ], + "ssec-language-go": [ + "index.html#ssec-language-go" + ], + "buildgomodule-parameters": [ + "index.html#buildgomodule-parameters" + ], + "ex-buildGoModule": [ + "index.html#ex-buildGoModule" + ], + "buildGoModule-vendorHash": [ + "index.html#buildGoModule-vendorHash" + ], + "buildGoModule-goModules-override": [ + "index.html#buildGoModule-goModules-override" + ], + "ssec-go-legacy": [ + "index.html#ssec-go-legacy" + ], + "buildGoPackage-migration": [ + "index.html#buildGoPackage-migration" + ], + "example-for-buildgopackage": [ + "index.html#example-for-buildgopackage" + ], + "ssec-go-common-attributes": [ + "index.html#ssec-go-common-attributes" + ], + "var-go-ldflags": [ + "index.html#var-go-ldflags" + ], + "var-go-tags": [ + "index.html#var-go-tags" + ], + "var-go-deleteVendor": [ + "index.html#var-go-deleteVendor" + ], + "var-go-subPackages": [ + "index.html#var-go-subPackages" + ], + "var-go-excludedPackages": [ + "index.html#var-go-excludedPackages" + ], + "var-go-CGO_ENABLED": [ + "index.html#var-go-CGO_ENABLED" + ], + "var-go-enableParallelBuilding": [ + "index.html#var-go-enableParallelBuilding" + ], + "var-go-allowGoReference": [ + "index.html#var-go-allowGoReference" + ], + "ssec-go-environment": [ + "index.html#ssec-go-environment" + ], + "ssec-skip-go-tests": [ + "index.html#ssec-skip-go-tests" + ], + "gradle": [ + "index.html#gradle" + ], + "building-a-gradle-package": [ + "index.html#building-a-gradle-package" + ], + "gradle-update-script": [ + "index.html#gradle-update-script" + ], + "gradle-environment": [ + "index.html#gradle-environment" + ], + "sec-language-hare": [ + "index.html#sec-language-hare" + ], + "ssec-language-hare": [ + "index.html#ssec-language-hare" + ], + "hareHook-attributes": [ + "index.html#hareHook-attributes" + ], + "ex-hareHook": [ + "index.html#ex-hareHook" + ], + "hareHook-cross-compilation": [ + "index.html#hareHook-cross-compilation" + ], + "haskell": [ + "index.html#haskell" + ], + "haskell-available-packages": [ + "index.html#haskell-available-packages" + ], + "haskell-available-versions": [ + "index.html#haskell-available-versions" + ], + "haskell-dependency-resolution": [ + "index.html#haskell-dependency-resolution" + ], + "haskell-limitations": [ + "index.html#haskell-limitations" + ], + "haskell-mkderivation": [ + "index.html#haskell-mkderivation" + ], + "haskell-derivation-args": [ + "index.html#haskell-derivation-args" + ], + "haskell-derivation-deps": [ + "index.html#haskell-derivation-deps" + ], + "haskell-derivation-meta": [ + "index.html#haskell-derivation-meta" + ], + "haskell-incremental-builds": [ + "index.html#haskell-incremental-builds" + ], + "haskell-development-environments": [ + "index.html#haskell-development-environments" + ], + "haskell-shellFor": [ + "index.html#haskell-shellFor" + ], + "haskell-language-server": [ + "index.html#haskell-language-server" + ], + "haskell-overriding-haskell-packages": [ + "index.html#haskell-overriding-haskell-packages" + ], + "haskell-overriding-a-single-package": [ + "index.html#haskell-overriding-a-single-package" + ], + "haskell-haskell.lib.compose": [ + "index.html#haskell-haskell.lib.compose" + ], + "haskell-packaging-helpers": [ + "index.html#haskell-packaging-helpers" + ], + "haskell-development-helpers": [ + "index.html#haskell-development-helpers" + ], + "haskell-trivial-helpers": [ + "index.html#haskell-trivial-helpers" + ], + "haskell-package-set-lib-functions": [ + "index.html#haskell-package-set-lib-functions" + ], + "haskell-import-from-derivation": [ + "index.html#haskell-import-from-derivation" + ], + "haskell-cabal2nix": [ + "index.html#haskell-cabal2nix" + ], + "haskell-faq": [ + "index.html#haskell-faq" + ], + "haskell-why-not-covered": [ + "index.html#haskell-why-not-covered" + ], + "haskell-faq-override-profiling": [ + "index.html#haskell-faq-override-profiling" + ], + "sec-language-hy": [ + "index.html#sec-language-hy" + ], + "ssec-hy-installation": [ + "index.html#ssec-hy-installation" + ], + "installation-without-packages": [ + "index.html#installation-without-packages" + ], + "installation-with-packages": [ + "index.html#installation-with-packages" + ], + "idris": [ + "index.html#idris" + ], + "installing-idris": [ + "index.html#installing-idris" + ], + "starting-idris-with-library-support": [ + "index.html#starting-idris-with-library-support" + ], + "building-an-idris-project-with-nix": [ + "index.html#building-an-idris-project-with-nix" + ], + "passing-options-to-idris-commands": [ + "index.html#passing-options-to-idris-commands" + ], + "sec-idris2": [ + "index.html#sec-idris2" + ], + "ios": [ + "index.html#ios" + ], + "deploying-a-proxy-component-wrapper-exposing-xcode": [ + "index.html#deploying-a-proxy-component-wrapper-exposing-xcode" + ], + "building-an-ios-application": [ + "index.html#building-an-ios-application" + ], + "spawning-simulator-instances": [ + "index.html#spawning-simulator-instances" + ], + "troubleshooting": [ + "index.html#troubleshooting" + ], + "sec-language-java": [ + "index.html#sec-language-java" + ], + "language-javascript": [ + "index.html#language-javascript" + ], + "javascript-introduction": [ + "index.html#javascript-introduction" + ], + "javascript-finding-examples": [ + "index.html#javascript-finding-examples" + ], + "javascript-finding-examples-github": [ + "index.html#javascript-finding-examples-github" + ], + "javascript-finding-examples-gitlab": [ + "index.html#javascript-finding-examples-gitlab" + ], + "javascript-tools-overview": [ + "index.html#javascript-tools-overview" + ], + "javascript-general-principles": [ + "index.html#javascript-general-principles" + ], + "javascript-upstream-node-version": [ + "index.html#javascript-upstream-node-version" + ], + "javascript-upstream-package-manager": [ + "index.html#javascript-upstream-package-manager" + ], + "javascript-upstream-package-json": [ + "index.html#javascript-upstream-package-json" + ], + "javascript-using-node_modules": [ + "index.html#javascript-using-node_modules" + ], + "javascript-packages-nixpkgs": [ + "index.html#javascript-packages-nixpkgs" + ], + "javascript-adding-or-updating-packages": [ + "index.html#javascript-adding-or-updating-packages" + ], + "javascript-git-error": [ + "index.html#javascript-git-error" + ], + "javascript-tool-specific": [ + "index.html#javascript-tool-specific" + ], + "javascript-buildNpmPackage": [ + "index.html#javascript-buildNpmPackage" + ], + "javascript-buildNpmPackage-arguments": [ + "index.html#javascript-buildNpmPackage-arguments" + ], + "javascript-buildNpmPackage-prefetch-npm-deps": [ + "index.html#javascript-buildNpmPackage-prefetch-npm-deps" + ], + "javascript-buildNpmPackage-fetchNpmDeps": [ + "index.html#javascript-buildNpmPackage-fetchNpmDeps" + ], + "javascript-buildNpmPackage-importNpmLock": [ + "index.html#javascript-buildNpmPackage-importNpmLock" + ], + "javascript-buildNpmPackage-inputs": [ + "index.html#javascript-buildNpmPackage-inputs" + ], + "javascript-buildNpmPackage-example": [ + "index.html#javascript-buildNpmPackage-example" + ], + "javascript-buildNpmPackage-example-fetcherOpts": [ + "index.html#javascript-buildNpmPackage-example-fetcherOpts" + ], + "javascript-buildNpmPackage-importNpmLock.buildNodeModules": [ + "index.html#javascript-buildNpmPackage-importNpmLock.buildNodeModules" + ], + "javascript-corepack": [ + "index.html#javascript-corepack" + ], + "javascript-node2nix": [ + "index.html#javascript-node2nix" + ], + "javascript-node2nix-preparation": [ + "index.html#javascript-node2nix-preparation" + ], + "javascript-node2nix-pitfalls": [ + "index.html#javascript-node2nix-pitfalls" + ], + "javascript-pnpm": [ + "index.html#javascript-pnpm" + ], + "javascript-pnpm-sourceRoot": [ + "index.html#javascript-pnpm-sourceRoot" + ], + "javascript-pnpm-workspaces": [ + "index.html#javascript-pnpm-workspaces" + ], + "javascript-pnpm-extraCommands": [ + "index.html#javascript-pnpm-extraCommands" + ], + "javascript-yarn": [ + "index.html#javascript-yarn" + ], + "javascript-yarnconfighook": [ + "index.html#javascript-yarnconfighook" + ], + "javascript-yarnbuildhook": [ + "index.html#javascript-yarnbuildhook" + ], + "javascript-yarninstallhook": [ + "index.html#javascript-yarninstallhook" + ], + "javascript-yarn2nix": [ + "index.html#javascript-yarn2nix" + ], + "javascript-yarn2nix-preparation": [ + "index.html#javascript-yarn2nix-preparation" + ], + "javascript-yarn2nix-mkYarnPackage": [ + "index.html#javascript-yarn2nix-mkYarnPackage" + ], + "javascript-yarn2nix-mkYarnModules": [ + "index.html#javascript-yarn2nix-mkYarnModules" + ], + "javascript-mkYarnPackage-overriding-dependencies": [ + "index.html#javascript-mkYarnPackage-overriding-dependencies" + ], + "javascript-yarn2nix-pitfalls": [ + "index.html#javascript-yarn2nix-pitfalls" + ], + "javascript-outside-nixpkgs": [ + "index.html#javascript-outside-nixpkgs" + ], + "javascript-npmlock2nix": [ + "index.html#javascript-npmlock2nix" + ], + "javascript-npmlock2nix-pitfalls": [ + "index.html#javascript-npmlock2nix-pitfalls" + ], + "javascript-nix-npm-buildpackage": [ + "index.html#javascript-nix-npm-buildpackage" + ], + "javascript-nix-npm-buildpackage-pitfalls": [ + "index.html#javascript-nix-npm-buildpackage-pitfalls" + ], + "language-julia": [ + "index.html#language-julia" + ], + "julia-introduction": [ + "index.html#julia-introduction" + ], + "julia-withpackage": [ + "index.html#julia-withpackage" + ], + "julia-withpackage-arguments": [ + "index.html#julia-withpackage-arguments" + ], + "lisp": [ + "index.html#lisp" + ], + "lisp-overview": [ + "index.html#lisp-overview" + ], + "lisp-use-case-example": [ + "index.html#lisp-use-case-example" + ], + "lisp-importing-packages-from-quicklisp": [ + "index.html#lisp-importing-packages-from-quicklisp" + ], + "lisp-quicklisp-adding-native-dependencies": [ + "index.html#lisp-quicklisp-adding-native-dependencies" + ], + "lisp-quicklisp-trusting": [ + "index.html#lisp-quicklisp-trusting" + ], + "lisp-quicklisp-quirks": [ + "index.html#lisp-quicklisp-quirks" + ], + "lisp-defining-packages-inside": [ + "index.html#lisp-defining-packages-inside" + ], + "lisp-defining-packages-outside": [ + "index.html#lisp-defining-packages-outside" + ], + "lisp-including-external-pkg-in-scope": [ + "index.html#lisp-including-external-pkg-in-scope" + ], + "lisp-overriding-package-attributes": [ + "index.html#lisp-overriding-package-attributes" + ], + "lisp-dealing-with-slashy-systems": [ + "index.html#lisp-dealing-with-slashy-systems" + ], + "lisp-building-wrappers": [ + "index.html#lisp-building-wrappers" + ], + "lisp-loading-asdf": [ + "index.html#lisp-loading-asdf" + ], + "lisp-loading-systems": [ + "index.html#lisp-loading-systems" + ], + "lisp-adding-a-new-lisp": [ + "index.html#lisp-adding-a-new-lisp" + ], + "lua": [ + "index.html#lua" + ], + "lua-userguide": [ + "index.html#lua-userguide" + ], + "lua-overview": [ + "index.html#lua-overview" + ], + "installing-lua-and-packages": [ + "index.html#installing-lua-and-packages" + ], + "lua-environment-defined-in-separate-.nix-file": [ + "index.html#lua-environment-defined-in-separate-.nix-file" + ], + "lua-environment-defined-in-.confignixpkgsconfig.nix": [ + "index.html#lua-environment-defined-in-.confignixpkgsconfig.nix" + ], + "lua-environment-defined-in-etcnixosconfiguration.nix": [ + "index.html#lua-environment-defined-in-etcnixosconfiguration.nix" + ], + "how-to-override-a-lua-package-using-overlays": [ + "index.html#how-to-override-a-lua-package-using-overlays" + ], + "temporary-lua-environment-with-nix-shell": [ + "index.html#temporary-lua-environment-with-nix-shell" + ], + "lua-developing": [ + "index.html#lua-developing" + ], + "packaging-a-library-on-luarocks": [ + "index.html#packaging-a-library-on-luarocks" + ], + "packaging-a-library-manually": [ + "index.html#packaging-a-library-manually" + ], + "lua-reference": [ + "index.html#lua-reference" + ], + "lua-interpreters": [ + "index.html#lua-interpreters" + ], + "attributes-on-lua-interpreters-packages": [ + "index.html#attributes-on-lua-interpreters-packages" + ], + "buildluarockspackage-function": [ + "index.html#buildluarockspackage-function" + ], + "buildluaapplication-function": [ + "index.html#buildluaapplication-function" + ], + "lua.withpackages-function": [ + "index.html#lua.withpackages-function" + ], + "lua-contributing": [ + "index.html#lua-contributing" + ], + "maven": [ + "index.html#maven" + ], + "maven-buildmavenpackage": [ + "index.html#maven-buildmavenpackage" + ], + "stable-maven-plugins": [ + "index.html#stable-maven-plugins" + ], + "maven-mvn2nix": [ + "index.html#maven-mvn2nix" + ], + "solving-for-dependencies": [ + "index.html#solving-for-dependencies" + ], + "buildmaven-with-nixosmvn2nix-maven-plugin": [ + "index.html#buildmaven-with-nixosmvn2nix-maven-plugin" + ], + "double-invocation": [ + "index.html#double-invocation" + ], + "building-a-jar": [ + "index.html#building-a-jar" + ], + "runnable-jar": [ + "index.html#runnable-jar" + ], + "classpath": [ + "index.html#classpath" + ], + "manifest-file-via-maven-plugin": [ + "index.html#manifest-file-via-maven-plugin" + ], + "nim": [ + "index.html#nim" + ], + "buildnimpackage-parameters": [ + "index.html#buildnimpackage-parameters" + ], + "nim-lockfiles": [ + "index.html#nim-lockfiles" + ], + "nim-overrides": [ + "index.html#nim-overrides" + ], + "nim-lock-overrides": [ + "index.html#nim-lock-overrides" + ], + "nim-lock-overrides-overrides": [ + "index.html#nim-lock-overrides-overrides" + ], + "sec-language-ocaml": [ + "index.html#sec-language-ocaml" + ], + "sec-language-ocaml-user-guide": [ + "index.html#sec-language-ocaml-user-guide" + ], + "sec-language-ocaml-packaging": [ + "index.html#sec-language-ocaml-packaging" + ], + "sec-octave": [ + "index.html#sec-octave" + ], + "ssec-octave-introduction": [ + "index.html#ssec-octave-introduction" + ], + "ssec-octave-structure": [ + "index.html#ssec-octave-structure" + ], + "ssec-octave-packaging": [ + "index.html#ssec-octave-packaging" + ], + "sssec-buildOctavePackage-steps": [ + "index.html#sssec-buildOctavePackage-steps" + ], + "sssec-octave-handling-dependencies": [ + "index.html#sssec-octave-handling-dependencies" + ], + "sssec-installing-octave-packages": [ + "index.html#sssec-installing-octave-packages" + ], + "sec-language-perl": [ + "index.html#sec-language-perl" + ], + "ssec-perl-running": [ + "index.html#ssec-perl-running" + ], + "ssec-perl-packaging": [ + "index.html#ssec-perl-packaging" + ], + "ssec-generation-from-CPAN": [ + "index.html#ssec-generation-from-CPAN" + ], + "ssec-perl-cross-compilation": [ + "index.html#ssec-perl-cross-compilation" + ], + "sec-php": [ + "index.html#sec-php" + ], + "ssec-php-user-guide": [ + "index.html#ssec-php-user-guide" + ], + "ssec-php-user-guide-overview": [ + "index.html#ssec-php-user-guide-overview" + ], + "ssec-php-user-guide-installing-with-extensions": [ + "index.html#ssec-php-user-guide-installing-with-extensions" + ], + "ssec-php-user-guide-installing-with-extensions-phpfpm": [ + "index.html#ssec-php-user-guide-installing-with-extensions-phpfpm" + ], + "ssec-php-user-guide-installing-with-extensions-nix-shell": [ + "index.html#ssec-php-user-guide-installing-with-extensions-nix-shell" + ], + "ssec-php-user-guide-installing-packages-with-extensions": [ + "index.html#ssec-php-user-guide-installing-packages-with-extensions" + ], + "ssec-php-user-guide-overriding-packages": [ + "index.html#ssec-php-user-guide-overriding-packages" + ], + "ssec-building-php-projects": [ + "index.html#ssec-building-php-projects" + ], + "sec-pkg-config": [ + "index.html#sec-pkg-config" + ], + "pkg-config-writing-packages": [ + "index.html#pkg-config-writing-packages" + ], + "sec-pkg-config-usage": [ + "index.html#sec-pkg-config-usage" + ], + "sec-pkg-config-usage-internal": [ + "index.html#sec-pkg-config-usage-internal" + ], + "sec-pkg-config-usage-external": [ + "index.html#sec-pkg-config-usage-external" + ], + "python": [ + "index.html#python" + ], + "reference": [ + "index.html#reference" + ], + "interpreters": [ + "index.html#interpreters" + ], + "missing-tkinter-module-standard-library": [ + "index.html#missing-tkinter-module-standard-library" + ], + "attributes-on-interpreters-packages": [ + "index.html#attributes-on-interpreters-packages" + ], + "building-packages-and-applications": [ + "index.html#building-packages-and-applications" + ], + "buildpythonpackage-function": [ + "index.html#buildpythonpackage-function" + ], + "buildpythonpackage-parameters": [ + "index.html#buildpythonpackage-parameters" + ], + "overriding-python-packages": [ + "index.html#overriding-python-packages" + ], + "buildpythonapplication-function": [ + "index.html#buildpythonapplication-function" + ], + "topythonapplication-function": [ + "index.html#topythonapplication-function" + ], + "topythonmodule-function": [ + "index.html#topythonmodule-function" + ], + "mkpythonmetapackage-function": [ + "index.html#mkpythonmetapackage-function" + ], + "mkpythoneditablepackage-function": [ + "index.html#mkpythoneditablepackage-function" + ], + "python.buildenv-function": [ + "index.html#python.buildenv-function" + ], + "python.buildenv-arguments": [ + "index.html#python.buildenv-arguments" + ], + "python.withpackages-function": [ + "index.html#python.withpackages-function" + ], + "setup-hooks": [ + "index.html#setup-hooks" + ], + "user-guide": [ + "index.html#user-guide" + ], + "using-python": [ + "index.html#using-python" + ], + "overview": [ + "index.html#overview" + ], + "installing-python-and-packages": [ + "index.html#installing-python-and-packages" + ], + "ad-hoc-temporary-python-environment-with-nix-shell": [ + "index.html#ad-hoc-temporary-python-environment-with-nix-shell" + ], + "running-python-scripts-and-using-nix-shell-as-shebang": [ + "index.html#running-python-scripts-and-using-nix-shell-as-shebang" + ], + "load-environment-from-.nix-expression": [ + "index.html#load-environment-from-.nix-expression" + ], + "installing-environments-globally-on-the-system": [ + "index.html#installing-environments-globally-on-the-system" + ], + "environment-defined-in-etcnixosconfiguration.nix": [ + "index.html#environment-defined-in-etcnixosconfiguration.nix" + ], + "developing-with-python": [ + "index.html#developing-with-python" + ], + "python-library-packages-in-nixpkgs": [ + "index.html#python-library-packages-in-nixpkgs" + ], + "handling-dependencies": [ + "index.html#handling-dependencies" + ], + "testing-python-packages": [ + "index.html#testing-python-packages" + ], + "using-pytest": [ + "index.html#using-pytest" + ], + "using-pytestcheckhook": [ + "index.html#using-pytestcheckhook" + ], + "using-pythonimportscheck": [ + "index.html#using-pythonimportscheck" + ], + "using-pythonrelaxdepshook": [ + "index.html#using-pythonrelaxdepshook" + ], + "using-unittestcheckhook": [ + "index.html#using-unittestcheckhook" + ], + "using-sphinxhook": [ + "index.html#using-sphinxhook" + ], + "organising-your-packages": [ + "index.html#organising-your-packages" + ], + "including-a-derivation-using-callpackage": [ + "index.html#including-a-derivation-using-callpackage" + ], + "faq": [ + "index.html#faq" + ], + "how-to-solve-circular-dependencies": [ + "index.html#how-to-solve-circular-dependencies" + ], + "how-to-override-a-python-package": [ + "index.html#how-to-override-a-python-package" + ], + "python-setup.py-bdist_wheel-cannot-create-.whl": [ + "index.html#python-setup.py-bdist_wheel-cannot-create-.whl" + ], + "install_data-data_files-problems": [ + "index.html#install_data-data_files-problems" + ], + "rationale-of-non-existent-global-site-packages": [ + "index.html#rationale-of-non-existent-global-site-packages" + ], + "how-to-consume-python-modules-using-pip-in-a-virtual-environment-like-i-am-used-to-on-other-operating-systems": [ + "index.html#how-to-consume-python-modules-using-pip-in-a-virtual-environment-like-i-am-used-to-on-other-operating-systems" + ], + "how-to-override-a-python-package-from-configuration.nix": [ + "index.html#how-to-override-a-python-package-from-configuration.nix" + ], + "how-to-override-a-python-package-using-overlays": [ + "index.html#how-to-override-a-python-package-using-overlays" + ], + "how-to-override-a-python-package-for-all-python-versions-using-extensions": [ + "index.html#how-to-override-a-python-package-for-all-python-versions-using-extensions" + ], + "how-to-use-intels-mkl-with-numpy-and-scipy": [ + "index.html#how-to-use-intels-mkl-with-numpy-and-scipy" + ], + "what-inputs-do-setup_requires-install_requires-and-tests_require-map-to": [ + "index.html#what-inputs-do-setup_requires-install_requires-and-tests_require-map-to" + ], + "optimizations": [ + "index.html#optimizations" + ], + "python-optional-dependencies": [ + "index.html#python-optional-dependencies" + ], + "tools": [ + "index.html#tools" + ], + "deterministic-builds": [ + "index.html#deterministic-builds" + ], + "automatic-tests": [ + "index.html#automatic-tests" + ], + "common-issues": [ + "index.html#common-issues" + ], + "contributing": [ + "index.html#contributing" + ], + "contributing-guidelines": [ + "index.html#contributing-guidelines" + ], + "python-package-set-maintenance": [ + "index.html#python-package-set-maintenance" + ], + "python-package-bulk-updates": [ + "index.html#python-package-bulk-updates" + ], + "python-cpython-update-schedule": [ + "index.html#python-cpython-update-schedule" + ], + "sec-language-qt": [ + "index.html#sec-language-qt" + ], + "qt-default-nix": [ + "index.html#qt-default-nix" + ], + "qt-versions": [ + "index.html#qt-versions" + ], + "qt-runtime-dependencies": [ + "index.html#qt-runtime-dependencies" + ], + "r": [ + "index.html#r" + ], + "installation": [ + "index.html#installation" + ], + "rstudio": [ + "index.html#rstudio" + ], + "updating-the-package-set": [ + "index.html#updating-the-package-set" + ], + "sec-language-ruby": [ + "index.html#sec-language-ruby" + ], + "using-ruby": [ + "index.html#using-ruby" + ], + "temporary-ruby-environment-with-nix-shell": [ + "index.html#temporary-ruby-environment-with-nix-shell" + ], + "load-ruby-environment-from-.nix-expression": [ + "index.html#load-ruby-environment-from-.nix-expression" + ], + "execute-command-with---run": [ + "index.html#execute-command-with---run" + ], + "using-nix-shell-as-shebang": [ + "index.html#using-nix-shell-as-shebang" + ], + "developing-with-ruby": [ + "index.html#developing-with-ruby" + ], + "using-an-existing-gemfile": [ + "index.html#using-an-existing-gemfile" + ], + "gem-specific-configurations-and-workarounds": [ + "index.html#gem-specific-configurations-and-workarounds" + ], + "ruby-platform-specif-gems": [ + "index.html#ruby-platform-specif-gems" + ], + "adding-a-gem-to-the-default-gemset": [ + "index.html#adding-a-gem-to-the-default-gemset" + ], + "packaging-applications": [ + "index.html#packaging-applications" + ], + "packaging-executables-that-require-wrapping": [ + "index.html#packaging-executables-that-require-wrapping" + ], + "rust": [ + "index.html#rust" + ], + "compiling-rust-applications-with-cargo": [ + "index.html#compiling-rust-applications-with-cargo" + ], + "importing-a-cargo.lock-file": [ + "index.html#importing-a-cargo.lock-file" + ], + "cargo-features": [ + "index.html#cargo-features" + ], + "cross-compilation": [ + "index.html#cross-compilation" + ], + "running-package-tests": [ + "index.html#running-package-tests" + ], + "tests-relying-on-the-structure-of-the-target-directory": [ + "index.html#tests-relying-on-the-structure-of-the-target-directory" + ], + "disabling-package-tests": [ + "index.html#disabling-package-tests" + ], + "using-cargo-nextest": [ + "index.html#using-cargo-nextest" + ], + "setting-test-threads": [ + "index.html#setting-test-threads" + ], + "building-a-package-in-debug-mode": [ + "index.html#building-a-package-in-debug-mode" + ], + "custom-buildinstall-procedures": [ + "index.html#custom-buildinstall-procedures" + ], + "building-a-crate-with-an-absent-or-out-of-date-cargo.lock-file": [ + "index.html#building-a-crate-with-an-absent-or-out-of-date-cargo.lock-file" + ], + "compiling-non-rust-packages-that-include-rust-code": [ + "index.html#compiling-non-rust-packages-that-include-rust-code" + ], + "vendoring-of-dependencies": [ + "index.html#vendoring-of-dependencies" + ], + "hooks": [ + "index.html#hooks" + ], + "examples": [ + "index.html#examples" + ], + "python-package-using-setuptools-rust": [ + "index.html#python-package-using-setuptools-rust" + ], + "python-package-using-maturin": [ + "index.html#python-package-using-maturin" + ], + "rust-package-built-with-meson": [ + "index.html#rust-package-built-with-meson" + ], + "compiling-rust-crates-using-nix-instead-of-cargo": [ + "index.html#compiling-rust-crates-using-nix-instead-of-cargo" + ], + "simple-operation": [ + "index.html#simple-operation" + ], + "handling-external-dependencies": [ + "index.html#handling-external-dependencies" + ], + "options-and-phases-configuration": [ + "index.html#options-and-phases-configuration" + ], + "setting-up-nix-shell": [ + "index.html#setting-up-nix-shell" + ], + "using-community-maintained-rust-toolchains": [ + "index.html#using-community-maintained-rust-toolchains" + ], + "using-rust-nightly-with-nix-shell": [ + "index.html#using-rust-nightly-with-nix-shell" + ], + "using-rust-nightly-in-a-derivation-with-buildrustpackage": [ + "index.html#using-rust-nightly-in-a-derivation-with-buildrustpackage" + ], + "using-git-bisect-on-the-rust-compiler": [ + "index.html#using-git-bisect-on-the-rust-compiler" + ], + "sec-scheme": [ + "index.html#sec-scheme" + ], + "sec-scheme-package-management": [ + "index.html#sec-scheme-package-management" + ], + "sec-scheme-package-management-akku": [ + "index.html#sec-scheme-package-management-akku" + ], + "swift": [ + "index.html#swift" + ], + "ssec-swift-module-search-paths": [ + "index.html#ssec-swift-module-search-paths" + ], + "ssec-swift-core-libraries": [ + "index.html#ssec-swift-core-libraries" + ], + "ssec-swift-packaging-with-swiftpm": [ + "index.html#ssec-swift-packaging-with-swiftpm" + ], + "ssec-swiftpm-custom-build-flags": [ + "index.html#ssec-swiftpm-custom-build-flags" + ], + "ssec-swiftpm-running-tests": [ + "index.html#ssec-swiftpm-running-tests" + ], + "ssec-swiftpm-patching-dependencies": [ + "index.html#ssec-swiftpm-patching-dependencies" + ], + "ssec-swift-considerations-for-custom-build-tools": [ + "index.html#ssec-swift-considerations-for-custom-build-tools" + ], + "ssec-swift-linking-the-standard-library": [ + "index.html#ssec-swift-linking-the-standard-library" + ], + "sec-language-tcl": [ + "index.html#sec-language-tcl" + ], + "sec-language-tcl-user-guide": [ + "index.html#sec-language-tcl-user-guide" + ], + "sec-language-tcl-packaging": [ + "index.html#sec-language-tcl-packaging" + ], + "sec-language-texlive": [ + "index.html#sec-language-texlive" + ], + "sec-language-texlive-user-guide-experimental": [ + "index.html#sec-language-texlive-user-guide-experimental" + ], + "sec-language-texlive-user-guide": [ + "index.html#sec-language-texlive-user-guide" + ], + "sec-language-texlive-custom-packages": [ + "index.html#sec-language-texlive-custom-packages" + ], + "sec-language-texlive-lualatex-font-cache": [ + "index.html#sec-language-texlive-lualatex-font-cache" + ], + "titanium": [ + "index.html#titanium" + ], + "building-a-titanium-app": [ + "index.html#building-a-titanium-app" + ], + "emulating-or-simulating-the-app": [ + "index.html#emulating-or-simulating-the-app" + ], + "vim": [ + "index.html#vim" + ], + "custom-configuration": [ + "index.html#custom-configuration" + ], + "managing-plugins-with-vim-packages": [ + "index.html#managing-plugins-with-vim-packages" + ], + "what-if-your-favourite-vim-plugin-isnt-already-packaged": [ + "index.html#what-if-your-favourite-vim-plugin-isnt-already-packaged" + ], + "vim-plugin-specificities": [ + "index.html#vim-plugin-specificities" + ], + "vim-plugin-treesitter": [ + "index.html#vim-plugin-treesitter" + ], + "managing-plugins-with-vim-plug": [ + "index.html#managing-plugins-with-vim-plug" + ], + "adding-new-plugins-to-nixpkgs": [ + "index.html#adding-new-plugins-to-nixpkgs" + ], + "testing-neovim-plugins": [ + "index.html#testing-neovim-plugins" + ], + "vim-plugin-required-snippet": [ + "index.html#vim-plugin-required-snippet" + ], + "updating-plugins-in-nixpkgs": [ + "index.html#updating-plugins-in-nixpkgs" + ], + "vim-out-of-tree-overlays": [ + "index.html#vim-out-of-tree-overlays" + ], + "chap-packages": [ + "index.html#chap-packages" + ], + "sec-citrix": [ + "index.html#sec-citrix" + ], + "sec-citrix-base": [ + "index.html#sec-citrix-base" + ], + "sec-citrix-selfservice": [ + "index.html#sec-citrix-selfservice" + ], + "sec-citrix-custom-certs": [ + "index.html#sec-citrix-custom-certs" + ], + "sec-darwin-builder": [ + "index.html#sec-darwin-builder" + ], + "sec-darwin-builder-example-flake": [ + "index.html#sec-darwin-builder-example-flake" + ], + "sec-darwin-builder-reconfiguring": [ + "index.html#sec-darwin-builder-reconfiguring" + ], + "sec-darwin-builder-troubleshoot": [ + "index.html#sec-darwin-builder-troubleshoot" + ], + "dlib": [ + "index.html#dlib" + ], + "compiling-without-avx-support": [ + "index.html#compiling-without-avx-support" + ], + "sec-eclipse": [ + "index.html#sec-eclipse" + ], + "sec-elm": [ + "index.html#sec-elm" + ], + "sec-emacs": [ + "index.html#sec-emacs" + ], + "sec-emacs-config": [ + "index.html#sec-emacs-config" + ], + "sec-firefox": [ + "index.html#sec-firefox" + ], + "build-wrapped-firefox-with-extensions-and-policies": [ + "index.html#build-wrapped-firefox-with-extensions-and-policies" + ], + "sec-firefox-troubleshooting": [ + "index.html#sec-firefox-troubleshooting" + ], + "sec-fish": [ + "index.html#sec-fish" + ], + "sec-fish-vendor": [ + "index.html#sec-fish-vendor" + ], + "sec-fish-plugins-pkg": [ + "index.html#sec-fish-plugins-pkg" + ], + "sec-fish-wrapper": [ + "index.html#sec-fish-wrapper" + ], + "sec-fuse": [ + "index.html#sec-fuse" + ], + "geant4": [ + "index.html#geant4" + ], + "geant4-hook": [ + "index.html#geant4-hook" + ], + "geant4-datasets": [ + "index.html#geant4-datasets" + ], + "geant4-datasets-hook": [ + "index.html#geant4-datasets-hook" + ], + "sec-ibus-typing-booster": [ + "index.html#sec-ibus-typing-booster" + ], + "sec-ibus-typing-booster-activate": [ + "index.html#sec-ibus-typing-booster-activate" + ], + "sec-ibus-typing-booster-customize-hunspell": [ + "index.html#sec-ibus-typing-booster-customize-hunspell" + ], + "sec-ibus-typing-booster-emoji-picker": [ + "index.html#sec-ibus-typing-booster-emoji-picker" + ], + "sec-kakoune": [ + "index.html#sec-kakoune" + ], + "sec-krita": [ + "index.html#sec-krita" + ], + "krita-python-plugins": [ + "index.html#krita-python-plugins" + ], + "krita-binary-plugins": [ + "index.html#krita-binary-plugins" + ], + "krita-install-binary-plugins": [ + "index.html#krita-install-binary-plugins" + ], + "krita-binary-plugin-structure": [ + "index.html#krita-binary-plugin-structure" + ], + "sec-linux-kernel": [ + "index.html#sec-linux-kernel" + ], + "ex-overriding-kernel-derivation": [ + "index.html#ex-overriding-kernel-derivation" + ], + "sec-manual-kernel-configuration": [ + "index.html#sec-manual-kernel-configuration" + ], + "ex-using-linux-manual-config": [ + "index.html#ex-using-linux-manual-config" + ], + "sec-linux-kernel-developing-modules": [ + "index.html#sec-linux-kernel-developing-modules" + ], + "ex-edit-compile-run-kernel-modules": [ + "index.html#ex-edit-compile-run-kernel-modules" + ], + "lhapdf": [ + "index.html#lhapdf" + ], + "lhapdf-sets": [ + "index.html#lhapdf-sets" + ], + "lhapdf-sets-hook": [ + "index.html#lhapdf-sets-hook" + ], + "locales": [ + "index.html#locales" + ], + "etc": [ + "index.html#etc" + ], + "sec-nginx": [ + "index.html#sec-nginx" + ], + "sec-nginx-etag": [ + "index.html#sec-nginx-etag" + ], + "sec-opengl": [ + "index.html#sec-opengl" + ], + "nixos-desktop": [ + "index.html#nixos-desktop" + ], + "nix-on-gnulinux": [ + "index.html#nix-on-gnulinux" + ], + "sec-shell-helpers": [ + "index.html#sec-shell-helpers" + ], + "sec-steam": [ + "index.html#sec-steam" + ], + "sec-steam-nix": [ + "index.html#sec-steam-nix" + ], + "sec-steam-play": [ + "index.html#sec-steam-play" + ], + "sec-steam-troub": [ + "index.html#sec-steam-troub" + ], + "sec-steam-run": [ + "index.html#sec-steam-run" + ], + "cataclysm-dark-days-ahead": [ + "index.html#cataclysm-dark-days-ahead" + ], + "how-to-install-cataclysm-dda": [ + "index.html#how-to-install-cataclysm-dda" + ], + "important-note-for-overriding-packages": [ + "index.html#important-note-for-overriding-packages" + ], + "customizing-with-mods": [ + "index.html#customizing-with-mods" + ], + "sec-urxvt": [ + "index.html#sec-urxvt" + ], + "sec-urxvt-conf": [ + "index.html#sec-urxvt-conf" + ], + "sec-urxvt-pkg": [ + "index.html#sec-urxvt-pkg" + ], + "sec-vcpkg": [ + "index.html#sec-vcpkg" + ], + "sec-vcpkg-nix-envvars": [ + "index.html#sec-vcpkg-nix-envvars" + ], + "sec-weechat": [ + "index.html#sec-weechat" + ], + "sec-xorg": [ + "index.html#sec-xorg" + ], + "katamari-tarballs": [ + "index.html#katamari-tarballs" + ], + "individual-tarballs": [ + "index.html#individual-tarballs" + ], + "generating-nix-expressions": [ + "index.html#generating-nix-expressions" + ], + "overriding-the-generator": [ + "index.html#overriding-the-generator" + ], + "sec-build-support": [ + "index.html#sec-build-support" + ], + "pkgs-substitute": [ + "index.html#pkgs-substitute" + ], + "ex-pkgs-substitute": [ + "index.html#ex-pkgs-substitute" + ], + "pkgs-substituteall": [ + "index.html#pkgs-substituteall" + ], + "ex-pkgs-substituteAll": [ + "index.html#ex-pkgs-substituteAll" + ], + "pkgs-substituteallfiles": [ + "index.html#pkgs-substituteallfiles" + ], + "ex-pkgs-substitute-all-files": [ + "index.html#ex-pkgs-substitute-all-files" + ], + "part-development": [ + "index.html#part-development" + ], + "sec-opening-issues": [ + "index.html#sec-opening-issues" + ], + "part-contributing": [ + "index.html#part-contributing" + ], + "chap-quick-start": [ + "index.html#chap-quick-start" + ], + "chap-conventions": [ + "index.html#chap-conventions" + ], + "sec-syntax": [ + "index.html#sec-syntax" + ], + "sec-package-naming": [ + "index.html#sec-package-naming" + ], + "sec-organisation": [ + "index.html#sec-organisation" + ], + "sec-versioning": [ + "index.html#sec-versioning" + ], + "sec-sources": [ + "index.html#sec-sources" + ], + "sec-source-hashes": [ + "index.html#sec-source-hashes" + ], + "sec-source-hashes-security": [ + "index.html#sec-source-hashes-security" + ], + "sec-patches": [ + "index.html#sec-patches" + ], + "sec-package-tests": [ + "index.html#sec-package-tests" + ], + "ssec-inline-package-tests-writing": [ + "index.html#ssec-inline-package-tests-writing" + ], + "ssec-package-tests-writing": [ + "index.html#ssec-package-tests-writing" + ], + "ssec-package-tests-running": [ + "index.html#ssec-package-tests-running" + ], + "ssec-package-tests-examples": [ + "index.html#ssec-package-tests-examples" + ], + "ssec-nixos-tests-linking": [ + "index.html#ssec-nixos-tests-linking" + ], + "ssec-import-from-derivation": [ + "index.html#ssec-import-from-derivation" + ], + "chap-submitting-changes": [ + "index.html#chap-submitting-changes" + ], + "submitting-changes-submitting-changes": [ + "index.html#submitting-changes-submitting-changes" + ], + "submitting-changes-submitting-security-fixes": [ + "index.html#submitting-changes-submitting-security-fixes" + ], + "submitting-changes-deprecating-packages": [ + "index.html#submitting-changes-deprecating-packages" + ], + "steps-to-remove-a-package-from-nixpkgs": [ + "index.html#steps-to-remove-a-package-from-nixpkgs" + ], + "submitting-changes-pull-request-template": [ + "index.html#submitting-changes-pull-request-template" + ], + "submitting-changes-tested-with-sandbox": [ + "index.html#submitting-changes-tested-with-sandbox" + ], + "submitting-changes-platform-diversity": [ + "index.html#submitting-changes-platform-diversity" + ], + "submitting-changes-nixos-tests": [ + "index.html#submitting-changes-nixos-tests" + ], + "submitting-changes-tested-compilation": [ + "index.html#submitting-changes-tested-compilation" + ], + "submitting-changes-tested-execution": [ + "index.html#submitting-changes-tested-execution" + ], + "submitting-changes-contribution-standards": [ + "index.html#submitting-changes-contribution-standards" + ], + "submitting-changes-hotfixing-pull-requests": [ + "index.html#submitting-changes-hotfixing-pull-requests" + ], + "submitting-changes-commit-policy": [ + "index.html#submitting-changes-commit-policy" + ], + "submitting-changes-branches": [ + "index.html#submitting-changes-branches" + ], + "submitting-changes-master-branch": [ + "index.html#submitting-changes-master-branch" + ], + "submitting-changes-staging-branch": [ + "index.html#submitting-changes-staging-branch" + ], + "submitting-changes-staging-next-branch": [ + "index.html#submitting-changes-staging-next-branch" + ], + "submitting-changes-stable-release-branches": [ + "index.html#submitting-changes-stable-release-branches" + ], + "submitting-changes-stable-release-branches-automatic-backports": [ + "index.html#submitting-changes-stable-release-branches-automatic-backports" + ], + "submitting-changes-stable-release-branches-manual-backports": [ + "index.html#submitting-changes-stable-release-branches-manual-backports" + ], + "acceptable-backport-criteria": [ + "index.html#acceptable-backport-criteria" + ], + "chap-vulnerability-roundup": [ + "index.html#chap-vulnerability-roundup" + ], + "vulnerability-roundup-issues": [ + "index.html#vulnerability-roundup-issues" + ], + "vulnerability-roundup-triaging-and-fixing": [ + "index.html#vulnerability-roundup-triaging-and-fixing" + ], + "chap-reviewing-contributions": [ + "index.html#chap-reviewing-contributions" + ], + "reviewing-contributions-package-updates": [ + "index.html#reviewing-contributions-package-updates" + ], + "reviewing-contributions-new-packages": [ + "index.html#reviewing-contributions-new-packages" + ], + "reviewing-contributions-module-updates": [ + "index.html#reviewing-contributions-module-updates" + ], + "reviewing-contributions-new-modules": [ + "index.html#reviewing-contributions-new-modules" + ], + "reviewing-contributions-individual-maintainer-list": [ + "index.html#reviewing-contributions-individual-maintainer-list" + ], + "reviewing-contributions-maintainer-teams": [ + "index.html#reviewing-contributions-maintainer-teams" + ], + "reviewing-contributions-other-submissions": [ + "index.html#reviewing-contributions-other-submissions" + ], + "reviewing-contributions--merging-pull-requests": [ + "index.html#reviewing-contributions--merging-pull-requests" + ], + "chap-contributing": [ + "index.html#chap-contributing" + ], + "sec-contributing-devmode": [ + "index.html#sec-contributing-devmode" + ], + "sec-contributing-markup": [ + "index.html#sec-contributing-markup" + ], + "part-interoperability": [ + "index.html#part-interoperability" + ], + "chap-interop-cyclonedx": [ + "index.html#chap-interop-cyclonedx" + ], + "sec-interop.cylonedx-nix": [ + "index.html#sec-interop.cylonedx-nix" + ], + "sec-interop.cylonedx-narinfo": [ + "index.html#sec-interop.cylonedx-narinfo" + ], + "sec-interop.cylonedx-fod": [ + "index.html#sec-interop.cylonedx-fod" + ] +} diff --git a/nixos/doc/manual/contributing-to-this-manual.chapter.md b/nixos/doc/manual/contributing-to-this-manual.chapter.md index 83e4773e6866..7515bef44b10 100644 --- a/nixos/doc/manual/contributing-to-this-manual.chapter.md +++ b/nixos/doc/manual/contributing-to-this-manual.chapter.md @@ -17,6 +17,12 @@ There's also [a convenient development daemon](https://nixos.org/manual/nixpkgs/ The above instructions don't deal with the appendix of available `configuration.nix` options, and the manual pages related to NixOS. These are built, and written in a different location and in a different format, as explained in the next sections. +## Testing redirects {#sec-contributing-redirects} + +Once you have a successful build, you can open the relevant HTML (path mentioned above) in a browser along with the anchor, and observe the redirection. + +Note that if you already loaded the page and *then* input the anchor, you will need to perform a reload. This is because browsers do not re-run client JS code when only the anchor has changed. + ## Contributing to the `configuration.nix` options documentation {#sec-contributing-options} The documentation for all the different `configuration.nix` options is automatically generated by reading the `description`s of all the NixOS options defined at `nixos/modules/`. If you want to improve such `description`, find it in the `nixos/modules/` directory, and edit it and open a pull request. diff --git a/nixos/doc/manual/default.nix b/nixos/doc/manual/default.nix index 80916e9733c5..177a05b37532 100644 --- a/nixos/doc/manual/default.nix +++ b/nixos/doc/manual/default.nix @@ -122,6 +122,7 @@ in rec { nixos-render-docs -j $NIX_BUILD_CORES manual html \ --manpage-urls ${manpageUrls} \ + --redirects ${./redirects.json} \ --revision ${escapeShellArg revision} \ --generator "nixos-render-docs ${pkgs.lib.version}" \ --stylesheet style.css \ diff --git a/nixos/doc/manual/redirects.json b/nixos/doc/manual/redirects.json new file mode 100644 index 000000000000..5bfd18c9f792 --- /dev/null +++ b/nixos/doc/manual/redirects.json @@ -0,0 +1,2177 @@ +{ + "book-nixos-manual": [ + "index.html#book-nixos-manual" + ], + "preface": [ + "index.html#preface" + ], + "ch-installation": [ + "index.html#ch-installation" + ], + "sec-obtaining": [ + "index.html#sec-obtaining" + ], + "sec-installation": [ + "index.html#sec-installation" + ], + "sec-installation-booting": [ + "index.html#sec-installation-booting" + ], + "sec-installation-graphical": [ + "index.html#sec-installation-graphical" + ], + "sec-installation-manual": [ + "index.html#sec-installation-manual" + ], + "sec-installation-manual-networking": [ + "index.html#sec-installation-manual-networking" + ], + "sec-installation-booting-networking": [ + "index.html#sec-installation-booting-networking" + ], + "sec-installation-manual-partitioning": [ + "index.html#sec-installation-manual-partitioning" + ], + "sec-installation-partitioning": [ + "index.html#sec-installation-partitioning" + ], + "sec-installation-manual-partitioning-UEFI": [ + "index.html#sec-installation-manual-partitioning-UEFI" + ], + "sec-installation-partitioning-UEFI": [ + "index.html#sec-installation-partitioning-UEFI" + ], + "sec-installation-manual-partitioning-MBR": [ + "index.html#sec-installation-manual-partitioning-MBR" + ], + "sec-installation-partitioning-MBR": [ + "index.html#sec-installation-partitioning-MBR" + ], + "sec-installation-manual-partitioning-formatting": [ + "index.html#sec-installation-manual-partitioning-formatting" + ], + "sec-installation-partitioning-formatting": [ + "index.html#sec-installation-partitioning-formatting" + ], + "sec-installation-manual-installing": [ + "index.html#sec-installation-manual-installing" + ], + "sec-installation-installing": [ + "index.html#sec-installation-installing" + ], + "sec-installation-manual-summary": [ + "index.html#sec-installation-manual-summary" + ], + "sec-installation-summary": [ + "index.html#sec-installation-summary" + ], + "ex-partition-scheme-MBR": [ + "index.html#ex-partition-scheme-MBR" + ], + "ex-partition-scheme-UEFI": [ + "index.html#ex-partition-scheme-UEFI" + ], + "ex-install-sequence": [ + "index.html#ex-install-sequence" + ], + "ex-config": [ + "index.html#ex-config" + ], + "sec-installation-additional-notes": [ + "index.html#sec-installation-additional-notes" + ], + "sec-booting-from-usb": [ + "index.html#sec-booting-from-usb" + ], + "sec-booting-from-usb-graphical": [ + "index.html#sec-booting-from-usb-graphical" + ], + "sec-booting-from-usb-linux": [ + "index.html#sec-booting-from-usb-linux" + ], + "sec-booting-from-usb-macos": [ + "index.html#sec-booting-from-usb-macos" + ], + "sec-booting-from-pxe": [ + "index.html#sec-booting-from-pxe" + ], + "sec-booting-via-kexec": [ + "index.html#sec-booting-via-kexec" + ], + "sec-installing-virtualbox-guest": [ + "index.html#sec-installing-virtualbox-guest" + ], + "sec-installing-from-other-distro": [ + "index.html#sec-installing-from-other-distro" + ], + "sec-installing-behind-proxy": [ + "index.html#sec-installing-behind-proxy" + ], + "sec-changing-config": [ + "index.html#sec-changing-config" + ], + "sec-upgrading": [ + "index.html#sec-upgrading" + ], + "sec-upgrading-automatic": [ + "index.html#sec-upgrading-automatic" + ], + "sec-building-image": [ + "index.html#sec-building-image" + ], + "sec-building-image-instructions": [ + "index.html#sec-building-image-instructions" + ], + "sec-building-image-drivers": [ + "index.html#sec-building-image-drivers" + ], + "sec-building-image-tech-notes": [ + "index.html#sec-building-image-tech-notes" + ], + "sec-image-repart": [ + "index.html#sec-image-repart" + ], + "sec-image-repart-store-partition": [ + "index.html#sec-image-repart-store-partition" + ], + "sec-image-repart-appliance": [ + "index.html#sec-image-repart-appliance" + ], + "ch-configuration": [ + "index.html#ch-configuration" + ], + "sec-configuration-syntax": [ + "index.html#sec-configuration-syntax" + ], + "sec-configuration-file": [ + "index.html#sec-configuration-file" + ], + "sec-module-abstractions": [ + "index.html#sec-module-abstractions" + ], + "sec-modularity": [ + "index.html#sec-modularity" + ], + "sec-package-management": [ + "index.html#sec-package-management" + ], + "sec-declarative-package-mgmt": [ + "index.html#sec-declarative-package-mgmt" + ], + "sec-customising-packages": [ + "index.html#sec-customising-packages" + ], + "sec-custom-packages": [ + "index.html#sec-custom-packages" + ], + "sec-custom-packages-nix": [ + "index.html#sec-custom-packages-nix" + ], + "sec-custom-packages-prebuilt": [ + "index.html#sec-custom-packages-prebuilt" + ], + "sec-ad-hoc-packages": [ + "index.html#sec-ad-hoc-packages" + ], + "sec-user-management": [ + "index.html#sec-user-management" + ], + "sec-systemd-sysusers": [ + "index.html#sec-systemd-sysusers" + ], + "sec-userborn": [ + "index.html#sec-userborn" + ], + "ch-file-systems": [ + "index.html#ch-file-systems" + ], + "sec-luks-file-systems": [ + "index.html#sec-luks-file-systems" + ], + "sec-luks-file-systems-fido2": [ + "index.html#sec-luks-file-systems-fido2" + ], + "sec-luks-file-systems-fido2-legacy": [ + "index.html#sec-luks-file-systems-fido2-legacy" + ], + "sec-luks-file-systems-fido2-systemd": [ + "index.html#sec-luks-file-systems-fido2-systemd" + ], + "sec-sshfs-file-systems": [ + "index.html#sec-sshfs-file-systems" + ], + "sec-sshfs-interactive": [ + "index.html#sec-sshfs-interactive" + ], + "sec-sshfs-non-interactive": [ + "index.html#sec-sshfs-non-interactive" + ], + "sec-sshfs-troubleshooting": [ + "index.html#sec-sshfs-troubleshooting" + ], + "sec-overlayfs": [ + "index.html#sec-overlayfs" + ], + "sec-x11": [ + "index.html#sec-x11" + ], + "sec-x11-auto-login": [ + "index.html#sec-x11-auto-login" + ], + "sec-x11--graphics-cards-intel": [ + "index.html#sec-x11--graphics-cards-intel" + ], + "sec-x11-graphics-cards-nvidia": [ + "index.html#sec-x11-graphics-cards-nvidia" + ], + "sec-x11-touchpads": [ + "index.html#sec-x11-touchpads" + ], + "sec-x11-gtk-and-qt-themes": [ + "index.html#sec-x11-gtk-and-qt-themes" + ], + "custom-xkb-layouts": [ + "index.html#custom-xkb-layouts" + ], + "sec-wayland": [ + "index.html#sec-wayland" + ], + "sec-gpu-accel": [ + "index.html#sec-gpu-accel" + ], + "sec-gpu-accel-opencl": [ + "index.html#sec-gpu-accel-opencl" + ], + "sec-gpu-accel-opencl-amd": [ + "index.html#sec-gpu-accel-opencl-amd" + ], + "sec-gpu-accel-opencl-intel": [ + "index.html#sec-gpu-accel-opencl-intel" + ], + "sec-gpu-accel-vulkan": [ + "index.html#sec-gpu-accel-vulkan" + ], + "sec-gpu-accel-vulkan-amd": [ + "index.html#sec-gpu-accel-vulkan-amd" + ], + "sec-gpu-accel-va-api": [ + "index.html#sec-gpu-accel-va-api" + ], + "sec-gpu-accel-va-api-intel": [ + "index.html#sec-gpu-accel-va-api-intel" + ], + "sec-gpu-accel-common-issues": [ + "index.html#sec-gpu-accel-common-issues" + ], + "sec-gpu-accel-common-issues-permissions": [ + "index.html#sec-gpu-accel-common-issues-permissions" + ], + "sec-gpu-accel-common-issues-mixing-nixpkgs": [ + "index.html#sec-gpu-accel-common-issues-mixing-nixpkgs" + ], + "sec-xfce": [ + "index.html#sec-xfce" + ], + "sec-xfce-thunar-plugins": [ + "index.html#sec-xfce-thunar-plugins" + ], + "sec-xfce-troubleshooting": [ + "index.html#sec-xfce-troubleshooting" + ], + "sec-networking": [ + "index.html#sec-networking" + ], + "sec-networkmanager": [ + "index.html#sec-networkmanager" + ], + "sec-ssh": [ + "index.html#sec-ssh" + ], + "sec-ipv4": [ + "index.html#sec-ipv4" + ], + "sec-ipv6": [ + "index.html#sec-ipv6" + ], + "sec-firewall": [ + "index.html#sec-firewall" + ], + "sec-wireless": [ + "index.html#sec-wireless" + ], + "ad-hoc-network-config": [ + "index.html#ad-hoc-network-config" + ], + "sec-rename-ifs": [ + "index.html#sec-rename-ifs" + ], + "sec-custom-ifnames": [ + "index.html#sec-custom-ifnames" + ], + "sec-kernel-config": [ + "index.html#sec-kernel-config" + ], + "sec-linux-config-customizing": [ + "index.html#sec-linux-config-customizing" + ], + "sec-linux-rust": [ + "index.html#sec-linux-rust" + ], + "sec-linux-config-developing-modules": [ + "index.html#sec-linux-config-developing-modules" + ], + "sec-linux-zfs": [ + "index.html#sec-linux-zfs" + ], + "module-services-subversion": [ + "index.html#module-services-subversion" + ], + "module-services-subversion-apache-httpd": [ + "index.html#module-services-subversion-apache-httpd" + ], + "chap-pantheon": [ + "index.html#chap-pantheon" + ], + "sec-pantheon-enable": [ + "index.html#sec-pantheon-enable" + ], + "sec-pantheon-wingpanel-switchboard": [ + "index.html#sec-pantheon-wingpanel-switchboard" + ], + "sec-pantheon-faq": [ + "index.html#sec-pantheon-faq" + ], + "sec-pantheon-faq-messed-up-theme": [ + "index.html#sec-pantheon-faq-messed-up-theme" + ], + "sec-pantheon-faq-gnome-and-pantheon": [ + "index.html#sec-pantheon-faq-gnome-and-pantheon" + ], + "sec-pantheon-faq-appcenter": [ + "index.html#sec-pantheon-faq-appcenter" + ], + "chap-gnome": [ + "index.html#chap-gnome" + ], + "sec-gnome-enable": [ + "index.html#sec-gnome-enable" + ], + "sec-gnome-without-the-apps": [ + "index.html#sec-gnome-without-the-apps" + ], + "sec-gnome-disabling-services": [ + "index.html#sec-gnome-disabling-services" + ], + "sec-gnome-games": [ + "index.html#sec-gnome-games" + ], + "sec-gnome-core-developer-tools": [ + "index.html#sec-gnome-core-developer-tools" + ], + "sec-gnome-enable-flashback": [ + "index.html#sec-gnome-enable-flashback" + ], + "sec-gnome-icons-and-gtk-themes": [ + "index.html#sec-gnome-icons-and-gtk-themes" + ], + "sec-gnome-shell-extensions": [ + "index.html#sec-gnome-shell-extensions" + ], + "sec-gnome-gsettings-overrides": [ + "index.html#sec-gnome-gsettings-overrides" + ], + "sec-gnome-gsettings-overrides-example": [ + "index.html#sec-gnome-gsettings-overrides-example" + ], + "sec-gnome-faq": [ + "index.html#sec-gnome-faq" + ], + "sec-gnome-faq-can-i-use-lightdm-with-gnome": [ + "index.html#sec-gnome-faq-can-i-use-lightdm-with-gnome" + ], + "sec-bootloader-external": [ + "index.html#sec-bootloader-external" + ], + "sec-bootloader-external-developing": [ + "index.html#sec-bootloader-external-developing" + ], + "module-boot-clevis": [ + "index.html#module-boot-clevis" + ], + "module-boot-clevis-create-secret": [ + "index.html#module-boot-clevis-create-secret" + ], + "module-boot-clevis-activate": [ + "index.html#module-boot-clevis-activate" + ], + "module-services-garage": [ + "index.html#module-services-garage" + ], + "module-services-garage-upgrade-scenarios": [ + "index.html#module-services-garage-upgrade-scenarios" + ], + "module-services-garage-advanced-upgrades": [ + "index.html#module-services-garage-advanced-upgrades" + ], + "module-services-garage-maintainer-info": [ + "index.html#module-services-garage-maintainer-info" + ], + "module-services-youtrack": [ + "index.html#module-services-youtrack" + ], + "module-services-youtrack-installation": [ + "index.html#module-services-youtrack-installation" + ], + "module-services-youtrack-upgrade-2022_3-2023_1": [ + "index.html#module-services-youtrack-upgrade-2022_3-2023_1" + ], + "module-services-suwayomi-server": [ + "index.html#module-services-suwayomi-server" + ], + "module-services-suwayomi-server-basic-usage": [ + "index.html#module-services-suwayomi-server-basic-usage" + ], + "module-services-suwayomi-server-basic-auth": [ + "index.html#module-services-suwayomi-server-basic-auth" + ], + "module-services-suwayomi-server-extra-config": [ + "index.html#module-services-suwayomi-server-extra-config" + ], + "module-services-plausible": [ + "index.html#module-services-plausible" + ], + "module-services-plausible-basic-usage": [ + "index.html#module-services-plausible-basic-usage" + ], + "module-services-pingvin-share": [ + "index.html#module-services-pingvin-share" + ], + "module-services-pingvin-share-basic-usage": [ + "index.html#module-services-pingvin-share-basic-usage" + ], + "module-services-pingvin-share-reverse-proxy-configuration": [ + "index.html#module-services-pingvin-share-reverse-proxy-configuration" + ], + "module-services-pict-rs": [ + "index.html#module-services-pict-rs" + ], + "module-services-pict-rs-quickstart": [ + "index.html#module-services-pict-rs-quickstart" + ], + "module-services-pict-rs-usage": [ + "index.html#module-services-pict-rs-usage" + ], + "module-services-pict-rs-missing": [ + "index.html#module-services-pict-rs-missing" + ], + "module-services-nextcloud": [ + "index.html#module-services-nextcloud" + ], + "module-services-nextcloud-basic-usage": [ + "index.html#module-services-nextcloud-basic-usage" + ], + "module-services-nextcloud-pitfalls-during-upgrade": [ + "index.html#module-services-nextcloud-pitfalls-during-upgrade" + ], + "module-services-nextcloud-httpd": [ + "index.html#module-services-nextcloud-httpd" + ], + "installing-apps-php-extensions-nextcloud": [ + "index.html#installing-apps-php-extensions-nextcloud" + ], + "module-services-nextcloud-known-warnings": [ + "index.html#module-services-nextcloud-known-warnings" + ], + "module-services-nextcloud-warning-logreader": [ + "index.html#module-services-nextcloud-warning-logreader" + ], + "module-services-nextcloud-maintainer-info": [ + "index.html#module-services-nextcloud-maintainer-info" + ], + "module-services-matomo": [ + "index.html#module-services-matomo" + ], + "module-services-matomo-database-setup": [ + "index.html#module-services-matomo-database-setup" + ], + "module-services-matomo-archive-processing": [ + "index.html#module-services-matomo-archive-processing" + ], + "module-services-matomo-backups": [ + "index.html#module-services-matomo-backups" + ], + "module-services-matomo-issues": [ + "index.html#module-services-matomo-issues" + ], + "module-services-matomo-other-web-servers": [ + "index.html#module-services-matomo-other-web-servers" + ], + "module-services-lemmy": [ + "index.html#module-services-lemmy" + ], + "module-services-lemmy-quickstart": [ + "index.html#module-services-lemmy-quickstart" + ], + "module-services-lemmy-usage": [ + "index.html#module-services-lemmy-usage" + ], + "module-services-lemmy-missing": [ + "index.html#module-services-lemmy-missing" + ], + "module-services-keycloak": [ + "index.html#module-services-keycloak" + ], + "module-services-keycloak-admin": [ + "index.html#module-services-keycloak-admin" + ], + "module-services-keycloak-database": [ + "index.html#module-services-keycloak-database" + ], + "module-services-keycloak-hostname": [ + "index.html#module-services-keycloak-hostname" + ], + "module-services-keycloak-tls": [ + "index.html#module-services-keycloak-tls" + ], + "module-services-keycloak-themes": [ + "index.html#module-services-keycloak-themes" + ], + "module-services-keycloak-settings": [ + "index.html#module-services-keycloak-settings" + ], + "module-services-keycloak-example-config": [ + "index.html#module-services-keycloak-example-config" + ], + "module-services-jitsi-meet": [ + "index.html#module-services-jitsi-meet" + ], + "module-services-jitsi-basic-usage": [ + "index.html#module-services-jitsi-basic-usage" + ], + "module-services-jitsi-configuration": [ + "index.html#module-services-jitsi-configuration" + ], + "module-services-honk": [ + "index.html#module-services-honk" + ], + "module-services-honk-basic-usage": [ + "index.html#module-services-honk-basic-usage" + ], + "module-services-hatsu": [ + "index.html#module-services-hatsu" + ], + "module-services-hatsu-quickstart": [ + "index.html#module-services-hatsu-quickstart" + ], + "module-services-grocy": [ + "index.html#module-services-grocy" + ], + "module-services-grocy-basic-usage": [ + "index.html#module-services-grocy-basic-usage" + ], + "module-services-grocy-settings": [ + "index.html#module-services-grocy-settings" + ], + "module-services-gotosocial": [ + "index.html#module-services-gotosocial" + ], + "modules-services-gotosocial-service-configuration": [ + "index.html#modules-services-gotosocial-service-configuration" + ], + "modules-services-gotosocial-proxy-configuration": [ + "index.html#modules-services-gotosocial-proxy-configuration" + ], + "modules-services-gotosocial-user-management": [ + "index.html#modules-services-gotosocial-user-management" + ], + "module-services-glance": [ + "index.html#module-services-glance" + ], + "module-services-glance-quickstart": [ + "index.html#module-services-glance-quickstart" + ], + "module-services-filesender": [ + "index.html#module-services-filesender" + ], + "module-services-filesender-quickstart": [ + "index.html#module-services-filesender-quickstart" + ], + "module-services-discourse": [ + "index.html#module-services-discourse" + ], + "module-services-discourse-basic-usage": [ + "index.html#module-services-discourse-basic-usage" + ], + "module-services-discourse-tls": [ + "index.html#module-services-discourse-tls" + ], + "module-services-discourse-database": [ + "index.html#module-services-discourse-database" + ], + "module-services-discourse-mail": [ + "index.html#module-services-discourse-mail" + ], + "module-services-discourse-settings": [ + "index.html#module-services-discourse-settings" + ], + "module-services-discourse-site-settings": [ + "index.html#module-services-discourse-site-settings" + ], + "module-services-discourse-backend-settings": [ + "index.html#module-services-discourse-backend-settings" + ], + "module-services-discourse-settings-example": [ + "index.html#module-services-discourse-settings-example" + ], + "module-services-discourse-plugins": [ + "index.html#module-services-discourse-plugins" + ], + "module-services-davis": [ + "index.html#module-services-davis" + ], + "module-services-davis-basic-usage": [ + "index.html#module-services-davis-basic-usage" + ], + "module-services-castopod": [ + "index.html#module-services-castopod" + ], + "module-services-castopod-quickstart": [ + "index.html#module-services-castopod-quickstart" + ], + "module-services-c2fmzq": [ + "index.html#module-services-c2fmzq" + ], + "module-services-akkoma": [ + "index.html#module-services-akkoma" + ], + "modules-services-akkoma-service-configuration": [ + "index.html#modules-services-akkoma-service-configuration" + ], + "modules-services-akkoma-user-management": [ + "index.html#modules-services-akkoma-user-management" + ], + "modules-services-akkoma-proxy-configuration": [ + "index.html#modules-services-akkoma-proxy-configuration" + ], + "modules-services-akkoma-media-proxy": [ + "index.html#modules-services-akkoma-media-proxy" + ], + "modules-services-akkoma-prefetch-remote-media": [ + "index.html#modules-services-akkoma-prefetch-remote-media" + ], + "modules-services-akkoma-media-previews": [ + "index.html#modules-services-akkoma-media-previews" + ], + "modules-services-akkoma-frontend-management": [ + "index.html#modules-services-akkoma-frontend-management" + ], + "modules-services-akkoma-federation-policies": [ + "index.html#modules-services-akkoma-federation-policies" + ], + "modules-services-akkoma-upload-filters": [ + "index.html#modules-services-akkoma-upload-filters" + ], + "modules-services-akkoma-migration-pleroma": [ + "index.html#modules-services-akkoma-migration-pleroma" + ], + "modules-services-akkoma-migration-pleroma-copy": [ + "index.html#modules-services-akkoma-migration-pleroma-copy" + ], + "modules-services-akkoma-migration-pleroma-reuse": [ + "index.html#modules-services-akkoma-migration-pleroma-reuse" + ], + "modules-services-akkoma-advanced-deployment": [ + "index.html#modules-services-akkoma-advanced-deployment" + ], + "modules-services-akkoma-confinement": [ + "index.html#modules-services-akkoma-confinement" + ], + "modules-services-akkoma-distributed-deployment": [ + "index.html#modules-services-akkoma-distributed-deployment" + ], + "module-services-systemd-lock-handler": [ + "index.html#module-services-systemd-lock-handler" + ], + "module-services-kerberos-server": [ + "index.html#module-services-kerberos-server" + ], + "module-services-kerberos-server-usage": [ + "index.html#module-services-kerberos-server-usage" + ], + "module-services-kerberos-server-notes": [ + "index.html#module-services-kerberos-server-notes" + ], + "module-services-kerberos-server-upstream-documentation": [ + "index.html#module-services-kerberos-server-upstream-documentation" + ], + "module-services-meilisearch": [ + "index.html#module-services-meilisearch" + ], + "module-services-meilisearch-quickstart": [ + "index.html#module-services-meilisearch-quickstart" + ], + "module-services-meilisearch-usage": [ + "index.html#module-services-meilisearch-usage" + ], + "module-services-meilisearch-quickstart-add": [ + "index.html#module-services-meilisearch-quickstart-add" + ], + "module-services-meilisearch-quickstart-search": [ + "index.html#module-services-meilisearch-quickstart-search" + ], + "module-services-meilisearch-defaults": [ + "index.html#module-services-meilisearch-defaults" + ], + "module-services-meilisearch-missing": [ + "index.html#module-services-meilisearch-missing" + ], + "module-services-networking-yggdrasil": [ + "index.html#module-services-networking-yggdrasil" + ], + "module-services-networking-yggdrasil-configuration": [ + "index.html#module-services-networking-yggdrasil-configuration" + ], + "module-services-networking-yggdrasil-configuration-simple": [ + "index.html#module-services-networking-yggdrasil-configuration-simple" + ], + "module-services-networking-yggdrasil-configuration-prefix": [ + "index.html#module-services-networking-yggdrasil-configuration-prefix" + ], + "module-services-networking-yggdrasil-configuration-container": [ + "index.html#module-services-networking-yggdrasil-configuration-container" + ], + "module-services-prosody": [ + "index.html#module-services-prosody" + ], + "module-services-prosody-basic-usage": [ + "index.html#module-services-prosody-basic-usage" + ], + "module-services-prosody-letsencrypt": [ + "index.html#module-services-prosody-letsencrypt" + ], + "module-services-pleroma": [ + "index.html#module-services-pleroma" + ], + "module-services-pleroma-generate-config": [ + "index.html#module-services-pleroma-generate-config" + ], + "module-services-pleroma-initialize-db": [ + "index.html#module-services-pleroma-initialize-db" + ], + "module-services-pleroma-enable": [ + "index.html#module-services-pleroma-enable" + ], + "module-services-pleroma-admin-user": [ + "index.html#module-services-pleroma-admin-user" + ], + "module-services-pleroma-nginx": [ + "index.html#module-services-pleroma-nginx" + ], + "module-services-netbird-server": [ + "index.html#module-services-netbird-server" + ], + "module-services-netbird-server-quickstart": [ + "index.html#module-services-netbird-server-quickstart" + ], + "module-services-netbird": [ + "index.html#module-services-netbird" + ], + "module-services-netbird-quickstart": [ + "index.html#module-services-netbird-quickstart" + ], + "module-services-netbird-multiple-connections": [ + "index.html#module-services-netbird-multiple-connections" + ], + "module-services-mosquitto": [ + "index.html#module-services-mosquitto" + ], + "module-services-mosquitto-quickstart": [ + "index.html#module-services-mosquitto-quickstart" + ], + "module-services-mosquitto-config": [ + "index.html#module-services-mosquitto-config" + ], + "module-services-mosquitto-config-passwords": [ + "index.html#module-services-mosquitto-config-passwords" + ], + "module-services-mosquitto-config-acl": [ + "index.html#module-services-mosquitto-config-acl" + ], + "module-services-jotta-cli": [ + "index.html#module-services-jotta-cli" + ], + "module-services-jotta-cli-quick-start": [ + "index.html#module-services-jotta-cli-quick-start" + ], + "module-services-jotta-cli-example-configuration": [ + "index.html#module-services-jotta-cli-example-configuration" + ], + "module-services-gns3-server": [ + "index.html#module-services-gns3-server" + ], + "module-services-gns3-server-basic-usage": [ + "index.html#module-services-gns3-server-basic-usage" + ], + "module-services-firefox-syncserver": [ + "index.html#module-services-firefox-syncserver" + ], + "module-services-firefox-syncserver-quickstart": [ + "index.html#module-services-firefox-syncserver-quickstart" + ], + "module-services-firefox-syncserver-configuration": [ + "index.html#module-services-firefox-syncserver-configuration" + ], + "module-services-networking-dnsmasq": [ + "index.html#module-services-networking-dnsmasq" + ], + "module-services-networking-dnsmasq-configuration": [ + "index.html#module-services-networking-dnsmasq-configuration" + ], + "module-services-networking-dnsmasq-configuration-home": [ + "index.html#module-services-networking-dnsmasq-configuration-home" + ], + "module-services-networking-dnsmasq-references": [ + "index.html#module-services-networking-dnsmasq-references" + ], + "module-services-samba": [ + "index.html#module-services-samba" + ], + "module-services-samba-basic-usage": [ + "index.html#module-services-samba-basic-usage" + ], + "module-services-samba-configuring": [ + "index.html#module-services-samba-configuring" + ], + "module-services-samba-configuring-file-share": [ + "index.html#module-services-samba-configuring-file-share" + ], + "module-services-litestream": [ + "index.html#module-services-litestream" + ], + "module-services-litestream-configuration": [ + "index.html#module-services-litestream-configuration" + ], + "module-services-prometheus-exporters": [ + "index.html#module-services-prometheus-exporters" + ], + "module-services-prometheus-exporters-configuration": [ + "index.html#module-services-prometheus-exporters-configuration" + ], + "module-services-prometheus-exporters-new-exporter": [ + "index.html#module-services-prometheus-exporters-new-exporter" + ], + "module-services-prometheus-exporters-update-exporter-module": [ + "index.html#module-services-prometheus-exporters-update-exporter-module" + ], + "module-services-parsedmarc": [ + "index.html#module-services-parsedmarc" + ], + "module-services-parsedmarc-basic-usage": [ + "index.html#module-services-parsedmarc-basic-usage" + ], + "module-services-parsedmarc-local-mail": [ + "index.html#module-services-parsedmarc-local-mail" + ], + "module-services-parsedmarc-grafana-geoip": [ + "index.html#module-services-parsedmarc-grafana-geoip" + ], + "module-services-ocsinventory-agent": [ + "index.html#module-services-ocsinventory-agent" + ], + "module-services-ocsinventory-agent-basic-usage": [ + "index.html#module-services-ocsinventory-agent-basic-usage" + ], + "module-services-goss": [ + "index.html#module-services-goss" + ], + "module-services-goss-basic-usage": [ + "index.html#module-services-goss-basic-usage" + ], + "module-services-certspotter": [ + "index.html#module-services-certspotter" + ], + "modules-services-certspotter-service-configuration": [ + "index.html#modules-services-certspotter-service-configuration" + ], + "modules-services-certspotter-operation": [ + "index.html#modules-services-certspotter-operation" + ], + "modules-services-certspotter-hooks": [ + "index.html#modules-services-certspotter-hooks" + ], + "module-services-weechat": [ + "index.html#module-services-weechat" + ], + "module-services-weechat-basic-usage": [ + "index.html#module-services-weechat-basic-usage" + ], + "module-services-weechat-reattach": [ + "index.html#module-services-weechat-reattach" + ], + "module-services-taskserver": [ + "index.html#module-services-taskserver" + ], + "module-services-taskserver-configuration": [ + "index.html#module-services-taskserver-configuration" + ], + "module-services-taskserver-nixos-taskserver-tool": [ + "index.html#module-services-taskserver-nixos-taskserver-tool" + ], + "module-services-taskserver-declarative-ca-management": [ + "index.html#module-services-taskserver-declarative-ca-management" + ], + "module-services-taskserver-manual-ca-management": [ + "index.html#module-services-taskserver-manual-ca-management" + ], + "module-services-sourcehut": [ + "index.html#module-services-sourcehut" + ], + "module-services-sourcehut-basic-usage": [ + "index.html#module-services-sourcehut-basic-usage" + ], + "module-services-sourcehut-configuration": [ + "index.html#module-services-sourcehut-configuration" + ], + "module-services-sourcehut-httpd": [ + "index.html#module-services-sourcehut-httpd" + ], + "module-services-gitlab": [ + "index.html#module-services-gitlab" + ], + "module-services-gitlab-prerequisites": [ + "index.html#module-services-gitlab-prerequisites" + ], + "module-services-gitlab-configuring": [ + "index.html#module-services-gitlab-configuring" + ], + "module-services-gitlab-maintenance": [ + "index.html#module-services-gitlab-maintenance" + ], + "module-services-gitlab-maintenance-backups": [ + "index.html#module-services-gitlab-maintenance-backups" + ], + "module-services-gitlab-maintenance-rake": [ + "index.html#module-services-gitlab-maintenance-rake" + ], + "module-forgejo": [ + "index.html#module-forgejo" + ], + "module-forgejo-migration-gitea": [ + "index.html#module-forgejo-migration-gitea" + ], + "module-forgejo-migration-gitea-default": [ + "index.html#module-forgejo-migration-gitea-default" + ], + "module-forgejo-migration-gitea-impersonate": [ + "index.html#module-forgejo-migration-gitea-impersonate" + ], + "module-services-apache-kafka": [ + "index.html#module-services-apache-kafka" + ], + "module-services-apache-kafka-basic-usage": [ + "index.html#module-services-apache-kafka-basic-usage" + ], + "module-services-apache-kafka-kraft": [ + "index.html#module-services-apache-kafka-kraft" + ], + "module-services-apache-kafka-migrating-to-settings": [ + "index.html#module-services-apache-kafka-migrating-to-settings" + ], + "module-services-anki-sync-server": [ + "index.html#module-services-anki-sync-server" + ], + "module-services-anki-sync-server-basic-usage": [ + "index.html#module-services-anki-sync-server-basic-usage" + ], + "module-services-matrix": [ + "index.html#module-services-matrix" + ], + "module-services-matrix-synapse": [ + "index.html#module-services-matrix-synapse" + ], + "module-services-matrix-register-users": [ + "index.html#module-services-matrix-register-users" + ], + "module-services-matrix-element-web": [ + "index.html#module-services-matrix-element-web" + ], + "module-services-mjolnir": [ + "index.html#module-services-mjolnir" + ], + "module-services-mjolnir-setup": [ + "index.html#module-services-mjolnir-setup" + ], + "module-services-mjolnir-setup-ems": [ + "index.html#module-services-mjolnir-setup-ems" + ], + "module-services-mjolnir-matrix-synapse-antispam": [ + "index.html#module-services-mjolnir-matrix-synapse-antispam" + ], + "module-services-mautrix-signal": [ + "index.html#module-services-mautrix-signal" + ], + "module-services-mautrix-signal-configuration": [ + "index.html#module-services-mautrix-signal-configuration" + ], + "module-services-mautrix-signal-migrate-configuration": [ + "index.html#module-services-mautrix-signal-migrate-configuration" + ], + "module-services-maubot": [ + "index.html#module-services-maubot" + ], + "module-services-maubot-configuration": [ + "index.html#module-services-maubot-configuration" + ], + "module-services-mailman": [ + "index.html#module-services-mailman" + ], + "module-services-mailman-basic-usage": [ + "index.html#module-services-mailman-basic-usage" + ], + "module-services-mailman-other-mtas": [ + "index.html#module-services-mailman-other-mtas" + ], + "trezor": [ + "index.html#trezor" + ], + "module-hardware-display": [ + "index.html#module-hardware-display" + ], + "module-hardware-display-modes": [ + "index.html#module-hardware-display-modes" + ], + "module-hardware-display-edid-custom": [ + "index.html#module-hardware-display-edid-custom" + ], + "module-hardware-display-edid-assign": [ + "index.html#module-hardware-display-edid-assign" + ], + "module-hardware-display-edid-linuxhw": [ + "index.html#module-hardware-display-edid-linuxhw" + ], + "module-hardware-display-edid-modelines": [ + "index.html#module-hardware-display-edid-modelines" + ], + "module-hardware-display-pg278q": [ + "index.html#module-hardware-display-pg278q" + ], + "module-services-emacs": [ + "index.html#module-services-emacs" + ], + "module-services-emacs-installing": [ + "index.html#module-services-emacs-installing" + ], + "module-services-emacs-releases": [ + "index.html#module-services-emacs-releases" + ], + "module-services-emacs-adding-packages": [ + "index.html#module-services-emacs-adding-packages" + ], + "ex-emacsNix": [ + "index.html#ex-emacsNix" + ], + "module-services-emacs-querying-packages": [ + "index.html#module-services-emacs-querying-packages" + ], + "module-services-emacs-configuration-nix": [ + "index.html#module-services-emacs-configuration-nix" + ], + "module-services-emacs-config-nix": [ + "index.html#module-services-emacs-config-nix" + ], + "module-services-emacs-advanced": [ + "index.html#module-services-emacs-advanced" + ], + "ex-emacsGtk3Nix": [ + "index.html#ex-emacsGtk3Nix" + ], + "module-services-emacs-running": [ + "index.html#module-services-emacs-running" + ], + "module-services-emacs-enabling": [ + "index.html#module-services-emacs-enabling" + ], + "module-services-emacs-starting-client": [ + "index.html#module-services-emacs-starting-client" + ], + "module-services-emacs-editor-variable": [ + "index.html#module-services-emacs-editor-variable" + ], + "module-services-emacs-per-user": [ + "index.html#module-services-emacs-per-user" + ], + "module-services-emacs-configuring": [ + "index.html#module-services-emacs-configuring" + ], + "module-services-emacs-major-mode": [ + "index.html#module-services-emacs-major-mode" + ], + "module-services-emacs-man-pages": [ + "index.html#module-services-emacs-man-pages" + ], + "module-services-livebook": [ + "index.html#module-services-livebook" + ], + "module-services-livebook-basic-usage": [ + "index.html#module-services-livebook-basic-usage" + ], + "module-services-livebook-extra-dependencies": [ + "index.html#module-services-livebook-extra-dependencies" + ], + "module-services-blackfire": [ + "index.html#module-services-blackfire" + ], + "module-athens": [ + "index.html#module-athens" + ], + "module-services-development-athens-configuring": [ + "index.html#module-services-development-athens-configuring" + ], + "module-services-flatpak": [ + "index.html#module-services-flatpak" + ], + "module-services-tigerbeetle": [ + "index.html#module-services-tigerbeetle" + ], + "module-services-tigerbeetle-configuring": [ + "index.html#module-services-tigerbeetle-configuring" + ], + "module-services-tigerbeetle-upgrading": [ + "index.html#module-services-tigerbeetle-upgrading" + ], + "module-postgresql": [ + "index.html#module-postgresql" + ], + "module-services-postgres-configuring": [ + "index.html#module-services-postgres-configuring" + ], + "module-services-postgres-initializing": [ + "index.html#module-services-postgres-initializing" + ], + "module-services-postgres-initializing-ownership": [ + "index.html#module-services-postgres-initializing-ownership" + ], + "module-services-postgres-initializing-extra-permissions": [ + "index.html#module-services-postgres-initializing-extra-permissions" + ], + "module-services-postgres-initializing-extra-permissions-superuser": [ + "index.html#module-services-postgres-initializing-extra-permissions-superuser" + ], + "module-services-postgres-initializing-extra-permissions-superuser-post-start": [ + "index.html#module-services-postgres-initializing-extra-permissions-superuser-post-start" + ], + "module-services-postgres-initializing-extra-permissions-superuser-oneshot": [ + "index.html#module-services-postgres-initializing-extra-permissions-superuser-oneshot" + ], + "module-services-postgres-initializing-extra-permissions-service-user": [ + "index.html#module-services-postgres-initializing-extra-permissions-service-user" + ], + "module-services-postgres-initializing-extra-permissions-service-user-pre-start": [ + "index.html#module-services-postgres-initializing-extra-permissions-service-user-pre-start" + ], + "module-services-postgres-initializing-extra-permissions-service-user-oneshot": [ + "index.html#module-services-postgres-initializing-extra-permissions-service-user-oneshot" + ], + "module-services-postgres-upgrading": [ + "index.html#module-services-postgres-upgrading" + ], + "module-services-postgres-versioning": [ + "index.html#module-services-postgres-versioning" + ], + "module-services-postgres-options": [ + "index.html#module-services-postgres-options" + ], + "module-services-postgres-plugins": [ + "index.html#module-services-postgres-plugins" + ], + "module-services-postgres-jit": [ + "index.html#module-services-postgres-jit" + ], + "module-services-postgres-hardening": [ + "index.html#module-services-postgres-hardening" + ], + "module-services-postgres-upstream-deviation": [ + "index.html#module-services-postgres-upstream-deviation" + ], + "module-services-foundationdb": [ + "index.html#module-services-foundationdb" + ], + "module-services-foundationdb-configuring": [ + "index.html#module-services-foundationdb-configuring" + ], + "module-services-foundationdb-scaling": [ + "index.html#module-services-foundationdb-scaling" + ], + "module-services-foundationdb-clustering": [ + "index.html#module-services-foundationdb-clustering" + ], + "module-services-foundationdb-connectivity": [ + "index.html#module-services-foundationdb-connectivity" + ], + "module-services-foundationdb-authorization": [ + "index.html#module-services-foundationdb-authorization" + ], + "module-services-foundationdb-disaster-recovery": [ + "index.html#module-services-foundationdb-disaster-recovery" + ], + "module-services-foundationdb-limitations": [ + "index.html#module-services-foundationdb-limitations" + ], + "module-services-foundationdb-options": [ + "index.html#module-services-foundationdb-options" + ], + "module-services-foundationdb-full-docs": [ + "index.html#module-services-foundationdb-full-docs" + ], + "module-borgbase": [ + "index.html#module-borgbase" + ], + "module-services-backup-borgbackup-configuring": [ + "index.html#module-services-backup-borgbackup-configuring" + ], + "module-security-acme": [ + "index.html#module-security-acme" + ], + "module-security-acme-prerequisites": [ + "index.html#module-security-acme-prerequisites" + ], + "module-security-acme-nginx": [ + "index.html#module-security-acme-nginx" + ], + "module-security-acme-httpd": [ + "index.html#module-security-acme-httpd" + ], + "module-security-acme-configuring": [ + "index.html#module-security-acme-configuring" + ], + "module-security-acme-config-dns": [ + "index.html#module-security-acme-config-dns" + ], + "module-security-acme-config-dns-with-vhosts": [ + "index.html#module-security-acme-config-dns-with-vhosts" + ], + "module-security-acme-root-owned": [ + "index.html#module-security-acme-root-owned" + ], + "module-security-acme-regenerate": [ + "index.html#module-security-acme-regenerate" + ], + "module-security-acme-fix-jws": [ + "index.html#module-security-acme-fix-jws" + ], + "module-programs-zsh-ohmyzsh": [ + "index.html#module-programs-zsh-ohmyzsh" + ], + "module-programs-oh-my-zsh-usage": [ + "index.html#module-programs-oh-my-zsh-usage" + ], + "module-programs-oh-my-zsh-additions": [ + "index.html#module-programs-oh-my-zsh-additions" + ], + "module-programs-oh-my-zsh-environments": [ + "index.html#module-programs-oh-my-zsh-environments" + ], + "module-programs-oh-my-zsh-packaging-customizations": [ + "index.html#module-programs-oh-my-zsh-packaging-customizations" + ], + "module-program-plotinus": [ + "index.html#module-program-plotinus" + ], + "module-programs-digitalbitbox": [ + "index.html#module-programs-digitalbitbox" + ], + "sec-digitalbitbox-package": [ + "index.html#sec-digitalbitbox-package" + ], + "sec-digitalbitbox-hardware-module": [ + "index.html#sec-digitalbitbox-hardware-module" + ], + "module-services-input-methods": [ + "index.html#module-services-input-methods" + ], + "module-services-input-methods-ibus": [ + "index.html#module-services-input-methods-ibus" + ], + "module-services-input-methods-troubleshooting": [ + "index.html#module-services-input-methods-troubleshooting" + ], + "module-services-input-methods-fcitx": [ + "index.html#module-services-input-methods-fcitx" + ], + "module-services-input-methods-nabi": [ + "index.html#module-services-input-methods-nabi" + ], + "module-services-input-methods-uim": [ + "index.html#module-services-input-methods-uim" + ], + "module-services-input-methods-hime": [ + "index.html#module-services-input-methods-hime" + ], + "module-services-input-methods-kime": [ + "index.html#module-services-input-methods-kime" + ], + "ch-profiles": [ + "index.html#ch-profiles" + ], + "sec-profile-all-hardware": [ + "index.html#sec-profile-all-hardware" + ], + "sec-profile-base": [ + "index.html#sec-profile-base" + ], + "sec-profile-clone-config": [ + "index.html#sec-profile-clone-config" + ], + "sec-profile-demo": [ + "index.html#sec-profile-demo" + ], + "sec-profile-docker-container": [ + "index.html#sec-profile-docker-container" + ], + "sec-profile-graphical": [ + "index.html#sec-profile-graphical" + ], + "sec-profile-hardened": [ + "index.html#sec-profile-hardened" + ], + "sec-profile-headless": [ + "index.html#sec-profile-headless" + ], + "sec-profile-installation-device": [ + "index.html#sec-profile-installation-device" + ], + "sec-perlless": [ + "index.html#sec-perlless" + ], + "sec-profile-minimal": [ + "index.html#sec-profile-minimal" + ], + "sec-profile-qemu-guest": [ + "index.html#sec-profile-qemu-guest" + ], + "sec-kubernetes": [ + "index.html#sec-kubernetes" + ], + "ch-running": [ + "index.html#ch-running" + ], + "sec-systemctl": [ + "index.html#sec-systemctl" + ], + "sect-nixos-systemd-general": [ + "index.html#sect-nixos-systemd-general" + ], + "sect-nixos-systemd-nixos": [ + "index.html#sect-nixos-systemd-nixos" + ], + "sect-nixos-systemd-template-units": [ + "index.html#sect-nixos-systemd-template-units" + ], + "sec-rebooting": [ + "index.html#sec-rebooting" + ], + "sec-user-sessions": [ + "index.html#sec-user-sessions" + ], + "sec-cgroups": [ + "index.html#sec-cgroups" + ], + "sec-logging": [ + "index.html#sec-logging" + ], + "ch-system-state": [ + "index.html#ch-system-state" + ], + "sec-nixos-state": [ + "index.html#sec-nixos-state" + ], + "sec-state-nix": [ + "index.html#sec-state-nix" + ], + "sec-state-boot": [ + "index.html#sec-state-boot" + ], + "sec-state-users": [ + "index.html#sec-state-users" + ], + "sec-systemd-state": [ + "index.html#sec-systemd-state" + ], + "sec-machine-id": [ + "index.html#sec-machine-id" + ], + "sec-var-systemd": [ + "index.html#sec-var-systemd" + ], + "sec-var-journal": [ + "index.html#sec-var-journal" + ], + "sec-zfs-state": [ + "index.html#sec-zfs-state" + ], + "sec-nix-gc": [ + "index.html#sec-nix-gc" + ], + "sect-nixos-gc-boot-entries": [ + "index.html#sect-nixos-gc-boot-entries" + ], + "ch-containers": [ + "index.html#ch-containers" + ], + "sec-imperative-containers": [ + "index.html#sec-imperative-containers" + ], + "sec-declarative-containers": [ + "index.html#sec-declarative-containers" + ], + "sec-container-networking": [ + "index.html#sec-container-networking" + ], + "ch-troubleshooting": [ + "index.html#ch-troubleshooting" + ], + "sec-boot-problems": [ + "index.html#sec-boot-problems" + ], + "sec-maintenance-mode": [ + "index.html#sec-maintenance-mode" + ], + "sec-rollback": [ + "index.html#sec-rollback" + ], + "sec-nix-store-corruption": [ + "index.html#sec-nix-store-corruption" + ], + "sec-nix-network-issues": [ + "index.html#sec-nix-network-issues" + ], + "ch-development": [ + "index.html#ch-development" + ], + "sec-getting-sources": [ + "index.html#sec-getting-sources" + ], + "sec-writing-modules": [ + "index.html#sec-writing-modules" + ], + "ex-module-syntax": [ + "index.html#ex-module-syntax" + ], + "locate-example": [ + "index.html#locate-example" + ], + "exec-escaping-example": [ + "index.html#exec-escaping-example" + ], + "sec-option-declarations": [ + "index.html#sec-option-declarations" + ], + "sec-option-declarations-util": [ + "index.html#sec-option-declarations-util" + ], + "sec-option-declarations-util-mkEnableOption": [ + "index.html#sec-option-declarations-util-mkEnableOption" + ], + "ex-options-declarations-util-mkEnableOption-magic": [ + "index.html#ex-options-declarations-util-mkEnableOption-magic" + ], + "sec-option-declarations-util-mkPackageOption": [ + "index.html#sec-option-declarations-util-mkPackageOption" + ], + "ex-options-declarations-util-mkPackageOption": [ + "index.html#ex-options-declarations-util-mkPackageOption" + ], + "ex-options-declarations-util-mkPackageOption-hello": [ + "index.html#ex-options-declarations-util-mkPackageOption-hello" + ], + "ex-options-declarations-util-mkPackageOption-ghc": [ + "index.html#ex-options-declarations-util-mkPackageOption-ghc" + ], + "ex-options-declarations-util-mkPackageOption-extraDescription": [ + "index.html#ex-options-declarations-util-mkPackageOption-extraDescription" + ], + "sec-option-declarations-eot": [ + "index.html#sec-option-declarations-eot" + ], + "ex-option-declaration-eot-service": [ + "index.html#ex-option-declaration-eot-service" + ], + "ex-option-declaration-eot-backend-gdm": [ + "index.html#ex-option-declaration-eot-backend-gdm" + ], + "ex-option-declaration-eot-backend-sddm": [ + "index.html#ex-option-declaration-eot-backend-sddm" + ], + "sec-option-types": [ + "index.html#sec-option-types" + ], + "sec-option-types-basic": [ + "index.html#sec-option-types-basic" + ], + "ex-types-anything": [ + "index.html#ex-types-anything" + ], + "sec-option-types-numeric": [ + "index.html#sec-option-types-numeric" + ], + "sec-option-types-string": [ + "index.html#sec-option-types-string" + ], + "sec-option-types-submodule": [ + "index.html#sec-option-types-submodule" + ], + "sec-option-types-unions": [ + "index.html#sec-option-types-unions" + ], + "sec-option-types-sums": [ + "index.html#sec-option-types-sums" + ], + "sec-option-types-composed": [ + "index.html#sec-option-types-composed" + ], + "section-option-types-submodule": [ + "index.html#section-option-types-submodule" + ], + "ex-submodule-direct": [ + "index.html#ex-submodule-direct" + ], + "ex-submodule-reference": [ + "index.html#ex-submodule-reference" + ], + "ex-submodule-listof-declaration": [ + "index.html#ex-submodule-listof-declaration" + ], + "ex-submodule-listof-definition": [ + "index.html#ex-submodule-listof-definition" + ], + "ex-submodule-attrsof-declaration": [ + "index.html#ex-submodule-attrsof-declaration" + ], + "ex-submodule-attrsof-definition": [ + "index.html#ex-submodule-attrsof-definition" + ], + "sec-option-types-extending": [ + "index.html#sec-option-types-extending" + ], + "ex-extending-type-check-1": [ + "index.html#ex-extending-type-check-1" + ], + "ex-extending-type-check-2": [ + "index.html#ex-extending-type-check-2" + ], + "sec-option-types-custom": [ + "index.html#sec-option-types-custom" + ], + "sec-option-definitions": [ + "index.html#sec-option-definitions" + ], + "sec-option-definitions-delaying-conditionals": [ + "index.html#sec-option-definitions-delaying-conditionals" + ], + "sec-option-definitions-setting-priorities": [ + "index.html#sec-option-definitions-setting-priorities" + ], + "sec-option-definitions-ordering": [ + "index.html#sec-option-definitions-ordering" + ], + "sec-option-definitions-merging": [ + "index.html#sec-option-definitions-merging" + ], + "sec-assertions": [ + "index.html#sec-assertions" + ], + "sec-assertions-warnings": [ + "index.html#sec-assertions-warnings" + ], + "sec-assertions-assetions": [ + "index.html#sec-assertions-assetions" + ], + "sec-meta-attributes": [ + "index.html#sec-meta-attributes" + ], + "sec-importing-modules": [ + "index.html#sec-importing-modules" + ], + "sec-replace-modules": [ + "index.html#sec-replace-modules" + ], + "sec-freeform-modules": [ + "index.html#sec-freeform-modules" + ], + "ex-freeform-module": [ + "index.html#ex-freeform-module" + ], + "sec-settings-options": [ + "index.html#sec-settings-options" + ], + "sec-settings-nix-representable": [ + "index.html#sec-settings-nix-representable" + ], + "pkgs-formats-php": [ + "index.html#pkgs-formats-php" + ], + "pkgs-formats-result": [ + "index.html#pkgs-formats-result" + ], + "ex-settings-nix-representable": [ + "index.html#ex-settings-nix-representable" + ], + "sec-settings-attrs-options": [ + "index.html#sec-settings-attrs-options" + ], + "ex-settings-typed-attrs": [ + "index.html#ex-settings-typed-attrs" + ], + "sec-building-parts": [ + "index.html#sec-building-parts" + ], + "sec-bootspec": [ + "index.html#sec-bootspec" + ], + "sec-bootspec-schema": [ + "index.html#sec-bootspec-schema" + ], + "sec-bootspec-extensions": [ + "index.html#sec-bootspec-extensions" + ], + "sec-bootspec-external-bootloaders": [ + "index.html#sec-bootspec-external-bootloaders" + ], + "sec-switching-systems": [ + "index.html#sec-switching-systems" + ], + "sec-unit-handling": [ + "index.html#sec-unit-handling" + ], + "sec-sysinit-reactivation": [ + "index.html#sec-sysinit-reactivation" + ], + "sec-activation-script": [ + "index.html#sec-activation-script" + ], + "sec-activation-script-nixos-snippets": [ + "index.html#sec-activation-script-nixos-snippets" + ], + "sec-non-switchable-system": [ + "index.html#sec-non-switchable-system" + ], + "sec-etc-overlay": [ + "index.html#sec-etc-overlay" + ], + "sec-writing-documentation": [ + "index.html#sec-writing-documentation" + ], + "sec-writing-docs-building-the-manual": [ + "index.html#sec-writing-docs-building-the-manual" + ], + "sec-nixos-tests": [ + "index.html#sec-nixos-tests" + ], + "sec-writing-nixos-tests": [ + "index.html#sec-writing-nixos-tests" + ], + "sec-calling-nixos-tests": [ + "index.html#sec-calling-nixos-tests" + ], + "sec-call-nixos-test-in-nixos": [ + "index.html#sec-call-nixos-test-in-nixos" + ], + "sec-call-nixos-test-outside-nixos": [ + "index.html#sec-call-nixos-test-outside-nixos" + ], + "sec-nixos-test-nodes": [ + "index.html#sec-nixos-test-nodes" + ], + "ssec-machine-objects": [ + "index.html#ssec-machine-objects" + ], + "ssec-failing-tests-early": [ + "index.html#ssec-failing-tests-early" + ], + "ssec-python-packages-in-test-script": [ + "index.html#ssec-python-packages-in-test-script" + ], + "sec-test-options-reference": [ + "index.html#sec-test-options-reference" + ], + "test-opt-defaults": [ + "index.html#test-opt-defaults" + ], + "test-opt-driver": [ + "index.html#test-opt-driver" + ], + "test-opt-enableOCR": [ + "index.html#test-opt-enableOCR" + ], + "test-opt-extraBaseModules": [ + "index.html#test-opt-extraBaseModules" + ], + "test-opt-extraDriverArgs": [ + "index.html#test-opt-extraDriverArgs" + ], + "test-opt-extraPythonPackages": [ + "index.html#test-opt-extraPythonPackages" + ], + "test-opt-globalTimeout": [ + "index.html#test-opt-globalTimeout" + ], + "test-opt-hostPkgs": [ + "index.html#test-opt-hostPkgs" + ], + "test-opt-interactive": [ + "index.html#test-opt-interactive" + ], + "test-opt-meta": [ + "index.html#test-opt-meta" + ], + "test-opt-meta.broken": [ + "index.html#test-opt-meta.broken" + ], + "test-opt-meta.maintainers": [ + "index.html#test-opt-meta.maintainers" + ], + "test-opt-meta.platforms": [ + "index.html#test-opt-meta.platforms" + ], + "test-opt-meta.timeout": [ + "index.html#test-opt-meta.timeout" + ], + "test-opt-name": [ + "index.html#test-opt-name" + ], + "test-opt-node.pkgs": [ + "index.html#test-opt-node.pkgs" + ], + "test-opt-node.pkgsReadOnly": [ + "index.html#test-opt-node.pkgsReadOnly" + ], + "test-opt-node.specialArgs": [ + "index.html#test-opt-node.specialArgs" + ], + "test-opt-nodes": [ + "index.html#test-opt-nodes" + ], + "test-opt-passthru": [ + "index.html#test-opt-passthru" + ], + "test-opt-qemu.package": [ + "index.html#test-opt-qemu.package" + ], + "test-opt-skipLint": [ + "index.html#test-opt-skipLint" + ], + "test-opt-skipTypeCheck": [ + "index.html#test-opt-skipTypeCheck" + ], + "test-opt-test": [ + "index.html#test-opt-test" + ], + "test-opt-testScript": [ + "index.html#test-opt-testScript" + ], + "sec-running-nixos-tests": [ + "index.html#sec-running-nixos-tests" + ], + "sec-running-nixos-tests-requirements": [ + "index.html#sec-running-nixos-tests-requirements" + ], + "sec-running-nixos-tests-interactively": [ + "index.html#sec-running-nixos-tests-interactively" + ], + "sec-nixos-test-shell-access": [ + "index.html#sec-nixos-test-shell-access" + ], + "sec-nixos-test-port-forwarding": [ + "index.html#sec-nixos-test-port-forwarding" + ], + "sec-nixos-test-reuse-vm-state": [ + "index.html#sec-nixos-test-reuse-vm-state" + ], + "sec-nixos-test-interactive-configuration": [ + "index.html#sec-nixos-test-interactive-configuration" + ], + "sec-linking-nixos-tests-to-packages": [ + "index.html#sec-linking-nixos-tests-to-packages" + ], + "chap-developing-the-test-driver": [ + "index.html#chap-developing-the-test-driver" + ], + "sec-test-the-test-framework": [ + "index.html#sec-test-the-test-framework" + ], + "ch-testing-installer": [ + "index.html#ch-testing-installer" + ], + "chap-contributing": [ + "index.html#chap-contributing" + ], + "sec-contributing-redirects": [ + "index.html#sec-contributing-redirects" + ], + "sec-contributing-options": [ + "index.html#sec-contributing-options" + ], + "sec-contributing-nixos-tools": [ + "index.html#sec-contributing-nixos-tools" + ], + "ssec-contributing-nixos-tools-cli-and-args": [ + "index.html#ssec-contributing-nixos-tools-cli-and-args" + ], + "ssec-contributing-nixos-tools-options-and-environment": [ + "index.html#ssec-contributing-nixos-tools-options-and-environment" + ], + "ssec-contributing-nixos-tools-code-examples": [ + "index.html#ssec-contributing-nixos-tools-code-examples" + ], + "ch-options": [ + "options.html#ch-options" + ], + "ch-release-notes": [ + "release-notes.html#ch-release-notes" + ], + "sec-release-25.05": [ + "release-notes.html#sec-release-25.05" + ], + "sec-release-25.05-highlights": [ + "release-notes.html#sec-release-25.05-highlights" + ], + "sec-release-25.05-new-modules": [ + "release-notes.html#sec-release-25.05-new-modules" + ], + "sec-release-25.05-incompatibilities": [ + "release-notes.html#sec-release-25.05-incompatibilities" + ], + "sec-release-25.05-notable-changes": [ + "release-notes.html#sec-release-25.05-notable-changes" + ], + "sec-release-24.11": [ + "release-notes.html#sec-release-24.11" + ], + "sec-release-24.11-highlights": [ + "release-notes.html#sec-release-24.11-highlights" + ], + "sec-release-24.11-new-modules": [ + "release-notes.html#sec-release-24.11-new-modules" + ], + "sec-release-24.11-incompatibilities": [ + "release-notes.html#sec-release-24.11-incompatibilities" + ], + "sec-release-24.11-notable-changes": [ + "release-notes.html#sec-release-24.11-notable-changes" + ], + "sec-release-24.11-migration": [ + "release-notes.html#sec-release-24.11-migration" + ], + "sec-release-24.11-migration-sound": [ + "release-notes.html#sec-release-24.11-migration-sound" + ], + "sec-release-24.11-migration-dto-compatible": [ + "release-notes.html#sec-release-24.11-migration-dto-compatible" + ], + "sec-release-24.05": [ + "release-notes.html#sec-release-24.05" + ], + "sec-release-24.05-highlights": [ + "release-notes.html#sec-release-24.05-highlights" + ], + "sec-release-24.05-new-services": [ + "release-notes.html#sec-release-24.05-new-services" + ], + "sec-release-24.05-incompatibilities": [ + "release-notes.html#sec-release-24.05-incompatibilities" + ], + "sec-release-24.05-notable-changes": [ + "release-notes.html#sec-release-24.05-notable-changes" + ], + "sec-release-24.05-nixpkgs-lib": [ + "release-notes.html#sec-release-24.05-nixpkgs-lib" + ], + "sec-release-24.05-lib-additions-improvements": [ + "release-notes.html#sec-release-24.05-lib-additions-improvements" + ], + "sec-release-24.05-lib-deprecations": [ + "release-notes.html#sec-release-24.05-lib-deprecations" + ], + "sec-release-24.05-lib-internal": [ + "release-notes.html#sec-release-24.05-lib-internal" + ], + "sec-release-23.11": [ + "release-notes.html#sec-release-23.11" + ], + "sec-release-23.11-toc": [ + "release-notes.html#sec-release-23.11-toc" + ], + "sec-release-23.11-nixos": [ + "release-notes.html#sec-release-23.11-nixos" + ], + "sec-release-23.11-nixos-breaking-changes": [ + "release-notes.html#sec-release-23.11-nixos-breaking-changes" + ], + "sec-release-23.11-nixos-new-services": [ + "release-notes.html#sec-release-23.11-nixos-new-services" + ], + "sec-release-23.11-nixos-notable-changes": [ + "release-notes.html#sec-release-23.11-nixos-notable-changes" + ], + "sec-release-23.11-nixpkgs-lib": [ + "release-notes.html#sec-release-23.11-nixpkgs-lib" + ], + "sec-release-23.11-lib-breaking": [ + "release-notes.html#sec-release-23.11-lib-breaking" + ], + "sec-release-23.11-lib-additions-improvements": [ + "release-notes.html#sec-release-23.11-lib-additions-improvements" + ], + "sec-release-23.11-lib-deprecations": [ + "release-notes.html#sec-release-23.11-lib-deprecations" + ], + "sec-release-23.05": [ + "release-notes.html#sec-release-23.05" + ], + "sec-release-23.05-highlights": [ + "release-notes.html#sec-release-23.05-highlights" + ], + "sec-release-23.05-new-services": [ + "release-notes.html#sec-release-23.05-new-services" + ], + "sec-release-23.05-incompatibilities": [ + "release-notes.html#sec-release-23.05-incompatibilities" + ], + "sec-release-23.05-notable-changes": [ + "release-notes.html#sec-release-23.05-notable-changes" + ], + "sec-release-23.05-nixpkgs-internals": [ + "release-notes.html#sec-release-23.05-nixpkgs-internals" + ], + "sec-release-23.05-migration": [ + "release-notes.html#sec-release-23.05-migration" + ], + "sec-release-23.05-migration-pipewire": [ + "release-notes.html#sec-release-23.05-migration-pipewire" + ], + "sec-release-23.05-migration-pipewire-why": [ + "release-notes.html#sec-release-23.05-migration-pipewire-why" + ], + "sec-release-23.05-migration-pipewire-how": [ + "release-notes.html#sec-release-23.05-migration-pipewire-how" + ], + "sec-release-23.05-migration-pipewire-simple": [ + "release-notes.html#sec-release-23.05-migration-pipewire-simple" + ], + "sec-release-23.05-migration-pipewire-removing-modules": [ + "release-notes.html#sec-release-23.05-migration-pipewire-removing-modules" + ], + "sec-release-23.05-migration-pipewire-modifying-modules": [ + "release-notes.html#sec-release-23.05-migration-pipewire-modifying-modules" + ], + "sec-release-23.05-migration-pipewire-nuclear": [ + "release-notes.html#sec-release-23.05-migration-pipewire-nuclear" + ], + "sec-release-22.11": [ + "release-notes.html#sec-release-22.11" + ], + "sec-release-22.11-highlights": [ + "release-notes.html#sec-release-22.11-highlights" + ], + "sec-release-22.11-internal": [ + "release-notes.html#sec-release-22.11-internal" + ], + "sec-release-22.11-version-updates": [ + "release-notes.html#sec-release-22.11-version-updates" + ], + "sec-release-22.11-incompatibilities": [ + "release-notes.html#sec-release-22.11-incompatibilities" + ], + "sec-release-22.11-notable-changes": [ + "release-notes.html#sec-release-22.11-notable-changes" + ], + "sec-release-22.11-new-services": [ + "release-notes.html#sec-release-22.11-new-services" + ], + "sec-release-22.05": [ + "release-notes.html#sec-release-22.05" + ], + "sec-release-22.05-highlights": [ + "release-notes.html#sec-release-22.05-highlights" + ], + "sec-release-22.05-new-services": [ + "release-notes.html#sec-release-22.05-new-services" + ], + "sec-release-22.05-incompatibilities": [ + "release-notes.html#sec-release-22.05-incompatibilities" + ], + "sec-release-22.05-notable-changes": [ + "release-notes.html#sec-release-22.05-notable-changes" + ], + "sec-release-21.11": [ + "release-notes.html#sec-release-21.11" + ], + "sec-release-21.11-highlights": [ + "release-notes.html#sec-release-21.11-highlights" + ], + "sec-release-21.11-new-services": [ + "release-notes.html#sec-release-21.11-new-services" + ], + "sec-release-21.11-incompatibilities": [ + "release-notes.html#sec-release-21.11-incompatibilities" + ], + "sec-release-21.11-notable-changes": [ + "release-notes.html#sec-release-21.11-notable-changes" + ], + "sec-release-21.05": [ + "release-notes.html#sec-release-21.05" + ], + "sec-release-21.05-highlights": [ + "release-notes.html#sec-release-21.05-highlights" + ], + "sec-release-21.05-new-services": [ + "release-notes.html#sec-release-21.05-new-services" + ], + "sec-release-21.05-incompatibilities": [ + "release-notes.html#sec-release-21.05-incompatibilities" + ], + "sec-release-21.05-notable-changes": [ + "release-notes.html#sec-release-21.05-notable-changes" + ], + "sec-release-20.09": [ + "release-notes.html#sec-release-20.09" + ], + "sec-release-20.09-highlights": [ + "release-notes.html#sec-release-20.09-highlights" + ], + "sec-release-20.09-new-services": [ + "release-notes.html#sec-release-20.09-new-services" + ], + "sec-release-20.09-incompatibilities": [ + "release-notes.html#sec-release-20.09-incompatibilities" + ], + "sec-release-20.09-notable-changes": [ + "release-notes.html#sec-release-20.09-notable-changes" + ], + "sec-release-20.09-contributions": [ + "release-notes.html#sec-release-20.09-contributions" + ], + "sec-release-20.03": [ + "release-notes.html#sec-release-20.03" + ], + "sec-release-20.03-highlights": [ + "release-notes.html#sec-release-20.03-highlights" + ], + "sec-release-20.03-new-services": [ + "release-notes.html#sec-release-20.03-new-services" + ], + "sec-release-20.03-incompatibilities": [ + "release-notes.html#sec-release-20.03-incompatibilities" + ], + "sec-release-20.03-notable-changes": [ + "release-notes.html#sec-release-20.03-notable-changes" + ], + "sec-release-19.09": [ + "release-notes.html#sec-release-19.09" + ], + "sec-release-19.09-highlights": [ + "release-notes.html#sec-release-19.09-highlights" + ], + "sec-release-19.09-new-services": [ + "release-notes.html#sec-release-19.09-new-services" + ], + "sec-release-19.09-incompatibilities": [ + "release-notes.html#sec-release-19.09-incompatibilities" + ], + "sec-release-19.09-notable-changes": [ + "release-notes.html#sec-release-19.09-notable-changes" + ], + "sec-release-19.03": [ + "release-notes.html#sec-release-19.03" + ], + "sec-release-19.03-highlights": [ + "release-notes.html#sec-release-19.03-highlights" + ], + "sec-release-19.03-new-services": [ + "release-notes.html#sec-release-19.03-new-services" + ], + "sec-release-19.03-incompatibilities": [ + "release-notes.html#sec-release-19.03-incompatibilities" + ], + "sec-release-19.03-notable-changes": [ + "release-notes.html#sec-release-19.03-notable-changes" + ], + "sec-release-18.09": [ + "release-notes.html#sec-release-18.09" + ], + "sec-release-18.09-highlights": [ + "release-notes.html#sec-release-18.09-highlights" + ], + "sec-release-18.09-new-services": [ + "release-notes.html#sec-release-18.09-new-services" + ], + "sec-release-18.09-incompatibilities": [ + "release-notes.html#sec-release-18.09-incompatibilities" + ], + "sec-release-18.09-notable-changes": [ + "release-notes.html#sec-release-18.09-notable-changes" + ], + "sec-release-18.03": [ + "release-notes.html#sec-release-18.03" + ], + "sec-release-18.03-highlights": [ + "release-notes.html#sec-release-18.03-highlights" + ], + "sec-release-18.03-new-services": [ + "release-notes.html#sec-release-18.03-new-services" + ], + "sec-release-18.03-incompatibilities": [ + "release-notes.html#sec-release-18.03-incompatibilities" + ], + "sec-release-18.03-notable-changes": [ + "release-notes.html#sec-release-18.03-notable-changes" + ], + "sec-release-17.09": [ + "release-notes.html#sec-release-17.09" + ], + "sec-release-17.09-highlights": [ + "release-notes.html#sec-release-17.09-highlights" + ], + "sec-release-17.09-new-services": [ + "release-notes.html#sec-release-17.09-new-services" + ], + "sec-release-17.09-incompatibilities": [ + "release-notes.html#sec-release-17.09-incompatibilities" + ], + "sec-release-17.09-notable-changes": [ + "release-notes.html#sec-release-17.09-notable-changes" + ], + "sec-release-17.03": [ + "release-notes.html#sec-release-17.03" + ], + "sec-release-17.03-highlights": [ + "release-notes.html#sec-release-17.03-highlights" + ], + "sec-release-17.03-new-services": [ + "release-notes.html#sec-release-17.03-new-services" + ], + "sec-release-17.03-incompatibilities": [ + "release-notes.html#sec-release-17.03-incompatibilities" + ], + "sec-release-17.03-notable-changes": [ + "release-notes.html#sec-release-17.03-notable-changes" + ], + "sec-release-16.09": [ + "release-notes.html#sec-release-16.09" + ], + "sec-release-16.03": [ + "release-notes.html#sec-release-16.03" + ], + "sec-release-15.09": [ + "release-notes.html#sec-release-15.09" + ], + "sec-release-14.12": [ + "release-notes.html#sec-release-14.12" + ], + "sec-release-14.04": [ + "release-notes.html#sec-release-14.04" + ], + "sec-release-13.10": [ + "release-notes.html#sec-release-13.10" + ] +} diff --git a/pkgs/by-name/ni/nixos-render-docs/README.md b/pkgs/by-name/ni/nixos-render-docs/README.md new file mode 100644 index 000000000000..92ea6ec8a91d --- /dev/null +++ b/pkgs/by-name/ni/nixos-render-docs/README.md @@ -0,0 +1,77 @@ +# nixos-render-docs + +A [CommonMark](https://commonmark.org/) and [`man-pages`](https://www.man7.org/linux/man-pages/man7/man-pages.7.html) renderer for the NixOS and Nixpkgs manuals. + +## Summary + +`nixos-render-docs` implements [RFC 72](https://github.com/NixOS/rfcs/pull/72) and has enabled a lossless port of Nixpkgs and NixOS documentation, which was originally written in the [DocBook](https://docbook.org/whatis) format, to [CommonMark](https://commonmark.org/) with [custom extensions](../../../../doc/README.md#syntax). + +Maintaining our own documentation rendering framework may appear extreme but has practical advantages: +- We never have to work around existing tools made under different assumptions +- We don't have to deal with unexpected breakage +- We can grow the framework with our evolving requirements without relying on external support or approval or the need to maintain a small diff to upstream +- The amount of code involved is minimal because it's single-purpose + +Several alternatives to `nixos-render-docs` were discussed in the past. +A detailed analysis can be found in a [table comparing documentation rendering framework](https://ethercalc.net/dc4vcnnl8zv0). + +## Redirects system + +Moving contents around can cause links to break. + +Since we have our own markdown parser, we can hook into the rendering process to extract all of the metadata around each content identifier. +The [mechanism for checking correctness of redirects](./src/nixos_render_docs/redirects.py) takes the collection of identifiers and a mapping of the identified content to its historical locations in the output. +It validates them against a set of rules, and creates a client-side redirect mapping for each output file, as well as a `_redirects` file for server-side redirects in [Netlify syntax](https://docs.netlify.com/routing/redirects/#syntax-for-the-redirects-file). + +This allows us to catch: +- Identifiers that were removed or renamed +- Content that was moved from one location to another +- Various consistency errors in the redirects mapping + +### Design considerations + +The creation, movement, and removal of every identifier is captured in the Git history. +However, analysing hundreds of thousands of commits during the build process is impractical. + +The chosen design is a trade-off between speed, repository size, and contributor friction: +- Stricter checks always require more attention from contributors + - Checks should be reasonably fast and ideally happen locally, e.g. as part of the build, as anything else will substantially lengthen the feedback cycle. +- Computing redirects against previous revisions of the repository would be more space-efficient, but impractically slow. + - It would also require keeping an impure or otherwise continuously updated reference to those other revisions. + - The static mapping acts like a semi-automatically updated cache that we drag along with version history. + - Other setups, such as a dedicated service to cache a history of moved content, are more complicated and would still be impure. +- Checking in large amounts of data that is touched often, bears a risk of more merge conflicts or related build failures. + +The solution picked here is to have a static mapping of the historical locations checked into the Git tree, such that it can be read during the build process. +This also ensures that an improper redirect mapping will cause `nixos-render-docs` to fail the build and thus enforce that redirects stay up-to-date with every commit. + +### Redirects Mapping Structure + +Here's an overview of this mapping: + +```json +{ + "": [ + "index.html#", + "foo.html#foo", + "bar.html#foo" + ] +} +``` + +- The keys of this mapping _must_ be an exhaustive list of all identifiers in the source files. +- The first element of the value of this mapping _must_ be the current output location (path and anchor) of the content signified by the identifier in the mapping key. + - While the order of the remaining elements is unconstrained, please only prepend to this list when the content under the indentifier moves in order to keep the diffs readable. + +In case this identifier is renamed, the mapping would change into: + +```json +{ + "": [ + "index.html#", + "foo.html#", + "bar.html#foo", + "index.html#" + ] +} +``` diff --git a/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manual.py b/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manual.py index c277d28ca5e4..64b3740c8352 100644 --- a/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manual.py +++ b/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/manual.py @@ -16,6 +16,7 @@ from . import md, options from .html import HTMLRenderer, UnresolvedXrefError from .manual_structure import check_structure, FragmentType, is_include, make_xml_id, TocEntry, TocEntryType, XrefTarget from .md import Converter, Renderer +from .redirects import Redirects class BaseConverter(Converter[md.TR], Generic[md.TR]): # per-converter configuration for ns:arg=value arguments to include blocks, following @@ -216,14 +217,16 @@ class ManualHTMLRenderer(RendererMixin, HTMLRenderer): _base_path: Path _in_dir: Path _html_params: HTMLParameters + _redirects: Redirects def __init__(self, toplevel_tag: str, revision: str, html_params: HTMLParameters, manpage_urls: Mapping[str, str], xref_targets: dict[str, XrefTarget], - in_dir: Path, base_path: Path): + redirects: Redirects, in_dir: Path, base_path: Path): super().__init__(toplevel_tag, revision, manpage_urls, xref_targets) self._in_dir = in_dir self._base_path = base_path.absolute() self._html_params = html_params + self._redirects = redirects def _pull_image(self, src: str) -> str: src_path = Path(src) @@ -306,6 +309,11 @@ class ManualHTMLRenderer(RendererMixin, HTMLRenderer): '
', ' ', ]) + + redirects_path = f'{self._base_path}/{toc.target.path.split('.html')[0]}-redirects.js' + with open(redirects_path, 'w') as file: + file.write(self._redirects.get_redirect_script(toc.target.path)) + return "\n".join([ '', '' for style in self._html_params.stylesheets)), "".join((f'' - for script in self._html_params.scripts)), + for script in [*self._html_params.scripts, redirects_path])), f' ', f' ' if home.target.href() else "", f' {up_link}{prev_link}{next_link}', @@ -501,6 +509,7 @@ class HTMLConverter(BaseConverter[ManualHTMLRenderer]): _revision: str _html_params: HTMLParameters _manpage_urls: Mapping[str, str] + _redirects: Redirects _xref_targets: dict[str, XrefTarget] _redirection_targets: set[str] _appendix_count: int = 0 @@ -509,9 +518,9 @@ class HTMLConverter(BaseConverter[ManualHTMLRenderer]): self._appendix_count += 1 return _to_base26(self._appendix_count - 1) - def __init__(self, revision: str, html_params: HTMLParameters, manpage_urls: Mapping[str, str]): + def __init__(self, revision: str, html_params: HTMLParameters, manpage_urls: Mapping[str, str], redirects: Redirects): super().__init__() - self._revision, self._html_params, self._manpage_urls = revision, html_params, manpage_urls + self._revision, self._html_params, self._manpage_urls, self._redirects = revision, html_params, manpage_urls, redirects self._xref_targets = {} self._redirection_targets = set() # renderer not set on purpose since it has a dependency on the output path! @@ -519,7 +528,7 @@ class HTMLConverter(BaseConverter[ManualHTMLRenderer]): def convert(self, infile: Path, outfile: Path) -> None: self._renderer = ManualHTMLRenderer( 'book', self._revision, self._html_params, self._manpage_urls, self._xref_targets, - infile.parent, outfile.parent) + self._redirects, infile.parent, outfile.parent) super().convert(infile, outfile) def _parse(self, src: str, *, auto_id_prefix: None | str = None) -> list[Token]: @@ -670,7 +679,13 @@ class HTMLConverter(BaseConverter[ManualHTMLRenderer]): ) TocEntry.collect_and_link(self._xref_targets, tokens) - + self._redirects.validate(self._xref_targets) + server_redirects = self._redirects.get_server_redirects() + with open(outfile.parent / '_redirects', 'w') as server_redirects_file: + formatted_server_redirects = [] + for from_path, to_path in server_redirects.items(): + formatted_server_redirects.append(f"{from_path} {to_path} 301") + server_redirects_file.write("\n".join(formatted_server_redirects)) def _build_cli_html(p: argparse.ArgumentParser) -> None: @@ -683,16 +698,22 @@ def _build_cli_html(p: argparse.ArgumentParser) -> None: p.add_argument('--chunk-toc-depth', default=1, type=int) p.add_argument('--section-toc-depth', default=0, type=int) p.add_argument('--media-dir', default="media", type=Path) + p.add_argument('--redirects', type=Path) p.add_argument('infile', type=Path) p.add_argument('outfile', type=Path) def _run_cli_html(args: argparse.Namespace) -> None: - with open(args.manpage_urls, 'r') as manpage_urls: + with open(args.manpage_urls) as manpage_urls, open(Path(__file__).parent / "redirects.js") as redirects_script: + redirects = {} + if args.redirects: + with open(args.redirects) as raw_redirects: + redirects = json.load(raw_redirects) + md = HTMLConverter( args.revision, HTMLParameters(args.generator, args.stylesheet, args.script, args.toc_depth, args.chunk_toc_depth, args.section_toc_depth, args.media_dir), - json.load(manpage_urls)) + json.load(manpage_urls), Redirects(redirects, redirects_script.read())) md.convert(args.infile, args.outfile) def build_cli(p: argparse.ArgumentParser) -> None: diff --git a/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.js b/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.js new file mode 100644 index 000000000000..38d7734735e9 --- /dev/null +++ b/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.js @@ -0,0 +1,3 @@ +const anchor = document.location.hash.substring(1); +const redirects = REDIRECTS_PLACEHOLDER; +if (redirects[anchor]) document.location.href = redirects[anchor]; diff --git a/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.py b/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.py new file mode 100644 index 000000000000..57a6d6bbb3aa --- /dev/null +++ b/pkgs/by-name/ni/nixos-render-docs/src/nixos_render_docs/redirects.py @@ -0,0 +1,174 @@ +import json +from dataclasses import dataclass, field +from pathlib import Path + +from .manual_structure import XrefTarget + + +class RedirectsError(Exception): + def __init__( + self, + conflicting_anchors: set[str] = None, + divergent_redirects: set[str] = None, + identifiers_missing_current_outpath: set[str] = None, + identifiers_without_redirects: set[str] = None, + orphan_identifiers: set[str] = None + ): + self.conflicting_anchors = conflicting_anchors or set() + self.divergent_redirects = divergent_redirects or set() + self.identifiers_missing_current_outpath = identifiers_missing_current_outpath or set() + self.identifiers_without_redirects = identifiers_without_redirects or set() + self.orphan_identifiers = orphan_identifiers or set() + + def __str__(self): + error_messages = [] + if self.conflicting_anchors: + error_messages.append(f""" +Identifiers must not be identical to any historical location's anchor of the same output path. + The following identifiers violate this rule: + - {"\n - ".join(self.conflicting_anchors)} + + This can break links or redirects. If you added new content, choose a different identifier. +""") + if self.divergent_redirects: + error_messages.append(f""" +All historical content locations must correspond to exactly one identifier. + The following locations violate this rule: + - {"\n - ".join(self.divergent_redirects)} + + It leads to inconsistent behavior depending on which redirect is applied. + Please update doc/redirects.json or nixos/doc/manual/redirects.json! +""") + if self.identifiers_missing_current_outpath: + error_messages.append(f""" +The first element of an identifier's redirects list must denote its current location. + The following identifiers violate this rule: + - {"\n - ".join(self.identifiers_missing_current_outpath)} + + If you moved content, add its new location as the first element of the redirects mapping. + Please update doc/redirects.json or nixos/doc/manual/redirects.json! +""") # TODO: automatically detect if you just missed adding a new location, and make a tool to do that for you + if self.identifiers_without_redirects: + error_messages.append(f""" +Identifiers present in the source must have a mapping in the redirects file. + - {"\n - ".join(self.identifiers_without_redirects)} + + This can happen when an identifier was added or renamed. + Please update doc/redirects.json or nixos/doc/manual/redirects.json! +""") # TODO: add tooling in the development shell to do that automatically and point to that command + if self.orphan_identifiers: + error_messages.append(f""" +Keys of the redirects mapping must correspond to some identifier in the source. + - {"\n - ".join(self.orphan_identifiers)} + + This can happen when an identifier was removed or renamed. + Please update doc/redirects.json or nixos/doc/manual/redirects.json! +""") # TODO: add tooling in the development shell to do that automatically and point to that command + + error_messages.append("NOTE: If your Manual build passes locally and you see this message in CI, you probably need a rebase.") + return "\n".join(error_messages) + + +@dataclass +class Redirects: + _raw_redirects: dict[str, list[str]] + _redirects_script: str + + _xref_targets: dict[str, XrefTarget] = field(default_factory=dict) + + def validate(self, initial_xref_targets: dict[str, XrefTarget]): + """ + Validate redirection mappings against element locations in the output + + - Ensure semantic correctness of the set of redirects with the following rules: + - Identifiers present in the source must have a mapping in the redirects file + - Keys of the redirects mapping must correspond to some identifier in the source + - All historical content locations must correspond to exactly one identifier + - Identifiers must not be identical to any historical location's anchor of the same output path + - The first element of an identifier's redirects list must denote its current location. + """ + xref_targets = {} + ignored_identifier_patterns = ("opt-", "auto-generated-", "function-library-") + for id, target in initial_xref_targets.items(): + # filter out automatically generated identifiers from module options and library documentation + if id.startswith(ignored_identifier_patterns): + continue + xref_targets[id] = target + + identifiers_without_redirects = xref_targets.keys() - self._raw_redirects.keys() + orphan_identifiers = self._raw_redirects.keys() - xref_targets.keys() + + client_side_redirects = {} + server_side_redirects = {} + conflicting_anchors = set() + divergent_redirects = set() + identifiers_missing_current_outpath = set() + + for identifier, locations in self._raw_redirects.items(): + if identifier not in xref_targets: + continue + + if not locations or locations[0] != f"{xref_targets[identifier].path}#{identifier}": + identifiers_missing_current_outpath.add(identifier) + + for location in locations[1:]: + if '#' in location: + path, anchor = location.split('#') + + if anchor in identifiers_without_redirects: + identifiers_without_redirects.remove(anchor) + + if location not in client_side_redirects: + client_side_redirects[location] = f"{xref_targets[identifier].path}#{identifier}" + for identifier, xref_target in xref_targets.items(): + if xref_target.path == path and anchor == identifier: + conflicting_anchors.add(anchor) + else: + divergent_redirects.add(location) + else: + if location not in server_side_redirects: + server_side_redirects[location] = xref_targets[identifier].path + else: + divergent_redirects.add(location) + + if any([ + conflicting_anchors, + divergent_redirects, + identifiers_missing_current_outpath, + identifiers_without_redirects, + orphan_identifiers + ]): + raise RedirectsError( + conflicting_anchors=conflicting_anchors, + divergent_redirects=divergent_redirects, + identifiers_missing_current_outpath=identifiers_missing_current_outpath, + identifiers_without_redirects=identifiers_without_redirects, + orphan_identifiers=orphan_identifiers + ) + + self._xref_targets = xref_targets + + def get_client_redirects(self, target: str): + paths_to_target = {src for src, dest in self.get_server_redirects().items() if dest == target} + client_redirects = {} + for locations in self._raw_redirects.values(): + for location in locations[1:]: + if '#' not in location: + continue + path, anchor = location.split('#') + if path not in [target, *paths_to_target]: + continue + client_redirects[anchor] = locations[0] + return client_redirects + + def get_server_redirects(self): + server_redirects = {} + for identifier, locations in self._raw_redirects.items(): + for location in locations[1:]: + if '#' not in location and location not in server_redirects: + server_redirects[location] = self._xref_targets[identifier].path + return server_redirects + + def get_redirect_script(self, target: str) -> str: + client_redirects = self.get_client_redirects(target) + return self._redirects_script.replace('REDIRECTS_PLACEHOLDER', json.dumps(client_redirects)) diff --git a/pkgs/by-name/ni/nixos-render-docs/src/pyproject.toml b/pkgs/by-name/ni/nixos-render-docs/src/pyproject.toml index d66643ef8421..b43b72e046df 100644 --- a/pkgs/by-name/ni/nixos-render-docs/src/pyproject.toml +++ b/pkgs/by-name/ni/nixos-render-docs/src/pyproject.toml @@ -13,3 +13,6 @@ nixos-render-docs = "nixos_render_docs:main" [build-system] requires = ["setuptools"] + +[tool.setuptools.package-data] +nixos_render_docs = ["redirects.js"] diff --git a/pkgs/by-name/ni/nixos-render-docs/src/tests/test_auto_id_prefix.py b/pkgs/by-name/ni/nixos-render-docs/src/tests/test_auto_id_prefix.py index ab917a106443..a3d33930b303 100644 --- a/pkgs/by-name/ni/nixos-render-docs/src/tests/test_auto_id_prefix.py +++ b/pkgs/by-name/ni/nixos-render-docs/src/tests/test_auto_id_prefix.py @@ -3,6 +3,7 @@ from pathlib import Path from markdown_it.token import Token from nixos_render_docs.manual import HTMLConverter, HTMLParameters from nixos_render_docs.md import Converter +from nixos_render_docs.redirects import Redirects auto_id_prefix="TEST_PREFIX" def set_prefix(token: Token, ident: str) -> None: @@ -10,7 +11,7 @@ def set_prefix(token: Token, ident: str) -> None: def test_auto_id_prefix_simple() -> None: - md = HTMLConverter("1.0.0", HTMLParameters("", [], [], 2, 2, 2, Path("")), {}) + md = HTMLConverter("1.0.0", HTMLParameters("", [], [], 2, 2, 2, Path("")), {}, Redirects({}, '')) src = f""" # title @@ -31,7 +32,7 @@ def test_auto_id_prefix_simple() -> None: def test_auto_id_prefix_repeated() -> None: - md = HTMLConverter("1.0.0", HTMLParameters("", [], [], 2, 2, 2, Path("")), {}) + md = HTMLConverter("1.0.0", HTMLParameters("", [], [], 2, 2, 2, Path("")), {}, Redirects({}, '')) src = f""" # title @@ -57,7 +58,7 @@ def test_auto_id_prefix_repeated() -> None: ] def test_auto_id_prefix_maximum_nested() -> None: - md = HTMLConverter("1.0.0", HTMLParameters("", [], [], 2, 2, 2, Path("")), {}) + md = HTMLConverter("1.0.0", HTMLParameters("", [], [], 2, 2, 2, Path("")), {}, Redirects({}, '')) src = f""" # h1 diff --git a/pkgs/by-name/ni/nixos-render-docs/src/tests/test_redirects.py b/pkgs/by-name/ni/nixos-render-docs/src/tests/test_redirects.py new file mode 100644 index 000000000000..56077b90014b --- /dev/null +++ b/pkgs/by-name/ni/nixos-render-docs/src/tests/test_redirects.py @@ -0,0 +1,259 @@ +import json +import unittest +from pathlib import Path + +from nixos_render_docs.manual import HTMLConverter, HTMLParameters +from nixos_render_docs.redirects import Redirects, RedirectsError + + +class TestRedirects(unittest.TestCase): + def setup_test(self, sources, raw_redirects): + with open(Path(__file__).parent / 'index.md', 'w') as infile: + indexHTML = ["# Redirects test suite {#redirects-test-suite}\n## Setup steps"] + for path in sources.keys(): + outpath = f"{path.split('.md')[0]}.html" + indexHTML.append(f"```{{=include=}} appendix html:into-file=//{outpath}\n{path}\n```") + infile.write("\n".join(indexHTML)) + + for filename, content in sources.items(): + with open(Path(__file__).parent / filename, 'w') as infile: + infile.write(content) + + redirects = Redirects({"redirects-test-suite": ["index.html#redirects-test-suite"]} | raw_redirects, '') + return HTMLConverter("1.0.0", HTMLParameters("", [], [], 2, 2, 2, Path("")), {}, redirects) + + def run_test(self, md: HTMLConverter): + md.convert(Path(__file__).parent / 'index.md', Path(__file__).parent / 'index.html') + + def assert_redirect_error(self, expected_errors: dict, md: HTMLConverter): + with self.assertRaises(RuntimeError) as context: + self.run_test(md) + + exception = context.exception.__cause__ + self.assertIsInstance(exception, RedirectsError) + + for attr, expected_values in expected_errors.items(): + self.assertTrue(hasattr(exception, attr)) + actual_values = getattr(exception, attr) + self.assertEqual(set(actual_values), set(expected_values)) + + def test_identifier_added(self): + """Test adding a new identifier to the source.""" + before = self.setup_test( + sources={"foo.md": "# Foo {#foo}"}, + raw_redirects={"foo": ["foo.html#foo"]}, + ) + self.run_test(before) + + intermediate = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={"foo": ["foo.html#foo"]}, + ) + self.assert_redirect_error({"identifiers_without_redirects": ["bar"]}, intermediate) + + after = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"]}, + ) + self.run_test(after) + + def test_identifier_removed(self): + """Test removing an identifier from the source.""" + before = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"]}, + ) + self.run_test(before) + + intermediate = self.setup_test( + sources={"foo.md": "# Foo {#foo}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"]}, + ) + self.assert_redirect_error({"orphan_identifiers": ["bar"]}, intermediate) + + after = self.setup_test( + sources={"foo.md": "# Foo {#foo}"}, + raw_redirects={"foo": ["foo.html#foo"]}, + ) + self.run_test(after) + + def test_identifier_renamed(self): + """Test renaming an identifier in the source.""" + before = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"]}, + ) + self.run_test(before) + + intermediate = self.setup_test( + sources={"foo.md": "# Foo Prime {#foo-prime}\n## Bar {#bar}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"]}, + ) + self.assert_redirect_error( + { + "identifiers_without_redirects": ["foo-prime"], + "orphan_identifiers": ["foo"] + }, + intermediate + ) + + after = self.setup_test( + sources={"foo.md": "# Foo Prime {#foo-prime}\n## Bar {#bar}"}, + raw_redirects={"foo-prime": ["foo.html#foo-prime", "foo.html#foo"], "bar": ["foo.html#bar"]}, + ) + self.run_test(after) + + def test_leaf_identifier_moved_to_different_file(self): + """Test moving a leaf identifier to a different output path.""" + before = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"]}, + ) + self.run_test(before) + + intermediate = self.setup_test( + sources={ + "foo.md": "# Foo {#foo}", + "bar.md": "# Bar {#bar}" + }, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#foo"]}, + ) + self.assert_redirect_error({"identifiers_missing_current_outpath": ["bar"]}, intermediate) + + after = self.setup_test( + sources={ + "foo.md": "# Foo {#foo}", + "bar.md": "# Bar {#bar}" + }, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["bar.html#bar", "foo.html#bar"]}, + ) + self.run_test(after) + + def test_non_leaf_identifier_moved_to_different_file(self): + """Test moving a non-leaf identifier to a different output path.""" + before = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}\n### Baz {#baz}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"], "baz": ["foo.html#baz"]}, + ) + self.run_test(before) + + intermediate = self.setup_test( + sources={ + "foo.md": "# Foo {#foo}", + "bar.md": "# Bar {#bar}\n## Baz {#baz}" + }, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar"], "baz": ["foo.html#baz"]}, + ) + self.assert_redirect_error({"identifiers_missing_current_outpath": ["bar", "baz"]}, intermediate) + + after = self.setup_test( + sources={ + "foo.md": "# Foo {#foo}", + "bar.md": "# Bar {#bar}\n## Baz {#baz}" + }, + raw_redirects={ + "foo": ["foo.html#foo"], + "bar": ["bar.html#bar", "foo.html#bar"], + "baz": ["bar.html#baz", "foo.html#baz"] + }, + ) + self.run_test(after) + + def test_conflicting_anchors(self): + """Test for conflicting anchors.""" + md = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={ + "foo": ["foo.html#foo", "foo.html#bar"], + "bar": ["foo.html#bar"], + } + ) + self.assert_redirect_error({"conflicting_anchors": ["bar"]}, md) + + def test_divergent_redirect(self): + """Test for divergent redirects.""" + md = self.setup_test( + sources={ + "foo.md": "# Foo {#foo}", + "bar.md": "# Bar {#bar}" + }, + raw_redirects={ + "foo": ["foo.html#foo", "old-foo.html"], + "bar": ["bar.html#bar", "old-foo.html"] + } + ) + self.assert_redirect_error({"divergent_redirects": ["old-foo.html"]}, md) + + def test_no_client_redirects(self): + """Test fetching client side redirects and ignore server-side ones.""" + md = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={"foo": ["foo.html#foo"], "bar": ["foo.html#bar", "bar.html"]} + ) + self.run_test(md) + self.assertEqual(md._redirects.get_client_redirects("foo.html"), {}) + + def test_basic_redirect_matching(self): + """Test client-side redirects getter with a simple redirect mapping""" + md = self.setup_test( + sources={"foo.md": "# Foo {#foo}\n## Bar {#bar}"}, + raw_redirects={ + 'foo': ['foo.html#foo', 'foo.html#some-section', 'foo.html#another-section'], + 'bar': ['foo.html#bar'], + }, + ) + self.run_test(md) + + client_redirects = md._redirects.get_client_redirects("foo.html") + expected_redirects = {'some-section': 'foo.html#foo', 'another-section': 'foo.html#foo'} + self.assertEqual(client_redirects, expected_redirects) + + def test_advanced_redirect_matching(self): + """Test client-side redirects getter with a complex redirect mapping""" + md = self.setup_test( + sources={"foo.md": "# Foo {#foo}", "bar.md": "# Bar {#bar}"}, + raw_redirects={ + 'foo': ['foo.html#foo', 'foo.html#some-section', 'bar.html#foo'], + 'bar': ['bar.html#bar', 'bar.html#another-section'], + }, + ) + self.run_test(md) + self.assertEqual(md._redirects.get_client_redirects("index.html"), {}) + + client_redirects = md._redirects.get_client_redirects("foo.html") + expected_redirects = {'some-section': 'foo.html#foo'} + self.assertEqual(client_redirects, expected_redirects) + + client_redirects = md._redirects.get_client_redirects("bar.html") + expected_redirects = {'foo': 'foo.html#foo', 'another-section': 'bar.html#bar'} + self.assertEqual(client_redirects, expected_redirects) + + def test_server_redirects(self): + """Test server-side redirects getter""" + md = self.setup_test( + sources={"foo.md": "# Foo {#foo}", "bar.md": "# Bar {#bar}"}, + raw_redirects={ + 'foo': ['foo.html#foo', 'foo-prime.html'], + 'bar': ['bar.html#bar', 'bar-prime.html'], + }, + ) + self.run_test(md) + + server_redirects = md._redirects.get_server_redirects() + expected_redirects = {'foo-prime.html': 'foo.html', 'bar-prime.html': 'bar.html'} + self.assertEqual(server_redirects, expected_redirects) + + def test_client_redirects_to_ghost_paths(self): + """Test implicit inference of client-side redirects to ghost paths""" + md = self.setup_test( + sources={"foo.md": "# Foo {#foo}", "bar.md": "# Bar {#bar}"}, + raw_redirects={ + 'foo': ['foo.html#foo', 'foo-prime.html'], + 'bar': ['bar.html#bar', 'foo-prime.html#old'], + }, + ) + self.run_test(md) + + client_redirects = md._redirects.get_client_redirects("foo.html") + expected_redirects = {'old': 'bar.html#bar'} + self.assertEqual(client_redirects, expected_redirects)