mirror of
https://github.com/golang/go
synced 2024-11-11 20:20:23 -07:00
goinstall: handle $(GOOS) and $(GOARCH) in filenames
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
This commit is contained in:
parent
f9ca3b5d5b
commit
70f08b47a0
@ -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
|
||||
|
35
src/Make.inc
35
src/Make.inc
@ -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 :=
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
56
src/cmd/goinstall/syslist_test.go
Normal file
56
src/cmd/goinstall/syslist_test.go
Normal file
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -189,7 +189,6 @@ NOTEST=\
|
||||
../cmd/ebnflint\
|
||||
../cmd/godoc\
|
||||
../cmd/gofmt\
|
||||
../cmd/goinstall\
|
||||
../cmd/govet\
|
||||
../cmd/goyacc\
|
||||
../cmd/hgpatch\
|
||||
|
Loading…
Reference in New Issue
Block a user