Hi gophers,
In the Go 1.5 cycle we will introduce three new GOARCHes values:
arm64, ppc64, ppc64le
From experience, introducing new GOARCHes or GOOSes has always
been problematic for our users and us:
Older releases don't recognize the new GOARCH, GOOS, which means
we can't use those GOOS/GOARCH in file names (we have to add
explicit build tags). This affects the x/sys repos mostly. And also we risk
conflict of custom build tags used by the users (this happened at least
once, for the android GOOS).
I filed #10165 to reserve common architectures as GOARCHes (CL 9644),
Brad brought up the question of reserving GOOSes. Unlike architectures,
the world of OS is much more diverse, so it's impossible to reserve all
possible GOOSes that Go is willing to support. Because we can't predict
the future, reserving known GOOS/GOARCH approach is not going to be
scalable.
Instead of reserving known GOOSes and GOARCHes, I propose that
we reserve the prefix "os-" and "arch-", and never add new GOOS or
GOARCH to the go/build package without such prefixes from Go 1.6
and on.
For example, suppose we accept a port for minix3, we will add os-minix3
to the list of GOOSes, and filenames and build tags will need to use "os-minix3" instead of just "minix3".
When used in $GOOS/$GOARCH or runtime.GOOS/GOARCH, because
there won't be any ambiguity, the non-prefixed form will be used.
For consistency, go/build package will also accept "os-" and "arch-" prefix
for existing GOOSes/GOARCHes. This will simplify build tag generation,
as you can always prepend "os-"/"arch-" (of course, it's still preferable to
use the unprefixed forms if we need to support older Go releases).
This is a late proposal for Go 1.5, but I think it will solve a problem in the
long run and as we're introducing a lot more GOARCHes in this cycle,
reserving the "os-" and "arch-" prefix is better done in the same cycle to
avoid disruption.
What do you think?
Sincerely,
Minux