at master 328 lines 11 kB view raw
1{ 2 lib, 3 mkCoqDerivation, 4 coq, 5 flocq, 6 MenhirLib, 7 ocamlPackages, 8 fetchpatch, 9 makeWrapper, 10 coq2html, 11 stdenv, 12 tools ? stdenv.cc, 13 version ? null, 14}: 15 16let 17 18 # https://compcert.org/man/manual002.html 19 targets = { 20 x86_64-linux = "x86_64-linux"; 21 aarch64-linux = "aarch64-linux"; 22 x86_64-darwin = "x86_64-macos"; 23 aarch64-darwin = "aarch64-macos"; 24 riscv32-linux = "rv32-linux"; 25 riscv64-linux = "rv64-linux"; 26 }; 27 28 target = 29 targets.${stdenv.hostPlatform.system} 30 or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); 31 32 compcert = mkCoqDerivation { 33 34 pname = "compcert"; 35 owner = "AbsInt"; 36 37 inherit version; 38 releaseRev = v: "v${v}"; 39 40 defaultVersion = 41 with lib.versions; 42 lib.switch coq.version [ 43 { 44 case = range "8.15" "9.0"; 45 out = "3.16"; 46 } 47 { 48 case = range "8.14" "8.20"; 49 out = "3.15"; 50 } 51 { 52 case = isEq "8.13"; 53 out = "3.10"; 54 } 55 { 56 case = isEq "8.12"; 57 out = "3.9"; 58 } 59 { 60 case = range "8.8" "8.11"; 61 out = "3.8"; 62 } 63 ] null; 64 65 release = { 66 "3.8".sha256 = "1gzlyxvw64ca12qql3wnq3bidcx9ygsklv9grjma3ib4hvg7vnr7"; 67 "3.9".sha256 = "1srcz2dqrvmbvv5cl66r34zqkm0hsbryk7gd3i9xx4slahc9zvdb"; 68 "3.10".sha256 = "sha256:19rmx8r8v46101ij5myfrz60arqjy7q3ra3fb8mxqqi3c8c4l4j6"; 69 "3.11".sha256 = "sha256-ZISs/ZAJVWtxp9+Sg5qV5Rss1gI9hK769GnBfawLa6A="; 70 "3.12".sha256 = "sha256-hXkQ8UnAx3k50OJGBmSm4hgrnRFCosu4+PEMrcKfmV0="; 71 "3.13".sha256 = "sha256-ZedxgEPr1ZgKIcyhQ6zD1l2xr6RDNNUYq/4ZyR6ojM4="; 72 "3.13.1".sha256 = "sha256-ldXbuzVB0Z+UVTd5S4yGSg6oRYiKbXLMmUZcQsJLcns="; 73 "3.14".sha256 = "sha256-QXJMpp/BaPiK5okHeo2rcmXENToXKjB51UqljMHTDgw="; 74 "3.15".sha256 = "sha256-QFTueGZd0hAWUj+c5GZL/AyNpfN4FuJiIzCICmwRXJ8="; 75 "3.16".sha256 = "sha256-Ep8bcSFs3Cu+lV5qgo89JJU2vh4TTq66Or0c4evo3gM="; 76 }; 77 78 strictDeps = true; 79 80 nativeBuildInputs = with ocamlPackages; [ 81 makeWrapper 82 ocaml 83 findlib 84 menhir 85 coq 86 coq2html 87 ]; 88 buildInputs = with ocamlPackages; [ menhirLib ]; 89 propagatedBuildInputs = [ 90 flocq 91 MenhirLib 92 ]; 93 94 enableParallelBuilding = true; 95 96 postPatch = '' 97 substituteInPlace ./configure \ 98 --replace \$\{toolprefix\}ar 'ar' \ 99 --replace '{toolprefix}gcc' '{toolprefix}cc' 100 ''; 101 102 configurePhase = '' 103 ./configure -clightgen \ 104 -prefix $out \ 105 -coqdevdir $lib/lib/coq/${coq.coq-version}/user-contrib/compcert/ \ 106 -toolprefix ${tools}/bin/ \ 107 -use-external-Flocq \ 108 -use-external-MenhirLib \ 109 ${target} \ 110 ''; # don't remove the \ above, the command gets appended in override below 111 112 installTargets = "documentation install"; 113 installFlags = [ ]; # trust ./configure 114 preInstall = '' 115 mkdir -p $out/share/man 116 mkdir -p $man/share 117 ''; 118 postInstall = '' 119 # move man into place 120 mv $out/share/man/ $man/share/ 121 122 # move docs into place 123 mkdir -p $doc/share/doc/compcert 124 mv doc/html $doc/share/doc/compcert/ 125 126 # wrap ccomp to undefine _FORTIFY_SOURCE; ccomp invokes cc1 which sets 127 # _FORTIFY_SOURCE=2 by default, but undefines __GNUC__ (as it should), 128 # which causes a warning in libc. this suppresses it. 129 for x in ccomp clightgen; do 130 wrapProgram $out/bin/$x --add-flags "-U_FORTIFY_SOURCE" 131 done 132 ''; 133 134 outputs = [ 135 "out" 136 "lib" 137 "doc" 138 "man" 139 ]; 140 141 meta = with lib; { 142 description = "Formally verified C compiler"; 143 homepage = "https://compcert.org"; 144 license = licenses.inria-compcert; 145 platforms = builtins.attrNames targets; 146 maintainers = with maintainers; [ 147 thoughtpolice 148 jwiegley 149 vbgl 150 ]; 151 }; 152 }; 153 patched_compcert = compcert.overrideAttrs (o: { 154 patches = 155 with lib.versions; 156 lib.switch [ coq.version o.version ] 157 [ 158 { 159 cases = [ 160 (range "8.12.2" "8.13.2") 161 "3.8" 162 ]; 163 out = [ 164 # Support for Coq 8.12.2 165 (fetchpatch { 166 url = "https://github.com/AbsInt/CompCert/commit/06956421b4307054af221c118c5f59593c0e67b9.patch"; 167 sha256 = "1f90q6j3xfvnf3z830bkd4d8526issvmdlrjlc95bfsqs78i1yrl"; 168 }) 169 # Support for Coq 8.13.0 170 (fetchpatch { 171 url = "https://github.com/AbsInt/CompCert/commit/0895388e7ebf9c9f3176d225107e21968919fb97.patch"; 172 sha256 = "0qhkzgb2xl5kxys81pldp3mr39gd30lvr2l2wmplij319vp3xavd"; 173 }) 174 # Support for Coq 8.13.1 175 (fetchpatch { 176 url = "https://github.com/AbsInt/CompCert/commit/6bf310dd678285dc193798e89fc2c441d8430892.patch"; 177 sha256 = "026ahhvpj5pksy90f8pnxgmhgwfqk4kwyvcf8x3dsanvz98d4pj5"; 178 }) 179 # Drop support for Coq < 8.9 180 (fetchpatch { 181 url = "https://github.com/AbsInt/CompCert/commit/7563a5df926a4c6fb1489a7a4c847641c8a35095.patch"; 182 sha256 = "05vkslzy399r3dm6dmjs722rrajnyfa30xsyy3djl52isvn4gyfb"; 183 }) 184 # Support for Coq 8.13.2 185 (fetchpatch { 186 url = "https://github.com/AbsInt/CompCert/commit/48bc183167c4ce01a5c9ea86e49d60530adf7290.patch"; 187 sha256 = "0j62lppfk26d1brdp3qwll2wi4gvpx1k70qivpvby5f7dpkrkax1"; 188 }) 189 ]; 190 } 191 { 192 cases = [ 193 (range "8.14" "8.15") 194 "3.10" 195 ]; 196 out = [ 197 # Support for Coq 8.14.1 198 (fetchpatch { 199 url = "https://github.com/AbsInt/CompCert/commit/a79f0f99831aa0b0742bf7cce459cc9353bd7cd0.patch"; 200 sha256 = "sha256:0g20x8gfzvplpad9y9vr1p33k6qv6rsp691x6687v9ffvz7zsz94"; 201 }) 202 # Support for Coq 8.15.0 203 (fetchpatch { 204 url = "https://github.com/AbsInt/CompCert/commit/a882f78c069f7337dd9f4abff117d4df98ef38a6.patch"; 205 sha256 = "sha256:16i87s608fj9ni7cvd5wrd7gicqniad7w78wi26pxdy0pacl7bjg"; 206 }) 207 # Support for Coq 8.15.1 208 (fetchpatch { 209 url = "https://github.com/AbsInt/CompCert/commit/10a976994d7fd30d143354c289ae735d210ccc09.patch"; 210 sha256 = "sha256:0bg58gpkgxlmxzp6sg0dvybrfk0pxnm7qd6vxlrbsbm2w6wk03jv"; 211 }) 212 # Support for Coq 8.15.2 213 (fetchpatch { 214 url = "https://github.com/AbsInt/CompCert/commit/283a5be7296c4c0a94d863b427c77007ab875733.patch"; 215 sha256 = "sha256:1s7hvb5ii3p8kkcjlzwldvk8xc3iiibxi9935qjbrh25xi6qs66k"; 216 }) 217 ]; 218 } 219 { 220 cases = [ 221 (isEq "8.16") 222 (range "3.11" "3.12") 223 ]; 224 out = [ 225 # Support for Coq 8.16.0 226 (fetchpatch { 227 url = "https://github.com/AbsInt/CompCert/commit/34be08a23d18d56f2dde24fd24b6dbe3bcb01ec3.patch"; 228 sha256 = "sha256-a5YnftGVadVypEqrOYRRxI7YtGOEWyKnO4GqakFhvzI="; 229 }) 230 # Support for Coq 8.16.1 231 (fetchpatch { 232 url = "https://github.com/AbsInt/CompCert/commit/35531503b3493cb9b0ec8a8585e84928c85b4af9.patch"; 233 hash = "sha256-DvtYi/eiPUe8tA0EFTcCjJA0JjtVKceUsX4ZDM0pWkE="; 234 }) 235 ]; 236 } 237 { 238 cases = [ 239 (range "8.17" "8.19") 240 (isEq "3.13") 241 ]; 242 out = [ 243 # Support for Coq 8.17.0 & Coq 8.17.1 244 (fetchpatch { 245 url = "https://github.com/AbsInt/CompCert/commit/2e04d986bdae578186e40330842878559a550402.patch"; 246 hash = "sha256-2ZRAjUUSScJI8ogWFTnukCUnJdLWGvyOPyfIVlHL4ig="; 247 }) 248 # Support for Coq 8.18.0 249 (fetchpatch { 250 url = "https://github.com/AbsInt/CompCert/commit/28218c5663cba36c6078ca342335d4e55c412bd7.patch"; 251 hash = "sha256-aAatUMO26oZwFYGh1BXYWxbTuyOgU8BAKMGDS5796hM="; 252 }) 253 # MenhirLib update 254 (fetchpatch { 255 url = "https://github.com/AbsInt/CompCert/commit/9f3d7b6eb99377ad4689cd57563c484c57baa457.patch"; 256 hash = "sha256-paofdSBxP/JFoBSiO1OI+mjKRI3UCanXRh/drzYt93E="; 257 }) 258 # Support for Coq 8.19.0 & Coq 8.19.1 259 (fetchpatch { 260 url = "https://github.com/AbsInt/CompCert/commit/a2e4ed62fc558d565366845f9d135bd7db5e23c4.patch"; 261 hash = "sha256-ufk0bokuayLfkSvK3cK4E9iXU5eZpp9d/ETSa/zCfMg="; 262 }) 263 # Support for Coq 8.19.2 264 (fetchpatch { 265 url = "https://github.com/AbsInt/CompCert/commit/8fcfb7d2a6e9ba44003ccab0dfcc894982779af1.patch"; 266 hash = "sha256-m/kcnDBBPWFriipuGvKZUqLQU8/W1uqw8j4qfCwnTZk="; 267 }) 268 ]; 269 } 270 { 271 cases = [ 272 (range "8.19" "8.20") 273 (isEq "3.14") 274 ]; 275 out = [ 276 # Support for Coq 8.19.2 277 (fetchpatch { 278 url = "https://github.com/AbsInt/CompCert/commit/8fcfb7d2a6e9ba44003ccab0dfcc894982779af1.patch"; 279 hash = "sha256-m/kcnDBBPWFriipuGvKZUqLQU8/W1uqw8j4qfCwnTZk="; 280 }) 281 # Support for Coq 8.20.0 282 (fetchpatch { 283 url = "https://github.com/AbsInt/CompCert/commit/20a5b48758bf8ac18e4c420df67017b371efc237.patch"; 284 hash = "sha256-TJ87CvLiAv1absGnPsTXsD/HQwKgS82loUTcosulyso="; 285 }) 286 # Support for Coq 8.20.1 287 (fetchpatch { 288 url = "https://github.com/AbsInt/CompCert/commit/e6c9a2d068ae67923bbc7c6b7035b6afde6ece3c.patch"; 289 hash = "sha256-PtiEkG/aLRotIiqrmc6SQncQSi7IGSC5QX3e52xkOUQ="; 290 }) 291 ]; 292 } 293 { 294 cases = [ 295 (isEq "8.20") 296 (isEq "3.15") 297 ]; 298 out = [ 299 # Support for Coq 8.20.1 300 (fetchpatch { 301 url = "https://github.com/AbsInt/CompCert/commit/e524b0a19ae5140f64047b1cba6ebbe1d16d5bbf.patch"; 302 hash = "sha256-24kt0hA75ooyXymH+kNS5VlsuXMHbkqTw4m+BzNUwrw="; 303 }) 304 ]; 305 } 306 { 307 cases = [ 308 (isEq "9.0") 309 (isEq "3.16") 310 ]; 311 out = [ 312 # Support for Coq 9.0.1 313 (fetchpatch { 314 url = "https://github.com/AbsInt/CompCert/commit/a962ef9da0fb4ef2a4314ccedd111eb248e42cf2.patch"; 315 hash = "sha256-ipYqcfcgz3cKyI1NGSgfOgiVdV1WUwlv6DVB1S1hJvw="; 316 }) 317 ]; 318 } 319 ] 320 [ ]; 321 }); 322in 323patched_compcert.overrideAttrs ( 324 o: 325 lib.optionalAttrs (coq.version != null && coq.version == "dev") { 326 configurePhase = "${o.configurePhase} -ignore-ocaml-version -ignore-coq-version"; 327 } 328)