{ lib, stdenv, fetchurl, makeWrapper
, boost, gmp
, tcl-8_5, tk-8_5
, emacs
}:

let
  version = "2.0.0";

  binaries = {
    x86_64-linux = fetchurl {
      url = "mirror://sourceforge/project/mozart-oz/v${version}-alpha.0/mozart2-${version}-alpha.0+build.4105.5c06ced-x86_64-linux.tar.gz";
      sha256 = "0rsfrjimjxqbwprpzzlmydl3z3aiwg5qkb052jixdxjyad7gyh5z";
    };
  };
in

stdenv.mkDerivation {
  pname = "mozart-binary";
  inherit version;

  preferLocalBuild = true;

  src = binaries.${stdenv.hostPlatform.system} or (throw "unsupported system: ${stdenv.hostPlatform.system}");

  libPath = lib.makeLibraryPath
    [ stdenv.cc.cc
      boost
      gmp
      tcl-8_5
      tk-8_5
    ];

  TK_LIBRARY = "${tk-8_5}/lib/tk8.5";

  nativeBuildInputs = [ makeWrapper ];

  buildCommand = ''
    mkdir $out
    tar xvf $src -C $out --strip-components=1

    for exe in $out/bin/{ozemulator,ozwish} ; do
      patchelf --set-interpreter $(< $NIX_CC/nix-support/dynamic-linker) \
               --set-rpath $libPath \
               $exe
    done

    wrapProgram $out/bin/ozwish \
      --set OZHOME $out \
      --set TK_LIBRARY $TK_LIBRARY

    wrapProgram $out/bin/ozemulator --set OZHOME $out

    ${lib.optionalString (emacs != null) ''
      wrapProgram $out/bin/oz --suffix PATH ":" ${lib.makeBinPath [ emacs ]}
    ''}

    sed -i $out/share/applications/oz.desktop \
        -e "s,Exec=oz %u,Exec=$out/bin/oz %u,"

    gzip -9n $out/share/mozart/elisp"/"*.elc

    patchShebangs $out
  '';

  meta = with lib; {
    homepage = "http://www.mozart-oz.org/";
    description = "Multiplatform implementation of the Oz programming language";
    longDescription = ''
      The Mozart Programming System combines ongoing research in
      programming language design and implementation, constraint logic
      programming, distributed computing, and human-computer
      interfaces. Mozart implements the Oz language and provides both
      expressive power and advanced functionality.
    '';
    license = licenses.mit;
    platforms = attrNames binaries;
    hydraPlatforms = [];
  };
}
