[swift-users] building static binaries / reducing library dependencies?
jgroff at apple.com
Thu Dec 3 15:57:40 CST 2015
> On Dec 3, 2015, at 1:54 PM, Brian Swetland <swetland at frotz.net> wrote:
> I've noticed that the standard "swift build" binaries are dynamic (which makes sense), and there are quite a few dependencies. For a trivial hello world, the hello binary depends on:
> and libswiftCore.so further depends on:
> If I want to build something I can hope will run on other linux machines with potentially arbitrary distributions, it'd be really nice to be able to build fully static, or at least more self-contained binaries.
> Both license-wise and operationally, linking glibc staticly is problematic, but at least glibc has very strong backward compatibility with itself. libstdc++ on the other hand is something I'd always want staticly linked to not be at the whim of ABI breakages from release to release.
> I'm curious about the libstdc++ dependency, since I was under the impression the swift runtime was written in swift. What part of the runtime or generated code causes this dependency to exist?
> The libc dependency could be simplified by supporting musl-libc (small, MIT licensed, pretty source-compatible with glibc).
> Given that libbsd and libicu are under permissive licenses and libstdc++ (if it's needed) has a linkage exception), it'd be nice to have a way to include those staticly (in either libswiftCore.so or final binaries), resulting in the only remaining dependencies being on libc/libc/libpthread/libdl which have extremely robust and well maintained API/ABI backward compatibility.
> This should allow for linux binaries which have significantly better chances of working correctly on an arbitrary linux machine.
It should be possible to configure Swift to statically link libswiftCore.so on Linux. We dynamically link on Apple platforms for future-proofing, but that's not a concern on Linux as far as I can see. The Swift core runtime is written in C++, as are some edges of the standard library, hence the libstdc++ dependency. If you're concerned about licensing issues statically linking libstdc++, then building against LLVM's UIUC-licensed libc++ might be a possibility.
More information about the swift-users