texlive: make packages proper multi-output derivations
Each package is now wrapped in a multi-output derivation that builds all the containers, whose output attributes are replaced by the containers themselves. This should facilitate building all containers, while avoiding unnecessary dependencies on the doc and source containers in texlive.withPackages.
This commit is contained in:
parent
de70648e07
commit
6e371cf263
|
@ -1,6 +1,7 @@
|
|||
{ lib
|
||||
, fetchurl
|
||||
, runCommand
|
||||
, writeShellScript
|
||||
|
||||
# script interpreters
|
||||
, bash
|
||||
|
@ -18,6 +19,16 @@
|
|||
/* Convert an attribute set extracted from tlpdb.nix (with the deps attribute
|
||||
already processed) to a fake multi-output derivation with possible outputs
|
||||
[ "tex" "texdoc" "texsource" "tlpkg" "out" "man" "info" ]
|
||||
|
||||
The multi-output is emulated as follows:
|
||||
- the main derivation is a multi-output derivation that builds links to the
|
||||
containers (tex, texdoc, ...)
|
||||
- the output attributes are replaced with the actual containers with the
|
||||
outputSpecified attribute set to true
|
||||
|
||||
In this way, when texlive.withPackages picks an output such as drv.tex, it
|
||||
receives the actual container, avoiding superfluous dependencies on the other
|
||||
containers (for instance doc containers).
|
||||
*/
|
||||
|
||||
# TODO stabilise a generic interface decoupled from the finer details of the
|
||||
|
@ -56,40 +67,29 @@ let
|
|||
hasDocfiles = sha512 ? doc;
|
||||
hasSource = sha512 ? source;
|
||||
|
||||
# emulate drv.all, drv.outputs lists
|
||||
all = lib.optional hasBinfiles bin ++
|
||||
lib.optional hasRunfiles tex ++
|
||||
lib.optional hasDocfiles texdoc ++
|
||||
lib.optional hasSource texsource ++
|
||||
lib.optional hasTlpkg tlpkg ++
|
||||
lib.optional hasManpages man ++
|
||||
lib.optional hasInfo info;
|
||||
outputs = lib.catAttrs "tlOutputName" all;
|
||||
# containers that will be built by Hydra
|
||||
outputs = lib.optional hasBinfiles "out" ++
|
||||
lib.optional hasRunfiles "tex" ++
|
||||
lib.optional hasDocfiles "texdoc" ++
|
||||
lib.optional hasSource "texsource" ++
|
||||
lib.optional hasTlpkg "tlpkg" ++
|
||||
lib.optional hasManpages "man" ++
|
||||
lib.optional hasInfo "info";
|
||||
outputDrvs = lib.getAttrs outputs containers;
|
||||
|
||||
mainDrv = if hasBinfiles then bin
|
||||
else if hasRunfiles then tex
|
||||
else if hasTlpkg then tlpkg
|
||||
else if hasDocfiles then texdoc
|
||||
else if hasSource then texsource
|
||||
else tex; # fall back to attrset tex if there is no derivation
|
||||
|
||||
# emulate multi-output derivation plus additional metadata
|
||||
# (out is handled in mkContainer)
|
||||
passthru = {
|
||||
inherit all outputs pname;
|
||||
# metadata
|
||||
inherit pname;
|
||||
revision = toString revision + extraRevision;
|
||||
version = version + extraVersion;
|
||||
# containers behave like specified outputs
|
||||
outputSpecified = true;
|
||||
inherit tex;
|
||||
} // lib.optionalAttrs (args ? deps) { tlDeps = args.deps; }
|
||||
// lib.optionalAttrs (args ? formats) { inherit (args) formats; }
|
||||
// lib.optionalAttrs hasHyphens { inherit hasHyphens; }
|
||||
// lib.optionalAttrs (args ? postactionScript) { inherit (args) postactionScript; }
|
||||
// lib.optionalAttrs hasDocfiles { texdoc = texdoc; }
|
||||
// lib.optionalAttrs hasSource { texsource = texsource; }
|
||||
// lib.optionalAttrs hasTlpkg { tlpkg = tlpkg; }
|
||||
// lib.optionalAttrs hasManpages { man = man; }
|
||||
// lib.optionalAttrs hasInfo { info = info; };
|
||||
// lib.optionalAttrs hasSource { inherit (containers) texsource; }
|
||||
// lib.optionalAttrs (! hasRunfiles) { tex = fakeTeX; };
|
||||
|
||||
# build run, doc, source, tlpkg containers
|
||||
mkContainer = tlType: tlOutputName: sha512:
|
||||
|
@ -124,24 +124,12 @@ let
|
|||
fi
|
||||
'' + postUnpack);
|
||||
in
|
||||
# remove the standard drv.out, optionally replace it with the bin container
|
||||
builtins.removeAttrs container [ "out" ] // lib.optionalAttrs hasBinfiles { out = bin; };
|
||||
# remove drv.out to avoid confusing texlive.withPackages
|
||||
removeAttrs container [ "out" ]
|
||||
// outputDrvs;
|
||||
|
||||
tex =
|
||||
if hasRunfiles then mkContainer "run" "tex" sha512.run
|
||||
else passthru
|
||||
// { inherit meta; tlOutputName = "tex"; }
|
||||
// lib.optionalAttrs hasBinfiles { out = bin; };
|
||||
|
||||
texdoc = mkContainer "doc" "texdoc" sha512.doc;
|
||||
|
||||
texsource = mkContainer "source" "texsource" sha512.source;
|
||||
|
||||
tlpkg = mkContainer "tlpkg" "tlpkg" sha512.run;
|
||||
|
||||
# build bin container
|
||||
# find interpreters for the script extensions found in tlpdb
|
||||
extToInput = {
|
||||
# find interpreters for the script extensions found in tlpdb
|
||||
jar = jdk;
|
||||
lua = texliveBinaries.luatex;
|
||||
py = python3;
|
||||
|
@ -152,52 +140,86 @@ let
|
|||
tlu = texliveBinaries.luatex;
|
||||
};
|
||||
|
||||
bin = runCommand "${name}"
|
||||
{
|
||||
inherit meta;
|
||||
passthru = passthru // { tlOutputName = "out"; };
|
||||
# shebang interpreters
|
||||
buildInputs =let outName = builtins.replaceStrings [ "-" ] [ "_" ] pname; in
|
||||
[ texliveBinaries.core.${outName} or null
|
||||
texliveBinaries.${pname} or null
|
||||
texliveBinaries.core-big.${outName} or null ]
|
||||
++ (args.extraBuildInputs or [ ]) ++ [ bash perl ]
|
||||
++ (lib.attrVals (args.scriptExts or [ ]) extToInput);
|
||||
nativeBuildInputs = extraNativeBuildInputs;
|
||||
# absolute scripts folder
|
||||
scriptsFolder = lib.optionals (tex ? outPath) (builtins.map (f: tex.outPath + "/scripts/" + f) (lib.toList args.scriptsFolder or pname));
|
||||
# binaries info
|
||||
inherit (args) binfiles;
|
||||
binlinks = builtins.attrNames (args.binlinks or { });
|
||||
bintargets = builtins.attrValues (args.binlinks or { });
|
||||
# build scripts
|
||||
patchScripts = ./patch-scripts.sed;
|
||||
makeBinContainers = ./make-bin-containers.sh;
|
||||
}
|
||||
''
|
||||
. "$makeBinContainers"
|
||||
${args.postFixup or ""}
|
||||
'';
|
||||
# fake derivation for resolving dependencies in the absence of a "tex" containers
|
||||
fakeTeX = passthru
|
||||
// { inherit meta; tlOutputName = "tex"; }
|
||||
// outputDrvs;
|
||||
|
||||
# build man, info containers
|
||||
man = builtins.removeAttrs (runCommand "${name}-man"
|
||||
{
|
||||
inherit meta texdoc;
|
||||
passthru = passthru // { tlOutputName = "man"; };
|
||||
}
|
||||
''
|
||||
mkdir -p "$out"/share
|
||||
ln -s {"$texdoc"/doc,"$out"/share}/man
|
||||
'') [ "out" ] // lib.optionalAttrs hasBinfiles { out = bin; };
|
||||
containers = rec {
|
||||
tex = mkContainer "run" "tex" sha512.run;
|
||||
texdoc = mkContainer "doc" "texdoc" sha512.doc;
|
||||
texsource = mkContainer "source" "texsource" sha512.source;
|
||||
tlpkg = mkContainer "tlpkg" "tlpkg" sha512.run;
|
||||
|
||||
info = builtins.removeAttrs (runCommand "${name}-info"
|
||||
{
|
||||
inherit meta texdoc;
|
||||
passthru = passthru // { tlOutputName = "info"; };
|
||||
}
|
||||
''
|
||||
mkdir -p "$out"/share
|
||||
ln -s {"$texdoc"/doc,"$out"/share}/info
|
||||
'') [ "out" ] // lib.optionalAttrs hasBinfiles { out = bin; };
|
||||
# bin container
|
||||
out = runCommand "${name}"
|
||||
{
|
||||
inherit meta;
|
||||
passthru = passthru // { tlOutputName = "out"; };
|
||||
# shebang interpreters
|
||||
buildInputs = let outName = builtins.replaceStrings [ "-" ] [ "_" ] pname; in
|
||||
[
|
||||
texliveBinaries.core.${outName} or null
|
||||
texliveBinaries.${pname} or null
|
||||
texliveBinaries.core-big.${outName} or null
|
||||
]
|
||||
++ (args.extraBuildInputs or [ ]) ++ [ bash perl ]
|
||||
++ (lib.attrVals (args.scriptExts or [ ]) extToInput);
|
||||
nativeBuildInputs = extraNativeBuildInputs;
|
||||
# absolute scripts folder
|
||||
scriptsFolder = lib.optionals (hasRunfiles && tex ? outPath) (map (f: tex.outPath + "/scripts/" + f) (lib.toList args.scriptsFolder or pname));
|
||||
# binaries info
|
||||
inherit (args) binfiles;
|
||||
binlinks = builtins.attrNames (args.binlinks or { });
|
||||
bintargets = builtins.attrValues (args.binlinks or { });
|
||||
# build scripts
|
||||
patchScripts = ./patch-scripts.sed;
|
||||
makeBinContainers = ./make-bin-containers.sh;
|
||||
}
|
||||
''
|
||||
. "$makeBinContainers"
|
||||
${args.postFixup or ""}
|
||||
'' // outputDrvs;
|
||||
|
||||
# build man, info containers
|
||||
man = removeAttrs
|
||||
(runCommand "${name}-man"
|
||||
{
|
||||
inherit meta texdoc;
|
||||
passthru = passthru // { tlOutputName = "man"; };
|
||||
}
|
||||
''
|
||||
mkdir -p "$out"/share
|
||||
ln -s {"$texdoc"/doc,"$out"/share}/man
|
||||
'') [ "out" ] // outputDrvs;
|
||||
|
||||
info = removeAttrs
|
||||
(runCommand "${name}-info"
|
||||
{
|
||||
inherit meta texdoc;
|
||||
passthru = passthru // { tlOutputName = "info"; };
|
||||
}
|
||||
''
|
||||
mkdir -p "$out"/share
|
||||
ln -s {"$texdoc"/doc,"$out"/share}/info
|
||||
'') [ "out" ] // outputDrvs;
|
||||
};
|
||||
in
|
||||
builtins.removeAttrs mainDrv [ "outputSpecified" ]
|
||||
if outputs == [ ] then removeAttrs fakeTeX [ "outputSpecified" ] else
|
||||
runCommand name
|
||||
{
|
||||
__structuredAttrs = true;
|
||||
inherit meta outputDrvs outputs;
|
||||
passthru = removeAttrs passthru [ "outputSpecified" ];
|
||||
|
||||
# force output name in case "out" is missing
|
||||
nativeBuildInputs = lib.optional (! hasBinfiles)
|
||||
(writeShellScript "force-output.sh" ''
|
||||
export out="''${${builtins.head outputs}-}"
|
||||
'');
|
||||
}
|
||||
''
|
||||
for outputName in ''${!outputs[@]} ; do
|
||||
ln -s "''${outputDrvs[$outputName]}" "''${outputs[$outputName]}"
|
||||
done
|
||||
'' // outputDrvs
|
||||
|
|
|
@ -94,7 +94,7 @@ let
|
|||
fixedHashes = lib.optionalAttrs useFixedHashes (import ./fixed-hashes.nix);
|
||||
|
||||
buildTeXLivePackage = import ./build-texlive-package.nix {
|
||||
inherit lib fetchurl runCommand bash jdk perl python3 ruby snobol4 tk;
|
||||
inherit lib fetchurl runCommand writeShellScript bash jdk perl python3 ruby snobol4 tk;
|
||||
texliveBinaries = bin;
|
||||
};
|
||||
|
||||
|
|
|
@ -131,10 +131,10 @@ in lib.recursiveUpdate orig rec {
|
|||
|
||||
# TODO: handle symlinks in bin.core
|
||||
ptex.binlinks = {
|
||||
pbibtex = tl.uptex + "/bin/upbibtex";
|
||||
pdvitype = tl.uptex + "/bin/updvitype";
|
||||
ppltotf = tl.uptex + "/bin/uppltotf";
|
||||
ptftopl = tl.uptex + "/bin/uptftopl";
|
||||
pbibtex = tl.uptex.out + "/bin/upbibtex";
|
||||
pdvitype = tl.uptex.out + "/bin/updvitype";
|
||||
ppltotf = tl.uptex.out + "/bin/uppltotf";
|
||||
ptftopl = tl.uptex.out + "/bin/uptftopl";
|
||||
};
|
||||
|
||||
texdef.binlinks = {
|
||||
|
@ -143,7 +143,7 @@ in lib.recursiveUpdate orig rec {
|
|||
|
||||
texlive-scripts.binlinks = {
|
||||
mktexfmt = "fmtutil";
|
||||
texhash = tl."texlive.infra" + "/bin/mktexlsr";
|
||||
texhash = tl."texlive.infra".out + "/bin/mktexlsr";
|
||||
};
|
||||
|
||||
texlive-scripts-extra.binlinks = {
|
||||
|
|
Loading…
Reference in New Issue
Block a user