Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
1{ lib, stdenv, coqPackages, coq, which, fetchzip }@args:
2let lib = import ./extra-lib.nix {inherit (args) lib;}; in
3with builtins; with lib;
4let
5 isGitHubDomain = d: match "^github.*" d != null;
6 isGitLabDomain = d: match "^gitlab.*" d != null;
7in
8{ pname,
9 version ? null,
10 fetcher ? null,
11 owner ? "coq-community",
12 domain ? "github.com",
13 repo ? pname,
14 defaultVersion ? null,
15 releaseRev ? (v: v),
16 displayVersion ? {},
17 release ? {},
18 buildInputs ? [],
19 nativeBuildInputs ? [],
20 extraBuildInputs ? [],
21 extraNativeBuildInputs ? [],
22 overrideBuildInputs ? [],
23 overrideNativeBuildInputs ? [],
24 namePrefix ? [ "coq" ],
25 enableParallelBuilding ? true,
26 extraInstallFlags ? [],
27 setCOQBIN ? true,
28 mlPlugin ? false,
29 useMelquiondRemake ? null,
30 dropAttrs ? [],
31 keepAttrs ? [],
32 dropDerivationAttrs ? [],
33 useDuneifVersion ? (x: false),
34 useDune ? false,
35 opam-name ? (concatStringsSep "-" (namePrefix ++ [ pname ])),
36 ...
37}@args:
38let
39 args-to-remove = foldl (flip remove) ([
40 "version" "fetcher" "repo" "owner" "domain" "releaseRev"
41 "displayVersion" "defaultVersion" "useMelquiondRemake"
42 "release"
43 "buildInputs" "nativeBuildInputs"
44 "extraBuildInputs" "extraNativeBuildInputs"
45 "overrideBuildInputs" "overrideNativeBuildInputs"
46 "namePrefix"
47 "meta" "useDuneifVersion" "useDune" "opam-name"
48 "extraInstallFlags" "setCOQBIN" "mlPlugin"
49 "dropAttrs" "dropDerivationAttrs" "keepAttrs" ] ++ dropAttrs) keepAttrs;
50 fetch = import ../coq/meta-fetch/default.nix
51 { inherit lib stdenv fetchzip; } ({
52 inherit release releaseRev;
53 location = { inherit domain owner repo; };
54 } // optionalAttrs (args?fetcher) {inherit fetcher;});
55 fetched = fetch (if version != null then version else defaultVersion);
56 display-pkg = n: sep: v:
57 let d = displayVersion.${n} or (if sep == "" then ".." else true); in
58 n + optionalString (v != "" && v != null) (switch d [
59 { case = true; out = sep + v; }
60 { case = "."; out = sep + versions.major v; }
61 { case = ".."; out = sep + versions.majorMinor v; }
62 { case = "..."; out = sep + versions.majorMinorPatch v; }
63 { case = isFunction; out = optionalString (d v != "") (sep + d v); }
64 { case = isString; out = optionalString (d != "") (sep + d); }
65 ] "") + optionalString (v == null) "-broken";
66 append-version = p: n: p + display-pkg n "" coqPackages.${n}.version + "-";
67 prefix-name = foldl append-version "" namePrefix;
68 useDune = args.useDune or (useDuneifVersion fetched.version);
69 coqlib-flags = switch coq.coq-version [
70 { case = v: versions.isLe "8.6" v && v != "dev" ;
71 out = [ "COQLIB=$(out)/lib/coq/${coq.coq-version}/" ]; }
72 ] [ "COQLIBINSTALL=$(out)/lib/coq/${coq.coq-version}/user-contrib"
73 "COQPLUGININSTALL=$(OCAMLFIND_DESTDIR)" ];
74 docdir-flags = switch coq.coq-version [
75 { case = v: versions.isLe "8.6" v && v != "dev";
76 out = [ "DOCDIR=$(out)/share/coq/${coq.coq-version}/" ]; }
77 ] [ "COQDOCINSTALL=$(out)/share/coq/${coq.coq-version}/user-contrib" ];
78in
79
80stdenv.mkDerivation (removeAttrs ({
81
82 name = prefix-name + (display-pkg pname "-" fetched.version);
83
84 inherit (fetched) version src;
85
86 nativeBuildInputs = args.overrideNativeBuildInputs
87 or ([ which ]
88 ++ optional useDune coq.ocamlPackages.dune_3
89 ++ optionals (useDune || mlPlugin) [ coq.ocamlPackages.ocaml coq.ocamlPackages.findlib ]
90 ++ (args.nativeBuildInputs or []) ++ extraNativeBuildInputs);
91 buildInputs = args.overrideBuildInputs
92 or ([ coq ] ++ (args.buildInputs or []) ++ extraBuildInputs);
93 inherit enableParallelBuilding;
94
95 meta = ({ platforms = coq.meta.platforms; } //
96 (switch domain [{
97 case = pred.union isGitHubDomain isGitLabDomain;
98 out = { homepage = "https://${domain}/${owner}/${repo}"; };
99 }] {}) //
100 optionalAttrs (fetched.broken or false) { coqFilter = true; broken = true; }) //
101 (args.meta or {}) ;
102
103}
104// (optionalAttrs setCOQBIN { COQBIN = "${coq}/bin/"; })
105// (optionalAttrs (!args?installPhase && !args?useMelquiondRemake) {
106 installFlags =
107 coqlib-flags ++ docdir-flags ++
108 extraInstallFlags;
109})
110// (optionalAttrs useDune {
111 buildPhase = ''
112 runHook preBuild
113 dune build -p ${opam-name} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
114 runHook postBuild
115 '';
116 installPhase = ''
117 runHook preInstall
118 dune install ${opam-name} --prefix=$out
119 mv $out/lib/coq $out/lib/TEMPORARY
120 mkdir $out/lib/coq/
121 mv $out/lib/TEMPORARY $out/lib/coq/${coq.coq-version}
122 runHook postInstall
123 '';
124})
125// (optionalAttrs (args?useMelquiondRemake) rec {
126 COQUSERCONTRIB = "$out/lib/coq/${coq.coq-version}/user-contrib";
127 preConfigurePhases = "autoconf";
128 configureFlags = [ "--libdir=${COQUSERCONTRIB}/${useMelquiondRemake.logpath or ""}" ];
129 buildPhase = "./remake -j$NIX_BUILD_CORES";
130 installPhase = "./remake install";
131})
132// (removeAttrs args args-to-remove)) dropDerivationAttrs)