about summary refs log tree commit diff
path: root/nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix')
-rw-r--r--nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix354
1 files changed, 354 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix b/nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix
new file mode 100644
index 000000000000..29a7f05af071
--- /dev/null
+++ b/nixpkgs/pkgs/tools/typesetting/tex/texlive/bin.nix
@@ -0,0 +1,354 @@
+{ stdenv, fetchurl
+, texlive
+, zlib, libiconv, libpng, libX11
+, freetype, gd, libXaw, icu, ghostscript, libXpm, libXmu, libXext
+, perl, pkgconfig, autoreconfHook
+, poppler, libpaper, graphite2, zziplib, harfbuzz, potrace, gmp, mpfr
+, cairo, pixman, xorg, clisp, biber
+, makeWrapper
+}:
+
+# Useful resource covering build options:
+# http://tug.org/texlive/doc/tlbuild.html
+
+let
+  withSystemLibs = map (libname: "--with-system-${libname}");
+
+  year = "2018";
+  version = year; # keep names simple for now
+
+  common = rec {
+    src = fetchurl {
+      urls = [
+        "http://ftp.math.utah.edu/pub/tex/historic/systems/texlive/${year}/texlive-${year}0414-source.tar.xz"
+              "ftp://tug.ctan.org/pub/tex/historic/systems/texlive/${year}/texlive-${year}0414-source.tar.xz"
+      ];
+      sha256 = "0khyi6h015r2zfqgg0a44a2j7vmr1cy42knw7jbss237yvakc07y";
+    };
+
+    patches = [
+      (fetchurl {
+        name = "texlive-poppler-0.64.patch";
+        url = https://git.archlinux.org/svntogit/packages.git/plain/trunk/texlive-poppler-0.64.patch?h=packages/texlive-bin&id=da56abf0f8a1e85daca0ec0f031b8fa268519e6b;
+        sha256 = "0443d074zl3c5raba8jyhavish706arjcd80ibb84zwnwck4ai0w";
+      })
+      (fetchurl {
+        name = "synctex-missing-header.patch";
+        url = https://git.archlinux.org/svntogit/packages.git/plain/trunk/synctex-missing-header.patch?h=packages/texlive-bin&id=da56abf0f8a1e85daca0ec0f031b8fa268519e6b;
+        sha256 = "1c4aq8lk8g3mlfq3mdjnxvmhss3qs7nni5rmw0k054dmj6q1xj5n";
+      })
+    ];
+    # remove when removing synctex-missing-header.patch
+    preAutoreconf = "pushd texk/web2c";
+    postAutoreconf = "popd";
+
+    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 patches preAutoreconf postAutoreconf;
+
+  outputs = [ "out" "doc" ];
+
+  nativeBuildInputs = [ pkgconfig autoreconfHook ];
+  buildInputs = [
+    /*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
+    cp -pv texk/web2c/pdftexdir/pdftoepdf{-newpoppler.cc,.cc}
+    cp -pv texk/web2c/pdftexdir/pdftosrc{-newpoppler.cc,.cc}
+  '';
+
+  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
+    ] ++ stdenv.lib.optional (stdenv.hostPlatform.isPower && stdenv.hostPlatform.is64bit) "mfluajit")
+    ++ [ "--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 "$out"/share/{man,info} "$doc"/doc
+  '' + cleanBrokenLinks;
+
+  # needed for poppler and xpdf
+  CXXFLAGS = stdenv.lib.optionalString stdenv.cc.isClang "-std=c++11";
+
+  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 patches preAutoreconf postAutoreconf;
+
+  hardeningDisable = [ "format" ];
+
+  inherit (core) nativeBuildInputs;
+  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"
+        # build fails on Darwin with luatex53
+        "luatex53" # TODO probably can be removed when TexLive 2019 is out
+        # luajittex is mostly not needed, see:
+        # http://tex.stackexchange.com/questions/97999/when-to-use-luajittex-in-favour-of-luatex
+        "luajittex" "mfluajit"
+      ];
+
+  configureScript = ":";
+
+  # we use static libtexlua, because it's only used by a single binary
+  postConfigure = ''
+    mkdir ./WorkDir && cd ./WorkDir
+    # TODO add lua53 here when luatex53 is enabled again
+    for path in libs/{teckit,lua52} texk/web2c; do
+      (
+        if [[ "$path" =~ "libs/lua5" ]]; 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" "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;
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ 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;
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ 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'
+  '';
+};
+
+
+inherit biber;
+bibtexu = bibtex8;
+bibtex8 = stdenv.mkDerivation {
+  name = "texlive-bibtex-x.bin-${version}";
+
+  inherit (common) src;
+
+  nativeBuildInputs = [ pkgconfig ];
+  buildInputs = [ 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;
+
+  nativeBuildInputs = [ pkgconfig ];
+  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
+
+// stdenv.lib.optionalAttrs (!stdenv.isDarwin) # see #20062
+{
+
+xindy = stdenv.mkDerivation {
+  name = "texlive-xindy.bin-${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 "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/"
+  '';
+};
+
+}