From b71c308591e1bfc3708c31dc1a94fcae636b5557 Mon Sep 17 00:00:00 2001 From: Cyril Cohen Date: Tue, 9 Apr 2019 19:21:57 +0200 Subject: coqPackages: refactor mathcomp packages Closes #61456 --- pkgs/development/coq-modules/mathcomp/default.nix | 194 +++++++++++++++------- 1 file changed, 135 insertions(+), 59 deletions(-) (limited to 'pkgs/development/coq-modules/mathcomp/default.nix') 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} = } 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 = ;} 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 = ; ... character = ; all = ;}. +# 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) -- cgit 1.4.1