Merge pull request #248701 from doronbehar/nixos/manpages

nixos/install-tools: Add manpages to packages instead of seperating them
This commit is contained in:
Doron Behar 2023-08-16 15:49:49 +00:00 committed by GitHub
commit 62730f2c31
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 128 additions and 78 deletions

View file

@ -7,6 +7,7 @@ You can quickly check your edits with the following:
```ShellSession ```ShellSession
$ cd /path/to/nixpkgs $ cd /path/to/nixpkgs
$ $EDITOR doc/nixos/manual/... # edit the manual
$ nix-build nixos/release.nix -A manual.x86_64-linux $ nix-build nixos/release.nix -A manual.x86_64-linux
``` ```
@ -14,24 +15,96 @@ If the build succeeds, the manual will be in `./result/share/doc/nixos/index.htm
There's also [a convenient development daemon](https://nixos.org/manual/nixpkgs/unstable/#sec-contributing-devmode). There's also [a convenient development daemon](https://nixos.org/manual/nixpkgs/unstable/#sec-contributing-devmode).
**Contributing to the man pages** 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.
The man pages are written in [DocBook] which is XML. ## Contributing to the `configuration.nix` options documentation {#sec-contributing-options}
To see what your edits look like: 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.
To see how your changes render on the web, run again:
```ShellSession
$ nix-build nixos/release.nix -A manual.x86_64-linux
```
And you'll see the changes to the appendix in the path `result/share/doc/nixos/options.html`.
You can also build only the `configuration.nix(5)` manual page, via:
```ShellSession ```ShellSession
$ cd /path/to/nixpkgs $ cd /path/to/nixpkgs
$ nix-build nixos/release.nix -A manpages.x86_64-linux $ nix-build nixos/release.nix -A nixos-configuration-reference-manpage.x86_64-linux
``` ```
You can then read the man page you edited by running And observe the result via:
```ShellSession ```ShellSession
$ man --manpath=result/share/man nixos-rebuild # Replace nixos-rebuild with the command whose manual you edited $ man --local-file result/share/man/man5/configuration.nix.5
``` ```
If you're on a different architecture that's supported by NixOS (check nixos/release.nix) then replace `x86_64-linux` with the architecture. If you're on a different architecture that's supported by NixOS (check file `nixos/release.nix` on Nixpkgs' repository) then replace `x86_64-linux` with the architecture. `nix-build` will complain otherwise, but should also tell you which architecture you have + the supported ones.
`nix-build` will complain otherwise, but should also tell you which architecture you have + the supported ones.
[DocBook]: https://en.wikipedia.org/wiki/DocBook ## Contributing to `nixos-*` tools' manpages {#sec-contributing-nixos-tools}
The manual pages for the tools available in the installation image can be found in Nixpkgs by running (e.g for `nixos-rebuild`):
```ShellSession
$ git ls | grep nixos-rebuild.8
```
Man pages are written in [`mdoc(7)` format](https://mandoc.bsd.lv/man/mdoc.7.html) and should be portable between mandoc and groff for rendering (except for minor differences, notably different spacing rules.)
For a preview, run `man --local-file path/to/file.8`.
Being written in `mdoc`, these manpages use semantic markup. This following subsections provides a guideline on where to apply which semantic elements.
### Command lines and arguments {#ssec-contributing-nixos-tools-cli-and-args}
In any manpage, commands, flags and arguments to the *current* executable should be marked according to their semantics. Commands, flags and arguments passed to *other* executables should not be marked like this and should instead be considered as code examples and marked with `Ql`.
- Use `Fl` to mark flag arguments, `Ar` for their arguments.
- Repeating arguments should be marked by adding an ellipsis (spelled with periods, `...`).
- Use `Cm` to mark literal string arguments, e.g. the `boot` command argument passed to `nixos-rebuild`.
- Optional flags or arguments should be marked with `Op`. This includes optional repeating arguments.
- Required flags or arguments should not be marked.
- Mutually exclusive groups of arguments should be enclosed in curly brackets, preferably created with `Bro`/`Brc` blocks.
When an argument is used in an example it should be marked up with `Ar` again to differentiate it from a constant. For example, a command with a `--host name` option that calls ssh to retrieve the host's local time would signify this thusly:
```
This will run
.Ic ssh Ar name Ic time
to retrieve the remote time.
```
### Paths, NixOS options, environment variables {#ssec-contributing-nixos-tools-options-and-environment}
Constant paths should be marked with `Pa`, NixOS options with `Va`, and environment variables with `Ev`.
Generated paths, e.g. `result/bin/run-hostname-vm` (where `hostname` is a variable or arguments) should be marked as `Ql` inline literals with their variable components marked appropriately.
- When `hostname` refers to an argument, it becomes `.Ql result/bin/run- Ns Ar hostname Ns -vm`
- When `hostname` refers to a variable, it becomes `.Ql result/bin/run- Ns Va hostname Ns -vm`
### Code examples and other commands {#ssec-contributing-nixos-tools-code-examples}
In free text names and complete invocations of other commands (e.g. `ssh` or `tar -xvf src.tar`) should be marked with `Ic`, fragments of command lines should be marked with `Ql`.
Larger code blocks or those that cannot be shown inline should use indented literal display block markup for their contents, i.e.
```
.Bd -literal -offset indent
...
.Ed
```
Contents of code blocks may be marked up further, e.g. if they refer to arguments that will be substituted into them:
```
.Bd -literal -offset indent
{
config.networking.hostname = "\c
.Ar hostname Ns \c
";
}
.Ed
```

View file

@ -184,8 +184,8 @@ in rec {
''; '';
# Generate the NixOS manpages. # Generate the `man configuration.nix` package
manpages = runCommand "nixos-manpages" nixos-configuration-reference-manpage = runCommand "nixos-configuration-reference-manpage"
{ nativeBuildInputs = [ { nativeBuildInputs = [
buildPackages.installShellFiles buildPackages.installShellFiles
buildPackages.nixos-render-docs buildPackages.nixos-render-docs
@ -194,8 +194,6 @@ in rec {
} }
'' ''
# Generate manpages. # Generate manpages.
mkdir -p $out/share/man/man8
installManPage ${./manpages}/*
mkdir -p $out/share/man/man5 mkdir -p $out/share/man/man5
nixos-render-docs -j $NIX_BUILD_CORES options manpage \ nixos-render-docs -j $NIX_BUILD_CORES options manpage \
--revision ${lib.escapeShellArg revision} \ --revision ${lib.escapeShellArg revision} \

View file

@ -1,57 +0,0 @@
# NixOS manpages
This is the collection of NixOS manpages, excluding `configuration.nix(5)`.
Man pages are written in [`mdoc(7)` format](https://mandoc.bsd.lv/man/mdoc.7.html) and should be portable between mandoc and groff for rendering (though minor differences may occur, mandoc and groff seem to have slightly different spacing rules.)
For previewing edited files, you can just run `man -l path/to/file.8` and you will see it rendered.
Being written in `mdoc` these manpages use semantic markup. This file provides a guideline on where to apply which of the semantic elements of `mdoc`.
### Command lines and arguments
In any manpage, commands, flags and arguments to the *current* executable should be marked according to their semantics. Commands, flags and arguments passed to *other* executables should not be marked like this and should instead be considered as code examples and marked with `Ql`.
- Use `Fl` to mark flag arguments, `Ar` for their arguments.
- Repeating arguments should be marked by adding ellipses (`...`).
- Use `Cm` to mark literal string arguments, e.g. the `boot` command argument passed to `nixos-rebuild`.
- Optional flags or arguments should be marked with `Op`. This includes optional repeating arguments.
- Required flags or arguments should not be marked.
- Mutually exclusive groups of arguments should be enclosed in curly brackets, preferably created with `Bro`/`Brc` blocks.
When an argument is used in an example it should be marked up with `Ar` again to differentiate it from a constant. For example, a command with a `--host name` flag that calls ssh to retrieve the host's local time would signify this thusly:
```
This will run
.Ic ssh Ar name Ic time
to retrieve the remote time.
```
### Paths, NixOS options, environment variables
Constant paths should be marked with `Pa`, NixOS options with `Va`, and environment variables with `Ev`.
Generated paths, e.g. `result/bin/run-hostname-vm` (where `hostname` is a variable or arguments) should be marked as `Ql` inline literals with their variable components marked appropriately.
- Taking `hostname` from an argument become `.Ql result/bin/run- Ns Ar hostname Ns -vm`
- Taking `hostname` from a variable otherwise defined becomes `.Ql result/bin/run- Ns Va hostname Ns -vm`
### Code examples and other commands
In free text names and complete invocations of other commands (e.g. `ssh` or `tar -xvf src.tar`) should be marked with `Ic`, fragments of command lines should be marked with `Ql`.
Larger code blocks or those that cannot be shown inline should use indented literal display block markup for their contents, i.e.
```
.Bd -literal -offset indent
...
.Ed
```
Contents of code blocks may be marked up further, e.g. if they refer to arguments that will be substituted into them:
```
.Bd -literal -offset indent
{
options.hostname = "\c
.Ar hostname Ns \c
";
}
.Ed
```

View file

@ -9,12 +9,19 @@ let
makeProg = args: pkgs.substituteAll (args // { makeProg = args: pkgs.substituteAll (args // {
dir = "bin"; dir = "bin";
isExecutable = true; isExecutable = true;
nativeBuildInputs = [
pkgs.installShellFiles
];
postInstall = ''
installManPage ${args.manPage}
'';
}); });
nixos-build-vms = makeProg { nixos-build-vms = makeProg {
name = "nixos-build-vms"; name = "nixos-build-vms";
src = ./nixos-build-vms/nixos-build-vms.sh; src = ./nixos-build-vms/nixos-build-vms.sh;
inherit (pkgs) runtimeShell; inherit (pkgs) runtimeShell;
manPage = ./manpages/nixos-build-vms.8;
}; };
nixos-install = makeProg { nixos-install = makeProg {
@ -27,6 +34,7 @@ let
nixos-enter nixos-enter
pkgs.util-linuxMinimal pkgs.util-linuxMinimal
]; ];
manPage = ./manpages/nixos-install.8;
}; };
nixos-rebuild = pkgs.nixos-rebuild.override { nix = config.nix.package.out; }; nixos-rebuild = pkgs.nixos-rebuild.override { nix = config.nix.package.out; };
@ -40,6 +48,7 @@ let
btrfs = "${pkgs.btrfs-progs}/bin/btrfs"; btrfs = "${pkgs.btrfs-progs}/bin/btrfs";
inherit (config.system.nixos-generate-config) configuration desktopConfiguration; inherit (config.system.nixos-generate-config) configuration desktopConfiguration;
xserverEnabled = config.services.xserver.enable; xserverEnabled = config.services.xserver.enable;
manPage = ./manpages/nixos-generate-config.8;
}; };
inherit (pkgs) nixos-option; inherit (pkgs) nixos-option;
@ -57,6 +66,7 @@ let
} // optionalAttrs (config.system.configurationRevision != null) { } // optionalAttrs (config.system.configurationRevision != null) {
configurationRevision = config.system.configurationRevision; configurationRevision = config.system.configurationRevision;
}); });
manPage = ./manpages/nixos-version.8;
}; };
nixos-enter = makeProg { nixos-enter = makeProg {
@ -66,6 +76,7 @@ let
path = makeBinPath [ path = makeBinPath [
pkgs.util-linuxMinimal pkgs.util-linuxMinimal
]; ];
manPage = ./manpages/nixos-enter.8;
}; };
in in

View file

@ -346,7 +346,7 @@ in
system.build.manual = manual; system.build.manual = manual;
environment.systemPackages = [] environment.systemPackages = []
++ optional cfg.man.enable manual.manpages ++ optional cfg.man.enable manual.nixos-configuration-reference-manpage
++ optionals cfg.doc.enable [ manual.manualHTML nixos-help ]; ++ optionals cfg.doc.enable [ manual.manualHTML nixos-help ];
}) })

View file

@ -143,7 +143,7 @@ in rec {
manualHTML = buildFromConfig ({ ... }: { }) (config: config.system.build.manual.manualHTML); manualHTML = buildFromConfig ({ ... }: { }) (config: config.system.build.manual.manualHTML);
manual = manualHTML; # TODO(@oxij): remove eventually manual = manualHTML; # TODO(@oxij): remove eventually
manualEpub = (buildFromConfig ({ ... }: { }) (config: config.system.build.manual.manualEpub)); manualEpub = (buildFromConfig ({ ... }: { }) (config: config.system.build.manual.manualEpub));
manpages = buildFromConfig ({ ... }: { }) (config: config.system.build.manual.manpages); nixos-configuration-reference-manpage = buildFromConfig ({ ... }: { }) (config: config.system.build.manual.nixos-configuration-reference-manpage);
options = (buildFromConfig ({ ... }: { }) (config: config.system.build.manual.optionsJSON)).x86_64-linux; options = (buildFromConfig ({ ... }: { }) (config: config.system.build.manual.optionsJSON)).x86_64-linux;

View file

@ -6,6 +6,7 @@
, nix , nix
, lib , lib
, nixosTests , nixosTests
, installShellFiles
}: }:
let let
fallback = import ./../../../../nixos/modules/installer/tools/nix-fallback-paths.nix; fallback = import ./../../../../nixos/modules/installer/tools/nix-fallback-paths.nix;
@ -20,6 +21,12 @@ substituteAll {
nix_i686_linux = fallback.i686-linux; nix_i686_linux = fallback.i686-linux;
nix_aarch64_linux = fallback.aarch64-linux; nix_aarch64_linux = fallback.aarch64-linux;
path = lib.makeBinPath [ coreutils gnused gnugrep ]; path = lib.makeBinPath [ coreutils gnused gnugrep ];
nativeBuildInputs = [
installShellFiles
];
postInstall = ''
installManPage ${./nixos-rebuild.8}
'';
# run some a simple installer tests to make sure nixos-rebuild still works for them # run some a simple installer tests to make sure nixos-rebuild still works for them
passthru.tests = { passthru.tests = {

View file

@ -20,8 +20,7 @@ in
inherit (config.system.build) inherit (config.system.build)
nixos-install nixos-generate-config nixos-enter; nixos-install nixos-generate-config nixos-enter;
# Required for --help. inherit (config.system.build.manual) nixos-configuration-reference-manpage;
inherit (config.system.build.manual) manpages;
}; };
extraOutputsToInstall = ["man"]; extraOutputsToInstall = ["man"];

View file

@ -1,14 +1,33 @@
{ lib, stdenv, boost, cmake, pkg-config, nix }: { lib
, stdenv
, boost
, cmake
, pkg-config
, installShellFiles
, nix
}:
stdenv.mkDerivation { stdenv.mkDerivation {
name = "nixos-option"; name = "nixos-option";
src = ./.; src = ./.;
postInstall = ''
installManPage ${./nixos-option.8}
'';
strictDeps = true; strictDeps = true;
nativeBuildInputs = [ cmake pkg-config ]; nativeBuildInputs = [
buildInputs = [ boost nix ]; cmake
cmakeFlags = [ "-DNIX_DEV_INCLUDEPATH=${nix.dev}/include/nix" ]; pkg-config
installShellFiles
];
buildInputs = [
boost
nix
];
cmakeFlags = [
"-DNIX_DEV_INCLUDEPATH=${nix.dev}/include/nix"
];
meta = with lib; { meta = with lib; {
license = licenses.lgpl2Plus; license = licenses.lgpl2Plus;