[Nix-dev] Replace default gcc through overlays?

Mateusz Czaplinski czapkofan at gmail.com
Mon May 29 23:39:50 CEST 2017


Hi,

Thanks for the response! Though I must admit it's quite... dense for me
still, being a Nix noob... thus I'll let myself follow up with some more
questions, as I'm desperately trying to wrap my head around the stuff...

So, first of all, regarding bootstrapping: I'm afraid I'm not yet really
sure what it means in Nix/NixOS. I get it that it's apparently not related
to what's usually understood as "OS bootstrapping" (i.e. bootstrap loader,
GRUB, etc.) - or is it? But apart from what it's *not*, I'm not really sure
what it actually *is* yet. So, when looking at the question: "If you have
to replace the early stages of the bootstrapping" - as of now I can only
answer: uhmmm, do I? :/ Can someone please help me understand how can I
recognize if I have to [replace gcc in the early stages of bootstrapping]
here, or not? :/

As to the second paragraph, I'm afraid I'm now even more confused... the
first para mentions "the overlay system doesn't allow to [replace gcc] in
early stages of bootstrapping"; but then the second para mentions: "overlay
should help you [...] by replacing [...] all the packages used by
bootstrapping". So, does it mean that an overlay cannot replace gcc while
bootstrapping, but can replace other packages? Or does this mean something
else? There's probably some nuance I cannot grasp at work here?...

To explain myself a bit as to why I'm asking about overlays at all, my
question originally was kind of a wild shot that maybe when building my
"l4linux.nix" standalone expression, which I usually would start as:
```nix
with import <nixpkgs> {};
# ...
```
I could maybe replace the gcc in the <nixpkgs> by doing something like:
```nix
with import <nixpkgs> { overlays = { gcc =
.../*somehow-gcc6-with-patch*/...; }; };
# ...
```
and this way benefit from reusing various intermediate stuff already
defined in <nixpkgs>. But I think I'm slowly starting to come to terms with
an intuition, that probably maybe forking <nixpkgs> may be an easier and
more straightforward way for me to start with. Trying to refactor this to a
standalone Nix expression may be possibly better left for me as a follow up
goal, once I have the stuff done the uglier but simpler way.

Other than that, I'll certainly try to analyze the sources at the provided
links, and try to find out if I can understand more from them. Thanks!

/Mateusz.

On Fri, May 26, 2017 at 1:29 PM, Nicolas Pierron <nicolas.b.pierron at nbp.name
> wrote:

> Hi,
>
> You can indeed replace gcc by a newer version of it, but the overlay
> system does not allow you to do so inside the early stages of the
> bootstrapping.  If you have to replace the early stages of the
> bootstrapping, then I suggest you look at `pkgs/stdenv/default.nix`
> and `pkgs/stdenv/linux/default.nix` and give it as argument of
> `pkgs/top-level/default.nix` which is currently loading this file to
> bootstrap the standard environment.
>
> Otherwise, an overlay should help you with what you are looking for by
> replacing the `stdenv` attribute as well as all the packages used for
> bootstrapping.  You have to replace these packages as well because you
> would otherwise have an inifnite loop as you try to add the new
> compiler to the stdenv, which would be needed for compiling the
> compiler it-self, due to `callPackage` taking stdenv from `self.`
>
> ```nix
> self: super:
>
> let
>   ...
>   stdenv = super.stdenvAdapters.overrideCC super.stdenv ...; # see [1]
> in
>
> { inherit stdenv; } // stdenv.overrides self super
> ```
>
> I did something similar a while ago, to use an old version of gcc, in
> order to reproduce a bug which was on a different CI.  You can find
> the detail here[1].
> Note that, you might have to override the stdenv argument (and maybe
> others) used for building the compiler:
>
> ```nix
> cc.override { stdenv = super.stdenv }
> ```
>
> In addition to changing the source of the derivation, otherwise you
> might have an infinite loop, as the compiler is by default compiled
> with the `callPackage` function which takes its inputs from the result
> of the fix-point, which is not what you want here for bootstrapping
> this new stdenv for every packages.
>
> About making it a cross compiler, I do not know enough, but I can only
> give you some pointers to `makeStdenvCross` stdenv adapter
> function[2].
>
> I have not tested this for replacing the stdenv globally, but I think
> this will bring you closer to the final solution.
> Good luck.
>
> [1] https://github.com/mozilla/nixpkgs-mozilla/blob/master/release.nix#L96
> [2] https://github.com/NixOS/nixpkgs/blob/master/pkgs/
> stdenv/adapters.nix#L59
>
>
> On Wed, May 24, 2017 at 12:15 AM, Mateusz Czaplinski
> <czapkofan at gmail.com> wrote:
> > I'm writing a local (non-nixpkgs) derivation, and I'd like to replace the
> > default "gcc" to be a patched gcc6 - also for all implicit dependencies
> in
> > nixpkgs. Is it possible to do that (I assume via overlays and resulting
> > fixpoint)? If yes, how should I write this to work?
> >
> > For background: I want to cross-compile the Linux kernel (actually, a
> fork -
> > L4Linux) to a new target platform. But setting `crossSystem` seems to
> > trigger rebuilding of gcc, which crashes on me because of OOM killer on
> > genattrtab. This I believe could be mitigated by a Nov'2016 patch to gcc
> > (https://patchwork.ozlabs.org/patch/695293/), so I believe I need to
> have it
> > incorporated into default gcc. This I hope would let me overcome the
> "out of
> > memory" obstacle, so that I could go back to hacking on my main task...
> >
> > When fixing this, I would much prefer not to have to fork whole nixpkgs,
> if
> > feasible. I suppose maintaining a nixpkgs fork is harder, and also
> sharing
> > sounds not so simple then as in the basic case of a single .nix file?
> >
> > I'd be grateful for any help.
> > Thanks,
> > /Mateusz.
> >
> > _______________________________________________
> > nix-dev mailing list
> > nix-dev at lists.science.uu.nl
> > https://mailman.science.uu.nl/mailman/listinfo/nix-dev
> >
>
>
>
> --
> Nicolas Pierron
> http://www.linkedin.com/in/nicolasbpierron - http://nbp.name/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.science.uu.nl/pipermail/nix-dev/attachments/20170529/8c882eb8/attachment.html>


More information about the nix-dev mailing list