1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package main
16
17 import (
18 "go/build"
19 "io/ioutil"
20 "os"
21 "path/filepath"
22 "regexp"
23 "runtime"
24 "strconv"
25 "strings"
26 )
27
28 var ASM_DEFINES = []string{
29 "-D", "GOOS_" + build.Default.GOOS,
30 "-D", "GOARCH_" + build.Default.GOARCH,
31 "-D", "GOOS_GOARCH_" + build.Default.GOOS + "_" + build.Default.GOARCH,
32 }
33
34
35
36
37
38 func buildSymabisFile(goenv *env, packagePath string, sFiles, hFiles []fileInfo, asmhdr string) (string, error) {
39 if len(sFiles) == 0 {
40 return "", nil
41 }
42
43
44
45 version := runtime.Version()
46 if strings.HasPrefix(version, "go1.") {
47 minor := version[len("go1."):]
48 if i := strings.IndexByte(minor, '.'); i >= 0 {
49 minor = minor[:i]
50 }
51 n, err := strconv.Atoi(minor)
52 if err == nil && n <= 11 {
53 return "", nil
54 }
55
56
57 }
58
59
60
61 asmhdrFile, err := os.Create(asmhdr)
62 if err != nil {
63 return "", err
64 }
65 if err := asmhdrFile.Close(); err != nil {
66 return "", err
67 }
68 asmhdrDir := filepath.Dir(asmhdr)
69
70
71 var symabisName string
72 symabisFile, err := ioutil.TempFile("", "symabis")
73 if err != nil {
74 return "", err
75 }
76 symabisName = symabisFile.Name()
77 symabisFile.Close()
78
79
80 wd, err := os.Getwd()
81 if err != nil {
82 return symabisName, err
83 }
84 asmargs := goenv.goTool("asm")
85 asmargs = append(asmargs, "-trimpath", wd)
86 asmargs = append(asmargs, "-I", wd)
87 asmargs = append(asmargs, "-I", filepath.Join(os.Getenv("GOROOT"), "pkg", "include"))
88 asmargs = append(asmargs, "-I", asmhdrDir)
89 seenHdrDirs := map[string]bool{wd: true, asmhdrDir: true}
90 for _, hFile := range hFiles {
91 hdrDir := filepath.Dir(abs(hFile.filename))
92 if !seenHdrDirs[hdrDir] {
93 asmargs = append(asmargs, "-I", hdrDir)
94 seenHdrDirs[hdrDir] = true
95 }
96 }
97
98
99
100
101 if packagePath != "" && isGo119OrHigher() {
102 asmargs = append(asmargs, "-p", packagePath)
103 }
104 asmargs = append(asmargs, ASM_DEFINES...)
105 asmargs = append(asmargs, "-gensymabis", "-o", symabisName, "--")
106 for _, sFile := range sFiles {
107 asmargs = append(asmargs, sFile.filename)
108 }
109
110 err = goenv.runCommand(asmargs)
111 return symabisName, err
112 }
113
114 func asmFile(goenv *env, srcPath, packagePath string, asmFlags []string, outPath string) error {
115 args := goenv.goTool("asm")
116 args = append(args, asmFlags...)
117
118
119
120 if packagePath != "" && isGo119OrHigher() {
121 args = append(args, "-p", packagePath)
122 }
123 args = append(args, ASM_DEFINES...)
124 args = append(args, "-trimpath", ".")
125 args = append(args, "-o", outPath)
126 args = append(args, "--", srcPath)
127 absArgs(args, []string{"-I", "-o", "-trimpath"})
128 return goenv.runCommand(args)
129 }
130
131 var goMinorVersionRegexp = regexp.MustCompile(`^go1\.(\d+)`)
132
133 func isGo119OrHigher() bool {
134 match := goMinorVersionRegexp.FindStringSubmatch(runtime.Version())
135 if match == nil {
136
137
138 return true
139 }
140 minorVersion, err := strconv.Atoi(match[1])
141 if err != nil {
142 return true
143 }
144 return minorVersion >= 19
145 }
146
View as plain text