. This is expected. When you ran the "guix package -L ~/dotfiles/ -m ~/dotfiles/guix/packages/manifest.scm" command above, that not only built the manifest but also
used the manifest to create a new generation of /home/twashing/.guix-profile.

Ah I see.

. If you run "guix package --list-generations" you should see a list of all of the existing (numbered) generations with the currently active generation marked
(it's typically the last / latest generation, and should be in this case).
. Running "guix package -I" will list the packages in the current generation of your default guix profile,
which should contain the packages in your manifest.

. To go into more details about how profiles work: unless you specify the "-p" argument to "guix package",
it will operate on your default profile when installing or removing packages (including through using manifests with "-m"),
and create a new generation when the set of installed packages changes.

. /home/twashing/.guix-profile is a symlink to /var/guix/profiles/per-user/twashing/guix-profile,
which in turn is a symlink to one of the numbered symlinks in that same /var/guix directory (i.e. if your current generation number is 14, then /var/guix/profiles/per-user/twashing/guix-profile will point to /var/guix/profiles/per-user/twashing/guix-profile-14-link).

. Each of those numbered symlinks points to the actual profile in /gnu/store,
so using that hypothetical generation 14 as the one created by your "guix package -m" command above,
/var/guix/profiles/per-user/twashing/guix-profile-14-link would be a symlink to /gnu/store/sqaz4ff2nshfizfh8ymbzllia6lsgnfv-profile.

This is really useful for my understanding. Thank-you!

But when I restart my machine, the currently installed tools (from "guix package -i foo") are not available on login.
For example, I manually ran "guix package -i tree git". And after restarting my machine, those were no longer available, even though presumably they should have been part of my latest generation.
I do remember trying to load the tools like below. But git and tree were still not available.
". /home/twashing/.guix-profile/etc/profile"

Are tools in generations cumulative?
And how can I load the cumulative sum of all my generations, and any custom profiles I create?

Thanks again
TimĀ 


On Tue, 23 May 2023 at 12:39, Kaelyn <kaelyn.alexi@protonmail.com> wrote:
Hi Tim,

------- Original Message -------
On Monday, May 22nd, 2023 at 8:20 PM, Timothy Washington <twashing@gmail.com> wrote:


> Yes that was it! I added "(native-inputs (list perl python))" to my package definition.
> $ guix build -L ~/dotfiles/ rust-rustscan # A. Now builds again!
> /gnu/store/4bldy27x1f2mzjqg5jd176nrawl98y1y-rust-rustscan-2.1.1
>
> $ guix package -L ~/dotfiles/ -m ~/dotfiles/guix/packages/manifest.scm # B. Now also builds!
> ...
> The following derivation will be built:
> /gnu/store/xll763hpl7mvdkxd3kf8f98pygarzh41-profile.drv
>
> ...
>
> guix package --list-profiles # C. does NOT show the custom profile just built
> /home/twashing/.config/guix/current
> /home/twashing/.guix-profile

This is expected. When you ran the "guix package -L ~/dotfiles/ -m ~/dotfiles/guix/packages/manifest.scm" command above, that not only built the manifest but also used the manifest to create a new generation of /home/twashing/.guix-profile. If you run "guix package --list-generations" you should see a list of all of the existing (numbered) generations with the currently active generation marked (it's typically the last / latest generation, and should be in this case). Running "guix package -I" will list the packages in the current generation of your default guix profile, which should contain the packages in your manifest.

To go into more details about how profiles work: unless you specify the "-p" argument to "guix package", it will operate on your default profile when installing or removing packages (including through using manifests with "-m"), and create a new generation when the set of installed packages changes. /home/twashing/.guix-profile is a symlink to /var/guix/profiles/per-user/twashing/guix-profile, which in turn is a symlink to one of the numbered symlinks in that same /var/guix directory (i.e. if your current generation number is 14, then /var/guix/profiles/per-user/twashing/guix-profile will point to /var/guix/profiles/per-user/twashing/guix-profile-14-link). Each of those numbered symlinks points to the actual profile in /gnu/store, so using that hypothetical generation 14 as the one created by your "guix package -m" command above, /var/guix/profiles/per-user/twashing/guix-profile-14-link would be a symlink to /gnu/store/sqaz4ff2nshfizfh8ymbzllia6lsgnfv-profile.

>
>
> cat /gnu/store/xll763hpl7mvdkxd3kf8f98pygarzh41-profile.drv # D. DOES show the new profile in /gnu/store
> Derive([("out","/gnu/store/sqaz4ff2nshfizfh8ymbzllia6lsgnfv-profile","","")], ... ("out","/gnu/store/sqaz4ff2nshfizfh8ymbzllia6lsgnfv-profile"),("preferLocalBuild","1")])
>
>
> i. Using a direct "guix build" gives you a directory in "/gnu/store". And you can add that bin to your PATH.

This is fragile and will work only as long as the package exists under /gnu/store. Which is to say, this method will break as soon as "guix gc" is run unless the package happens to be "live" as a member or dependency of any existing generation of the system profile or other profiles (the profile generation symlinks like the guix-profile-14-link mentioned above are the garbage collector roots for guix, as can be seen with "guix gc --list-roots").

> ii. But for "/gnu/store/*-profile/", would you just loop over those profile directories, and run each "/gnu/store/*-profile/etc/profile"?

This is a very bad idea, as many or most of those "/gnu/store/*-profile" directories are different generations of the same profile, and sourcing them all would result in many conflicts and other troubles, including having unpredictable and likely outdated versions of commands being picked up before newer counterparts.

Cheers,
Kaelyn