mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-11-04 12:42:21 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			141 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{
 | 
						|
  inputs,
 | 
						|
  pkgs,
 | 
						|
  lib,
 | 
						|
}: let
 | 
						|
  inherit ((lib.importJSON ../release.json)) release;
 | 
						|
 | 
						|
  nvimModuleDocs = pkgs.nixosOptionsDoc {
 | 
						|
    variablelistId = "nvf-options";
 | 
						|
    warningsAreErrors = true;
 | 
						|
 | 
						|
    inherit
 | 
						|
      (
 | 
						|
        (lib.evalModules {
 | 
						|
          specialArgs = {inherit inputs;};
 | 
						|
          modules =
 | 
						|
            import ../modules/modules.nix {
 | 
						|
              inherit lib pkgs;
 | 
						|
            }
 | 
						|
            ++ [
 | 
						|
              (
 | 
						|
                let
 | 
						|
                  # From nixpkgs:
 | 
						|
                  #
 | 
						|
                  # Recursively replace each derivation in the given attribute set
 | 
						|
                  # with the same derivation but with the `outPath` attribute set to
 | 
						|
                  # the string `"\${pkgs.attribute.path}"`. This allows the
 | 
						|
                  # documentation to refer to derivations through their values without
 | 
						|
                  # establishing an actual dependency on the derivation output.
 | 
						|
                  #
 | 
						|
                  # This is not perfect, but it seems to cover a vast majority of use
 | 
						|
                  # cases.
 | 
						|
                  #
 | 
						|
                  # Caveat: even if the package is reached by a different means, the
 | 
						|
                  # path above will be shown and not e.g.
 | 
						|
                  # `${config.services.foo.package}`.
 | 
						|
                  scrubDerivations = namePrefix: pkgSet:
 | 
						|
                    builtins.mapAttrs (
 | 
						|
                      name: value: let
 | 
						|
                        wholeName = "${namePrefix}.${name}";
 | 
						|
                      in
 | 
						|
                        if builtins.isAttrs value
 | 
						|
                        then
 | 
						|
                          scrubDerivations wholeName value
 | 
						|
                          // lib.optionalAttrs (lib.isDerivation value) {
 | 
						|
                            inherit (value) drvPath;
 | 
						|
                            outPath = "\${${wholeName}}";
 | 
						|
                          }
 | 
						|
                        else value
 | 
						|
                    )
 | 
						|
                    pkgSet;
 | 
						|
                in {
 | 
						|
                  _module = {
 | 
						|
                    check = false;
 | 
						|
                    args.pkgs = lib.mkForce (scrubDerivations "pkgs" pkgs);
 | 
						|
                  };
 | 
						|
                }
 | 
						|
              )
 | 
						|
            ];
 | 
						|
        })
 | 
						|
      )
 | 
						|
      options
 | 
						|
      ;
 | 
						|
 | 
						|
    transformOptions = opt:
 | 
						|
      opt
 | 
						|
      // {
 | 
						|
        declarations =
 | 
						|
          map (
 | 
						|
            decl:
 | 
						|
              if lib.hasPrefix (toString ../.) (toString decl)
 | 
						|
              then
 | 
						|
                lib.pipe decl [
 | 
						|
                  toString
 | 
						|
                  (lib.removePrefix (toString ../.))
 | 
						|
                  (lib.removePrefix "/")
 | 
						|
                  (x: {
 | 
						|
                    url = "https://github.com/NotAShelf/nvf/blob/main/${x}";
 | 
						|
                    name = "<nvf/${x}>";
 | 
						|
                  })
 | 
						|
                ]
 | 
						|
              else if decl == "lib/modules.nix"
 | 
						|
              then {
 | 
						|
                url = "https://github.com/NixOS/nixpkgs/blob/master/${decl}";
 | 
						|
                name = "<nixpkgs/lib/modules.nix>";
 | 
						|
              }
 | 
						|
              else decl
 | 
						|
          )
 | 
						|
          opt.declarations;
 | 
						|
      };
 | 
						|
  };
 | 
						|
 | 
						|
  # Generate the HTML manual pages
 | 
						|
  html = pkgs.callPackage ./manual.nix {
 | 
						|
    inherit release;
 | 
						|
    inherit (nvimModuleDocs) optionsJSON;
 | 
						|
  };
 | 
						|
in {
 | 
						|
  # TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
 | 
						|
  # `nixosOptionsDoc` is more customizable.
 | 
						|
  options.json =
 | 
						|
    pkgs.runCommand "options.json" {
 | 
						|
      meta.description = "List of nvf options in JSON format";
 | 
						|
    } ''
 | 
						|
      mkdir -p $out/{share/doc,nix-support}
 | 
						|
      cp -a ${nvimModuleDocs.optionsJSON}/share/doc/nixos $out/share/doc/nvf
 | 
						|
      substitute \
 | 
						|
        ${nvimModuleDocs.optionsJSON}/nix-support/hydra-build-products \
 | 
						|
        $out/nix-support/hydra-build-products \
 | 
						|
        --replace \
 | 
						|
        '${nvimModuleDocs.optionsJSON}/share/doc/nixos' \
 | 
						|
        "$out/share/doc/nvf"
 | 
						|
    '';
 | 
						|
 | 
						|
  # Generate the `man home-configuration.nix` package
 | 
						|
  manPages =
 | 
						|
    pkgs.runCommand "nvf-reference-manpage" {
 | 
						|
      nativeBuildInputs = [
 | 
						|
        pkgs.buildPackages.installShellFiles
 | 
						|
        pkgs.nixos-render-docs
 | 
						|
      ];
 | 
						|
      allowedReferences = ["out"];
 | 
						|
    } ''
 | 
						|
      # Generate manpages.
 | 
						|
      mkdir -p $out/share/man/{man5,man1}
 | 
						|
 | 
						|
      nixos-render-docs -j $NIX_BUILD_CORES options manpage \
 | 
						|
        --revision ${release} \
 | 
						|
        --header ${./man/header.5} \
 | 
						|
        --footer ${./man/footer.5} \
 | 
						|
        ${nvimModuleDocs.optionsJSON}/share/doc/nixos/options.json \
 | 
						|
        $out/share/man/man5/nvf.5
 | 
						|
 | 
						|
      cp ${./man/nvf.1} $out/share/man/man1/nvf.1
 | 
						|
    '';
 | 
						|
 | 
						|
  manual = {
 | 
						|
    inherit html;
 | 
						|
    htmlOpenTool = pkgs.callPackage ./html-open-tool.nix {inherit html;};
 | 
						|
  };
 | 
						|
}
 |