{ lib, stdenv, fetchurl, gfortran, imake, makedepend, motif, xorg, libxcrypt }:

stdenv.mkDerivation rec {
  version = "2006";
  pname = "cernlib";

  src = fetchurl {
    urls = [
      "https://ftp.riken.jp/cernlib/download/${version}_source/tar/${version}_src.tar.gz"
      "https://cernlib.web.cern.ch/cernlib/download/${version}_source/tar/${version}_src.tar.gz"
    ];
    sha256 = "0awla1rl96z82br7slcmg8ks1d2a7slk6dj79ywb871j2ksi3fky";
  };

  buildInputs = with xorg; [ gfortran motif libX11 libXft libXt libxcrypt ];
  nativeBuildInputs = [ imake makedepend ];
  sourceRoot = ".";

  patches = [ ./patch.patch ./0001-Use-strerror-rather-than-sys_errlist-to-fix-compilat.patch ];

  postPatch = ''
    echo 'InstallBinSubdirs(packlib scripts)' >> 2006/src/Imakefile
    substituteInPlace 2006/src/config/site.def \
      --replace "# define MakeCmd gmake" "# define MakeCmd make"
    substituteInPlace 2006/src/config/lnxLib.rules \
      --replace "# lib" "// lib"

    substituteInPlace 2006/src/config/linux.cf \
      --replace "# ifdef Hasgfortran" "# if 1" \
      --replace "# define CcCmd			gcc4" "# define CcCmd			gcc"
    substituteInPlace 2006/src/scripts/cernlib \
      --replace "-lnsl" ""

    # binutils 2.37 fix
    substituteInPlace 2006/src/config/Imake.tmpl --replace "clq" "cq"
  '';

  preConfigure = ''
    export CERN=`pwd`
    export CERN_LEVEL=${version}
    export CERN_ROOT=$CERN/$CERN_LEVEL
    export CVSCOSRC=`pwd`/$CERN_LEVEL/src
    export PATH=$PATH:$CERN_ROOT/bin
  '';

  FFLAGS = lib.optionals (lib.versionAtLeast gfortran.version "10.0.0") [
    # Fix https://github.com/vmc-project/geant3/issues/17
    "-fallow-invalid-boz"

    # Fix for gfortran 10
    "-fallow-argument-mismatch"
  ];

  NIX_CFLAGS = [ "-Wno-return-type" ];

  # Workaround build failure on -fno-common toolchains:
  # ld: libpacklib.a(kedit.o):kuip/klink1.h:11: multiple definition of `klnkaddr';
  #   libzftplib.a(zftpcdf.o):zftp/zftpcdf.c:155: first defined here
  env.NIX_CFLAGS_COMPILE = "-fcommon";

  makeFlags = [
    "FORTRANOPTIONS=$(FFLAGS)"
    "CCOPTIONS=$(NIX_CFLAGS)"
  ];

  configurePhase = ''
    runHook preConfigure

    cd $CERN_ROOT
    mkdir -p build
    cd $CERN_ROOT/build
    $CVSCOSRC/config/imake_boot

    runHook postConfigure
  '';

  preBuild = ''
    make -j $NIX_BUILD_CORES $makeFlags bin/kuipc
    make -j $NIX_BUILD_CORES $makeFlags scripts/Makefile
    pushd scripts
    make -j $NIX_BUILD_CORES $makeFlags bin/cernlib
    popd
  '';

  installTargets = [ "install.bin" "install.lib" "install.include" ];
  installFlags = [
    "CERN_BINDIR=${placeholder "out"}/bin"
    "CERN_INCLUDEDIR=${placeholder "out"}/include"
    "CERN_LIBDIR=${placeholder "out"}/lib"
    "CERN_SHLIBDIR=${placeholder "out"}/libexec"
  ];

  setupHook = ./setup-hook.sh;

  meta = {
    homepage = "http://cernlib.web.cern.ch";
    description = "Legacy collection of libraries and modules for data analysis in high energy physics";
    broken = stdenv.isDarwin;
    platforms = [ "i686-linux" "x86_64-linux" "x86_64-darwin" ];
    maintainers = with lib.maintainers; [ veprbl ];
    license = lib.licenses.gpl2;
  };
}
