# Generic builder for tcl packages/applications, generally based on mk-python-derivation.nix
{ tcl
, lib
, makeWrapper
, runCommand
, writeScript
}:

{ buildInputs ? []
, nativeBuildInputs ? []
, propagatedBuildInputs ? []
, checkInputs ? []
, nativeCheckInputs ? []

# true if we should skip the configuration phase altogether
, dontConfigure ? false

# Extra flags passed to configure step
, configureFlags ? []

# Whether or not we should add common Tcl-related configure flags
, addTclConfigureFlags ? true

, meta ? {}
, passthru ? {}
, doCheck ? true
, ... } @ attrs:

let
  inherit (tcl) stdenv;
  inherit (lib) getBin optionalAttrs;

  defaultTclPkgConfigureFlags = [
    "--with-tcl=${tcl}/lib"
    "--with-tclinclude=${tcl}/include"
    "--exec-prefix=${placeholder "out"}"
  ];

  self = (stdenv.mkDerivation ((builtins.removeAttrs attrs [
    "addTclConfigureFlags" "checkPhase" "checkInputs" "nativeCheckInputs" "doCheck"
  ]) // {

    buildInputs = buildInputs ++ [ tcl.tclPackageHook ];
    nativeBuildInputs = nativeBuildInputs ++ [ makeWrapper tcl ];
    propagatedBuildInputs = propagatedBuildInputs ++ [ tcl ];

    TCLSH = "${getBin tcl}/bin/tclsh";

    # Run tests after install, at which point we've done all TCLLIBPATH setup
    doCheck = false;
    doInstallCheck = attrs.doCheck or (attrs.doInstallCheck or false);
    installCheckInputs = checkInputs ++ (attrs.installCheckInputs or []);
    nativeInstallCheckInputs = nativeCheckInputs ++ (attrs.nativeInstallCheckInputs or []);

    # Add typical values expected by TEA for configureFlags
    configureFlags =
      if (!dontConfigure && addTclConfigureFlags)
        then (configureFlags ++ defaultTclPkgConfigureFlags)
        else configureFlags;

    meta = {
      platforms = tcl.meta.platforms;
    } // meta;


  } // optionalAttrs (attrs?checkPhase) {
    installCheckPhase = attrs.checkPhase;
  }
  ));

in lib.extendDerivation true passthru self
