1
0
Fork 1
mirror of https://github.com/NixOS/nixpkgs.git synced 2024-11-22 13:41:26 +00:00

ocamlPackages.janeStreet{,_0_9_0}: join the ocamlPackages fix point, allowing overriding to work as expected (#113696)

* ocamlPackages.janeStreet_0_9_0: join the ocamlPackages fix point

Internal dependencies in the janeStreet sets were always taken from the
own rec attribute set. While this is pretty simple and convenient, it
has the disadvantage that it doesn't play nice with overriding: If you'd
override an attribute in a janeStreet set previously, it would be
changed when referenced directly, but the other packages in that
janeStreet set still would use the original, non-overridden version of
the derivation.

This is easily fixed by passing janeStreet_0_9_0 itself from the fix
point of ocamlPackages and using it to reference the dependencies.

Example showing it now works as expected:

test-overlay.nix:

    self: super: {
      ocamlPackages = super.ocamlPackages.overrideScope (old: _: {
        janeStreet_0_9_0 = old.janeStreet_0_9_0 // {
          base = old.janeStreet_0_9_0.base.overrideAttrs (_: {
            meta.broken = true;
          });
        };
      });
    }

nix-repl> (import ./. {
  overlays = [ (import ./test-overlay.nix) ];
}).ocamlPackages.janeStreet_0_9_0.stdio

error: Package ‘ocaml4.10.0-base-0.9.4’ in /home/lukas/src/nix/nixpkgs/pkgs/development/ocaml-modules/janestreet/janePackage.nix:6 is marked as broken, refusing to evaluate.

a) To temporarily allow broken packages, you can use an environment variable
   for a single invocation of the nix tools.

     $ export NIXPKGS_ALLOW_BROKEN=1

b) For `nixos-rebuild` you can set
  { nixpkgs.config.allowBroken = true; }
in configuration.nix to override this.

c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
  { allowBroken = true; }
to ~/.config/nixpkgs/config.nix.

* ocamlPackages.janeStreet: take part in fixpoint for OCaml >= 4.08

This change makes overrides to the janeStreet set work as expected by
making the janeStreet set take part in the ocamlPackages fixpoint for
janeStreet 0.14, i. e. OCaml >= 4.08

* ocamlPackages.janeStreet: take part in fixpoint for OCaml == 4.07

This change makes overrides to the janeStreet set work as expected by
making the janeStreet set take part in the ocamlPackages fixpoint for
janeStreet 0.12, i. e. OCaml == 4.07

* ocamlPackages.janeStreet: take part in fixpoint for OCaml < 4.07

This change makes overrides to the janeStreet set work as expected by
making the janeStreet set take part in the ocamlPackages fixpoint for
janeStreet 0.11, i. e. OCaml < 4.07

* ocamlPackages.janeStreet: remove self - super distinction

Previously, we inherited non-janestreet ocaml dependencies from super
and janestreet dependencies from self which always was super.janeStreet.

This behavior is however not really what we want due to liftJaneStreet:
Users and other packages will use ocamlPackages.base etc. instead of
ocamlPackages.janeStreet.base and the like. Consequently they also would
override the top-level attributes which would mean that other janestreet
packages would not pick up on it however.

As a consequence however, overriding ocamlPackages.janeStreet.base
doesn't work. Since this was never possible, I don't think this is an
issue. It is probably a good idea to deprecate that set anyways and
printing a warning when it is used via trace.

janeStreet_0_9_0 is unchanged as the disticniton between self and super
makes sense for it.

Below is an example showing how overriding would work from an user's
perspective:

test-overlay.nix:

    self: super: {
      ocamlPackages = super.ocamlPackages.overrideScope (old: _: {
        base = old.base.overrideAttrs (_: {
          meta.broken = true;
        });
      });
    }

nix-repl> (import ./. { overlays = [ (import ./test-overlay.nix) ]; }).ocamlPackages.
stdio
error: Package ‘ocaml4.10.0-base-0.14.0’ in /home/lukas/src/nix/nixpkgs/pkgs/development/ocaml-modules/janestreet/janePackage_0_14.nix:12 is marked as broken, refusing to evaluate.

a) To temporarily allow broken packages, you can use an environment variable
   for a single invocation of the nix tools.

     $ export NIXPKGS_ALLOW_BROKEN=1

b) For `nixos-rebuild` you can set
  { nixpkgs.config.allowBroken = true; }
in configuration.nix to override this.

c) For `nix-env`, `nix-build`, `nix-shell` or any other Nix command you can add
  { allowBroken = true; }
to ~/.config/nixpkgs/config.nix.
This commit is contained in:
sterni 2021-04-11 12:26:10 +02:00 committed by GitHub
parent 441f0c894a
commit 2140791f9b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 54 deletions

View file

@ -1,13 +1,10 @@
{ janePackage
, ctypes
, num
, octavius
, ppxlib
, re
{ self
, openssl
}:
rec {
with self;
{
ocaml-compiler-libs = janePackage {
pname = "ocaml-compiler-libs";

View file

@ -1,30 +1,11 @@
{ janePackage
, alcotest
, angstrom
, angstrom-async
, base64
, cryptokit
, ctypes
, dune-configurator
, faraday
, inotify
, js_of_ocaml
, js_of_ocaml-ppx
, lambdasoup
, magic-mime
, num
, octavius
, ppxlib
, re
, tyxml
, uri-sexp
, zarith
{ self
, openssl
, ounit
, zstd
}:
rec {
with self;
{
accessor = janePackage {
pname = "accessor";

View file

@ -1,10 +1,10 @@
{ janePackage, ocamlbuild, angstrom, cryptokit, ctypes,
magic-mime, ocaml-migrate-parsetree, octavius, ounit, ppx_deriving, re,
num, openssl
, ppxlib
{ self
, openssl
}:
rec {
with self;
{
ocaml-compiler-libs = janePackage {
pname = "ocaml-compiler-libs";

View file

@ -1,8 +1,32 @@
{ stdenv, lib, janePackage, ocaml, ocamlbuild, cryptokit, ctypes, magic-mime,
ocaml-migrate-parsetree, octavius, ounit, ppx_deriving, re, zarith, num,
openssl }:
{ self
, super
, lib
, stdenv
, openssl
}:
rec {
let
inherit (super)
janePackage
ocaml
ocamlbuild
cryptokit
ctypes
magic-mime
ocaml-migrate-parsetree
octavius
ounit
ppx_deriving
re
zarith
num
;
in
with self;
{
# Jane Street packages, up to ppx_core

View file

@ -1255,32 +1255,31 @@ let
janeStreet =
if lib.versionOlder "4.08" ocaml.version
then import ../development/ocaml-modules/janestreet/0.14.nix {
inherit alcotest angstrom angstrom-async base64 cryptokit ctypes
dune-configurator faraday inotify janePackage js_of_ocaml
js_of_ocaml-ppx lambdasoup magic-mime num octavius ounit
ppxlib re tyxml uri-sexp zarith;
inherit self;
inherit (pkgs) openssl zstd;
}
else if lib.versionOlder "4.07" ocaml.version
then import ../development/ocaml-modules/janestreet/0.12.nix {
inherit ctypes janePackage num octavius re;
self = self // {
ppxlib = ppxlib.override { version = "0.8.1"; };
};
inherit (pkgs) openssl;
ppxlib = ppxlib.override { version = "0.8.1"; };
}
else import ../development/ocaml-modules/janestreet {
inherit janePackage ocamlbuild angstrom ctypes cryptokit;
inherit magic-mime num ocaml-migrate-parsetree octavius ounit;
inherit ppx_deriving re;
self = self // {
ppxlib = ppxlib.override { version = "0.8.1"; };
};
inherit (pkgs) openssl;
ppxlib = ppxlib.override { version = "0.8.1"; };
};
janeStreet_0_9_0 = import ../development/ocaml-modules/janestreet/old.nix {
janePackage = callPackage ../development/ocaml-modules/janestreet/janePackage.nix { defaultVersion = "0.9.0"; };
inherit lib ocaml ocamlbuild ctypes cryptokit;
inherit magic-mime num ocaml-migrate-parsetree octavius ounit;
inherit ppx_deriving re zarith;
inherit (pkgs) stdenv openssl;
self = self.janeStreet_0_9_0;
super = self // {
janePackage = callPackage ../development/ocaml-modules/janestreet/janePackage.nix {
defaultVersion = "0.9.0";
};
};
inherit (pkgs) stdenv lib openssl;
};
js_build_tools = callPackage ../development/ocaml-modules/janestreet/js-build-tools.nix {};