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}@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 ? [ "rocq-core" ],
57 enableParallelBuilding ? true,
58 extraInstallFlags ? [ ],
59 setROCQBIN ? 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 "setROCQBIN"
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 "" rocqPackages.${n}.version + "-";
157 prefix-name = foldl append-version "" namePrefix;
158 useDune = args.useDune or (useDuneifVersion fetched.version);
159 rocqlib-flags = [
160 "COQLIBINSTALL=$(out)/lib/coq/${rocq-core.rocq-version}/user-contrib"
161 "COQPLUGININSTALL=$(OCAMLFIND_DESTDIR)"
162 ];
163 docdir-flags = [ "COQDOCINSTALL=$(out)/share/coq/${rocq-core.rocq-version}/user-contrib" ];
164in
165
166stdenv.mkDerivation (
167 removeAttrs (
168 {
169
170 name = prefix-name + (display-pkg pname "-" fetched.version);
171
172 inherit (fetched) version src;
173
174 nativeBuildInputs =
175 args.overrideNativeBuildInputs or (
176 [ which ]
177 ++ optional useDune rocq-core.ocamlPackages.dune_3
178 ++ optionals (useDune || mlPlugin) [
179 rocq-core.ocamlPackages.ocaml
180 rocq-core.ocamlPackages.findlib
181 ]
182 ++ (args.nativeBuildInputs or [ ])
183 ++ extraNativeBuildInputs
184 );
185 buildInputs =
186 args.overrideBuildInputs or ([ rocq-core ] ++ (args.buildInputs or [ ]) ++ extraBuildInputs);
187 inherit enableParallelBuilding;
188
189 meta =
190 (
191 {
192 platforms = rocq-core.meta.platforms;
193 }
194 // (switch domain [
195 {
196 case = pred.union isGitHubDomain isGitLabDomain;
197 out = {
198 homepage = "https://${domain}/${owner}/${repo}";
199 };
200 }
201 ] { })
202 // optionalAttrs (fetched.broken or false) {
203 rocqFilter = true;
204 broken = true;
205 }
206 )
207 // (args.meta or { });
208
209 }
210 // (optionalAttrs setROCQBIN { ROCQBIN = "${rocq-core}/bin/"; })
211 // (optionalAttrs (!args ? installPhase && !args ? useMelquiondRemake) {
212 installFlags = rocqlib-flags ++ docdir-flags ++ extraInstallFlags;
213 })
214 // (optionalAttrs useDune {
215 buildPhase = ''
216 runHook preBuild
217 dune build -p ${opam-name} ''${enableParallelBuilding:+-j $NIX_BUILD_CORES}
218 runHook postBuild
219 '';
220 installPhase = ''
221 runHook preInstall
222 dune install --prefix=$out --libdir $OCAMLFIND_DESTDIR ${opam-name}
223 mkdir $out/lib/coq/
224 mv $OCAMLFIND_DESTDIR/coq $out/lib/coq/${rocq-core.rocq-version}
225 runHook postInstall
226 '';
227 })
228 // (optionalAttrs (args ? useMelquiondRemake) rec {
229 COQUSERCONTRIB = "$out/lib/coq/${rocq-core.rocq-version}/user-contrib";
230 preConfigurePhases = [ "autoconf" ];
231 configureFlags = [ "--libdir=${COQUSERCONTRIB}/${useMelquiondRemake.logpath or ""}" ];
232 buildPhase = "./remake -j$NIX_BUILD_CORES";
233 installPhase = "./remake install";
234 })
235 // (removeAttrs args args-to-remove)
236 ) dropDerivationAttrs
237)