summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/go/build/build.go12
-rw-r--r--src/go/build/build_test.go4
2 files changed, 16 insertions, 0 deletions
diff --git a/src/go/build/build.go b/src/go/build/build.go
index 5e11c9b9c..3ac798083 100644
--- a/src/go/build/build.go
+++ b/src/go/build/build.go
@@ -1291,6 +1291,18 @@ func (ctxt *Context) goodOSArchFile(name string, allTags map[string]bool) bool {
if dot := strings.Index(name, "."); dot != -1 {
name = name[:dot]
}
+
+ // Before Go 1.4, a file called "linux.go" would be equivalent to having a
+ // build tag "linux" in that file. For Go 1.4 and beyond, we require this
+ // auto-tagging to apply only to files with a non-empty prefix, so
+ // "foo_linux.go" is tagged but "linux.go" is not. This allows new operating
+ // sytems, such as android, to arrive without breaking existing code with
+ // innocuous source code in "android.go". The easiest fix: files without
+ // underscores are always included.
+ if !strings.ContainsRune(name, '_') {
+ return true
+ }
+
l := strings.Split(name, "_")
if n := len(l); n > 0 && l[n-1] == "test" {
l = l[:n-1]
diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go
index 004010113..23ce89b4b 100644
--- a/src/go/build/build_test.go
+++ b/src/go/build/build_test.go
@@ -173,6 +173,10 @@ var matchFileTests = []struct {
{ctxtAndroid, "foo_linux.go", "", true},
{ctxtAndroid, "foo_android.go", "", true},
{ctxtAndroid, "foo_plan9.go", "", false},
+ {ctxtAndroid, "android.go", "", true},
+ {ctxtAndroid, "plan9.go", "", true},
+ {ctxtAndroid, "arm.s", "", true},
+ {ctxtAndroid, "amd64.s", "", true},
}
func TestMatchFile(t *testing.T) {