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