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