]> Cypherpunks repositories - gostls13.git/commitdiff
goinstall: handle $(GOOS) and $(GOARCH) in filenames
authorGustavo Niemeyer <gustavo@niemeyer.net>
Mon, 7 Mar 2011 15:54:53 +0000 (10:54 -0500)
committerRuss Cox <rsc@golang.org>
Mon, 7 Mar 2011 15:54:53 +0000 (10:54 -0500)
This enables goinstall to handle .go and .c files (for cgo)
which are named after the following patterns:

    name_$(GOOS).*
    name_$(GOARCH).*
    name_$(GOOS)_$(GOARCH).*

Files with those names are only included if the $(GOOS) and
$(GOARCH) match the current system.

R=rsc
CC=golang-dev
https://golang.org/cl/4172055

.hgignore
src/Make.inc
src/cmd/goinstall/Makefile
src/cmd/goinstall/parse.go
src/cmd/goinstall/syslist_test.go [new file with mode: 0644]
src/pkg/Makefile

index 59aeeeb15f1971270443f27c70b97ea572962a56..9abdbf1ffb95cac1bfd9aca4c89ddb123b626093 100644 (file)
--- a/.hgignore
+++ b/.hgignore
@@ -37,6 +37,7 @@ src/cmd/gc/opnames.h
 src/cmd/gc/y.output
 src/cmd/gc/y1.tab.c
 src/cmd/gc/yerr.h
+src/cmd/goinstall/syslist.go
 src/pkg/Make.deps
 src/pkg/exp/ogle/ogle
 src/pkg/os/signal/unix.go
index 2889c7edf2544148f6678fc78b9e076473b41f11..a6edb165a7100be5a7bd6e7ae206ffc7fb78cc7f 100644 (file)
@@ -29,14 +29,20 @@ ifeq ($(GOOS),)
 GOOS:=$(GOHOSTOS)
 endif
 
-ifeq ($(GOOS),darwin)
-else ifeq ($(GOOS),freebsd)
-else ifeq ($(GOOS),linux)
-else ifeq ($(GOOS),tiny)
-else ifeq ($(GOOS),plan9)
-else ifeq ($(GOOS),windows)
-else
-$(error Invalid $$GOOS '$(GOOS)'; must be darwin, freebsd, linux, plan9, tiny, or windows)
+GOOS_LIST=\
+       darwin\
+       freebsd\
+       linux\
+       plan9\
+       windows\
+
+GOARCH_LIST=\
+       386\
+       amd64\
+       arm\
+
+ifeq ($(filter $(GOOS),$(GOOS_LIST)),)
+$(error Invalid $$GOOS '$(GOOS)'; must be one of: $(GOOS_LIST))
 endif
 
 ifeq ($(GOHOSTARCH),)
@@ -59,24 +65,25 @@ ifeq ($(GOOS),darwin)
 GOHOSTARCH:=$(GOARCH)
 endif
 
+ifeq ($(filter $(GOARCH),$(GOARCH_LIST)),)
+$(error Invalid $$GOARCH '$(GOARCH)'; must be one of: $(GOARCH_LIST))
+endif
+
 ifeq ($(GOARCH),386)
 O:=8
 else ifeq ($(GOARCH),amd64)
 O:=6
 else ifeq ($(GOARCH),arm)
-
 O:=5
-ifeq ($(GOOS),linux)
-else
+ifneq ($(GOOS),linux)
 $(error Invalid $$GOOS '$(GOOS)' for GOARCH=arm; must be linux)
 endif
-
 else
-$(error Invalid $$GOARCH '$(GOARCH)'; must be 386, amd64, or arm)
+$(error Missing $$O for '$(GOARCH)')
 endif
 
 # Save for recursive make to avoid recomputing.
-export GOARCH GOOS GOHOSTARCH GOHOSTOS
+export GOARCH GOOS GOHOSTARCH GOHOSTOS GOARCH_LIST GOOS_LIST
 
 # ugly hack to deal with whitespaces in $GOROOT
 nullstring :=
index 6ddb32be723bad7294a91f3f26571e1a93590e3e..6900bcb61d24198fa201458d39f7ef95bdce1a13 100644 (file)
@@ -10,5 +10,17 @@ GOFILES=\
        main.go\
        make.go\
        parse.go\
+       syslist.go\
+
+CLEANFILES+=syslist.go
 
 include ../../Make.cmd
+
+syslist.go:
+       echo '// Generated automatically by make.' >$@
+       echo 'package main' >>$@
+       echo 'const goosList = "$(GOOS_LIST)"' >>$@
+       echo 'const goarchList = "$(GOARCH_LIST)"' >>$@
+
+test:
+       gotest
index 014b8fcb20b6baebac03d2cfc9c80456a6a86025..564ec46bc94e5957f848030d6c1b1f3d3739794d 100644 (file)
@@ -14,6 +14,7 @@ import (
        "path/filepath"
        "strconv"
        "strings"
+       "runtime"
 )
 
 
@@ -57,6 +58,9 @@ func scanDir(dir string, allowMain bool) (info *dirInfo, err os.Error) {
                if strings.HasPrefix(d.Name, "_") || strings.Index(d.Name, ".cgo") != -1 {
                        continue
                }
+               if !goodOSArch(d.Name) {
+                       continue
+               }
                if strings.HasSuffix(d.Name, ".c") {
                        cFiles = append(cFiles, d.Name)
                        continue
@@ -108,3 +112,47 @@ func scanDir(dir string, allowMain bool) (info *dirInfo, err os.Error) {
        }
        return &dirInfo{goFiles, cgoFiles, cFiles, imports, pkgName}, nil
 }
+
+// goodOSArch returns false if the filename contains a $GOOS or $GOARCH
+// suffix which does not match the current system.
+// The recognized filename formats are:
+//
+//     name_$(GOOS).*
+//     name_$(GOARCH).*
+//     name_$(GOOS)_$(GOARCH).*
+//
+func goodOSArch(filename string) bool {
+       if dot := strings.Index(filename, "."); dot != -1 {
+               filename = filename[:dot]
+       }
+       l := strings.Split(filename, "_", -1)
+       n := len(l)
+       if n == 0 {
+               return true
+       }
+       if good, known := goodOS[l[n-1]]; known {
+               return good
+       }
+       if good, known := goodArch[l[n-1]]; known {
+               if !good || n < 2 {
+                       return false
+               }
+               good, known = goodOS[l[n-2]]
+               return good || !known
+       }
+       return true
+}
+
+var goodOS = make(map[string]bool)
+var goodArch = make(map[string]bool)
+
+func init() {
+       goodOS = make(map[string]bool)
+       goodArch = make(map[string]bool)
+       for _, v := range strings.Fields(goosList) {
+               goodOS[v] = v == runtime.GOOS
+       }
+       for _, v := range strings.Fields(goarchList) {
+               goodArch[v] = v == runtime.GOARCH
+       }
+}
diff --git a/src/cmd/goinstall/syslist_test.go b/src/cmd/goinstall/syslist_test.go
new file mode 100644 (file)
index 0000000..a660e69
--- /dev/null
@@ -0,0 +1,56 @@
+// Copyright 2011 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+package main
+
+import (
+       "runtime"
+       "testing"
+)
+
+var (
+       thisOS    = runtime.GOOS
+       thisArch  = runtime.GOARCH
+       otherOS   = "freebsd"
+       otherArch = "arm"
+)
+
+func init() {
+       if thisOS == otherOS {
+               otherOS = "linux"
+       }
+       if thisArch == otherArch {
+               otherArch = "amd64"
+       }
+}
+
+type GoodFileTest struct {
+       name   string
+       result bool
+}
+
+var tests = []GoodFileTest{
+       {"file.go", true},
+       {"file.c", true},
+       {"file_foo.go", true},
+       {"file_" + thisArch + ".go", true},
+       {"file_" + otherArch + ".go", false},
+       {"file_" + thisOS + ".go", true},
+       {"file_" + otherOS + ".go", false},
+       {"file_" + thisOS + "_" + thisArch + ".go", true},
+       {"file_" + otherOS + "_" + thisArch + ".go", false},
+       {"file_" + thisOS + "_" + otherArch + ".go", false},
+       {"file_" + otherOS + "_" + otherArch + ".go", false},
+       {"file_foo_" + thisArch + ".go", true},
+       {"file_foo_" + otherArch + ".go", false},
+       {"file_" + thisOS + ".c", true},
+       {"file_" + otherOS + ".c", false},
+}
+
+func TestGoodOSArch(t *testing.T) {
+       for _, test := range tests {
+               if goodOSArch(test.name) != test.result {
+                       t.Fatalf("goodOSArch(%q) != %v", test.name, test.result)
+               }
+       }
+}
index 6e70690d1b392bfafb1d286cfee7cdffbffe748d..9de2bd2f7d90d4cf79219a2f7b6f0087544e5434 100644 (file)
@@ -189,7 +189,6 @@ NOTEST=\
        ../cmd/ebnflint\
        ../cmd/godoc\
        ../cmd/gofmt\
-       ../cmd/goinstall\
        ../cmd/govet\
        ../cmd/goyacc\
        ../cmd/hgpatch\