nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix
Vincenzo Mantova 70c3a7fa4e
texlive.bin.context: 2.11.02 -> 2.10.08 (#298414)
LMTX 2.11.02 is the new version shipped by TeX Live 2024, not 2023.

This reverts commits 7992ab336b,
4a2f32b16c and other ConTeXt patches
that were fixing issues caused by using the wrong version of LMTX.
2024-03-23 15:35:02 -04:00

514 lines
18 KiB
Nix

{ lib, stdenv, fetchurl, fetchpatch, buildPackages
, texlive
, zlib, libiconv, libpng, libX11
, freetype, gd, libXaw, icu, ghostscript, libXpm, libXmu, libXext
, perl, perlPackages, python3Packages, pkg-config, cmake, ninja
, libpaper, graphite2, zziplib, harfbuzz, potrace, gmp, mpfr, mupdf-headless
, brotli, cairo, pixman, xorg, clisp, biber, woff2, xxHash
, makeWrapper, shortenPerlShebang, useFixedHashes, asymptote
, biber-ms
, tlpdb
}:
# Useful resource covering build options:
# http://tug.org/texlive/doc/tlbuild.html
let
withSystemLibs = map (libname: "--with-system-${libname}");
year = toString ((import ./tlpdb.nix)."00texlive.config").year;
version = year; # keep names simple for now
# detect and stop redundant rebuilds that may occur when building new fixed hashes
assertFixedHash = name: src:
if ! useFixedHashes || src ? outputHash then src else throw "The TeX Live package '${src.pname}' must have a fixed hash before building '${name}'.";
# list of packages whose binaries are built in core, core-big
# generated manually by inspecting ${core}/bin
corePackages = [ "afm2pl" "aleph" "autosp" "axodraw2" "bibtex" "cjkutils"
"ctie" "cweb" "detex" "dtl" "dvi2tty" "dvicopy" "dvidvi" "dviljk"
"dviout-util" "dvipdfmx" "dvipos" "dvips" "fontware" "gregoriotex"
"gsftopk" "hitex" "kpathsea" "lacheck" "lcdftypetools" "m-tx" "makeindex"
"mfware" "musixtnt" "omegaware" "patgen" "pdftex" "pdftosrc" "pmx"
"ps2eps" "ps2pk" "psutils" "ptex" "seetexk" "synctex" "t1utils" "tex"
"tex4ht" "texlive-scripts-extra" "texware" "tie" "tpic2pdftex" "ttfutils"
"uptex" "velthuis" "vlna" "web" "xml2pmx" ];
coreBigPackages = [ "metafont" "mflua" "metapost" "luatex" "luahbtex"
"upmendex" "xetex" ] ++ lib.optional withLuaJIT "luajittex";
binPackages = lib.getAttrs (corePackages ++ coreBigPackages) tlpdb;
common = {
src = fetchurl {
urls = [
"http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/${year}/texlive-${year}0313-source.tar.xz"
"ftp://tug.ctan.org/pub/tex/historic/systems/texlive/${year}/texlive-${year}0313-source.tar.xz"
];
hash = "sha256-OHiqDh7QMBwFOw4u5OmtmZxEE0X0iC55vdHI9M6eebk=";
};
prePatch = ''
for i in texk/kpathsea/mktex*; do
sed -i '/^mydir=/d' "$i"
done
# ST_NLINK_TRICK causes kpathsea to treat folders with no real subfolders
# as leaves, even if they contain symlinks to other folders; must be
# disabled to work correctly with the nix store", see section 5.3.6
# Subdirectory expansion of the kpathsea manual
# http://mirrors.ctan.org/systems/doc/kpathsea/kpathsea.pdf for more
# details
sed -i '/^#define ST_NLINK_TRICK/d' texk/kpathsea/config.h
'' +
# when cross compiling, we must use himktables from PATH
# (i.e. from buildPackages.texlive.bin.core.dev)
lib.optionalString (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
sed -i 's|\./himktables|himktables|' texk/web2c/Makefile.in
''
;
configureFlags = [
"--with-banner-add=/nixos.org"
"--disable-missing" # terminate if a requested program or feature must be
# disabled, e.g., due to missing libraries
"--disable-native-texlive-build" # do not build for the TeX Live binary distribution
"--enable-shared" # "--enable-cxx-runtime-hack" # static runtime
"--enable-tex-synctex"
"--disable-texlive" # do not build the texlive (TeX Live scripts) package
"--disable-linked-scripts" # do not install the linked scripts
"-C" # use configure cache to speed up
]
++ withSystemLibs [
# see "from TL tree" vs. "Using installed" in configure output
"zziplib" "mpfr" "gmp"
"pixman" "potrace" "gd" "freetype2" "libpng" "libpaper" "zlib"
] ++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform)
"BUILDCC=${buildPackages.stdenv.cc.targetPrefix}cc";
# move binaries to corresponding split outputs, based on content of texlive.tlpdb
binToOutput = lib.listToAttrs
(lib.concatMap
(n: map (v: { name = v; value = builtins.replaceStrings [ "-" ] [ "_" ] n; }) binPackages.${n}.binfiles or [ ])
(builtins.attrNames binPackages));
moveBins = ''
for bin in "$out/bin"/* ; do
bin="''${bin##*/}"
package="''${binToOutput[$bin]}"
if [[ -n "$package" ]] ; then
if [[ -z "''${!package}" ]] ; then
echo "WARNING: missing output '$package' for binary '$bin', leaving in 'out'"
else
mkdir -p "''${!package}"/bin
mv "$out/bin/$bin" "''${!package}"/bin/
fi
else
echo "WARNING: no output known for binary '$bin', leaving in 'out'"
fi
done
'';
};
# RISC-V: https://github.com/LuaJIT/LuaJIT/issues/628
withLuaJIT = !(stdenv.hostPlatform.isPower && stdenv.hostPlatform.is64bit) && !stdenv.hostPlatform.isRiscV;
in rec { # un-indented
texliveYear = year;
core = stdenv.mkDerivation rec {
pname = "texlive-bin";
inherit version;
__structuredAttrs = true;
inherit (common) binToOutput src prePatch;
outputs = [ "out" "dev" "man" "info" ]
++ (builtins.map (builtins.replaceStrings [ "-" ] [ "_" ]) corePackages);
nativeBuildInputs = [
pkg-config
] ++ lib.optionals (!stdenv.buildPlatform.canExecute stdenv.hostPlatform) (with texlive.bin.core; [
# configure: error: tangle was not found but is required when cross-compiling.
# dev (himktables) is used when building hitex to generate the additional source file hitables.c
web/*tangle*/ cweb/*ctangle*/ omegaware/*otangle*/ tie/*tie*/ # see "Building TeX Live" 6.4.2 Cross problems
dev/*himktables*/
]);
buildInputs = [
/*teckit*/ zziplib mpfr gmp
pixman gd freetype libpng libpaper zlib
perl
];
hardeningDisable = [ "format" ];
preConfigure = ''
rm -r libs/{cairo,freetype2,gd,gmp,graphite2,harfbuzz,icu,libpaper,libpng} \
libs/{lua53,luajit,mpfr,pixman,pplib,teckit,zlib,zziplib} \
texk/{bibtex-x,chktex,dvipng,dvisvgm,upmendex,xdvik} \
utils/{asymptote,texdoctk,xindy,xpdfopen}
mkdir WorkDir
cd WorkDir
'';
configureScript = "../configure";
depsBuildBuild = [ buildPackages.stdenv.cc ];
configureFlags = common.configureFlags
++ [ "--without-x" ] # disable xdvik and xpdfopen
++ map (what: "--disable-${what}") [
"chktex"
"dvisvgm" "dvipng" # ghostscript dependency
"luatex" "luajittex" "luahbtex" "luajithbtex"
"mp" "pmp" "upmp" "mf" "mflua" "mfluajit" # cairo would bring in X and more
"xetex" "bibtexu" "bibtex8" "bibtex-x" "upmendex" # ICU isn't small
];
enableParallelBuilding = true;
doCheck = false; # triptest fails, likely due to missing TEXMF tree
preCheck = "patchShebangs ../texk/web2c";
installTargets = [ "install" ];
# TODO: perhaps improve texmf.cnf search locations
postInstall =
/* remove redundant texmf-dist (content provided by TeX Live packages) */
''
rm -fr "$out"/share/texmf-dist
'' + /* install himktables in separate output for use in cross compilation */ ''
mkdir -p $dev/bin
cp texk/web2c/.libs/himktables $dev/bin/himktables
'' + common.moveBins;
passthru = { inherit version buildInputs; };
meta = with lib; {
description = "Basic binaries for TeX Live";
homepage = "http://www.tug.org/texlive";
license = lib.licenses.gpl2;
maintainers = with maintainers; [ veprbl lovek323 raskin jwiegley ];
platforms = platforms.all;
};
};
inherit (core-big) metafont mflua metapost luatex luahbtex xetex;
luajittex = core.big.luajittex or null;
core-big = stdenv.mkDerivation {
pname = "texlive-bin-big";
inherit version;
__structuredAttrs = true;
inherit (common) binToOutput src prePatch;
patches = [
# improves reproducibility of fmt files
# see discussion at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1009196
(fetchpatch {
name = "lua_fixed_hash.patch";
url = "https://bugs.debian.org/cgi-bin/bugreport.cgi?att=1;bug=1009196;filename=lua_fixed_hash.patch;msg=45";
sha256 = "sha256-FTu1eRd3AUU7IRs2/7e7uwHuvZsrzTBPypbcEZkU7y4=";
})
# update to LuaTeX 1.16.1 to prepare for 1.17.0 below
(fetchpatch {
name = "luatex-1.16.1.patch";
url = "https://github.com/TeX-Live/texlive-source/commit/ad8702a45e317fa9d396ef4d50467c37964a9543.patch";
hash = "sha256-qfzUfkJUfW285w+fnbpO8JLArM7/uj3yb9PONgZrJLE=";
})
# fixes security issues in luatex that allows arbitrary code execution even with shell-escape disabled and network requests, see https://tug.org/~mseven/luatex.html
# fixed in LuaTeX 1.17.0, shipped as a rare binary update in TL 2023
(fetchpatch {
name = "luatex-1.17.0.patch";
url = "https://github.com/TeX-Live/texlive-source/commit/6ace460233115bd42b36e63c7ddce11cc92a1ebd.patch";
hash = "sha256-2fbIdwnw/XQXci9OqRrb6B5tHiSR0co08NyFgMyXCvc=";
})
# Fixes texluajitc crashes on aarch64, backport of the upstream fix
# https://github.com/LuaJIT/LuaJIT/commit/e9af1abec542e6f9851ff2368e7f196b6382a44c
# to the version vendored by texlive (2.1.0-beta3)
(fetchpatch {
name = "luajit-fix-aarch64-linux.patch";
url = "https://raw.githubusercontent.com/void-linux/void-packages/master/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch";
hash = "sha256-ysSZmfpfCFMukfHmIqwofAZux1e2kEq/37lfqp7HoWo=";
stripLen = 1;
extraPrefix = "libs/luajit/LuaJIT-src/";
})
];
hardeningDisable = [ "format" ];
inherit (core) nativeBuildInputs depsBuildBuild;
buildInputs = core.buildInputs ++ [ core cairo harfbuzz icu graphite2 libX11 potrace ];
/* deleting the unused packages speeds up configure by a considerable margin
and ensures we do not rebuild existing libraries by mistake */
preConfigure = ''
rm -r libs/{cairo,freetype2,gd,gmp,graphite2,harfbuzz,icu,libpaper,libpng} \
libs/{mpfr,pixman,xpdf,zlib,zziplib} \
texk/{afm2pl,bibtex-x,chktex,cjkutils,detex,dtl,dvi2tty,dvidvi,dviljk,dviout-util} \
texk/{dvipdfm-x,dvipng,dvipos,dvipsk,dvisvgm,gregorio,gsftopk,kpathsea} \
texk/{lcdf-typetools,makeindexk,makejvf,mendexk,musixtnt,ps2pk,psutils,ptexenc} \
texk/{seetexk,tex4htk,texlive,ttf2pk2,ttfdump,xdvik} \
utils/{asymptote,autosp,axodraw2,devnag,lacheck,m-tx,pmx,ps2eps,t1utils,texdoctk} \
utils/{tpic2pdftex,vlna,xindy,xml2pmx,xpdfopen}
mkdir WorkDir
cd WorkDir
'';
configureFlags = common.configureFlags
++ withSystemLibs [ "kpathsea" "ptexenc" "cairo" "harfbuzz" "icu" "graphite2" ]
++ map (prog: "--disable-${prog}") # don't build things we already have
# list from texk/web2c/configure
([ "tex" "ptex" "eptex" "uptex" "euptex" "aleph" "hitex" "pdftex"
"web-progs" "synctex"
] ++ lib.optionals (!withLuaJIT) [ "luajittex" "luajithbtex" "mfluajit" ])
/* disable all packages, re-enable upmendex, web2c packages */
++ [ "--disable-all-pkgs" "--enable-upmendex" "--enable-web2c" ]
/* kpathsea requires specifying the kpathsea location manually */
++ [ "--with-kpathsea-includes=${core.dev}/include" ];
configureScript = "../configure";
enableParallelBuilding = true;
doCheck = false; # fails
outputs = [ "out" "dev" "man" "info" ]
++ (builtins.map (builtins.replaceStrings [ "-" ] [ "_" ]) coreBigPackages)
# some outputs of metapost, omegaware are for ptex/uptex
++ [ "ptex" "uptex" ]
# unavoidable duplicates from core
++ [ "ctie" "cweb" "omegaware" "texlive_scripts_extra" "tie" "web" ];
postInstall = common.moveBins;
};
chktex = stdenv.mkDerivation {
pname = "chktex";
inherit (texlive.pkgs.chktex) version;
inherit (common) src;
nativeBuildInputs = [ pkg-config ];
# perl used in shebang of script bin/deweb
buildInputs = [ core/*kpathsea*/ perl ];
preConfigure = "cd texk/chktex";
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" ];
enableParallelBuilding = true;
};
# the LuaMetaTeX engine (distributed since TeX Live 2023) must be built separately
# the sources used by TL are stored in the source TL repo
# for details see https://wiki.contextgarden.net/Building_LuaMetaTeX_for_TeX_Live
context = stdenv.mkDerivation rec {
pname = "luametatex";
version = "2.10.08";
src = fetchurl {
url = "https://tug.org/svn/texlive/trunk/Master/source/luametatex-${version}.tar.xz?revision=67034&view=co";
hash = "sha256-3JeOUQ63jJOZWTxFCoyWjfcrspmdmC/yqgS1JaLfTWk=";
};
enableParallelBuilding = true;
nativeBuildInputs = [ cmake ninja ];
meta = with lib; {
description = "The LUAMETATEX engine is a follow up on LUATEX and is again part of CONTEXT development";
homepage = "https://www.pragma-ade.nl/luametatex-1.htm";
license = licenses.gpl2Plus;
maintainers = with lib.maintainers; [ apfelkuchen6 xworld21 ];
};
};
dvisvgm = stdenv.mkDerivation rec {
pname = "dvisvgm";
version = "3.2.2";
src = assert lib.assertMsg (version == texlive.pkgs.dvisvgm.version) "dvisvgm: TeX Live version (${texlive.pkgs.dvisvgm.version}) different from source (${version}), please update dvisvgm"; fetchurl {
url = "https://github.com/mgieseki/dvisvgm/releases/download/${version}/dvisvgm-${version}.tar.gz";
hash = "sha256-8GKL6lqjMUXXWwpqbdGPrYibdSc4y8AcGUGPNUc6HQA=";
};
configureFlags = [
"--disable-manpage" # man pages are provided by the doc container
];
# PDF handling requires mutool (from mupdf) since Ghostscript 10.01
postPatch = ''
substituteInPlace src/PDFHandler.cpp \
--replace-fail 'Process("mutool"' "Process(\"$(PATH="$HOST_PATH" command -v mutool)\""
'';
nativeBuildInputs = [ pkg-config ];
buildInputs = [ core brotli ghostscript zlib freetype woff2 potrace xxHash mupdf-headless ];
enableParallelBuilding = true;
};
dvipng = stdenv.mkDerivation {
pname = "dvipng";
inherit (texlive.pkgs.dvipng) version;
inherit (common) src;
nativeBuildInputs = [ perl pkg-config makeWrapper ];
buildInputs = [ core/*kpathsea*/ zlib libpng freetype gd ghostscript ];
preConfigure = ''
cd texk/dvipng
patchShebangs doc/texi2pod.pl
'';
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" "--with-gs=yes" "--disable-debug" ];
GS="${ghostscript}/bin/gs";
enableParallelBuilding = true;
};
pygmentex = python3Packages.buildPythonApplication rec {
pname = "pygmentex";
inherit (src) version;
format = "other";
src = assertFixedHash pname texlive.pkgs.pygmentex.tex;
propagatedBuildInputs = with python3Packages; [ pygments chardet ];
dontBuild = true;
doCheck = false;
installPhase = ''
runHook preInstall
install -D ./scripts/pygmentex/pygmentex.py "$out"/bin/pygmentex
runHook postInstall
'';
meta = with lib; {
homepage = "https://www.ctan.org/pkg/pygmentex";
description = "Auxiliary tool for typesetting code listings in LaTeX documents using Pygments";
longDescription = ''
PygmenTeX is a Python-based LaTeX package that can be used for
typesetting code listings in a LaTeX document using Pygments.
Pygments is a generic syntax highlighter for general use in all kinds of
software such as forum systems, wikis or other applications that need to
prettify source code.
'';
license = licenses.lppl13c;
maintainers = with maintainers; [ romildo ];
};
};
inherit asymptote;
inherit biber;
inherit biber-ms;
bibtexu = bibtex8;
bibtex8 = stdenv.mkDerivation {
pname = "bibtex-x";
inherit (texlive.pkgs.bibtexu) version;
inherit (common) src;
nativeBuildInputs = [ pkg-config ];
buildInputs = [ core/*kpathsea*/ icu ];
preConfigure = "cd texk/bibtex-x";
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" "--with-system-icu" ];
enableParallelBuilding = true;
};
xdvi = stdenv.mkDerivation {
pname = "xdvi";
inherit (texlive.pkgs.xdvi) version;
inherit (common) src;
nativeBuildInputs = [ pkg-config ];
buildInputs = [ core/*kpathsea*/ freetype ghostscript ]
++ (with xorg; [ libX11 libXaw libXi libXpm libXmu libXaw libXext libXfixes ]);
preConfigure = "cd texk/xdvik";
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" "--with-system-libgs" ];
enableParallelBuilding = true;
postInstall = ''
substituteInPlace "$out/bin/xdvi" \
--replace-fail "exec xdvi-xaw" "exec '$out/bin/xdvi-xaw'"
'';
# TODO: it's suspicious that mktexpk generates fonts into ~/.texlive2014
};
xpdfopen = stdenv.mkDerivation {
pname = "xpdfopen";
inherit (texlive.pkgs.xpdfopen) version;
inherit (common) src;
buildInputs = [ libX11 ];
preConfigure = "cd utils/xpdfopen";
enableParallelBuilding = true;
};
} # un-indented
// lib.optionalAttrs (!clisp.meta.broken) # broken on aarch64 and darwin (#20062)
{
xindy = stdenv.mkDerivation {
pname = "xindy";
inherit (texlive.pkgs.xindy) version;
inherit (common) src;
# If unset, xindy will try to mkdir /homeless-shelter
HOME = ".";
prePatch = "cd utils/xindy";
# hardcode clisp location
postPatch = ''
substituteInPlace xindy-*/user-commands/xindy.in \
--replace-fail "our \$clisp = ( \$is_windows ? 'clisp.exe' : 'clisp' ) ;" \
"our \$clisp = '$(type -P clisp)';"
'';
nativeBuildInputs = [
pkg-config perl
(texlive.combine { inherit (texlive) scheme-basic cyrillic ec; })
];
buildInputs = [ clisp libiconv perl ];
configureFlags = [ "--with-clisp-runtime=system" "--disable-xindy-docs" ];
preInstall = ''mkdir -p "$out/bin" '';
# fixup various file-location errors of: lib/xindy/{xindy.mem,modules/}
postInstall = ''
mkdir -p "$out/lib/xindy"
mv "$out"/{bin/xindy.mem,lib/xindy/}
ln -s ../../share/texmf-dist/xindy/modules "$out/lib/xindy/"
'';
};
}