nixpkgs mirror (for testing) github.com/NixOS/nixpkgs
nix
at python-updates 238 lines 5.9 kB view raw
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)