@@ -14,8 +14,11 @@ import (
14
14
"io"
15
15
"os"
16
16
"os/exec"
17
+ "path"
17
18
"regexp"
18
19
"strings"
20
+
21
+ "golang.org/x/tools/go/packages"
19
22
)
20
23
21
24
var ctx = build .Default
@@ -77,7 +80,7 @@ func runBuild(cmd *command) (err error) {
77
80
78
81
// runBuildImpl builds a package for mobiles based on the given commands.
79
82
// runBuildImpl returns a built package information and an error if exists.
80
- func runBuildImpl (cmd * command ) (* build .Package , error ) { cleanup , err := buildEnvInit ()
83
+ func runBuildImpl (cmd * command ) (* packages .Package , error ) { cleanup , err := buildEnvInit ()
81
84
if err != nil {
82
85
return nil , err
83
86
}
@@ -90,14 +93,13 @@ func runBuildImpl(cmd *command) (*build.Package, error) { cleanup, err := buildE
90
93
return nil , fmt .Errorf (`invalid -target=%q: %v` , buildTarget , err )
91
94
}
92
95
96
+ // TODO(hajimehoshi): ctx is now used only for recording build tags in build. Remove this.
93
97
oldCtx := ctx
94
98
defer func () {
95
99
ctx = oldCtx
96
100
}()
97
- ctx .GOARCH = targetArchs [0 ]
98
- ctx .GOOS = targetOS
99
101
100
- if ctx . GOOS == "darwin" {
102
+ if targetOS == "darwin" {
101
103
ctx .BuildTags = append (ctx .BuildTags , "ios" )
102
104
103
105
if buildRelease {
@@ -106,19 +108,27 @@ func runBuildImpl(cmd *command) (*build.Package, error) { cleanup, err := buildE
106
108
}
107
109
}
108
110
109
- var pkg * build. Package
111
+ var buildPath string
110
112
switch len (args ) {
111
113
case 0 :
112
- pkg , err = ctx . ImportDir ( cwd , build . ImportComment )
114
+ buildPath = "."
113
115
case 1 :
114
- pkg , err = ctx . Import (args [0 ], cwd , build . ImportComment )
116
+ buildPath = path . Clean (args [0 ])
115
117
default :
116
118
cmd .usage ()
117
119
os .Exit (1 )
118
120
}
121
+ pkgs , err := packages .Load (packagesConfig (targetOS ), buildPath )
119
122
if err != nil {
120
123
return nil , err
121
124
}
125
+ // len(pkgs) can be more than 1 e.g., when the specified path includes `...`.
126
+ if len (pkgs ) != 1 {
127
+ cmd .usage ()
128
+ os .Exit (1 )
129
+ }
130
+
131
+ pkg := pkgs [0 ]
122
132
123
133
if pkg .Name != "main" && buildO != "" {
124
134
return nil , fmt .Errorf ("cannot set -o when building non-main package" )
@@ -133,7 +143,7 @@ func runBuildImpl(cmd *command) (*build.Package, error) { cleanup, err := buildE
133
143
if pkg .Name != "main" {
134
144
for _ , arch := range targetArchs {
135
145
env := androidEnv [arch ]
136
- if err := goBuild (pkg .ImportPath , env ); err != nil {
146
+ if err := goBuild (pkg .PkgPath , env ); err != nil {
137
147
return nil , err
138
148
}
139
149
}
@@ -150,7 +160,7 @@ func runBuildImpl(cmd *command) (*build.Package, error) { cleanup, err := buildE
150
160
if pkg .Name != "main" {
151
161
for _ , arch := range targetArchs {
152
162
env := darwinEnv [arch ]
153
- if err := goBuild (pkg .ImportPath , env ); err != nil {
163
+ if err := goBuild (pkg .PkgPath , env ); err != nil {
154
164
return nil , err
155
165
}
156
166
}
@@ -163,7 +173,7 @@ func runBuildImpl(cmd *command) (*build.Package, error) { cleanup, err := buildE
163
173
}
164
174
165
175
if ! nmpkgs ["golang.org/x/mobile/app" ] {
166
- return nil , fmt .Errorf (`%s does not import "golang.org/x/mobile/app"` , pkg .ImportPath )
176
+ return nil , fmt .Errorf (`%s does not import "golang.org/x/mobile/app"` , pkg .PkgPath )
167
177
}
168
178
169
179
return pkg , nil
0 commit comments