1
2
3
4
5 package cache
6
7 import (
8 "fmt"
9 "os"
10 "path/filepath"
11 "sync"
12
13 "cmd/go/internal/base"
14 "cmd/go/internal/cfg"
15 )
16
17
18 func Default() *Cache {
19 defaultOnce.Do(initDefaultCache)
20 return defaultCache
21 }
22
23 var (
24 defaultOnce sync.Once
25 defaultCache *Cache
26 )
27
28
29
30
31 const cacheREADME = `This directory holds cached build artifacts from the Go build system.
32 Run "go clean -cache" if the directory is getting too large.
33 See golang.org to learn more about Go.
34 `
35
36
37
38 func initDefaultCache() {
39 dir := DefaultDir()
40 if dir == "off" {
41 if defaultDirErr != nil {
42 base.Fatalf("build cache is required, but could not be located: %v", defaultDirErr)
43 }
44 base.Fatalf("build cache is disabled by GOCACHE=off, but required as of Go 1.12")
45 }
46 if err := os.MkdirAll(dir, 0777); err != nil {
47 base.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
48 }
49 if _, err := os.Stat(filepath.Join(dir, "README")); err != nil {
50
51 os.WriteFile(filepath.Join(dir, "README"), []byte(cacheREADME), 0666)
52 }
53
54 c, err := Open(dir)
55 if err != nil {
56 base.Fatalf("failed to initialize build cache at %s: %s\n", dir, err)
57 }
58 defaultCache = c
59 }
60
61 var (
62 defaultDirOnce sync.Once
63 defaultDir string
64 defaultDirErr error
65 )
66
67
68
69 func DefaultDir() string {
70
71
72
73
74
75 defaultDirOnce.Do(func() {
76 defaultDir = cfg.Getenv("GOCACHE")
77 if filepath.IsAbs(defaultDir) || defaultDir == "off" {
78 return
79 }
80 if defaultDir != "" {
81 defaultDir = "off"
82 defaultDirErr = fmt.Errorf("GOCACHE is not an absolute path")
83 return
84 }
85
86
87 dir, err := os.UserCacheDir()
88 if err != nil {
89 defaultDir = "off"
90 defaultDirErr = fmt.Errorf("GOCACHE is not defined and %v", err)
91 return
92 }
93 defaultDir = filepath.Join(dir, "go-build")
94 })
95
96 return defaultDir
97 }
98
View as plain text