Very simple builder which builds (optionally) gzipped man pages from a list of attrsets and links them into a common man directory with the correct layout, so it should be installable immediately. Additionally runs mandoc -T lint, but by default only for informational purposes as it is very strict and some things are almost never true (for example all Xrs being present in the respective directory). buildManPages.single exposes the internal builder for a single, optionally gzipped man page from a nix attrset. Change-Id: I43fce011716f4a7cc80521f222800ca99ba54060 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2654 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { depot, ... }:
 | |
| 
 | |
| let
 | |
|   inherit (depot.third_party)
 | |
|     lib
 | |
|     gzip
 | |
|     mandoc
 | |
|     coreutils
 | |
|     ;
 | |
| 
 | |
|   inherit (depot.nix)
 | |
|     runExecline
 | |
|     getBins
 | |
|     ;
 | |
| 
 | |
|   bins = getBins mandoc [ "mandoc" ]
 | |
|       // getBins gzip   [ "gzip" ]
 | |
|       // getBins coreutils [ "mkdir" "ln" "cp" ]
 | |
|       ;
 | |
| 
 | |
|   defaultGzip = true;
 | |
| 
 | |
|   basename = gzip: { name, section, ... }:
 | |
|     "${name}.${toString section}${lib.optionalString gzip ".gz"}";
 | |
| 
 | |
|   manDir = { section, ... }:
 | |
|     "\${out}/share/man/man${toString section}";
 | |
| 
 | |
|   target = gzip: args:
 | |
|     "${manDir args}/${basename gzip args}";
 | |
| 
 | |
|   buildManPage =
 | |
|     { requireLint ? false
 | |
|     , gzip ? defaultGzip
 | |
|     , ...
 | |
|     }:
 | |
|     { content
 | |
|     , ...
 | |
|     }@page: let
 | |
|       source = builtins.toFile (basename false page) content;
 | |
|     in runExecline (basename gzip page) {} ([
 | |
|       (if requireLint then "if" else "foreground") [
 | |
|         bins.mandoc "-mdoc" "-T" "lint" source
 | |
|       ]
 | |
|       "importas" "out" "out"
 | |
|     ] ++ (if gzip then [
 | |
|       "redirfd" "-w" "1" "$out"
 | |
|       bins.gzip "-c" source
 | |
|     ] else [
 | |
|       bins.cp "--reflink=auto" source "$out"
 | |
|     ]));
 | |
| 
 | |
|   buildManPages =
 | |
|     name:
 | |
|     { derivationArgs ? {}
 | |
|     , gzip ? defaultGzip
 | |
|     , ...
 | |
|     }@args:
 | |
|     pages:
 | |
|     runExecline "${name}-man-pages" {
 | |
|       inherit derivationArgs;
 | |
|     } ([
 | |
|       "importas" "out" "out"
 | |
|     ] ++ lib.concatMap ({ name, section, content }@page: [
 | |
|       "if" [ bins.mkdir "-p" (manDir page) ]
 | |
|       "if" [
 | |
|         bins.ln "-s"
 | |
|         (buildManPage args page)
 | |
|         (target gzip page)
 | |
|       ]
 | |
|     ]) pages);
 | |
| 
 | |
| in {
 | |
|   __functor = _: buildManPages;
 | |
| 
 | |
|   single = buildManPage;
 | |
| }
 |