[Nix-dev] all-packages.nix and the unoverridable self.

Ericson, John john_ericson at brown.edu
Sun May 8 20:58:31 CEST 2016


Nicolas intentionally kept `self` for such aliases as these. See the
security updates PR (https://github.com/NixOS/nixpkgs/pull/10851) for the
reasons why.

On Sun, May 8, 2016 at 10:44 AM, <roconnor at theorem.ca> wrote:

> I haven't heard back from Nicolas yet.
>
> Perhaps I should put together a PR that removes the instances of self that
> I think are wrong so that we can discuss the issue.
>
>
> On Sun, 8 May 2016, Daniel Peebles wrote:
>
> Did you figure this out? I'm curious whether something got messed up in
>> the recent changes.
>>
>> On Mon, May 2, 2016 at 2:23 AM, <roconnor at theorem.ca> wrote:
>>       Something seems wrong / bizzare with the recursion in
>> all-packages.nix
>>
>>       I've been trying to override linux_4_4 in my configuration.nix with
>> the
>>       following:
>>
>>            nixpkgs.config.packageOverrides = super:
>>             { linux_4_4 = super.linux_4_4.override { extraConfig =
>> "CHROME_PLATFORMS y";
>>                                                      kernelPatches = [ {
>> name = "f10_sysrq"; patch = ./f10_sysrq.patch; } ]; };
>>             };
>>
>>       but this no longer works.  I've spent a few hours studying the
>> issue.
>>       If I do the following chain of overrides upto the linuxPackages
>>       attribute
>>
>>            nixpkgs.config.packageOverrides = super: rec
>>             { linux_4_4 = super.linux_4_4.override { extraConfig =
>> "CHROME_PLATFORMS y";
>>                                                      kernelPatches = [ {
>> name = "f10_sysrq"; patch = ./f10_sysrq.patch; } ]; };
>>               linuxPackages_4_4 = super.recurseIntoAttrs
>> (super.linuxPackagesFor
>>               linux_4_4 linuxPackages_4_4);
>>               linuxPackages = linuxPackages_4_4;
>>               linux = linuxPackages.kernel;
>>             };
>>
>>       then it does work.
>>
>>       I couldn't for the life of me understand why copying what is
>> essentially
>>       the exact definitions of linuxPackages_4_4 and linuxPackages into my
>>       packageOverrides caused it to work.  The whole point of the
>>       packageOverride mechanism is to invoke late-binding so that I don't
>> have
>>       to override long chains.
>>
>>       I traced the issue to the following strange set of definitions:
>>
>>       all-packages.nix begins with something like this
>>
>>       { ... }:
>>       self: pkgs:
>>
>>       with pkgs;
>>
>>       { ... }
>>
>>       It is a function of three arguments, (1) a set of parameters, (2) a
>>       binding for self, (3) a binding for pkgs, and the with pkgs; bring
>> all
>>       the definitions from pkgs into scope.
>>
>>       This is called from top-level/default.nix with the following
>>       expression:
>>
>>               allPackages = self: super:
>>                 let res = import ./all-packages.nix allPackagesArgs res
>> self;
>>                 in res;
>>
>>       So allPackageArgs contains the parameters, self gets bound to res,
>> and
>>       pkgs get bound to self.
>>
>>       The upshot of this is that within all-packages.nix self (which is
>> bound
>>       to res) is the result of only evaluating all-packanges *with no
>>       overrides* while pkgs (which is bound to self) ends up late-bound
>> and is
>>       the set of packges *with all overrides*
>>
>>       So when linux and linuxPackages get bound using self in
>> all-packages:
>>
>>           # The current default kernel / kernel modules.
>>           linuxPackages = self.linuxPackages_4_4;
>>           linux = self.linuxPackages.kernel;
>>
>>       The use of self here (and throughout the linuxPackage definitions)
>> means
>>       that we are making reference to the *unoverridden package set*.
>> This is
>>       why my packageOverrides of linux_4_4 did nothing, because the
>> references
>>       to linux_4_4 inn all-packages.nix are prefixed with "self." which
>> means
>>       it always gets the unoverriden packages.
>>
>>       Is this really the desired behaviour?  I think that
>> all-packages.nix is
>>       full of many questionable uses of the "self." prefix.  I suspect
>> that
>>       people don't really understand that "self." means "give me the
>>       unoverriden version of packages".  I think renaming "self" in
>>       all-packages.nix to "unoverridenPackages" would be a better name.
>>
>>       --
>>       Russell O'Connor                                      <
>> http://r6.ca/>
>>       ``All talk about `theft,''' the general counsel of the American
>> Graphophone
>>       Company wrote, ``is the merest claptrap, for there exists no
>> property in
>>       ideas musical, literary or artistic, except as defined by statute.''
>>       _______________________________________________
>>       nix-dev mailing list
>>       nix-dev at lists.science.uu.nl
>>       http://lists.science.uu.nl/mailman/listinfo/nix-dev
>>
>>
>>
>>
>>
> --
> Russell O'Connor                                      <http://r6.ca/>
> ``All talk about `theft,''' the general counsel of the American Graphophone
> Company wrote, ``is the merest claptrap, for there exists no property in
> ideas musical, literary or artistic, except as defined by statute.''
>
> _______________________________________________
> nix-dev mailing list
> nix-dev at lists.science.uu.nl
> http://lists.science.uu.nl/mailman/listinfo/nix-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.science.uu.nl/pipermail/nix-dev/attachments/20160508/f37cc609/attachment.html 


More information about the nix-dev mailing list