<aside>
🚀 ♻️♻️♻️
This page is largely REPLACED by https://zapps.app/ !
♻️♻️♻️
</aside>
Goals
- Be path-agnostic. (e.g. untar anywhere and just run.)
- Be simple (as much as possible).
- Have low requirements.
- Don’t use mounts.
- Don’t use containers, or namespaces, or other similarly overkill approaches.
- Don’t use post install hooks. Be viable on a read-only system.
- Bundle everything…
- … but be able to support deduplication efforts afterwards (e.g. symlink farms), optionally.
- (which means don’t use static linking.)
- Be composable. (One executable made with this strategy should be able to trivially call another executable that was independently made with the same strategy.)
Why?
This de-balkanizes linux.
Without these techniques, binaries on linux cannot be shared between distributions. It creates more work for packagers; and it creates more frustration for users. It means friction; it means wasted time; it means less collaboration; it means linux as a whole is growing more slowly than it could be.
Path-agnostic packaging can be shared. This means easier consumption by users, and less work for packagers. It means we can share, and grow faster together.
Mechanically
tl;dr:
- Use rpath $ORIGIN for dynamic library paths (we’ll keep using the ELF format!)
- Hooray now you're already path-agnostic