Hi folks,
I did a bunch of research on detecting xz support, in pursuit of adding a "system supports xz?" check to shadowspawn/nvh and tj/n.
The gist of it for Linux and macOS:
xz binary is on the system PATH, tar will support extracting xz-compressed tarballs.xz in the repos. It's therefore possible but _very unlikely_ that a Linux machine has xz on the path but no support in tar.nvm is basically already doing this check; It works great for Linux. If it works anywhere else, I would propose that that's pretty much just a coincidence or a happy accident.libarchive/bsdtar that macOS ships with.libarchive/bsdtar in OS X Lion (10.7)... but had xz support toggled off in pre-compile configuration, and didn't ship the underlying liblzma library that macOS would eventually use to support xz. macOS only ships xz support in macOS 10.9 or newer.libarchive/bsdtar with xz support toggled _on_, and shipped liblzma to use for compressing/decompressing xz archivesxz on the PATH is irrelevant (and a bit of a red herring!) for xz support in tar on macOS.libarchive/bsdtar version on macOS will mostly work, but you will get a false positive for OS X Lion and Mountain Lion (10.7 and 10.8, respectively).I would recommend checking for macOS 10.9+ before enabling xz, and not checking for xz on the PATH on macOS at all. You can conveniently check the macOS version via command-line with sw_vers.
Here are the main research findings from implementing this on nvh/n. (Scroll up/down in the issue for the whole convoluted research process, if you like!)
Thanks, I'd be very appreciative of a PR that improves xz support detection.
Will work on a PR when I get a free moment to do so.
Hello again @ljharb, you mentioned me in https://github.com/shadowspawn/nvh/pull/12. This is already the relevant issue, so I thought you might want to take another peek at this. Thanks.
Discussion in my earlier PR https://github.com/nvm-sh/nvm/pull/2156 got really into the weeds, but it isn't really that complicated a problem, IMO. Just that I nerd out and give way too much detail lots of detail. If you have any questions I'll try to give shorter answers and move toward a solution. Not just mountains of theoretical considerations. :P
Best regards,
- DeeDeeG
If you like the checks that are used in tj/n I can try to recreate those at this repo.
xz on the PATH? Fetch xz-compressed tarballs.Oops, sorry :-) that bulleted list seems good to me.
While I was looking at this again, I tested the latest releases of the various BSDs in VirtualBox:
| OS | uname -s | tar supports xz? |
| ------------- | ------------- | ------------- |
| DragonFly BSD 5.8.1 | DragonFly | ✔️ yes |
| FreeBSD 12.1-RELEASE, GhostBSD 20.04.1, OPNSense 20.1, pfSense 2.4.5-p1 | FreeBSD | ✔️ yes |
| NetBSD 9.0 | NetBSD | ✔️ yes |
| OpenBSD 6.7 | OpenBSD | ❌ no |
In all BSDs I tested the following was true:
tar supported xz, xz was coincidentally on the PATH, and the file /usr/lib/liblzma.so existed.tar did not support xz, xz wasn't on the PATH, and /usr/lib/liblzma.so wasn't present.I think the proper check on all BSDs is to look for /usr/lib/liblzma.so.
I can make this a separate issue and/or PR if you like. Or try to roll that into the same PR I'm already working on.
Let's roll it into the one "make xz work properly" PR :-)