nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix

466 lines
13 KiB
Nix
Raw Normal View History

{ lib, stdenv, fetchurl
, texlive
, zlib, libiconv, libpng, libX11
, freetype, gd, libXaw, icu, ghostscript, libXpm, libXmu, libXext
, perl, perlPackages, python2Packages, pkg-config
, poppler, libpaper, graphite2, zziplib, harfbuzz, potrace, gmp, mpfr
, brotli, cairo, pixman, xorg, clisp, biber, woff2, xxHash
, makeWrapper, shortenPerlShebang
}:
# Useful resource covering build options:
# http://tug.org/texlive/doc/tlbuild.html
let
withSystemLibs = map (libname: "--with-system-${libname}");
year = "2020";
version = year; # keep names simple for now
2019-08-13 21:52:01 +00:00
common = {
src = fetchurl {
2018-08-21 16:18:30 +00:00
urls = [
"http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/${year}/texlive-${year}0406-source.tar.xz"
"ftp://tug.ctan.org/pub/tex/historic/systems/texlive/${year}/texlive-${year}0406-source.tar.xz"
2018-08-21 16:18:30 +00:00
];
sha256 = "0y4h4j2qg714srhvf1hvn165w7sanr1j2vzrsgc23kxvrc43sbz3";
};
prePatch = ''
for i in texk/kpathsea/mktex*; do
sed -i '/^mydir=/d' "$i"
done
cp -pv texk/web2c/pdftexdir/pdftoepdf{-poppler0.86.0,}.cc
cp -pv texk/web2c/pdftexdir/pdftosrc{-poppler0.83.0,}.cc
2020-03-14 20:46:55 +00:00
'';
configureFlags = [
"--with-banner-add=/NixOS.org"
"--disable-missing" "--disable-native-texlive-build"
"--enable-shared" # "--enable-cxx-runtime-hack" # static runtime
"--enable-tex-synctex"
"-C" # use configure cache to speed up
]
++ withSystemLibs [
# see "from TL tree" vs. "Using installed" in configure output
"zziplib" "xpdf" "poppler" "mpfr" "gmp"
"pixman" "potrace" "gd" "freetype2" "libpng" "libpaper" "zlib"
# beware: xpdf means to use stuff from poppler :-/
];
# clean broken links to stuff not built
cleanBrokenLinks = ''
for f in "$out"/bin/*; do
if [[ ! -x "$f" ]]; then rm "$f"; fi
done
'';
};
withLuaJIT = !(stdenv.hostPlatform.isPower && stdenv.hostPlatform.is64bit);
in rec { # un-indented
inherit (common) cleanBrokenLinks;
texliveYear = year;
core = stdenv.mkDerivation rec {
2019-08-13 21:52:01 +00:00
pname = "texlive-bin";
inherit version;
inherit (common) src prePatch;
outputs = [ "out" "doc" ];
nativeBuildInputs = [ pkg-config ];
buildInputs = [
/*teckit*/ zziplib poppler mpfr gmp
pixman gd freetype libpng libpaper zlib
perl
];
hardeningDisable = [ "format" ];
2015-12-23 01:59:47 +00:00
preConfigure = ''
rm -r libs/{cairo,freetype2,gd,gmp,graphite2,harfbuzz,icu,libpaper,libpng} \
libs/{lua53,luajit,mpfr,pixman,poppler,xpdf,zlib,zziplib}
mkdir WorkDir
cd WorkDir
'';
configureScript = "../configure";
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" "texlinks" ];
# TODO: perhaps improve texmf.cnf search locations
postInstall = /* a few texmf-dist files are useful; take the rest from pkgs */ ''
mv "$out/share/texmf-dist/web2c/texmf.cnf" .
rm -r "$out/share/texmf-dist"
mkdir -p "$out"/share/texmf-dist/{web2c,scripts/texlive/TeXLive}
mv ./texmf.cnf "$out/share/texmf-dist/web2c/"
cp ../texk/tests/TeXLive/*.pm "$out/share/texmf-dist/scripts/texlive/TeXLive/"
cp ../texk/texlive/linked_scripts/scripts.lst "$out/share/texmf-dist/scripts/texlive/"
'' +
(let extraScripts =
''
tex4ht/ht.sh
tex4ht/htcontext.sh
tex4ht/htcopy.pl
tex4ht/htlatex.sh
tex4ht/htmex.sh
tex4ht/htmove.pl
tex4ht/httex.sh
tex4ht/httexi.sh
tex4ht/htxelatex.sh
tex4ht/htxetex.sh
tex4ht/mk4ht.pl
tex4ht/xhlatex.sh
'';
in
''
echo -e 'texmf_scripts="$texmf_scripts\n${extraScripts}"' \
>> "$out/share/texmf-dist/scripts/texlive/scripts.lst"
'')
+ /* doc location identical with individual TeX pkgs */ ''
mkdir -p "$doc/doc"
mv "$out"/share/{man,info} "$doc"/doc
'' + cleanBrokenLinks;
setupHook = ./setup-hook.sh; # TODO: maybe texmf-nix -> texmf (and all references)
passthru = { inherit version buildInputs; };
meta = with lib; {
description = "Basic binaries for TeX Live";
homepage = "http://www.tug.org/texlive";
2021-01-15 09:19:50 +00:00
license = lib.licenses.gpl2;
maintainers = with maintainers; [ vcunat veprbl lovek323 raskin jwiegley ];
platforms = platforms.all;
};
};
inherit (core-big) metafont mflua metapost luatex luahbtex luajittex xetex;
core-big = stdenv.mkDerivation { #TODO: upmendex
2019-08-13 21:52:01 +00:00
pname = "texlive-core-big.bin";
inherit version;
inherit (common) src prePatch;
hardeningDisable = [ "format" ];
inherit (core) nativeBuildInputs;
buildInputs = core.buildInputs ++ [ core cairo harfbuzz icu graphite2 libX11 ];
configureFlags = common.configureFlags
++ withSystemLibs [ "kpathsea" "ptexenc" "cairo" "harfbuzz" "icu" "graphite2" ]
++ map (prog: "--disable-${prog}") # don't build things we already have
([ "tex" "ptex" "eptex" "uptex" "euptex" "aleph" "pdftex"
"web-progs" "synctex"
2021-01-15 09:19:50 +00:00
] ++ lib.optionals (!withLuaJIT) [ "luajittex" "luajithbtex" "mfluajit" ]);
configureScript = ":";
# we use static libtexlua, because it's only used by a single binary
postConfigure = let
2021-01-15 09:19:50 +00:00
luajit = lib.optionalString withLuaJIT ",luajit";
in ''
mkdir ./WorkDir && cd ./WorkDir
for path in libs/{teckit,lua53${luajit}} texk/web2c; do
(
if [[ "$path" =~ "libs/lua" ]]; then
extraConfig="--enable-static --disable-shared"
else
extraConfig=""
fi
mkdir -p "$path" && cd "$path"
"../../../$path/configure" $configureFlags $extraConfig
)
done
'';
preBuild = "cd texk/web2c";
enableParallelBuilding = true;
doCheck = false; # fails
# now distribute stuff into outputs, roughly as upstream TL
# (uninteresting stuff remains in $out, typically duplicates from `core`)
outputs = [
"out"
"metafont"
"mflua"
"metapost"
"luatex"
"luahbtex"
"luajittex"
"xetex"
];
postInstall = ''
for output in $outputs; do
mkdir -p "''${!output}/bin"
done
mv "$out/bin"/{inimf,mf,mf-nowin} "$metafont/bin/"
mv "$out/bin"/mflua{,-nowin} "$mflua/bin/"
mv "$out/bin"/{*tomp,mfplain,*mpost} "$metapost/bin/"
mv "$out/bin"/{luatex,texlua,texluac} "$luatex/bin/"
mv "$out/bin"/luahbtex "$luahbtex/bin/"
mv "$out/bin"/xetex "$xetex/bin/"
2021-01-15 09:19:50 +00:00
'' + lib.optionalString withLuaJIT ''
mv "$out/bin"/mfluajit{,-nowin} "$mflua/bin/"
mv "$out/bin"/{luajittex,luajithbtex,texluajit,texluajitc} "$luajittex/bin/"
'' ;
};
chktex = stdenv.mkDerivation {
pname = "texlive-chktex.bin";
inherit version;
inherit (common) src;
nativeBuildInputs = [ pkg-config ];
buildInputs = [ core/*kpathsea*/ ];
preConfigure = "cd texk/chktex";
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" ];
enableParallelBuilding = true;
};
dvisvgm = stdenv.mkDerivation rec {
2019-08-13 21:52:01 +00:00
pname = "texlive-dvisvgm.bin";
version = "2.11";
# TODO: dvisvgm was switched to build from upstream sources
# to address https://github.com/NixOS/nixpkgs/issues/104847
# We might want to consider reverting that change in the future.
src = fetchurl {
url = "https://github.com/mgieseki/dvisvgm/releases/download/${version}/dvisvgm-${version}.tar.gz";
sha256 = "12b6h0h8rc487yjh3sq9zsdabm9cs2vqcrb0znnfi8277f87zf3j";
};
nativeBuildInputs = [ pkg-config ];
buildInputs = [ core/*kpathsea*/ brotli ghostscript zlib freetype woff2 potrace xxHash ];
enableParallelBuilding = true;
};
dvipng = stdenv.mkDerivation {
2019-08-13 21:52:01 +00:00
pname = "texlive-dvipng.bin";
inherit version;
inherit (common) src;
nativeBuildInputs = [ perl pkg-config ];
buildInputs = [ core/*kpathsea*/ zlib libpng freetype gd ghostscript makeWrapper ];
preConfigure = ''
cd texk/dvipng
patchShebangs doc/texi2pod.pl
'';
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" "--with-gs=yes" "--disable-debug" ];
enableParallelBuilding = true;
# I didn't manage to hardcode gs location by configureFlags
postInstall = ''
wrapProgram "$out/bin/dvipng" --prefix PATH : '${ghostscript}/bin'
'';
};
latexindent = perlPackages.buildPerlPackage rec {
pname = "latexindent";
inherit (src) version;
2021-01-15 09:19:50 +00:00
src = lib.head (builtins.filter (p: p.tlType == "run") texlive.latexindent.pkgs);
outputs = [ "out" ];
2021-01-15 09:19:50 +00:00
nativeBuildInputs = lib.optional stdenv.isDarwin shortenPerlShebang;
propagatedBuildInputs = with perlPackages; [ FileHomeDir LogDispatch LogLog4perl UnicodeLineBreak YAMLTiny ];
postPatch = ''
substituteInPlace scripts/latexindent/LatexIndent/GetYamlSettings.pm \
--replace '$FindBin::RealBin/defaultSettings.yaml' ${src}/scripts/latexindent/defaultSettings.yaml
'';
# Dirty hack to apply perlFlags, but do no build
preConfigure = ''
touch Makefile.PL
'';
buildPhase = ":";
installPhase = ''
install -D ./scripts/latexindent/latexindent.pl "$out"/bin/latexindent
mkdir -p "$out"/${perl.libPrefix}
cp -r ./scripts/latexindent/LatexIndent "$out"/${perl.libPrefix}/
2021-01-15 09:19:50 +00:00
'' + lib.optionalString stdenv.isDarwin ''
shortenPerlShebang "$out"/bin/latexindent
'';
};
pygmentex = python2Packages.buildPythonApplication rec {
pname = "pygmentex";
inherit (src) version;
2021-01-15 09:19:50 +00:00
src = lib.head (builtins.filter (p: p.tlType == "run") texlive.pygmentex.pkgs);
propagatedBuildInputs = with python2Packages; [ 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 ];
};
};
texlinks = stdenv.mkDerivation rec {
name = "texlinks.sh";
2021-01-15 09:19:50 +00:00
src = lib.head (builtins.filter (p: p.tlType == "run") texlive.texlive-scripts-extra.pkgs);
dontBuild = true;
doCheck = false;
installPhase = ''
runHook preInstall
# Patch texlinks.sh back to 2015 version;
# otherwise some bin/ links break, e.g. xe(la)tex.
patch --verbose -R scripts/texlive-extra/texlinks.sh < '${./texlinks.diff}'
install -Dm555 scripts/texlive-extra/texlinks.sh "$out"
runHook postInstall
'';
};
inherit biber;
bibtexu = bibtex8;
bibtex8 = stdenv.mkDerivation {
2019-08-13 21:52:01 +00:00
pname = "texlive-bibtex-x.bin";
inherit 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 {
2019-08-13 21:52:01 +00:00
pname = "texlive-xdvi.bin";
inherit 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 "exec xdvi-xaw" "exec '$out/bin/xdvi-xaw'"
'';
# TODO: it's suspicious that mktexpk generates fonts into ~/.texlive2014
};
} # un-indented
2021-01-15 09:19:50 +00:00
// lib.optionalAttrs (!clisp.meta.broken) # broken on aarch64 and darwin (#20062)
{
xindy = stdenv.mkDerivation {
2019-08-13 21:52:01 +00:00
pname = "texlive-xindy.bin";
inherit version;
inherit (common) src;
texlive: 2017 -> 2017-final This commit rebuilds texlive 2017 with the final release of 2017. As described in these issues [1][2][3], the upstream CTAN mirrors are a continuously moving rolling release without historical archives. This particular FTP server is also a rolling release folling CTAN for the latest version, but it has snapshots of the final texlive releases; it appears that the 2017 distribution has been unmodified since texlive-2018 was released earlier this year. Along the way, we needed to fix several issues: - xindy: if $HOME is unset, it will try to mkdir /homeless-shelter, which fails due to insufficient permissions. - scheme-infraonly: this scheme had symlinks into other releases that were read-only, so it couldn't patch and modify the scripts. This commit removes it for now, but that's not a particularly satisfying solution. Ideas? This also adds some documentation on the upgrade process to prepare for texlive-2018 [4]. This commit also replaces the sha1 hashes with upstream's standard sha512 hashes. It appears the motivation for the shorter hashes was to save disk space in the derivations; in master, the size of this directory is 1012K; in this commit it is 1600K. The difference is not particularly large, and the downsides to using our own sha1 hashes are: - More nix code to maintain - Multi-step upgrade process for maintainers: the maintainer first has to download all upstream tarballs by sha512 hash, then run the fix script, then rebuild with sha1 hashes. - Less transparent. If we use the upstream sha512 hashes, any user can immediately verify that the hashes we're providing match upstream, or match the snapshot in time. - Easier to debug. Since upstream is rolling and packages may disappear or fail to build, it's useful to be able to determine if the sha mismatch is because of an update or not; if we have a sha1 mismatch and no tarball to pull, we can't figure out which sha512sum would have produced that sha1. - Less trust required. Due to the above, users don't have to trust the content-addressed mirrors on IPFS and @veprbl's servers as much. - Easier to cobble together a source distribution from a variety of sources. It seems some FTP servers have more/less than others, or older/newer packages. If we know what we're looking for beforehand and we're just missing a few packages whose hashes match the advertised hashes upstream, it's easier to find. [1] https://github.com/NixOS/nixpkgs/issues/24683 [2] https://github.com/NixOS/nixpkgs/issues/10026 [3] https://github.com/NixOS/nixpkgs/issues/34490 [4] https://github.com/NixOS/nixpkgs/issues/40232
2018-05-20 15:08:17 +00:00
# If unset, xindy will try to mkdir /homeless-shelter
2018-08-02 02:18:16 +00:00
HOME = ".";
texlive: 2017 -> 2017-final This commit rebuilds texlive 2017 with the final release of 2017. As described in these issues [1][2][3], the upstream CTAN mirrors are a continuously moving rolling release without historical archives. This particular FTP server is also a rolling release folling CTAN for the latest version, but it has snapshots of the final texlive releases; it appears that the 2017 distribution has been unmodified since texlive-2018 was released earlier this year. Along the way, we needed to fix several issues: - xindy: if $HOME is unset, it will try to mkdir /homeless-shelter, which fails due to insufficient permissions. - scheme-infraonly: this scheme had symlinks into other releases that were read-only, so it couldn't patch and modify the scripts. This commit removes it for now, but that's not a particularly satisfying solution. Ideas? This also adds some documentation on the upgrade process to prepare for texlive-2018 [4]. This commit also replaces the sha1 hashes with upstream's standard sha512 hashes. It appears the motivation for the shorter hashes was to save disk space in the derivations; in master, the size of this directory is 1012K; in this commit it is 1600K. The difference is not particularly large, and the downsides to using our own sha1 hashes are: - More nix code to maintain - Multi-step upgrade process for maintainers: the maintainer first has to download all upstream tarballs by sha512 hash, then run the fix script, then rebuild with sha1 hashes. - Less transparent. If we use the upstream sha512 hashes, any user can immediately verify that the hashes we're providing match upstream, or match the snapshot in time. - Easier to debug. Since upstream is rolling and packages may disappear or fail to build, it's useful to be able to determine if the sha mismatch is because of an update or not; if we have a sha1 mismatch and no tarball to pull, we can't figure out which sha512sum would have produced that sha1. - Less trust required. Due to the above, users don't have to trust the content-addressed mirrors on IPFS and @veprbl's servers as much. - Easier to cobble together a source distribution from a variety of sources. It seems some FTP servers have more/less than others, or older/newer packages. If we know what we're looking for beforehand and we're just missing a few packages whose hashes match the advertised hashes upstream, it's easier to find. [1] https://github.com/NixOS/nixpkgs/issues/24683 [2] https://github.com/NixOS/nixpkgs/issues/10026 [3] https://github.com/NixOS/nixpkgs/issues/34490 [4] https://github.com/NixOS/nixpkgs/issues/40232
2018-05-20 15:08:17 +00:00
prePatch = "cd utils/xindy";
# hardcode clisp location
postPatch = ''
substituteInPlace xindy-*/user-commands/xindy.in \
--replace "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 ];
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/"
'';
};
}