Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
1{
2 lib,
3 stdenv,
4 coqPackages,
5 coq,
6 which,
7 fetchzip,
8 fetchurl,
9}@args:
10
11let
12 lib = import ./extra-lib.nix {
13 inherit (args) lib;
14 };
15
16 inherit (lib)
17 concatStringsSep
18 flip
19 foldl
20 isFunction
21 isString
22 optional
23 optionalAttrs
24 optionals
25 optionalString
26 pred
27 remove
28 switch
29 versions
30 ;
31
32 inherit (lib.attrsets) removeAttrs;
33 inherit (lib.strings) match;
34
35 isGitHubDomain = d: match "^github.*" d != null;
36 isGitLabDomain = d: match "^gitlab.*" d != null;
37in
38
39{
40 pname,
41 version ? null,
42 fetcher ? null,
43 owner ? "coq-community",
44 domain ? "github.com",
45 repo ? pname,
46 defaultVersion ? null,
47 releaseRev ? (v: v),
48 displayVersion ? { },
49 release ? { },
50 buildInputs ? [ ],
51 nativeBuildInputs ? [ ],
52 extraBuildInputs ? [ ],
53 extraNativeBuildInputs ? [ ],
54 overrideBuildInputs ? [ ],
55 overrideNativeBuildInputs ? [ ],
56 namePrefix ? [ "coq" ],
57 enableParallelBuilding ? true,
58 extraInstallFlags ? [ ],
59 setCOQBIN ? true,
60 mlPlugin ? false,
61 useMelquiondRemake ? null,
62 dropAttrs ? [ ],
63 keepAttrs ? [ ],
64 dropDerivationAttrs ? [ ],
65 useDuneifVersion ? (x: false),
66 useDune ? false,
67 opam-name ? (concatStringsSep "-" (namePrefix ++ [ pname ])),
68 ...
69}@args:
70let
71 args-to-remove = foldl (flip remove) (
72 [
73 "version"
74 "fetcher"
75 "repo"
76 "owner"
77 "domain"
78 "releaseRev"
79 "displayVersion"
80 "defaultVersion"
81 "useMelquiondRemake"
82 "release"
83 "buildInputs"
84 "nativeBuildInputs"
85 "extraBuildInputs"
86 "extraNativeBuildInputs"
87 "overrideBuildInputs"
88 "overrideNativeBuildInputs"
89 "namePrefix"
90 "meta"
91 "useDuneifVersion"
92 "useDune"
93 "opam-name"
94 "extraInstallFlags"
95 "setCOQBIN"
96 "mlPlugin"
97 "dropAttrs"
98 "dropDerivationAttrs"
99 "keepAttrs"
100 ]
101 ++ dropAttrs
102 ) keepAttrs;
103 fetch =
104 import ../coq/meta-fetch/default.nix
105 {
106 inherit
107 lib
108 stdenv
109 fetchzip
110 fetchurl
111 ;
112 }
113 (
114 {
115 inherit release releaseRev;
116 location = { inherit domain owner repo; };
117 }
118 // optionalAttrs (args ? fetcher) { inherit fetcher; }
119 );
120 fetched = fetch (if version != null then version else defaultVersion);
121 display-pkg =
122 n: sep: v:
123 let
124 d = displayVersion.${n} or (if sep == "" then ".." else true);
125 in
126 n
127 + optionalString (v != "" && v != null) (
128 switch d [
129 {
130 case = true;
131 out = sep + v;
132 }
133 {
134 case = ".";
135 out = sep + versions.major v;
136 }
137 {
138 case = "..";
139 out = sep + versions.majorMinor v;
140 }
141 {
142 case = "...";
143 out = sep + versions.majorMinorPatch v;
144 }
145 {
146 case = isFunction;
147 out = optionalString (d v != "") (sep + d v);
148 }
149 {
150 case = isString;
151 out = optionalString (d != "") (sep + d);
152 }
153 ] ""
154 )
155 + optionalString (v == null) "-broken";
156 append-version = p: n: p + display-pkg n "" coqPackages.${n}.version + "-";
157 prefix-name = foldl append-version "" namePrefix;
158 useDune = args.useDune or (useDuneifVersion fetched.version);
159 coqlib-flags =
160 switch coq.coq-version
161 [
162 {
163 case = v: versions.isLe "8.6" v && v != "dev";
164 out = [ "COQLIB=$(out)/lib/coq/${coq.coq-version}/" ];
165 }
166 ]
167 [
168 "COQLIBINSTALL=$(out)/lib/coq/${coq.coq-version}/user-contrib"
169 "COQPLUGININSTALL=$(OCAMLFIND_DESTDIR)"
170 ];
171 docdir-flags =
172 switch coq.coq-version
173 [
174 {
175 case = v: versions.isLe "8.6" v && v != "dev";
176 out = [ "DOCDIR=$(out)/share/coq/${coq.coq-version}/" ];
177 }
178 ]
179 [ "COQDOCINSTALL=$(out)/share/coq/${coq.coq-version}/user-contrib" ];
180in
181
182stdenv.mkDerivation (
183 removeAttrs (
184 {
185
186 name = prefix-name + (display-pkg pname "-" fetched.version);
187
188 inherit (fetched) version src;
189
190 nativeBuildInputs =
191 args.overrideNativeBuildInputs or (
192 [ which ]
193 ++ optional useDune coq.ocamlPackages.dune_3
194 ++ optionals (useDune || mlPlugin) [
195 coq.ocamlPackages.ocaml
196 coq.ocamlPackages.findlib
197 ]
198 ++ (args.nativeBuildInputs or [ ])
199 ++ extraNativeBuildInputs
200 );
201 buildInputs =
202 args.overrideBuildInputs or ([ coq ] ++ (args.buildInputs or [ ]) ++ extraBuildInputs);
203 inherit enableParallelBuilding;
204
205 meta =
206 (
207 {
208 platforms = coq.meta.platforms;
209 }
210 // (switch domain [
211 {
212 case = pred.union isGitHubDomain isGitLabDomain;
213 out = {
214 homepage = "https://${domain}/${owner}/${repo}";
215 };
216 }
217 ] { })
218 // optionalAttrs (fetched.broken or false) {
219 coqFilter = true;
220 broken = true;
221 }
222 )
223 // (args.meta or { });
224
225 }
226 // (optionalAttrs setCOQBIN { COQBIN = "${coq}/bin/"; })
227 // (optionalAttrs (!args ? installPhase && !args ? useMelquiondRemake) {
228 installFlags = coqlib-flags ++ docdir-flags ++ extraInstallFlags;
229 })
230 // (optionalAttrs useDune {
231 buildPhase = ''
232 runHook preBuild
233 dune build -p ${opam-name} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
234 runHook postBuild
235 '';
236 installPhase = ''
237 runHook preInstall
238 dune install --prefix=$out --libdir $OCAMLFIND_DESTDIR ${opam-name}
239 mkdir $out/lib/coq/
240 mv $OCAMLFIND_DESTDIR/coq $out/lib/coq/${coq.coq-version}
241 runHook postInstall
242 '';
243 })
244 // (optionalAttrs (args ? useMelquiondRemake) rec {
245 COQUSERCONTRIB = "$out/lib/coq/${coq.coq-version}/user-contrib";
246 preConfigurePhases = [ "autoconf" ];
247 configureFlags = [ "--libdir=${COQUSERCONTRIB}/${useMelquiondRemake.logpath or ""}" ];
248 buildPhase = "./remake -j$NIX_BUILD_CORES";
249 installPhase = "./remake install";
250 })
251 // (removeAttrs args args-to-remove)
252 ) dropDerivationAttrs
253)