Merge pull request #289854 from xworld21/texlive-packages-top-level

texlivePackages: init
This commit is contained in:
Dmitry Kalinkin 2024-04-27 16:10:49 -04:00 committed by GitHub
commit 18a47ee4c1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 4572 additions and 93 deletions

View file

@ -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

View file

@ -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;
};

View file

@ -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

View file

@ -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

View file

@ -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 { };