guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Howto reference a custom package from a manifest


From: Kaelyn
Subject: Re: Howto reference a custom package from a manifest
Date: Wed, 24 May 2023 22:16:54 +0000

------- Original Message -------
On Wednesday, May 24th, 2023 at 8:25 PM, Timothy Washington 
<twashing@gmail.com> wrote:


> . 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?

They are when installed or removed via "guix package -i" and "guix package -r". 
Updating your profile using a manifest is not cumulative--the new generation of 
your profile will have exactly the set of packages in the manifest. You can 
then use "guix package -i" and "guix package -r" to modify the installed set, 
but the set will be reset if/when "guix package -m my-manifest.scm" is run.

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

The most reproducible way to maintain the set of packages in your default 
profile is to include them in your manifest (e.g. adding git and tree to the 
list of packages included in the manifest, then running "guix package -m 
your-manifest.scm" again). The generations of a profile are like git commits or 
filesystem snapshots in that they represent the profile at different points in 
time, and they aren't really meant to be composed together. If you'd like to 
maintain separate profiles for different sets of packages or groups of 
functionality instead of installing all the things you need in your default 
profile, I might recommend taking a look at the Guix Cookbook, in particular 
https://guix.gnu.org/cookbook/en/html_node/Guix-Profiles-in-Practice.html.

On a different tack, if you have no issue with installing all of the packages 
you need in a single profile using a manifest, and you'd like a way of managing 
at least some of your home configuration (shell aliases, simple config files, 
etc), there is also "guix home" for a declarative way of specify those pieces: 
https://guix.gnu.org/en/manual/devel/en/html_node/Home-Configuration.html. In a 
manner of speaking, it is to your home directory what "guix system" is to the 
OS when booting Guix.

Cheers,
Kaelyn

> 
> Thanks againTim
> 
> 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]