2021-12-18 18:37:41 +00:00
|
|
|
|
{ pkgs
|
|
|
|
|
, options
|
|
|
|
|
, config
|
|
|
|
|
, version
|
|
|
|
|
, revision
|
|
|
|
|
, extraSources ? []
|
|
|
|
|
, baseOptionsJSON ? null
|
|
|
|
|
, warningsAreErrors ? true
|
2022-09-01 18:23:59 +01:00
|
|
|
|
, allowDocBook ? true
|
2021-12-18 18:37:41 +00:00
|
|
|
|
, prefix ? ../../..
|
|
|
|
|
}:
|
2008-06-05 16:33:17 +01:00
|
|
|
|
|
2014-08-09 15:30:44 +01:00
|
|
|
|
with pkgs;
|
2013-10-17 13:09:05 +01:00
|
|
|
|
|
2011-09-14 19:20:50 +01:00
|
|
|
|
let
|
2022-06-27 19:06:30 +01:00
|
|
|
|
inherit (lib) hasPrefix removePrefix;
|
|
|
|
|
|
2016-07-28 03:27:39 +01:00
|
|
|
|
lib = pkgs.lib;
|
2009-10-06 00:15:06 +01:00
|
|
|
|
|
2022-03-31 01:34:42 +01:00
|
|
|
|
docbook_xsl_ns = pkgs.docbook-xsl-ns.override {
|
|
|
|
|
withManOptDedupPatch = true;
|
|
|
|
|
};
|
|
|
|
|
|
2016-01-22 19:22:12 +00:00
|
|
|
|
# We need to strip references to /nix/store/* from options,
|
|
|
|
|
# including any `extraSources` if some modules came from elsewhere,
|
|
|
|
|
# or else the build will fail.
|
|
|
|
|
#
|
|
|
|
|
# E.g. if some `options` came from modules in ${pkgs.customModules}/nix,
|
2016-01-29 15:20:22 +00:00
|
|
|
|
# you'd need to include `extraSources = [ pkgs.customModules ]`
|
2021-11-18 23:26:27 +00:00
|
|
|
|
prefixesToStrip = map (p: "${toString p}/") ([ prefix ] ++ extraSources);
|
2021-01-25 06:57:48 +00:00
|
|
|
|
stripAnyPrefixes = lib.flip (lib.foldr lib.removePrefix) prefixesToStrip;
|
2013-10-23 18:32:19 +01:00
|
|
|
|
|
2019-08-08 11:59:25 +01:00
|
|
|
|
optionsDoc = buildPackages.nixosOptionsDoc {
|
2022-09-01 18:23:59 +01:00
|
|
|
|
inherit options revision baseOptionsJSON warningsAreErrors allowDocBook;
|
2019-08-08 11:59:25 +01:00
|
|
|
|
transformOptions = opt: opt // {
|
|
|
|
|
# Clean up declaration sites to not refer to the NixOS source tree.
|
|
|
|
|
declarations = map stripAnyPrefixes opt.declarations;
|
|
|
|
|
};
|
|
|
|
|
};
|
2009-09-18 16:10:37 +01:00
|
|
|
|
|
2022-06-27 16:52:08 +01:00
|
|
|
|
nixos-lib = import ../../lib { };
|
|
|
|
|
|
|
|
|
|
testOptionsDoc = let
|
|
|
|
|
eval = nixos-lib.evalTest {
|
|
|
|
|
# Avoid evaluating a NixOS config prototype.
|
|
|
|
|
config.node.type = lib.types.deferredModule;
|
|
|
|
|
options._module.args = lib.mkOption { internal = true; };
|
|
|
|
|
};
|
|
|
|
|
in buildPackages.nixosOptionsDoc {
|
|
|
|
|
inherit (eval) options;
|
|
|
|
|
inherit (revision);
|
|
|
|
|
transformOptions = opt: opt // {
|
|
|
|
|
# Clean up declaration sites to not refer to the NixOS source tree.
|
|
|
|
|
declarations =
|
|
|
|
|
map
|
|
|
|
|
(decl:
|
|
|
|
|
if hasPrefix (toString ../../..) (toString decl)
|
|
|
|
|
then
|
|
|
|
|
let subpath = removePrefix "/" (removePrefix (toString ../../..) (toString decl));
|
|
|
|
|
in { url = "https://github.com/NixOS/nixpkgs/blob/master/${subpath}"; name = subpath; }
|
|
|
|
|
else decl)
|
|
|
|
|
opt.declarations;
|
|
|
|
|
};
|
|
|
|
|
documentType = "none";
|
|
|
|
|
variablelistId = "test-options-list";
|
2022-09-29 11:41:59 +01:00
|
|
|
|
optionIdPrefix = "test-opt-";
|
2022-06-27 16:52:08 +01:00
|
|
|
|
};
|
|
|
|
|
|
2016-07-28 03:27:39 +01:00
|
|
|
|
sources = lib.sourceFilesBySuffices ./. [".xml"];
|
2014-08-25 13:33:17 +01:00
|
|
|
|
|
2016-04-27 13:29:33 +01:00
|
|
|
|
modulesDoc = builtins.toFile "modules.xml" ''
|
|
|
|
|
<section xmlns:xi="http://www.w3.org/2001/XInclude" id="modules">
|
|
|
|
|
${(lib.concatMapStrings (path: ''
|
|
|
|
|
<xi:include href="${path}" />
|
|
|
|
|
'') (lib.catAttrs "value" config.meta.doc))}
|
|
|
|
|
</section>
|
|
|
|
|
'';
|
|
|
|
|
|
2018-04-28 03:44:25 +01:00
|
|
|
|
generatedSources = runCommand "generated-docbook" {} ''
|
|
|
|
|
mkdir $out
|
|
|
|
|
ln -s ${modulesDoc} $out/modules.xml
|
2019-08-08 11:59:25 +01:00
|
|
|
|
ln -s ${optionsDoc.optionsDocBook} $out/options-db.xml
|
2022-06-27 16:52:08 +01:00
|
|
|
|
ln -s ${testOptionsDoc.optionsDocBook} $out/test-options-db.xml
|
2018-04-28 03:44:25 +01:00
|
|
|
|
printf "%s" "${version}" > $out/version
|
|
|
|
|
'';
|
|
|
|
|
|
2014-08-25 13:33:17 +01:00
|
|
|
|
copySources =
|
|
|
|
|
''
|
|
|
|
|
cp -prd $sources/* . # */
|
2018-04-28 03:44:25 +01:00
|
|
|
|
ln -s ${generatedSources} ./generated
|
2014-08-27 11:24:10 +01:00
|
|
|
|
chmod -R u+w .
|
2014-08-25 13:33:17 +01:00
|
|
|
|
'';
|
|
|
|
|
|
2015-07-22 15:09:00 +01:00
|
|
|
|
toc = builtins.toFile "toc.xml"
|
|
|
|
|
''
|
|
|
|
|
<toc role="chunk-toc">
|
|
|
|
|
<d:tocentry xmlns:d="http://docbook.org/ns/docbook" linkend="book-nixos-manual"><?dbhtml filename="index.html"?>
|
2015-07-22 15:17:06 +01:00
|
|
|
|
<d:tocentry linkend="ch-options"><?dbhtml filename="options.html"?></d:tocentry>
|
|
|
|
|
<d:tocentry linkend="ch-release-notes"><?dbhtml filename="release-notes.html"?></d:tocentry>
|
2015-07-22 15:09:00 +01:00
|
|
|
|
</d:tocentry>
|
|
|
|
|
</toc>
|
|
|
|
|
'';
|
|
|
|
|
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
manualXsltprocOptions = toString [
|
2022-12-12 12:04:39 +00:00
|
|
|
|
"--param chapter.autolabel 0"
|
|
|
|
|
"--param part.autolabel 0"
|
|
|
|
|
"--param preface.autolabel 0"
|
|
|
|
|
"--param reference.autolabel 0"
|
|
|
|
|
"--param section.autolabel 0"
|
2018-04-05 12:54:01 +01:00
|
|
|
|
"--stringparam html.stylesheet 'style.css overrides.css highlightjs/mono-blue.css'"
|
|
|
|
|
"--stringparam html.script './highlightjs/highlight.pack.js ./highlightjs/loader.js'"
|
2022-12-12 12:04:39 +00:00
|
|
|
|
"--param xref.with.number.and.title 0"
|
2019-10-28 10:46:10 +00:00
|
|
|
|
"--param toc.section.depth 0"
|
2020-10-31 20:18:16 +00:00
|
|
|
|
"--param generate.consistent.ids 1"
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
"--stringparam admon.style ''"
|
2018-04-05 12:54:01 +01:00
|
|
|
|
"--stringparam callout.graphics.extension .svg"
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
"--stringparam current.docid manual"
|
|
|
|
|
"--param chunk.section.depth 0"
|
|
|
|
|
"--param chunk.first.sections 1"
|
|
|
|
|
"--param use.id.as.filename 1"
|
|
|
|
|
"--stringparam chunk.toc ${toc}"
|
|
|
|
|
];
|
|
|
|
|
|
2017-06-28 18:02:33 +01:00
|
|
|
|
manual-combined = runCommand "nixos-manual-combined"
|
2016-09-27 14:26:37 +01:00
|
|
|
|
{ inherit sources;
|
2018-03-21 19:02:15 +00:00
|
|
|
|
nativeBuildInputs = [ buildPackages.libxml2.bin buildPackages.libxslt.bin ];
|
2017-06-28 18:02:33 +01:00
|
|
|
|
meta.description = "The NixOS manual as plain docbook XML";
|
2016-09-27 14:26:37 +01:00
|
|
|
|
}
|
|
|
|
|
''
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
${copySources}
|
|
|
|
|
|
2017-06-28 18:02:33 +01:00
|
|
|
|
xmllint --xinclude --output ./manual-combined.xml ./manual.xml
|
|
|
|
|
xmllint --xinclude --noxincludenode \
|
|
|
|
|
--output ./man-pages-combined.xml ./man-pages.xml
|
|
|
|
|
|
2017-11-18 23:44:17 +00:00
|
|
|
|
# outputs the context of an xmllint error output
|
|
|
|
|
# LEN lines around the failing line are printed
|
|
|
|
|
function context {
|
|
|
|
|
# length of context
|
|
|
|
|
local LEN=6
|
|
|
|
|
# lines to print before error line
|
|
|
|
|
local BEFORE=4
|
|
|
|
|
|
|
|
|
|
# xmllint output lines are:
|
|
|
|
|
# file.xml:1234: there was an error on line 1234
|
|
|
|
|
while IFS=':' read -r file line rest; do
|
|
|
|
|
echo
|
|
|
|
|
if [[ -n "$rest" ]]; then
|
|
|
|
|
echo "$file:$line:$rest"
|
|
|
|
|
local FROM=$(($line>$BEFORE ? $line - $BEFORE : 1))
|
|
|
|
|
# number lines & filter context
|
|
|
|
|
nl --body-numbering=a "$file" | sed -n "$FROM,+$LEN p"
|
|
|
|
|
else
|
|
|
|
|
if [[ -n "$line" ]]; then
|
|
|
|
|
echo "$file:$line"
|
|
|
|
|
else
|
|
|
|
|
echo "$file"
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function lintrng {
|
|
|
|
|
xmllint --debug --noout --nonet \
|
|
|
|
|
--relaxng ${docbook5}/xml/rng/docbook/docbook.rng \
|
|
|
|
|
"$1" \
|
|
|
|
|
2>&1 | context 1>&2
|
|
|
|
|
# ^ redirect assumes xmllint doesn’t print to stdout
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-28 18:02:33 +01:00
|
|
|
|
mkdir $out
|
|
|
|
|
cp manual-combined.xml $out/
|
|
|
|
|
cp man-pages-combined.xml $out/
|
2022-06-27 16:18:02 +01:00
|
|
|
|
|
|
|
|
|
lintrng $out/manual-combined.xml
|
|
|
|
|
lintrng $out/man-pages-combined.xml
|
2017-06-28 18:02:33 +01:00
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
olinkDB = runCommand "manual-olinkdb"
|
|
|
|
|
{ inherit sources;
|
2018-03-21 19:02:15 +00:00
|
|
|
|
nativeBuildInputs = [ buildPackages.libxml2.bin buildPackages.libxslt.bin ];
|
2017-06-28 18:02:33 +01:00
|
|
|
|
}
|
|
|
|
|
''
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
xsltproc \
|
|
|
|
|
${manualXsltprocOptions} \
|
|
|
|
|
--stringparam collect.xref.targets only \
|
|
|
|
|
--stringparam targets.filename "$out/manual.db" \
|
2017-06-28 18:02:33 +01:00
|
|
|
|
--nonet \
|
2018-07-17 21:11:16 +01:00
|
|
|
|
${docbook_xsl_ns}/xml/xsl/docbook/xhtml/chunktoc.xsl \
|
2017-06-28 18:02:33 +01:00
|
|
|
|
${manual-combined}/manual-combined.xml
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
|
|
|
|
|
cat > "$out/olinkdb.xml" <<EOF
|
|
|
|
|
<?xml version="1.0" encoding="utf-8"?>
|
|
|
|
|
<!DOCTYPE targetset SYSTEM
|
2018-07-17 21:11:16 +01:00
|
|
|
|
"file://${docbook_xsl_ns}/xml/xsl/docbook/common/targetdatabase.dtd" [
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
<!ENTITY manualtargets SYSTEM "file://$out/manual.db">
|
|
|
|
|
]>
|
|
|
|
|
<targetset>
|
|
|
|
|
<targetsetinfo>
|
|
|
|
|
Allows for cross-referencing olinks between the manpages
|
2016-07-28 17:32:56 +01:00
|
|
|
|
and manual.
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
</targetsetinfo>
|
|
|
|
|
|
|
|
|
|
<document targetdoc="manual">&manualtargets;</document>
|
|
|
|
|
</targetset>
|
|
|
|
|
EOF
|
|
|
|
|
'';
|
|
|
|
|
|
2010-08-11 13:28:53 +01:00
|
|
|
|
in rec {
|
2018-04-28 09:00:55 +01:00
|
|
|
|
inherit generatedSources;
|
2010-08-11 13:28:53 +01:00
|
|
|
|
|
2021-11-18 23:26:27 +00:00
|
|
|
|
inherit (optionsDoc) optionsJSON optionsNix optionsDocBook;
|
2014-11-17 12:41:18 +00:00
|
|
|
|
|
2010-08-11 13:28:53 +01:00
|
|
|
|
# Generate the NixOS manual.
|
2018-09-06 20:17:44 +01:00
|
|
|
|
manualHTML = runCommand "nixos-manual-html"
|
2016-09-27 14:26:37 +01:00
|
|
|
|
{ inherit sources;
|
2018-03-21 19:02:15 +00:00
|
|
|
|
nativeBuildInputs = [ buildPackages.libxml2.bin buildPackages.libxslt.bin ];
|
2016-09-27 14:26:37 +01:00
|
|
|
|
meta.description = "The NixOS manual in HTML format";
|
|
|
|
|
allowedReferences = ["out"];
|
|
|
|
|
}
|
|
|
|
|
''
|
2009-10-05 14:17:45 +01:00
|
|
|
|
# Generate the HTML manual.
|
2009-07-14 16:47:03 +01:00
|
|
|
|
dst=$out/share/doc/nixos
|
2014-06-30 13:56:10 +01:00
|
|
|
|
mkdir -p $dst
|
2014-08-25 18:08:12 +01:00
|
|
|
|
xsltproc \
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
${manualXsltprocOptions} \
|
|
|
|
|
--stringparam target.database.document "${olinkDB}/olinkdb.xml" \
|
2019-02-07 15:35:24 +00:00
|
|
|
|
--stringparam id.warnings "1" \
|
2017-06-28 18:02:33 +01:00
|
|
|
|
--nonet --output $dst/ \
|
2018-07-17 21:11:16 +01:00
|
|
|
|
${docbook_xsl_ns}/xml/xsl/docbook/xhtml/chunktoc.xsl \
|
2019-02-08 09:50:59 +00:00
|
|
|
|
${manual-combined}/manual-combined.xml \
|
|
|
|
|
|& tee xsltproc.out
|
|
|
|
|
grep "^ID recommended on" xsltproc.out &>/dev/null && echo "error: some IDs are missing" && false
|
|
|
|
|
rm xsltproc.out
|
2009-09-18 16:10:37 +01:00
|
|
|
|
|
2012-07-25 16:54:24 +01:00
|
|
|
|
mkdir -p $dst/images/callouts
|
2018-07-17 21:11:16 +01:00
|
|
|
|
cp ${docbook_xsl_ns}/xml/xsl/docbook/images/callouts/*.svg $dst/images/callouts/
|
2013-01-09 12:43:57 +00:00
|
|
|
|
|
2018-04-05 12:54:01 +01:00
|
|
|
|
cp ${../../../doc/style.css} $dst/style.css
|
|
|
|
|
cp ${../../../doc/overrides.css} $dst/overrides.css
|
|
|
|
|
cp -r ${pkgs.documentation-highlighter} $dst/highlightjs
|
2011-09-14 19:20:50 +01:00
|
|
|
|
|
2013-10-24 19:06:02 +01:00
|
|
|
|
mkdir -p $out/nix-support
|
|
|
|
|
echo "nix-build out $out" >> $out/nix-support/hydra-build-products
|
2014-09-10 14:03:49 +01:00
|
|
|
|
echo "doc manual $dst" >> $out/nix-support/hydra-build-products
|
2012-07-25 16:54:24 +01:00
|
|
|
|
''; # */
|
2013-10-24 19:06:02 +01:00
|
|
|
|
|
2018-09-06 20:17:44 +01:00
|
|
|
|
# Alias for backward compatibility. TODO(@oxij): remove eventually.
|
|
|
|
|
manual = manualHTML;
|
|
|
|
|
|
|
|
|
|
# Index page of the NixOS manual.
|
|
|
|
|
manualHTMLIndex = "${manualHTML}/share/doc/nixos/index.html";
|
2010-08-11 13:28:53 +01:00
|
|
|
|
|
2016-09-27 14:26:37 +01:00
|
|
|
|
manualEpub = runCommand "nixos-manual-epub"
|
|
|
|
|
{ inherit sources;
|
2022-01-08 15:03:23 +00:00
|
|
|
|
nativeBuildInputs = [ buildPackages.libxml2.bin buildPackages.libxslt.bin buildPackages.zip ];
|
2016-09-27 14:26:37 +01:00
|
|
|
|
}
|
|
|
|
|
''
|
2016-07-28 03:27:39 +01:00
|
|
|
|
# Generate the epub manual.
|
|
|
|
|
dst=$out/share/doc/nixos
|
|
|
|
|
|
|
|
|
|
xsltproc \
|
|
|
|
|
${manualXsltprocOptions} \
|
|
|
|
|
--stringparam target.database.document "${olinkDB}/olinkdb.xml" \
|
|
|
|
|
--nonet --xinclude --output $dst/epub/ \
|
2018-07-17 21:11:16 +01:00
|
|
|
|
${docbook_xsl_ns}/xml/xsl/docbook/epub/docbook.xsl \
|
2017-06-28 18:02:33 +01:00
|
|
|
|
${manual-combined}/manual-combined.xml
|
2016-07-28 03:27:39 +01:00
|
|
|
|
|
|
|
|
|
mkdir -p $dst/epub/OEBPS/images/callouts
|
2018-07-17 21:11:16 +01:00
|
|
|
|
cp -r ${docbook_xsl_ns}/xml/xsl/docbook/images/callouts/*.svg $dst/epub/OEBPS/images/callouts # */
|
2016-07-28 03:27:39 +01:00
|
|
|
|
echo "application/epub+zip" > mimetype
|
2016-08-01 10:02:41 +01:00
|
|
|
|
manual="$dst/nixos-manual.epub"
|
|
|
|
|
zip -0Xq "$manual" mimetype
|
|
|
|
|
cd $dst/epub && zip -Xr9D "$manual" *
|
|
|
|
|
|
|
|
|
|
rm -rf $dst/epub
|
2016-07-28 03:27:39 +01:00
|
|
|
|
|
|
|
|
|
mkdir -p $out/nix-support
|
2016-08-01 10:02:41 +01:00
|
|
|
|
echo "doc-epub manual $manual" >> $out/nix-support/hydra-build-products
|
2016-07-28 03:27:39 +01:00
|
|
|
|
'';
|
|
|
|
|
|
2010-08-11 13:28:53 +01:00
|
|
|
|
|
2016-09-27 14:26:37 +01:00
|
|
|
|
# Generate the NixOS manpages.
|
|
|
|
|
manpages = runCommand "nixos-manpages"
|
|
|
|
|
{ inherit sources;
|
2018-03-21 19:02:15 +00:00
|
|
|
|
nativeBuildInputs = [ buildPackages.libxml2.bin buildPackages.libxslt.bin ];
|
2016-09-27 14:26:37 +01:00
|
|
|
|
allowedReferences = ["out"];
|
|
|
|
|
}
|
|
|
|
|
''
|
2009-10-05 14:17:45 +01:00
|
|
|
|
# Generate manpages.
|
2013-10-24 19:06:02 +01:00
|
|
|
|
mkdir -p $out/share/man
|
2017-06-28 18:02:33 +01:00
|
|
|
|
xsltproc --nonet \
|
2018-03-27 18:58:44 +01:00
|
|
|
|
--maxdepth 6000 \
|
2009-07-14 16:47:03 +01:00
|
|
|
|
--param man.output.in.separate.dir 1 \
|
|
|
|
|
--param man.output.base.dir "'$out/share/man/'" \
|
2009-10-06 00:15:06 +01:00
|
|
|
|
--param man.endnotes.are.numbered 0 \
|
2016-03-19 16:16:59 +00:00
|
|
|
|
--param man.break.after.slash 1 \
|
nixos/doc: Allow refs from options to the manual
My first attempt to do this was to just use a conditional <refsection/>
in order to not create exact references in the manpage but create the
reference in the HTML manual, as suggested by @edolstra on IRC.
Later I went on to use <olink/> to reference sections of the manual, but
in order to do that, we need to overhaul how we generate the manual and
manpages.
So, that's where we are now:
There is a new derivation called "manual-olinkdb", which is the olinkdb
for the HTML manual, which in turn creates the olinkdb.xml file and the
manual.db. The former contains the targetdoc references and the latter
the specific targetptr elements.
The reason why I included the olinkdb.xml verbatim is that first of all
the DTD is dependent on the Docbook XSL sources and the references
within the olinkdb.xml entities are relative to the current directory.
So using a store path for that would end up searching for the manual.db
directly in /nix/store/manual.db.
Unfortunately, the <olinks/> that end up in the output file are
relative, so for example if you're clicking on one of these within the
PDF, the URL is searched in the current directory.
However, the sections from the olink's text are still valid, so we could
use an alternative URL for that in the future.
The manual doesn't contain any links, so even referencing the relative
URL shouldn't do any harm.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
2016-04-11 17:29:00 +01:00
|
|
|
|
--stringparam target.database.document "${olinkDB}/olinkdb.xml" \
|
2018-07-17 21:11:16 +01:00
|
|
|
|
${docbook_xsl_ns}/xml/xsl/docbook/manpages/docbook.xsl \
|
2017-06-28 18:02:33 +01:00
|
|
|
|
${manual-combined}/man-pages-combined.xml
|
2008-01-04 14:24:42 +00:00
|
|
|
|
'';
|
2015-09-24 10:47:00 +01:00
|
|
|
|
|
2011-09-14 19:20:50 +01:00
|
|
|
|
}
|