One aspect of Guix I found to be really fascinating: That there is basically no conceptual difference between defining a package as a private build script, and using a package as part of the system.
Let me explain: Say you wrote a little program in Python which uses a C library (or a Rust library with C ABI) which is in the distribution. Then, in Guix you would put that librarie’s name and needed version into a manifest.scm
file which lists your dependency, and makes it available if you run guix shell
in that folder. It does not matter whether you run the full Guix System, or just use Guix as s package manager.
Now, if you want to install your little python program as part of your system, you’ll write an install script or package definition, which is nothing else than a litle piece of Scheme code which contains the name of your program, your dependency, and the information needed to call python’s build tool.
The point I am making is now that the only thing which is different between your local package and a distributed package in Guix is that distributed packages are package definitions hosted in public git repos, called ‘channels’. So, if you put your package’s source into a github or codeberg repo, and the package definition into another repo, you now have published a package which is a part of Guix (in your own channel). Anybody who wants to install and run your package just needs your channel’s URL and the packages name. It is a fully decentral system.
In short, in Guix you have built-in something like Arch’s AUR, just in a much more elegant and clean manner - and in a fully decentralized way.
This is true for Nix as well.
The two main advantages of Guix are the language (which is well-known and comes with lots of good tooling and other support) and the package bootstrapping.
The main disadvantages I’ve faced when trying it a few years ago:
At the time it was a great concept, but essentially useless for anything not Emacs/Haskell related.
Yeah. See, drivers are part of the hardware abstraction layer which in a Linux system is the Kernel. The kernel is GPL, so it is hard to get support for hardware with drivers without GPL, it does not conform Linux’ license.
I, too, had also nothing but hassle with an NVidia graphics card in Debian. It was a happy day when I finally ditched it for a supported card and had a fully supported system!
The other thing… let’s turn the question around. Would you:
If not - why do some people expect equivalent things from free software projects?
It’s a violation that’s not enforced, as almost all distros provide proprietary blobs. They balance ideology with usability, since they realised most people aren’t going to use a librebooted ThinkPad from the 90s. If everyone enforced libre purism like GNU, desktop Linux would’ve been completely dead long ago. If you need proof, check usage statistics for any of the free distros.
And did you need to install a modified iso to have WiFi? Did maybe Debian provide those nvidia drivers?
How is any of that relevant? This is not a question of additional software or services, but basic usability. Guixos as is, is for example essentially useless on a laptop unless you’re willing to carry an external WiFi card in your pocket.
The only expectation I have for an OS is to work on my devices, guixos does not. And even when I jumped through all of the hoops to get it working, I still needed to use nix to install most packages I need to work. So why would I use guixos+nix+flatpak instead of just running nixos?
So maybe Guix System is not a good choice for you?
It has top-priority goals like reproducibility, capability to inspect and verify all source code, and providing a fully free system. These specific goals are not compatible with providing nonfree binary blobs in Guix-core. For example, depending on non-free binary blobs will block exactly reconstructing a system years later if these binaries are not available any more. Guix has scientific applications where reproducibility absolutely matters.
Also, I can unterstand if companies are hating it which just want to have a free ride and monetize efforts of other people. But for users, there are many many other options and distributions available. Why not chose one that matches your need better?
Why get mad about people comparing nix and guix, in a thread comparing nix and guix? Pointing out legitimate disadvantages is not hating. Maybe get off the internet for a bit and touch grass.
So does nix, nobody is forcing you to opt-in into non-free packages. And guix most certainly is compatible with non-free blobs, as that’s how most people are using it. The only difference is that nix is supporting non-free packages instead of banning even talking about them.
I wouldn’t call that an advantage for the average person. Nix is far nicer to work with. Some Lispers might disagree, but I, for one, can’t exactly see the beauty in trying to turn Scheme into a configuration language with macros and hacks. Also Guix puts Scheme everywhere, things you can do with plain old Bash in Nix, you’ll have to all do in Scheme in Guix, so there is a much steeper learning curve.
Bash is not a advantage, it’s a disadvantage
You prefer:
over:
postInstall = '' rm $out/lib/basic-server $out/lib/helloworld $out/lib/postcollector ''
?
Bash code should definitely be
rm -f "$out"/lib/{basic-server,helloworld,postcollector}
Yes, having programmed bash and its predecessors for 30 years and several lisps (Clojure, Racket, Guile, a little SBCL) in the last 15 years, I very much prefer the Scheme version in this place.
Why?
'echo a; rm -rf /etc/*'
.Can’t you just define a macro called rm-f and pass a list of files to remove?
Of course, this would be no problem. Can also be a function. The expliciteness serves readability.