-
Notifications
You must be signed in to change notification settings - Fork 18.3k
Description
The downloadable archives at https://golang.org/dl/ currently contain precompiled .a files for all packages in the standard library. Each archive has a set of .a files for one platform, plus another set for -race
builds.
These files take up quite a bit of space, and they're fast to rebuild on demand. We should consider removing them from binary Go distributions.
For example, in 1.17rc1 on darwin/amd64, the whole distribution uncompressed is 435M. The pkg/darwin_amd64
directory is 97M (22%), and the pkg/darwin_amd64_race
directory is 109M (25%). Compressed as a zip file with default settings, the archive is 135M. Without .a files, it's 86M (63%).
After #40042 was fixed, the C compiler version is included in the cache key for each package that uses cgo. That means that if no C compiler is installed on the system, or if a different C compiler version is installed (very common), go build
and other commands will rebuild packages that depend on cgo instead of using the versions installed in $GOROOT/pkg
. As of 1.17rc1, there are 27 packages in std
that use cgo directly or indirectly, most prominently, net
. The precompiled files for these packages are almost never used unless the installed C compiler exactly matches the version used to build the Go distribution.
Note that the fix for #40042 is causing builds to fail on systems without a C compiler installed (#47215), so it may be partially or completely rolled back in 1.17. If we implement this proposal, we'd have the same problem, so we may want to think about changing the default value of CGO_ENABLED
(#47251).