On 30/06/16 20:18, Alex Berg wrote:
I created a new "~/.nixpkgs/config.nix" file to customize the
nix-channel-obtained nixpkgs copy on my system - my goal was to bump
the version of Vim to a specific version.
My first attempt was to override the derivation and simply set the
"version" attribute, like this:
{
packageOverrides = pkgs: rec {
vim = pkgs.vim.overrideDerivation (oldAttrs: {
version = "7.4.1941";
});
};
}
But this had zero effect on the name of Vim I saw when using "nix-env
-qaP" to see package details. The Vim package's definition has the
"name" attribute defined like this:
name = "vim-${version}";
version = "7.4.1585";
so I expected my overriding the "version" attribute to affect the
package's name, but it did not.
No, because the definition above relies on the "rec" keyword, but "rec"
has already been applied /before/ overrideDerivation.
Overriding "version" will not override "name", and in turn will not
override "src".
In fact, overriding "version" will have no impact on the output path as
that parameter is not used by mkDerivation.
But the attribute is overriden. ` nix-instantiate "<nixpkgs>" --eval -A
vim.version ` will give you the new version string.
Overriding "name", for example, will have impact as it is used by
mkDerivation to compute the output path.
Again, it is not sufficient to build a different version of vim. See below.
After asking the #nixos IRC channel, one person suggested the
"version" attribute isn't overridable because it isn't an attribute
the *primitive derivation* set. Based on this guess, I changed my
~/.nixpkgs/config.nix definition from that to this:
let
vim-version = "7.4.1941";
in
{
packageOverrides = pkgs: rec {
vim = pkgs.vim.overrideDerivation (oldAttrs: {
name = "vim-${vim-version}";
src = pkgs.fetchFromGitHub {
owner = "vim";
repo = "vim";
rev = "v${vim-version}";
sha256 = "0apq7sv1fbyfzqh4q0r2z19bn4gbjlb97wyl80kj7qsqmsy7m1lm";
};
});
};
}
My guess is this works because I'm overriding the "name" attribute.
No, it works because you override the "src" attribute.
src is used by mkDerivation, so overriding modifies the package to be
built with the new source tree.
Overriding the name is not strictly necessary, but is a *very* good
practice, as otherwise you would get a 7.4.1941 vim with the old version
in the name... confusing :-)
I read the definition of the "mkDerivation" function
(pkgs/stdenv/generic/default.nix), but it doesn't have a simple list
of attributes that are overridable, but is rather flexible. Also, that
definition doesn't mention a "src" attribute, but "src" attribute is
overridable, so I wonder why overriding the "src" attribute works.
Where can I find explanation for this? If there is a restriction on
which attributes are overridable, then I'd like to note this in the
NixPkgs manual, here:
https://nixos.org/nixpkgs/manual/index.html#sec-pkg-overrideDerivation
Everything is overridable separately, but you cannot count on the rec
keyword at override time.
Every attribute already has a fully defined value.
_______________________________________________
nix-dev mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-dev
_______________________________________________
nix-dev mailing list
[email protected]
http://lists.science.uu.nl/mailman/listinfo/nix-dev