Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at python-updates 253 lines 6.2 kB view raw
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)