1// Copyright 2018 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package imports 6 7import ( 8 "cmd/go/internal/cfg" 9 "sync" 10) 11 12var ( 13 tags map[string]bool 14 tagsOnce sync.Once 15) 16 17// Tags returns a set of build tags that are true for the target platform. 18// It includes GOOS, GOARCH, the compiler, possibly "cgo", 19// release tags like "go1.13", and user-specified build tags. 20func Tags() map[string]bool { 21 tagsOnce.Do(func() { 22 tags = loadTags() 23 }) 24 return tags 25} 26 27func loadTags() map[string]bool { 28 tags := map[string]bool{ 29 cfg.BuildContext.GOOS: true, 30 cfg.BuildContext.GOARCH: true, 31 cfg.BuildContext.Compiler: true, 32 } 33 if cfg.BuildContext.CgoEnabled { 34 tags["cgo"] = true 35 } 36 for _, tag := range cfg.BuildContext.BuildTags { 37 tags[tag] = true 38 } 39 for _, tag := range cfg.BuildContext.ReleaseTags { 40 tags[tag] = true 41 } 42 return tags 43} 44 45var ( 46 anyTags map[string]bool 47 anyTagsOnce sync.Once 48) 49 50// AnyTags returns a special set of build tags that satisfy nearly all 51// build tag expressions. Only "ignore" and malformed build tag requirements 52// are considered false. 53func AnyTags() map[string]bool { 54 anyTagsOnce.Do(func() { 55 anyTags = map[string]bool{"*": true} 56 }) 57 return anyTags 58} 59