summary refs log tree commit diff
path: root/pkgs/development/coq-modules/mathcomp/default.nix
diff options
context:
space:
mode:
authorCyril Cohen <cohen@crans.org>2019-04-09 19:21:57 +0200
committerVincent Laporte <Vincent.Laporte@gmail.com>2019-05-15 14:11:21 +0000
commitb71c308591e1bfc3708c31dc1a94fcae636b5557 (patch)
tree64383399a44c1ffb465a91c6d46c9407cbfaa422 /pkgs/development/coq-modules/mathcomp/default.nix
parent4ec7a6eda993986a2e0e00c999e92e290e9dccac (diff)
downloadnixpkgs-b71c308591e1bfc3708c31dc1a94fcae636b5557.tar
nixpkgs-b71c308591e1bfc3708c31dc1a94fcae636b5557.tar.gz
nixpkgs-b71c308591e1bfc3708c31dc1a94fcae636b5557.tar.bz2
nixpkgs-b71c308591e1bfc3708c31dc1a94fcae636b5557.tar.lz
nixpkgs-b71c308591e1bfc3708c31dc1a94fcae636b5557.tar.xz
nixpkgs-b71c308591e1bfc3708c31dc1a94fcae636b5557.tar.zst
nixpkgs-b71c308591e1bfc3708c31dc1a94fcae636b5557.zip
coqPackages: refactor mathcomp packages
Closes #61456
Diffstat (limited to 'pkgs/development/coq-modules/mathcomp/default.nix')
-rw-r--r--pkgs/development/coq-modules/mathcomp/default.nix194
1 files changed, 135 insertions, 59 deletions
diff --git a/pkgs/development/coq-modules/mathcomp/default.nix b/pkgs/development/coq-modules/mathcomp/default.nix
index 85678a4c6a9..aa6da1a1e28 100644
--- a/pkgs/development/coq-modules/mathcomp/default.nix
+++ b/pkgs/development/coq-modules/mathcomp/default.nix
@@ -1,70 +1,146 @@
-{ stdenv, fetchFromGitHub, coq, ncurses, which
-, graphviz, withDoc ? false
+{ stdenv, fetchFromGitHub, ncurses, which, graphviz, coq,
+  recurseIntoAttrs, withDoc ? false
 }:
-
-let param =
-
-  if stdenv.lib.versionAtLeast coq.coq-version "8.7" then
-  {
-    version = "1.8.0";
-    sha256 = "07l40is389ih8bi525gpqs3qp4yb2kl11r9c8ynk1ifpjzpnabwp";
-  }
-  else if stdenv.lib.versionAtLeast coq.coq-version "8.6" then
-  {
-    version = "1.7.0";
-    sha256 = "0wnhj9nqpx2bw6n1l4i8jgrw3pjajvckvj3lr4vzjb3my2lbxdd1";
-  }
-  else if stdenv.lib.versionAtLeast coq.coq-version "8.5" then
-  {
-    version = "1.6.1";
-    sha256 = "1ilw6vm4dlsdv9cd7kmf0vfrh2kkzr45wrqr8m37miy0byzr4p9i";
-  }
-  else throw "No version of math-comp is available for Coq ${coq.coq-version}";
-
-in
-
-stdenv.mkDerivation rec {
-  name = "coq${coq.coq-version}-mathcomp-${version}";
-
-  # used in ssreflect
-  inherit (param) version;
-
-  src = fetchFromGitHub {
-    owner = "math-comp";
-    repo = "math-comp";
-    rev = "mathcomp-${param.version}";
-    inherit (param) sha256;
+with builtins // stdenv.lib;
+let
+  # sha256 of released mathcomp versions
+  mathcomp-sha256 = {
+    "1.8.0" = "07l40is389ih8bi525gpqs3qp4yb2kl11r9c8ynk1ifpjzpnabwp";
+    "1.7.0" = "0wnhj9nqpx2bw6n1l4i8jgrw3pjajvckvj3lr4vzjb3my2lbxdd1";
+    "1.6.1" = "1ilw6vm4dlsdv9cd7kmf0vfrh2kkzr45wrqr8m37miy0byzr4p9i";
+  };
+  # versions of coq compatible with released mathcomp versions
+  mathcomp-coq-versions = {
+    "1.8.0" = flip elem ["8.7" "8.8" "8.9"];
+    "1.7.0" = flip elem ["8.6" "8.7" "8.8" "8.9"];
+    "1.6.1" = flip elem ["8.5"];
   };
+  # computes the default version of mathcomp given a version of Coq
+  min-mathcomp-version = head (naturalSort (attrNames mathcomp-coq-versions));
+  default-mathcomp-version = last (naturalSort ([min-mathcomp-version]
+     ++ (attrNames (filterAttrs (_: vs: vs coq.coq-version) mathcomp-coq-versions))));
 
-  nativeBuildInputs = stdenv.lib.optionals withDoc [ graphviz ];
-  buildInputs = [ coq ncurses which ] ++ (with coq.ocamlPackages; [ ocaml findlib camlp5 ]);
+  # list of core mathcomp packages sorted by dependency order
+  mathcomp-packages =
+    [ "ssreflect" "fingroup" "algebra" "solvable" "field" "character" "all" ];
+  # compute the dependencies of the core package pkg
+  # (assuming the total ordering above, rewrite if necessary)
+  mathcomp-deps = pkg: if pkg == "single" then [] else
+    (split (x: x == pkg) mathcomp-packages).left;
 
-  enableParallelBuilding = true;
+  # generic split function (TODO: move to lib?)
+  split = pred: l:
+    let loop = v: l: if l == [] then {left = v; right = [];}
+      else let hd = builtins.head l; tl = builtins.tail l; in
+      if pred hd then {left = v; right = tl;} else loop (v ++ [hd]) tl;
+    in loop [] l;
 
-  buildFlags = stdenv.lib.optionalString withDoc "doc";
+  # exported, documented at the end.
+  mathcompGen = mkMathcompGenFrom (_: {}) mathcomp-packages;
 
-  COQBIN = "${coq}/bin/";
+  # exported, documented at the end.
+  mathcompGenSingle = mkMathcompGen (_: {}) "single";
 
-  preBuild = ''
-    patchShebangs etc/utils/ssrcoqdep || true
-    cd mathcomp
-  '';
+  # mkMathcompGen: internal mathcomp package generator
+  # returns {error = ...} if impossible to generate
+  # returns {${mathcomp-pkg} = <derivation>} otherwise
+  mkMathcompGenFrom = o: l: mcv: fold (pkg: pkgs: pkgs // mkMathcompGen o pkg mcv) {} l;
+  mkMathcompGen = overrides: mathcomp-pkg: mathcomp-version:
+    let
+      coq-version-check = mathcomp-coq-versions.${mathcomp-version} or (_: false);
+      pkgpath = {single = "mathcomp";}.${mathcomp-pkg} or "mathcomp/${mathcomp-pkg}";
+      pkgname = {single = "mathcomp";}.${mathcomp-pkg} or "mathcomp-${mathcomp-pkg}";
+      pkgallMake = ''
+      echo "all.v" > Make
+      echo "-I ." >> Make
+      echo "-R . mathcomp.all" >> Make
+      '';
 
-  installPhase = ''
-    make -f Makefile.coq COQLIB=$out/lib/coq/${coq.coq-version}/ install
-  '' + stdenv.lib.optionalString withDoc ''
-    make -f Makefile.coq install-doc DOCDIR=$out/share/coq/${coq.coq-version}/
-  '';
+      # the base set of attributes for mathcomp
+      attrs = rec {
+        name = "coq${coq.coq-version}-${pkgname}-${mathcomp-version}";
 
-  meta = with stdenv.lib; {
-    homepage = http://ssr.msr-inria.inria.fr/;
-    license = licenses.cecill-b;
-    maintainers = [ maintainers.vbgl maintainers.jwiegley ];
-    platforms = coq.meta.platforms;
-  };
+        # used in ssreflect
+        version = mathcomp-version;
 
-  passthru = {
-    compatibleCoqVersions = v: builtins.elem v [ "8.5" "8.6" "8.7" "8.8" "8.9" ];
-  };
+        src = fetchFromGitHub {
+          owner = "math-comp";
+          repo = "math-comp";
+          rev = "mathcomp-${mathcomp-version}";
+          sha256 = mathcomp-sha256.${mathcomp-version};
+        };
+
+        nativeBuildInputs = optionals withDoc [ graphviz ];
+        buildInputs = [ ncurses which ] ++ (with coq.ocamlPackages; [ ocaml findlib camlp5 ]);
+        propagatedBuildInputs = [ coq ] ++
+           attrValues (mkMathcompGenFrom overrides (mathcomp-deps mathcomp-pkg) mathcomp-version);
+        enableParallelBuilding = true;
+
+        buildFlags = optionalString withDoc "doc";
+
+        COQBIN = "${coq}/bin/";
+
+        preBuild = ''
+          patchShebangs etc/utils/ssrcoqdep || true
+          cd ${pkgpath}
+        '' + optionalString (mathcomp-pkg == "all") pkgallMake;
+
+        installPhase = ''
+          make -f Makefile.coq COQLIB=$out/lib/coq/${coq.coq-version}/ install
+        '' + optionalString withDoc ''
+          make -f Makefile.coq install-doc DOCDIR=$out/share/coq/${coq.coq-version}/
+        '';
+
+        meta = with stdenv.lib; {
+          homepage = http://ssr.msr-inria.inria.fr/;
+          license = licenses.cecill-b;
+          maintainers = [ maintainers.vbgl maintainers.jwiegley ];
+          platforms = coq.meta.platforms;
+        };
+
+        passthru = {
+          compatibleCoqVersions = coq-version-check;
+          currentOverrides = overrides;
+          overrideMathcomp = moreOverrides:
+            (mkMathcompGen (old: let new = overrides old; in new // moreOverrides new)
+                          mathcomp-pkg mathcomp-version).${mathcomp-pkg};
+          mathcompGen = moreOverrides:
+            (mkMathcompGenFrom (old: let new = overrides old; in new // moreOverrides new)
+                          mathcomp-packages mathcomp-version);
+        };
+      };
+    in
+    {"${mathcomp-pkg}" = stdenv.mkDerivation (attrs // overrides attrs);};
+
+getAttrOr = a: n: a."${n}" or (throw a.error);
+
+mathcompCorePkgs_1_7 = mathcompGen "1.7.0";
+mathcompCorePkgs_1_8 = mathcompGen "1.8.0";
+mathcompCorePkgs     = recurseIntoAttrs
+  (mapDerivationAttrset dontDistribute (mathcompGen default-mathcomp-version));
+
+in rec {
+# mathcompGenSingle: given a version of mathcomp
+# generates an attribute set {single = <drv>;} with the single mathcomp derivation
+inherit mathcompGenSingle;
+mathcomp_1_7_single = getAttrOr (mathcompGenSingle "1.7.0") "single";
+mathcomp_1_8_single = getAttrOr (mathcompGenSingle "1.8.0") "single";
+mathcomp_single     = dontDistribute
+ (getAttrOr (mathcompGenSingle default-mathcomp-version) "single");
+
+# mathcompGen: given a version of mathcomp
+# generates an attribute set {ssreflect = <drv>; ... character = <drv>; all = <drv>;}.
+# each of these have a special attribute overrideMathcomp which
+# must be used instead of overrideAttrs in order to also fix the dependencies
+inherit mathcompGen mathcompCorePkgs_1_7 mathcompCorePkgs_1_8 mathcompCorePkgs;
+
+mathcomp_1_7 = getAttrOr mathcompCorePkgs_1_7 "all";
+mathcomp_1_8 = getAttrOr mathcompCorePkgs_1_8 "all";
+mathcomp     = getAttrOr mathcompCorePkgs     "all";
+
+ssreflect     = getAttrOr mathcompCorePkgs     "ssreflect";
 
-}
+} //
+(mapAttrs' (n: pkg: {name = "mathcomp-${n}"; value = pkg;}) mathcompCorePkgs) //
+(mapAttrs' (n: pkg: {name = "mathcomp-${n}_1_7"; value = pkg;}) mathcompCorePkgs_1_7) //
+(mapAttrs' (n: pkg: {name = "mathcomp-${n}_1_8"; value = pkg;}) mathcompCorePkgs_1_8)