[HN Gopher] Hacking anything with GNU Guix
       ___________________________________________________________________
        
       Hacking anything with GNU Guix
        
       Author : podiki
       Score  : 224 points
       Date   : 2022-09-21 15:47 UTC (7 hours ago)
        
 (HTM) web link (gexp.no)
 (TXT) w3m dump (gexp.no)
        
       | davexunit wrote:
       | 'guix shell' is killer. I use it for all my projects and one-off
       | experiments. I also hook it up to Emacs 'M-x compile' so that
       | compilation happens in the context of the guix shell. Beyond the
       | simple command line package specification, you can add a guix.scm
       | file to the root of your project repo and fill it with code that
       | specifies all the packages needed for a development environment.
       | Some of my guix.scm files are simple lists of existing packages,
       | others are full of custom code to modify existing packages or
       | define new ones. No matter how simple or complex it is behind the
       | scenes, I just run 'guix shell' and get on with working on my
       | project.
        
         | daptaq wrote:
         | You might be interested in buffer-env, it can automatically
         | load an environment on a buffer-to-buffer basis and make it
         | appear as though it were globally installed. No manual "guix
         | shell ... -- ..." calls needed.
        
           | davexunit wrote:
           | Thanks, I've been meaning to check it out, so long as I can
           | integrate guix shell with it.
        
           | dman wrote:
           | Could you elaborate a bit on how this works? Am a longtime
           | emacs user and very motivated to get this working!
        
         | dman wrote:
         | Any pointers to your setup?
        
       | genpfault wrote:
       | ...except KDE[1]:
       | 
       | > GNOME, Xfce, LXDE, and Enlightenment are available (see Desktop
       | Services), as well as a number of X11 window managers. However,
       | KDE is currently missing.
       | 
       | [1]: https://guix.gnu.org/manual/en/html_node/Limitations.html
        
       | bogwog wrote:
       | I had an idea recently to try out Fedora silverblue with Guix on
       | top.
       | 
       | Silverblue gives you an immutable root filesystem, which is great
       | for building a reliable and reproducible system, but it makes
       | installing software more complicated. Containers are the main
       | solution, and stuff like flatpaks and toolbox. That (mostly)
       | works, but it's a bit heavy handed and not without annoyances.
       | 
       | But with guix, your packages live in the guix store, and don't
       | touch your os packages. So that seems like a good way to manage
       | software on top of an immutable OS.
       | 
       | Unfortunately when I went to try it out, I learned that the only
       | way to change the default location of the guix store (since
       | /gnu/store won't work in silverblue, and Guix isn't available as
       | a package for fedora) is to build it from source... and then I
       | ran into some build issues when trying to do that and gave up.
       | 
       | ...So maybe someone less lazy than I will pull it off and report
       | back whether it's actually a good idea or not!
        
         | Infernal wrote:
         | I'm downloading the silverblue iso right now to play with this
         | in a VM. It is surprising to me that ostree does not let you do
         | any sort of bind mount or symlink of a non-reserved location
         | like /gnu to some other filesystem, so I'll have a whack at it.
        
           | bogwog wrote:
           | > It is surprising to me that ostree does not let you do any
           | sort of bind mount or symlink of a non-reserved location like
           | /gnu to some other filesystem, so I'll have a whack at it.
           | 
           | ...Well, it might. I actually had zero experience with both
           | ostree/silverblue and guix when I tried doing this, and may
           | have made some hasty assumptions.
           | 
           | EDIT: I do know however that guix doesn't work if the store
           | is a symlink. I tried doing that a while back and it didn't
           | work.
        
           | Infernal wrote:
           | So you can create /gnu/store on Silverblue with the commands
           | (as root)                 chattr -i /       mkdir -p
           | /gnu/store       chattr +i /
           | 
           | The last command restores the immutable attribute on the root
           | filesystem. I am able to write arbitrary files (e.g. `touch
           | /gnu/store/test`) even with that attribute set, so it isn't
           | inherited by subdirectories (maybe obvious).
           | 
           | Now, persistence of the /gnu/store data could be an issue,
           | I'm not sure, but maybe this gets you started?
           | 
           | EDIT: next step is to get Guix installed and then try to
           | update the system, we shall see how it goes
        
             | Infernal wrote:
             | So, having removed the immutable attribute from / and run
             | the guix-install.sh script, the first issue I have is that
             | the script thinks the group 'kvm' exists, because 'getent
             | group kvm' returns successfully. However, if you try to
             | create a user and add them to the kvm group, you get an
             | error about the group not existing. Looking at the contents
             | of /etc/group, there are only 5 groups and none of them are
             | 'kvm'. At the very least it seems that the Guix install
             | script is making some assumptions about the system that
             | Silverblue breaks, which does make me wonder a bit about
             | using the two side by side.
             | 
             | Additionally, I have found some posts as far back as 2017
             | regarding using Guix or Nix on Fedora Atomic Linux or
             | Fedora Container Linux (it seems the Silverblue name is
             | more recent) and the fact that we're still puzzling it out
             | 5 years later without much in the way of documented success
             | does make me question the viability of the idea a bit.
        
             | bogwog wrote:
             | I just tried doing that to create the bind mount at
             | /gnu/store via fstab, and it disappeared on reboot (and
             | threw me into an emergency console). Removing the fstab
             | line allowed me to boot normally again.
             | 
             | I think the solution will require using systemd to recreate
             | that folder on boot, and do it early enough to not make the
             | system panic like that.
             | 
             | Maybe that's a bad idea, I don't know enough about
             | ostree/silverblue. However, after some more digging it
             | seems like this solution would be preferable to changing
             | the default guix store with a custom build, since doing
             | that means you can't use any of the pre-compiled binary
             | packages from the official guix servers.
        
           | yjftsjthsd-h wrote:
           | Wouldn't that require that the mountpoint exists in the
           | underlying filesystem? That is, you can't create a /gnu
           | directory to mount into if root is read-only
           | 
           | EDIT: Or is the filesystem not literally read-only? Sibling
           | comment seems to imply that it's just chattr +I'd
        
             | bogwog wrote:
             | I just tried it, and the folder created via chattr
             | disappered after rebooting. So it seems like there's more
             | to it.
        
         | colordrops wrote:
         | What does silverblue give you on top of what Guix and Nix
         | already provide?
        
           | bogwog wrote:
           | In Guix's case, a working desktop with wayland + proprietary
           | Nvidia drivers. (I'm actually using Kinoite, which is the KDE
           | spin of silverblue)
           | 
           | I could install Guix on top of something like Ubuntu or
           | Fedora workstation for the same effect, but then I'll have
           | two system package managers side by side, which is pointless
           | and probably error prone.
        
             | von_lohengramm wrote:
             | You can do that with NixOS trivially.
        
               | rekado wrote:
               | And of course with Guix System. (odd to always see Nix*
               | mentioned when someone talks about Guix.)
        
               | striking wrote:
               | Comparing https://wiki.systemcrafters.cc/guix/nvidia/
               | with https://nixos.wiki/wiki/Nvidia makes me think that
               | in _this specific case_ there 's a difference.
        
               | pxc wrote:
               | A question for nonguix contributors, including OP: is
               | there a reason that nonguix has an nvidia package but not
               | an nvidia service that handles more of this in a
               | streamlined way, even just some stuff copied and pasted
               | from this wiki?
        
               | RaitoBezarius wrote:
               | Well, Guix is also mentioned when someone talks about
               | Nix, seems fair to me (and of course, Guix may be more
               | relevant sometimes!).
        
           | pxc wrote:
           | An FHS base system that still gives you some the nice
           | features of Nix and Guix, like immutability and rollbacks.
           | 
           | In theory something like it could be a giant escape hatch so
           | that if you run into Guix packaging difficulties for some
           | software that, e.g., tries to fetch from the internet at
           | runtime, you can just build with autoconf and make.
           | Silverblue might be quirky enough that it has its own hiccups
           | though, idk.
        
         | podiki wrote:
         | Not on Silverblue but I've used a bindmount to have /gnu/store
         | elsewhere (due to disk space on a laptop). I can dig up some
         | notes if that is helpful.
        
           | bogwog wrote:
           | I didn't think to try doing a bind mount, so that might
           | actually work. I'll need to try it again at some point!
        
         | pca006132 wrote:
         | Not sure about guix, but for nixos we have
         | https://github.com/nix-community/nix-user-chroot
        
         | [deleted]
        
         | [deleted]
        
       | kqbx wrote:
       | > PYTHONPATH, CPATH, etc are all set up and ready to go.
       | 
       | Does that mean that Guix just exports the required environment
       | variables in the shell rather than wrapping each executable with
       | a bash script [1] like nix does?
       | 
       | If yes, that's great, because the wrapper approach feels like an
       | ugly hack. I found some executables on my nixos installation that
       | are behind _three_ layers of wrappers, and that 's probably not
       | the maximum.
       | 
       | I guess nix could improve this situation by making `wrapProgram`
       | smarter (if the executable to be wrapped is already a wrapper,
       | merge the inner and outer wrapper), but even single-layer
       | wrappers are annoying, and I imagine they have some performance
       | impact.
       | 
       | EDIT:
       | 
       | I forgot about nix-shell, which does actually export the right
       | environment variables directly to the shell.
       | 
       | [1] https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-
       | supp...
        
         | pxc wrote:
         | Does nix-shell/`nix develop` use makeWrapper?
        
           | kqbx wrote:
           | Thank you, I totally forgot how nix-shell works. You're
           | right, it should export the right env variables without
           | makeWrapper.
           | 
           | I haven't used nixos in a while and I got confused about this
           | because to install python packages _globally_ I used
           | `python3.withPackages` and that does use the wrappers.
        
         | yyyk2 wrote:
         | Guix has a mechanism called search-paths which is defined for
         | any package like Python that searches for things based on
         | envars; it exports the relevant search paths into the
         | environment. Though it also has shell wrappers, which are
         | essentially a hack around non-propagating dependencies: it
         | allows you to expose things that would normally be visible to
         | everyone, like executables, to just the specific program.
        
       | zelphirkalt wrote:
       | Plus: You can make it all reproducible using `guix time-machine`.
        
       | hedora wrote:
       | Can anyone comment on how this compares to apt-get source?
       | (Optionally run inside docker?)
        
         | daptaq wrote:
         | AFAIK that won't install all the necessary dependencies, right?
         | And even if it does, these are installed globally. Guix shell
         | will only make the dependencies visible while the shell is
         | active, and "hide" them again as soon as the process
         | terminates.
        
         | pxc wrote:
         | It's more like `apt build-dep`, but you don't install all the
         | development libraries and headers to your system in a global,
         | persistent way. Instead you just make them available for that
         | shell session.
         | 
         | It's likely a lot smaller than a Docker container that contains
         | a whole Ubuntu runtime, and it'll automatically share a cache
         | of deoendencies with any Guix packaged you may have installed
         | locally. It also has normal/native access to your filesystem
         | (and thus your dotfiles and your homedir), since it doesn't
         | live in a container.
        
         | podiki wrote:
         | Not an apt user but my quick search suggests this just
         | downloads the source of the package? The guix shell
         | --development command in this article is for getting all the
         | dependencies needed to build the package (but not the source
         | itself, though you can do that through other guix commands I
         | believe). In other words, with guix shell you can now run make
         | or whatever you need to build the package in question, without
         | needing to fetch the development tools, other libraries, set
         | env variables, etc.
         | 
         | Edit: for the source of a package guix build --source
         | thepackage will return the path to the source (as stored in the
         | store). This includes any patches or transformations (e.g. you
         | can pass patches to be included or a git/branch/commit location
         | to pull the source from instead of what is defined in the
         | package definition)
        
       | pizza wrote:
       | The article is about having the correct environment set up -
       | attacking the problem from the environment level.
       | 
       | When I think of "hacking code you didn't write" one of the
       | biggest hurdles for me is "inserting my changes to the behavior
       | of the code with minimal refactoring of the original" - attacking
       | the problem from, perhaps, compiler instrumentation level.
       | 
       | e.g. suppose when I use some library function f, there is a
       | deeply nested function, g, that has access to some data x, which
       | is cleaned up somewhere before the API returns its result.
       | 
       | How do I tell my compiler "I want a new function h, which, when
       | given the same arguments as f, returns x, by returning from
       | within g" ?
        
         | LanternLight83 wrote:
         | This problem is trivial within emacs thanks to the advice
         | system, and something I've always missed in literally any other
         | programming environment. In Guile, I bet `(parameterize)` could
         | be used to similar ends, but you don't get to choose the
         | language of every project you hack on.
        
       | retzkek wrote:
       | It should be pointed out that "guix shell" is currently only
       | available in the unstable "latest" version, not the stable
       | "standard" release (v1.3.0). If you are running an older version,
       | "guix environment" is similar.
       | 
       | https://guix.gnu.org/manual/devel/en/html_node/Invoking-guix...
       | 
       | https://guix.gnu.org/en/manual/en/html_node/Invoking-guix-en...
        
       | podiki wrote:
       | Another great use of guix shell that I tend to do is for one off
       | commands. I don't need OBS installed to use it occasionally, I
       | can just do "guix shell obs -- obs" to run it once and not have
       | it in my PATH, application launcher, etc. when I don't need it.
       | Or better yet for running python or CL scripts, with something
       | like 'guix shell python [python packages] -- python3 myscript.py
       | "some argument"'. No need to carry around these libraries. This
       | can be done with a manifest or guix.scm file as well, that guix
       | shell will use automatically (once authorized, so you don't
       | accidentally run something).
       | 
       | This keeps things tidy in terms of just having packages I need
       | all the time installed, while still being very quick after the
       | first run. (There are some caveats about garbage collection, but
       | I rarely do that.)
       | 
       | And as the article mentioned there's also containers...lots of
       | useful tools.
        
       | chubot wrote:
       | I had a couple people attempt this for the dev environment of
       | https://www.oilshell.org/ with Nix, and it wasn't entirely
       | successful. (Not Guix, but my understanding is that Guix would
       | have the same issues)
       | 
       | As background, we've long had a set of evolving shell scripts
       | that fetch and build dependencies at specific versions -- like
       | bash/dash/zsh/mksh/busybox to test against, re2c to generate
       | code, CommonMark, Python 3.10, MyPy with pip dependencies, and
       | (bonus) R with CRAN dependencies.
       | 
       | I wrote about 2 problems here:
       | https://lobste.rs/s/s5co2f/where_contributors_have_problems_...
       | 
       | 1. OS X and libc, which is not really a problem since our
       | existing scripts don't solve it either. It was just one
       | motivation for Nix that didn't quite work out.
       | 
       | 2. The file system layout becomes different, and Oil's shell
       | tests rely on that. So containers ended up being easier. The
       | whole build and test system runs in OCI containers under Docker
       | and podman now, so it's pretty reproducible and automated.
       | 
       | But I still think it would be nice if someone who actually knows
       | Nix and Guix (unlike me) tries again. The dependencies are more
       | stable now than 2 years ago.
       | 
       | I think you have to write like 10 Nix or Guix expressions from
       | scratch with the exact tarballs that we use. (Otherwise the tests
       | will break even more, because Oil's tests are extremely detailed
       | and find bugs in specific versions of specific shells.)
       | 
       | Right now we have a 134 line shell.nix that tries to reuse Oil's
       | scripts, but I think it doesn't gibe with the way that Nix and
       | Guix are meant to be used. Probably the real solution would be
       | more like 1000 lines from scratch?
       | 
       | I remember that Nix Flakes was what I thought Nix was going to
       | be, but at the time it wasn't ready. I thought Nix was supposed
       | to solve the "it works on my machine" problem but it actually
       | doesn't -- you still need a CI because it's possible to write
       | .nix expressions in ways that break the sandboxing (unlike Bazel
       | where you always get it).
       | 
       | I had ran this by someone who knows Guix and my takeaway was that
       | Guix is basically the same in that regard.
       | 
       | A key problem is that, at least for awhile, I want it to work in
       | parallel with our existing system ... not have a "big break".
        
         | smasher164 wrote:
         | As long as you don't hardcode "expected paths" (like in the
         | FHS) in the filesystem, and expose the expectations you have
         | via some configuration (environment variables and flags are
         | fine), then packaging your software for Nix is pretty
         | straightforward.
        
         | pxc wrote:
         | > But I believe libc is fundamentally a "hole" in the
         | sandboxing of Nix, at least on OS X.
         | 
         | Nix doesn't sandbox builds on macOS at all by default, and
         | turning sandboxing on breaks some builds:
         | https://github.com/NixOS/nix/pull/1821
         | 
         | But the libc issue goes deeper. This blog post has some
         | explanation: https://matthewbauer.us/blog/darwin-stdenv-
         | update.html
         | 
         | > Linux is unique among operating systems due to the fact that
         | the Kernel and Libc are developed independently. Linux is
         | maintained by creator Linus Torvalds and a community of
         | contributors. Glibc, the most popular Libc for Linux, is
         | maintained by the GNU project. As a result, Linux has a strong
         | separation between Syscalls and Libc.
         | 
         | > [ ... ]
         | 
         | > To accomplish this, Linux provides a stable list of syscalls
         | that it has maintained across many versions. This is specified
         | for i386 at arch/x86/entry/syscalls/syscall_32.tbl in the
         | kernel tree. The syscalls specified here are the interface
         | through which the Libc communicates with the kernel. As a
         | result, applications built in 1992 can run on a modern kernel,
         | provided it comes with copies of all its libraries.
         | 
         | > The macOS Libc is called libSystem. It is available on all
         | macOS systems at /usr/lib/libSystem.B.dylib. This library is
         | the main interface that binary compatibility is maintained in
         | macOS. Unlike Linux, macOS maintains a stable interface in
         | libSystem that all executables are expected to link to. This
         | interface is guaranteed by Apple to be stable between versions.
         | 
         | > In Nixpkgs, we maintain this compatibility through a list of
         | symbols that are exported by libSystem. This is a simple text
         | list and is available for viewing at NixOS/nixpkgs/pkgs/os-
         | specific/darwin/apple-source-
         | releases/Libsystem/system_c_symbols. The symbol list is created
         | by listing symbols (nm) on the minimum macOS version that we
         | support (for my PR, 10.12). We do some linking tricks to ensure
         | that everything that we build in Nixpkgs only contains those
         | symbols. This means that we can reproducibly build on newer
         | versions of macOS, while maintaining compatibility with older
         | macOS versions. Unfortunately, newer symbols introduced in
         | later versions cannot be used even on systems that have those
         | symbols.
         | 
         | > A side effect of macOS design, is that fully static
         | executables are not supported in macOS as they are on Linux.
         | _Without a stable syscall interface, there is nothing to
         | provide compatibility between versions._ As a result, Apple
         | does not support this type of linking.
         | 
         | So Nixpkgs does do some things to try to let you peg builds
         | only to what's available in older versions of the macOS libc,
         | but it doesn't try to let you bring your own libc.
         | 
         | There's at least one libc that does claim this kind of
         | portability of course, and is the subject of lots of good posts
         | here on HN. Maybe the author of Cosmopolitan libc (
         | https://justine.lol/cosmopolitan/index.html ) might have
         | something insightful to say here.
        
         | chubot wrote:
         | Also, reading back on that, I think the hardest part would be
         | "PyPI dependencies" of MyPy, and "CRAN dependencies of R
         | scripts like dplyr". These have what I call the "rewriting
         | upstream" problem.
         | 
         | Though maybe a hybrid approach can work? Or does that defeat
         | the purpose? I think a problem with these kinds of systems is
         | that they can be "all or nothing". If you're halfway in, and
         | halfway out, you don't get any benefits.
        
           | pxc wrote:
           | For lang-specific package managers that have a lockfile
           | format, it's possible to write tooling that lets you run
           | `cargo lock` or whatever and then generate the required Nix
           | expressions for those dependencies. For stuff that doesn't
           | support such a format, if you had your scripts export to your
           | own little json lockfile format, you could have Nix read that
           | (Nix expressions can ingest json).
           | 
           | There's some ongoing work to better support 'generating'
           | those Nix expressions and using them in builds without
           | explicitly storing them anywhere, as well (John Ericson's
           | RFCs on 'import-from-derivation' and related functionality),
           | and for unifying such tooling (dream2nix). (This kind of
           | thing is what the `guix import` CLI does, but it has some
           | limitations.)
           | 
           | There's some talk of possibly using Oil Shell for a port of
           | Nixpkgs to Windows, although another language might be chosen
           | by whoever really takes up that work. People interested in
           | adding native Windows support to Nix might be interested in
           | helping you sort out Nix packaging for Oil (I see there is a
           | package currently, but it's not a source build).
        
       | rank0 wrote:
       | Can anyone explain to me the appeal of guix over nix? Is the
       | learning curve any easier? I really badly wanted to like
       | nix...but its just so strange and unconventional.
       | 
       | Whenever I need a disposable environment I reach for lxc/lxd.
        
         | pxc wrote:
         | Guix is strange and unconventional in the same fundamental way
         | as Nix, namely that each package is installed to its own,
         | immutable, quasi-content-addressed prefix. This is because that
         | design decision is what gives both package managers their
         | superpowers.
         | 
         | If you are already a Scheme user, you may find Guix more
         | accessible for you. If you are not a C++ programmer, you may
         | find hacking on the package manager itself easier with Guix.
         | 
         | In terms of the CLI interface, Guix really shines here. Guix
         | also has a more centralized approach to documentation, which
         | you may find helpful.
         | 
         | Beyond the surface-level language differences, Guix has gone
         | with different abstractions than Nix in some key areas, and has
         | some features that Nix lacks. One big one is that GuixSD uses a
         | different model for defining the options that can be used to
         | configure the system. Guix's approach1 is more explicit, and
         | features some provenance tracking for configured options-- it
         | can draw a graph for you showing where each setting on your
         | system came from.
         | 
         | Guix also takes a different approach to pinning package
         | versions and defining repositories of source packages, and its
         | conventions for doing those things are more settled than their
         | equivalents and alternatives in the Nix world.
         | 
         | Guix also supports a feature called 'grafts'2 that allows you
         | to avoid rebuilding the world in case of things like mission-
         | critical security updates to glibc. This is a really cool and
         | useful feature!
         | 
         | I'm sure there are other things that more serious Guix users
         | can better highlight than this dilettante. :)
         | 
         | The Guix blog is really excellent! I strongly recommend it for
         | getting a sense of what problems Guix tries to solve and how it
         | sometimes approaches them differently than Nix does.
         | 
         | --
         | 
         | 1: https://guix.gnu.org/manual/en/html_node/Defining-
         | Services.h...
         | 
         | 2: https://guix.gnu.org/blog/2020/grafts-continued/
        
           | Macha wrote:
           | I tried and bounced off Nix on other systems, and I'm now
           | running nixOS on my personal laptop (which is a secondary
           | device).
           | 
           | I think there's absolutely room to solve the same set of
           | problems better than Nix does:
           | 
           | 1. The number 1 problem for me has been documentation of
           | nixpkgs. Nix lang is a bit funky but even if I was writing
           | python the problem is that you're writing code to assign
           | magic objects to magic variables and the only way to find the
           | right ones is to read the nixpkgs source (and given the size
           | of all-packages.nix and the limit of github's web viewer,
           | maintain a local checkout).
           | 
           | 2. Second place goes to the flake/non-flake divide where the
           | nix community generally implies flakes are better but apart
           | from the nix cli detailed docs, most things refuse to
           | acknowledge its existence in the official docs.
           | 
           | 3. Portability between macOS and Linux, where flakes actually
           | make the situation worse as the root config is now system
           | specific.
           | 
           | 4. Tools like flakes, niv, the suggested way to write a
           | shell.nix all want you to handle full commit hashes directly
           | which is kinda unergonomic.
           | 
           | None of these are inherent to the problem space. If I was to
           | keep writing the list, maybe around 9 and 10 are the things
           | around nixlang being a funky language or /nix directory that
           | the "you just need to understand functional languages/content
           | addressable stores" discussion seems to think are the top
           | ones.
        
             | pxc wrote:
             | Agreed on points 1 and 2. I think 3 is basically solvable
             | for Nix, and it's easy to paper over with a Nix library for
             | now.
             | 
             | Re: 4, Flakes do let you define inputs in terms of Git tags
             | and branches and then have the computer resolve those to
             | commit hashes for you, which is good.
             | 
             | Overall, I agree that it's not fair to think of package
             | managers that work in the same basic paradigm as Nix as
             | mere also-rans or clones. There's a lot of room to
             | meaningfully experiment in the space and Guix's developers
             | have proven thoughtful about where they want to differ in
             | technical and ergonomic matters.
        
         | nitsky wrote:
         | What in particular did you find strange and unconventional?
        
           | im3w1l wrote:
           | For me it was the core premise that is both the blessing and
           | the curse. That it is only possible to install software by
           | first packaging it.
        
             | amelius wrote:
             | That's because the basic idea is immutability and that
             | doesn't go well with OSes designed around mutability.
             | 
             | Nix/Guix are basically the "glue" that connects two worlds.
        
         | jolmg wrote:
         | Haven't tried guix yet, and haven't used nix in years, but if
         | what you struggled with is the language, guix might be less
         | strange and more conventional since it uses Scheme as the
         | language. It uses strict evaluation like most languages and
         | there's probably more documentation about it.
        
         | amelius wrote:
         | I think the main difference is that Guix will only support open
         | software officially, whereas Nix will also happily allow
         | proprietary stuff, like nVidia drivers.
         | 
         | See e.g.:
         | 
         | https://gitlab.com/nonguix/nonguix
         | 
         | > Guix channel for packages that can't be included upstream.
         | Please do NOT promote or refer to this repository on any
         | official Guix communication channels.
        
           | medstrom wrote:
           | Far from the 'main difference' -- if there was a project that
           | just forked Nix and made that change, you could say that
           | about it, but not about Guix, which has tons of work-hours
           | invested and pretty much none of those work hours have to do
           | with that.
        
             | amelius wrote:
             | True but that's from mostly a technical perspective. It is
             | also (more?) important to know how a community thinks.
        
         | turboponyy wrote:
         | From what I can tell (I've only used NixOS/Nix), Guix has
         | considerably more thought put into the UX: Nix is currently
         | undergoing a transition to a newer CLI; Nix's nomenclature is
         | confusing; Guix has much better documentation; Guix has its
         | equivalent of Nix's home-manager built-in.
         | 
         | There is still some division in the Nix ecosystem between the
         | pre-flake and the experimental post-flake way of doing things.
         | 
         | Guix uses an established programming language for
         | configuration, which some might find attractive (I actually
         | quite like Nixlang after getting used to it).
         | 
         | Guix makes installing non-free software a hassle (you have to
         | include community sources). Nixpkgs doesn't impose this
         | restriction, though you still have to explicitly allow the
         | install of non-free packages when running Nix.
         | 
         | Overall, Guix seems like the more polished product, though
         | NixOS/Nix is similar in functionality and has a larger
         | collection of packages and more traction in general.
        
           | openfuture wrote:
           | I think that allow unfree in nix is practically the same as
           | adding nonguix repo to your channels. Both are essentially
           | one line of config in some file.
           | 
           | (I am former nixos user but now on guix)
        
           | retzkek wrote:
           | > Overall, Guix seems like the more polished product
           | 
           | Possibly when comparing the Guix vs. Nix package managers,
           | but for Linux distributions GuixSD ("Guix System" now) is
           | very far behind NixOS in this regard. I've tried to install
           | GuixSD on different hardware several times over the past
           | couple years, and failed every time, between a lack of
           | drivers and unpolished or buggy installer. Last time the
           | installer wiped out my partition table without prompting when
           | I went in to manually partition (to set up dual boot).
           | 
           | NixOS on the other hand has always been flawless to install,
           | and now there's even a modern GUI installer.
           | 
           | I like Guix better in theory, but Nix wins in practicality.
        
         | throw10920 wrote:
         | In addition to the other answers here: the Guix repositories
         | only accept Free Software, even excluding things like Firefox,
         | and intentionally make it somewhat difficult to install non-
         | Free-Software (as opposed to Nix, where installing things like
         | Firefox is relatively easy[1]). This may appeal to some people.
         | 
         | [1] https://nixos.wiki/wiki/Firefox
        
           | yyyk2 wrote:
           | Guix does not make non-free software "intentionally more
           | difficult", it just excludes it from the main repository.
           | There is a nonfree repo that you can add to your guix
           | channels.
        
             | slim wrote:
             | the non free repo explicitly asks you not to talk about it
             | 
             | https://gitlab.com/nonguix/nonguix
             | 
             | looks intentional to me
        
               | [deleted]
        
               | yyyk2 wrote:
               | Well, all it says that you shouldn't promote it on the
               | "official channels" (i.e. the mailing list and the #guix
               | libera.chat channel). Guix, the package manager itself,
               | does not make installing non-free packages any more
               | difficult than free packages. I suppose it could be said
               | that Guix (the project) makes finding non-free packages
               | harder, although anecdotally I will say that nonguix is
               | the first thing I've heard about guix, since it seems to
               | be the most controversial part of it.
        
               | daptaq wrote:
               | Non-free software is just off-topic in official channels,
               | there is no need to interpret malicious intent into it.
               | It is no more difficult to enable nonguix than it is to
               | enable any other repository.
        
               | striking wrote:
               | I don't think anyone was implying malice, just that there
               | was intent. Nothing wrong with having principles.
        
           | amelius wrote:
           | Reminds me of the VHS vs Betamax war, where VHS won because
           | Betamax (Sony) didn't allow adult videos (at least, so the
           | legend goes).
        
         | forevernoob wrote:
         | One of my personal pet peeves are that Guix does not support
         | Apple, while Nix does.
        
       ___________________________________________________________________
       (page generated 2022-09-21 23:00 UTC)