Merge pull request #289854 from xworld21/texlive-packages-top-level
texlivePackages: init
This commit is contained in:
commit
18a47ee4c1
6 changed files with 4572 additions and 93 deletions
|
@ -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
|
||||
|
@ -50,47 +61,43 @@ let
|
|||
license = map (x: lib.licenses.${x}) license;
|
||||
# TeX Live packages should not be installed directly into the user profile
|
||||
outputsToInstall = [ ];
|
||||
longDescription = ''
|
||||
This package cannot be installed directly. Please use `texlive.withPackages`.
|
||||
'';
|
||||
} // lib.optionalAttrs (args ? shortdesc) {
|
||||
description = args.shortdesc;
|
||||
};
|
||||
|
||||
hasBinfiles = args ? binfiles && args.binfiles != [ ];
|
||||
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" ++
|
||||
# omit building sources, since as far as we know, installing them is not common
|
||||
# the sources will still be available under drv.texsource
|
||||
# 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 ? fontMaps) { inherit (args) fontMaps; }
|
||||
// lib.optionalAttrs (args ? formats) { inherit (args) formats; }
|
||||
// lib.optionalAttrs (args ? hyphenPatterns) { inherit (args) hyphenPatterns; }
|
||||
// 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:
|
||||
|
@ -125,24 +132,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;
|
||||
|
@ -153,52 +148,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;
|
||||
};
|
||||
|
||||
|
|
|
@ -23,6 +23,12 @@ $a}
|
|||
# extract revision
|
||||
s/^revision ([0-9]*)$/ revision = \1;/p
|
||||
|
||||
# extract short description
|
||||
/^shortdesc (.+)$/{
|
||||
s/"/\\"/g # escape quotes
|
||||
s/^shortdesc (.+)/ shortdesc = "\1";/p
|
||||
}
|
||||
|
||||
# extract hashes of *.tar.xz
|
||||
s/^containerchecksum (.*)/ sha512.run = "\1";/p
|
||||
s/^doccontainerchecksum (.*)/ sha512.doc = "\1";/p
|
||||
|
|
|
@ -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 = {
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -5335,6 +5335,7 @@ with pkgs;
|
|||
# TeX Live; see https://nixos.org/nixpkgs/manual/#sec-language-texlive
|
||||
texlive = callPackage ../tools/typesetting/tex/texlive { };
|
||||
inherit (texlive.schemes) texliveBasic texliveBookPub texliveConTeXt texliveFull texliveGUST texliveInfraOnly texliveMedium texliveMinimal texliveSmall texliveTeTeX;
|
||||
texlivePackages = recurseIntoAttrs (lib.filterAttrs (_: lib.isDerivation) texlive.pkgs);
|
||||
|
||||
fop = callPackage ../tools/typesetting/fop { };
|
||||
|
||||
|
|
Loading…
Reference in a new issue