nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix
2016-11-07 22:57:41 +01:00

319 lines
9.1 KiB
Nix

{ stdenv, lib, fetchurl
, texlive
, zlib, bzip2, ncurses, libiconv, libpng, flex, bison, libX11, libICE, xproto
, freetype, t1lib, gd, libXaw, icu, ghostscript, ed, libXt, libXpm, libXmu, libXext
, xextproto, perl, libSM, ruby, expat, curl, libjpeg, python, fontconfig, pkgconfig
, poppler, libpaper, graphite2, zziplib, harfbuzz, texinfo, potrace, gmp, mpfr
, xpdf, cairo, pixman, xorg, clisp
, makeWrapper
}:
# Useful resource covering build options:
# http://tug.org/texlive/doc/tlbuild.html
let
withSystemLibs = map (libname: "--with-system-${libname}");
year = "2016";
version = year; # keep names simple for now
common = rec {
src = fetchurl {
url = # "ftp://tug.org/historic/systems/texlive/${year}/"
"http://lipa.ms.mff.cuni.cz/~cunav5am/nix/texlive-2016" # FIXME: a proper mirror
+ "/texlive-${year}0523b-source.tar.xz";
sha256 = "1v91vahxlxkdra0qz3f132vvx5d9cx2jy84yl1hkch0agyj2rcx8";
};
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
'';
};
in rec { # un-indented
inherit (common) cleanBrokenLinks;
texliveYear = year;
core = stdenv.mkDerivation rec {
name = "texlive-bin-${version}";
inherit (common) src;
outputs = [ "out" "doc" ];
buildInputs = [
pkgconfig
/*teckit*/ zziplib poppler mpfr gmp
pixman potrace gd freetype libpng libpaper zlib
perl
];
hardeningDisable = [ "format" ];
postPatch = ''
for i in texk/kpathsea/mktex*; do
sed -i '/^mydir=/d' "$i"
done
'';
preConfigure = ''
rm -r libs/{cairo,freetype2,gd,gmp,graphite2,harfbuzz,icu,libpaper,libpng} \
libs/{mpfr,pixman,poppler,potrace,xpdf,zlib,zziplib}
mkdir WorkDir
cd WorkDir
'';
configureScript = "../configure";
configureFlags = common.configureFlags
++ [ "--without-x" ] # disable xdvik and xpdfopen
++ map (what: "--disable-${what}") [
"dvisvgm" "dvipng" # ghostscript dependency
"luatex" "luajittex" "mp" "pmp" "upmp" "mf" # cairo would bring in X and more
"xetex" "bibtexu" "bibtex8" "bibtex-x" "upmendex" # ICU isn't small
]
++ [ "--without-system-harfbuzz" "--without-system-icu" ] # bogus configure
;
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 "$doc"/share/{man,info} "$doc"/doc
rmdir "$doc"/share
'' + cleanBrokenLinks;
setupHook = ./setup-hook.sh; # TODO: maybe texmf-nix -> texmf (and all references)
passthru = { inherit version buildInputs; };
meta = with stdenv.lib; {
description = "Basic binaries for TeX Live";
homepage = http://www.tug.org/texlive;
license = stdenv.lib.licenses.gpl2;
maintainers = with maintainers; [ vcunat lovek323 raskin jwiegley ];
platforms = platforms.all;
};
};
inherit (core-big) metafont metapost luatex xetex;
core-big = stdenv.mkDerivation { #TODO: upmendex
name = "texlive-core-big.bin-${version}";
inherit (common) src;
hardeningDisable = [ "format" ];
buildInputs = core.buildInputs ++ [ core cairo harfbuzz icu graphite2 ];
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" "luajittex" "mfluajit" # luajittex is mostly not needed, see:
# http://tex.stackexchange.com/questions/97999/when-to-use-luajittex-in-favour-of-luatex
];
configureScript = ":";
# we use static libtexlua, because it's only used by a single binary
postConfigure = ''
mkdir ./WorkDir && cd ./WorkDir
for path in libs/{teckit,lua52} texk/web2c; do
(
if [[ "$path" == "libs/lua52" ]]; 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;
# now distribute stuff into outputs, roughly as upstream TL
# (uninteresting stuff remains in $out, typically duplicates from `core`)
outputs = [ "out" "metafont" "metapost" "luatex" "xetex" ];
postInstall = ''
for output in $outputs; do
mkdir -p "''${!output}/bin"
done
mv "$out/bin"/{inimf,mf,mf-nowin} "$metafont/bin/"
mv "$out/bin"/{*tomp,mfplain,*mpost} "$metapost/bin/"
mv "$out/bin"/{luatex,texlua*} "$luatex/bin/"
mv "$out/bin"/xetex "$xetex/bin/"
'';
};
dvisvgm = stdenv.mkDerivation {
name = "texlive-dvisvgm.bin-${version}";
inherit (common) src;
buildInputs = [ pkgconfig core/*kpathsea*/ ghostscript zlib freetype potrace ];
preConfigure = "cd texk/dvisvgm";
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" "--with-system-libgs" ];
enableParallelBuilding = true;
};
dvipng = stdenv.mkDerivation {
name = "texlive-dvipng.bin-${version}";
inherit (common) src;
buildInputs = [ pkgconfig core/*kpathsea*/ zlib libpng freetype gd ghostscript makeWrapper ];
preConfigure = "cd texk/dvipng";
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'
'';
};
bibtexu = bibtex8;
bibtex8 = stdenv.mkDerivation {
name = "texlive-bibtex-x.bin-${version}";
inherit (common) src;
buildInputs = [ pkgconfig core/*kpathsea*/ icu ];
preConfigure = "cd texk/bibtex-x";
configureFlags = common.configureFlags
++ [ "--with-system-kpathsea" "--with-system-icu" ];
enableParallelBuilding = true;
};
xdvi = stdenv.mkDerivation {
name = "texlive-xdvi.bin-${version}";
inherit (common) src;
buildInputs = [ pkgconfig 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
// stdenv.lib.optionalAttrs (!stdenv.isDarwin) # see #20062
{
xindy = stdenv.mkDerivation {
name = "texlive-xindy.bin-${version}";
inherit (common) src;
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 = [
pkgconfig 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/"
'';
};
}