{ stdenv, fetchurl, perl, groff, llvm, cmake, libxml2, python }:

let
  version = "3.3";
  gccReal = if (stdenv.cc.cc or null) == null then stdenv.cc else stdenv.cc.cc;
in

stdenv.mkDerivation {
  name = "clang-${version}";

  buildInputs = [ perl llvm groff cmake libxml2 python ];

  patches = [ ./clang-tablegen-dir.patch ] ++
            stdenv.lib.optional (stdenv.cc.libc != null) ./clang-purity.patch;

  cmakeFlags = [
    "-DCLANG_PATH_TO_LLVM_BUILD=${llvm}"
    "-DCMAKE_BUILD_TYPE=Release"
    "-DLLVM_TARGETS_TO_BUILD=all"
    "-DGCC_INSTALL_PREFIX=${gccReal}"
  ] ++ stdenv.lib.optionals (stdenv.cc.libc != null) [
    "-DC_INCLUDE_DIRS=${stdenv.cc.libc}/include/"
  ];

  enableParallelBuilding = true;

  src = fetchurl {
      url = "http://llvm.org/releases/${version}/cfe-${version}.src.tar.gz";
      sha256 = "15mrvw43s4frk1j49qr4v5viq68h8qlf10qs6ghd6mrsmgj5vddi";
  };

  passthru = {
    isClang = true;
    cc = stdenv.cc.cc;
    gcc = gccReal;
  };

  meta = {
    homepage = http://clang.llvm.org/;
    description = "A C language family frontend for LLVM";
    license = "BSD";
    maintainers = with stdenv.lib.maintainers; [viric];
    platforms = with stdenv.lib.platforms; all;
  };
}
