summary refs log tree commit diff
path: root/pkgs/development/coq-modules/metacoq/default.nix
blob: 583d8b7adb914b71c43524e970ab602b55cbce29 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
{ lib, which, fetchzip,
  mkCoqDerivation, recurseIntoAttrs,  single ? false,
  coqPackages, coq, equations, version ? null }@args:
with builtins // lib;
let
  repo  = "metacoq";
  owner = "MetaCoq";
  defaultVersion = with versions; switch coq.coq-version [
      { case = "8.11"; out = "1.0-beta2-8.11"; }
      { case = "8.12"; out = "1.0-beta2-8.12"; }
      # Do not provide 8.13 because it does not compile with equations 1.3 provided by default (only 1.2.3)
      # { case = "8.13"; out = "1.0-beta2-8.13"; }
    ] null;
  release = {
    "1.0-beta2-8.11".sha256 = "sha256-I9YNk5Di6Udvq5/xpLSNflfjRyRH8fMnRzbo3uhpXNs=";
    "1.0-beta2-8.12".sha256 = "sha256-I8gpmU9rUQJh0qfp5KOgDNscVvCybm5zX4TINxO1TVA=";
    "1.0-beta2-8.13".sha256 = "sha256-IC56/lEDaAylUbMCfG/3cqOBZniEQk8jmI053DBO5l8=";
  };
  releaseRev = v: "v${v}";

  # list of core metacoq packages sorted by dependency order
  packages = [ "template-coq" "pcuic" "safechecker" "erasure" "all" ];

  template-coq = metacoq_ "template-coq";

  metacoq_ = package: let
      metacoq-deps = if package == "single" then []
        else map metacoq_ (head (splitList (pred.equal package) packages));
      pkgpath = if package == "single" then "./" else "./${package}";
      pname = if package == "all" then "metacoq" else "metacoq-${package}";
      pkgallMake = ''
          mkdir all
          echo "all:" > all/Makefile
          echo "install:" >> all/Makefile
        '' ;
      derivation = mkCoqDerivation ({
        inherit version pname defaultVersion release releaseRev repo owner;

        extraNativeBuildInputs = [ which ];
        mlPlugin = true;
        extraBuildInputs = [ coq.ocamlPackages.zarith ];
        propagatedBuildInputs = [ equations ] ++ metacoq-deps;

        patchPhase =  ''
          patchShebangs ./configure.sh
          patchShebangs ./template-coq/update_plugin.sh
          patchShebangs ./template-coq/gen-src/to-lower.sh
          patchShebangs ./pcuic/clean_extraction.sh
          patchShebangs ./safechecker/clean_extraction.sh
          patchShebangs ./erasure/clean_extraction.sh
          echo "CAMLFLAGS+=-w -60 # Unused module" >> ./safechecker/Makefile.plugin.local
          sed -i -e 's/mv $i $newi;/mv $i tmp; mv tmp $newi;/' ./template-coq/gen-src/to-lower.sh ./pcuic/clean_extraction.sh ./safechecker/clean_extraction.sh ./erasure/clean_extraction.sh
        '' ;

        configurePhase = optionalString (package == "all") pkgallMake + ''
          touch ${pkgpath}/metacoq-config
        '' + optionalString (elem package ["safechecker" "erasure"]) ''
          echo  "-I ${template-coq}/lib/coq/${coq.coq-version}/user-contrib/MetaCoq/Template/" > ${pkgpath}/metacoq-config
        '' + optionalString (package == "single") ''
          ./configure.sh local
        '';

        preBuild = ''
          cd ${pkgpath}
        '' ;

        meta = {
          homepage    = "https://metacoq.github.io/";
          license     = licenses.mit;
          maintainers = with maintainers; [ cohencyril ];
        };
      } // optionalAttrs (package != "single")
        { passthru = genAttrs packages metacoq_; });
    in derivation;
in
metacoq_ (if single then "single" else "all")