The Linux kernel itself has a well publicized policy of not breaking user space and binary compatibility, but pretty much all distros regularly break binary compatibility, they require software to dynamically link to os provided shared libraries, and they don't allow statically linked programs to be distributed using their package managers.
Packaging and distributing software for windows or macOS is really easy. Doing the same for Linux, particularly desktop applications, is a huge pain.
It's a point that Linus Torvalds has often bemoaned[0][1].
[0]: https://lore.kernel.org/lkml/CAHk-=whs8QZf3YnifdLv57+FhBi5_W...
It's an automated Rube Goldberg machine. Linux used to have these as well! I remember clearly the hacky automated Java 6 install script and the VirtualBox drivers that came as a several executable hundred megabytes in size.
You can static link if you want. You need to watch out for core system libraries like glibc (just like you need to watch out for Win7/8.1/10/11 on Windows) but that's about it.
Packaging for Linux is easy. You can even automatically test if your packages work on different distributions! You can read about it here: https://appimage-builder.readthedocs.io/en/latest/intro/tuto...
I don't think comparing "state of packages got off of apt" to "state of downloaded installers for Mac/Windows" is an apples to apples comparison.
Yes, the reasons for why it's more complicated on Linux are varied, the fragmentation of the desktop Linux ecosystem might be the other main factor.
However I think comparing the status quo between each OS is fair.
Appimage seems cool, I don't have experience with it, so I can't speak to how well it works.
I do agree it's fragmented and frustrating where we've ended up for installers. My main critique is more that the state of linux packaging _isn't_ what thunderbird is doing here.
Go nearly always does this for example (although in some version they switched to dynamically linking to glibc for the stub resolver) and you can take statically linked go binaries and copy them to totally different OSes as long as the architecture is compatible. I remember taking a copy of syncthing and copying it between my Android and a Raspberry pi at one point (or maybe it was a kindle and a raspberry pi) which run totally different OSes and it worked just fine (ignoring the Android stupidity of course.)
On other platforms (Windows, macOS, Android, iOS) it’s fairly common to distribute GUI apps as a single binary so you don’t need an army of package maintainers. Perks of having many years of ABI stability.
I can't comment deeply on deb vs rpm, it is kinda disappointing that we have this split, and I don't know if there's a great way to merge it back.
Mac does have a good distribution story. This also exists on Linux in the form of app images. The one missing piece is that Mac has the Applications convention. AppImageLauncher[0] solves this, but really it would be good for Gnome/KDE to just integrate this concept. That gives the (important!) "have the application show up in the application launcher" option.
I do not believe one could qualify Windows programs as being distributed as a single binary. A single installer, perhaps! But many Windows programs dump files all over your file tree to do things, and then goes to touch stuff in your registry. There's a reason we have "portable executables" for windows as its own download option!
* A desktop package that isn’t a vehicle for ads (like Windows and ChromeOS).
* A desktop package that doesn’t require you to write your own one-off scripts to work around stupid deficiencies (like GNU/Linux).
* A desktop package that doesn’t constantly throw away all its “legacy” and break a bunch of stuff (like Mac).
Scroll down and you’ll see people arguing about supported features because they’re running an ancient version of Thunderbird supplied by their distro.
You can do this on Linux, too, be it by compiling a static binary or bundling everything as an AppImage or what have you.
Frankly, I find it annoying that it isn't done as a matter of course.
I think it's unfortunate anyone offers .deb (or similar) downloads really - the many Linux distros don't have a single packaging mechanism, so why pretend they do, or that your app's not going to work on the ones you don't provide?
Just say it's built for Linux, perhaps here's a binary, here's the source if available, this is the preferred name, go and check your package manager.