155 lines
5.1 KiB
Nix
155 lines
5.1 KiB
Nix
|
{ lib, stdenv, coqPackages, coq, which, fetchzip, fetchurl }@args:
|
||
|
|
||
|
let
|
||
|
lib = import ./extra-lib.nix {
|
||
|
inherit (args) lib;
|
||
|
};
|
||
|
|
||
|
inherit (lib)
|
||
|
concatStringsSep
|
||
|
flip
|
||
|
foldl
|
||
|
isFunction
|
||
|
isString
|
||
|
optional
|
||
|
optionalAttrs
|
||
|
optionals
|
||
|
optionalString
|
||
|
pred
|
||
|
remove
|
||
|
switch
|
||
|
versions
|
||
|
;
|
||
|
|
||
|
inherit (lib.attrsets) removeAttrs;
|
||
|
inherit (lib.strings) match;
|
||
|
|
||
|
isGitHubDomain = d: match "^github.*" d != null;
|
||
|
isGitLabDomain = d: match "^gitlab.*" d != null;
|
||
|
in
|
||
|
|
||
|
{ pname,
|
||
|
version ? null,
|
||
|
fetcher ? null,
|
||
|
owner ? "coq-community",
|
||
|
domain ? "github.com",
|
||
|
repo ? pname,
|
||
|
defaultVersion ? null,
|
||
|
releaseRev ? (v: v),
|
||
|
displayVersion ? {},
|
||
|
release ? {},
|
||
|
buildInputs ? [],
|
||
|
nativeBuildInputs ? [],
|
||
|
extraBuildInputs ? [],
|
||
|
extraNativeBuildInputs ? [],
|
||
|
overrideBuildInputs ? [],
|
||
|
overrideNativeBuildInputs ? [],
|
||
|
namePrefix ? [ "coq" ],
|
||
|
enableParallelBuilding ? true,
|
||
|
extraInstallFlags ? [],
|
||
|
setCOQBIN ? true,
|
||
|
mlPlugin ? false,
|
||
|
useMelquiondRemake ? null,
|
||
|
dropAttrs ? [],
|
||
|
keepAttrs ? [],
|
||
|
dropDerivationAttrs ? [],
|
||
|
useDuneifVersion ? (x: false),
|
||
|
useDune ? false,
|
||
|
opam-name ? (concatStringsSep "-" (namePrefix ++ [ pname ])),
|
||
|
...
|
||
|
}@args:
|
||
|
let
|
||
|
args-to-remove = foldl (flip remove) ([
|
||
|
"version" "fetcher" "repo" "owner" "domain" "releaseRev"
|
||
|
"displayVersion" "defaultVersion" "useMelquiondRemake"
|
||
|
"release"
|
||
|
"buildInputs" "nativeBuildInputs"
|
||
|
"extraBuildInputs" "extraNativeBuildInputs"
|
||
|
"overrideBuildInputs" "overrideNativeBuildInputs"
|
||
|
"namePrefix"
|
||
|
"meta" "useDuneifVersion" "useDune" "opam-name"
|
||
|
"extraInstallFlags" "setCOQBIN" "mlPlugin"
|
||
|
"dropAttrs" "dropDerivationAttrs" "keepAttrs" ] ++ dropAttrs) keepAttrs;
|
||
|
fetch = import ../coq/meta-fetch/default.nix
|
||
|
{ inherit lib stdenv fetchzip fetchurl; } ({
|
||
|
inherit release releaseRev;
|
||
|
location = { inherit domain owner repo; };
|
||
|
} // optionalAttrs (args?fetcher) {inherit fetcher;});
|
||
|
fetched = fetch (if version != null then version else defaultVersion);
|
||
|
display-pkg = n: sep: v:
|
||
|
let d = displayVersion.${n} or (if sep == "" then ".." else true); in
|
||
|
n + optionalString (v != "" && v != null) (switch d [
|
||
|
{ case = true; out = sep + v; }
|
||
|
{ case = "."; out = sep + versions.major v; }
|
||
|
{ case = ".."; out = sep + versions.majorMinor v; }
|
||
|
{ case = "..."; out = sep + versions.majorMinorPatch v; }
|
||
|
{ case = isFunction; out = optionalString (d v != "") (sep + d v); }
|
||
|
{ case = isString; out = optionalString (d != "") (sep + d); }
|
||
|
] "") + optionalString (v == null) "-broken";
|
||
|
append-version = p: n: p + display-pkg n "" coqPackages.${n}.version + "-";
|
||
|
prefix-name = foldl append-version "" namePrefix;
|
||
|
useDune = args.useDune or (useDuneifVersion fetched.version);
|
||
|
coqlib-flags = switch coq.coq-version [
|
||
|
{ case = v: versions.isLe "8.6" v && v != "dev" ;
|
||
|
out = [ "COQLIB=$(out)/lib/coq/${coq.coq-version}/" ]; }
|
||
|
] [ "COQLIBINSTALL=$(out)/lib/coq/${coq.coq-version}/user-contrib"
|
||
|
"COQPLUGININSTALL=$(OCAMLFIND_DESTDIR)" ];
|
||
|
docdir-flags = switch coq.coq-version [
|
||
|
{ case = v: versions.isLe "8.6" v && v != "dev";
|
||
|
out = [ "DOCDIR=$(out)/share/coq/${coq.coq-version}/" ]; }
|
||
|
] [ "COQDOCINSTALL=$(out)/share/coq/${coq.coq-version}/user-contrib" ];
|
||
|
in
|
||
|
|
||
|
stdenv.mkDerivation (removeAttrs ({
|
||
|
|
||
|
name = prefix-name + (display-pkg pname "-" fetched.version);
|
||
|
|
||
|
inherit (fetched) version src;
|
||
|
|
||
|
nativeBuildInputs = args.overrideNativeBuildInputs
|
||
|
or ([ which ]
|
||
|
++ optional useDune coq.ocamlPackages.dune_3
|
||
|
++ optionals (useDune || mlPlugin) [ coq.ocamlPackages.ocaml coq.ocamlPackages.findlib ]
|
||
|
++ (args.nativeBuildInputs or []) ++ extraNativeBuildInputs);
|
||
|
buildInputs = args.overrideBuildInputs
|
||
|
or ([ coq ] ++ (args.buildInputs or []) ++ extraBuildInputs);
|
||
|
inherit enableParallelBuilding;
|
||
|
|
||
|
meta = ({ platforms = coq.meta.platforms; } //
|
||
|
(switch domain [{
|
||
|
case = pred.union isGitHubDomain isGitLabDomain;
|
||
|
out = { homepage = "https://${domain}/${owner}/${repo}"; };
|
||
|
}] {}) //
|
||
|
optionalAttrs (fetched.broken or false) { coqFilter = true; broken = true; }) //
|
||
|
(args.meta or {}) ;
|
||
|
|
||
|
}
|
||
|
// (optionalAttrs setCOQBIN { COQBIN = "${coq}/bin/"; })
|
||
|
// (optionalAttrs (!args?installPhase && !args?useMelquiondRemake) {
|
||
|
installFlags =
|
||
|
coqlib-flags ++ docdir-flags ++
|
||
|
extraInstallFlags;
|
||
|
})
|
||
|
// (optionalAttrs useDune {
|
||
|
buildPhase = ''
|
||
|
runHook preBuild
|
||
|
dune build -p ${opam-name} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
|
||
|
runHook postBuild
|
||
|
'';
|
||
|
installPhase = ''
|
||
|
runHook preInstall
|
||
|
dune install --prefix=$out --libdir $OCAMLFIND_DESTDIR ${opam-name}
|
||
|
mkdir $out/lib/coq/
|
||
|
mv $OCAMLFIND_DESTDIR/coq $out/lib/coq/${coq.coq-version}
|
||
|
runHook postInstall
|
||
|
'';
|
||
|
})
|
||
|
// (optionalAttrs (args?useMelquiondRemake) rec {
|
||
|
COQUSERCONTRIB = "$out/lib/coq/${coq.coq-version}/user-contrib";
|
||
|
preConfigurePhases = [ "autoconf" ];
|
||
|
configureFlags = [ "--libdir=${COQUSERCONTRIB}/${useMelquiondRemake.logpath or ""}" ];
|
||
|
buildPhase = "./remake -j$NIX_BUILD_CORES";
|
||
|
installPhase = "./remake install";
|
||
|
})
|
||
|
// (removeAttrs args args-to-remove)) dropDerivationAttrs)
|