@@ -45,11 +45,11 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
45
45
}
46
46
47
47
// Run the gobind command for each platform
48
- var wg errgroup.Group
48
+ var gobindWG errgroup.Group
49
49
for platform , outDir := range outDirsForPlatform {
50
50
platform := platform
51
51
outDir := outDir
52
- wg .Go (func () error {
52
+ gobindWG .Go (func () error {
53
53
// Catalyst support requires iOS 13+
54
54
v , _ := strconv .ParseFloat (buildIOSVersion , 64 )
55
55
if platform == "maccatalyst" && v < 13.0 {
@@ -78,7 +78,7 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
78
78
return nil
79
79
})
80
80
}
81
- if err := wg .Wait (); err != nil {
81
+ if err := gobindWG .Wait (); err != nil {
82
82
return err
83
83
}
84
84
@@ -87,12 +87,60 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
87
87
return err
88
88
}
89
89
90
+ // Build archive files.
91
+ var buildWG errgroup.Group
92
+ for _ , t := range targets {
93
+ t := t
94
+ buildWG .Go (func () error {
95
+ outDir := outDirsForPlatform [t .platform ]
96
+ outSrcDir := filepath .Join (outDir , "src" )
97
+
98
+ if modulesUsed {
99
+ // Copy the source directory for each architecture for concurrent building.
100
+ newOutSrcDir := filepath .Join (outDir , "src-" + t .arch )
101
+ if ! buildN {
102
+ if err := doCopyAll (newOutSrcDir , outSrcDir ); err != nil {
103
+ return err
104
+ }
105
+ }
106
+ outSrcDir = newOutSrcDir
107
+ }
108
+
109
+ // Copy the environment variables to make this function concurrent-safe.
110
+ env := make ([]string , len (appleEnv [t .String ()]))
111
+ copy (env , appleEnv [t .String ()])
112
+
113
+ // Add the generated packages to GOPATH for reverse bindings.
114
+ gopath := fmt .Sprintf ("GOPATH=%s%c%s" , outDir , filepath .ListSeparator , goEnv ("GOPATH" ))
115
+ env = append (env , gopath )
116
+
117
+ // Run `go mod tidy` to force to create go.sum.
118
+ // Without go.sum, `go build` fails as of Go 1.16.
119
+ if modulesUsed {
120
+ if err := writeGoMod (outSrcDir , t .platform , t .arch ); err != nil {
121
+ return err
122
+ }
123
+ if err := goModTidyAt (outSrcDir , env ); err != nil {
124
+ return err
125
+ }
126
+ }
127
+
128
+ if err := goAppleBindArchive (appleArchiveFilepath (name , t ), env , outSrcDir ); err != nil {
129
+ return fmt .Errorf ("%s/%s: %v" , t .platform , t .arch , err )
130
+ }
131
+
132
+ return nil
133
+ })
134
+ }
135
+ if err := buildWG .Wait (); err != nil {
136
+ return err
137
+ }
138
+
90
139
var frameworkDirs []string
91
140
frameworkArchCount := map [string ]int {}
92
141
for _ , t := range targets {
93
142
outDir := outDirsForPlatform [t .platform ]
94
- outSrcDir := filepath .Join (outDir , "src" )
95
- gobindDir := filepath .Join (outSrcDir , "gobind" )
143
+ gobindDir := filepath .Join (outDir , "src" , "gobind" )
96
144
97
145
env := appleEnv [t .String ()][:]
98
146
sdk := getenv (env , "DARWIN_SDK" )
@@ -101,41 +149,14 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
101
149
frameworkDirs = append (frameworkDirs , frameworkDir )
102
150
frameworkArchCount [frameworkDir ] = frameworkArchCount [frameworkDir ] + 1
103
151
104
- fileBases := make ([]string , len (pkgs )+ 1 )
105
- for i , pkg := range pkgs {
106
- fileBases [i ] = bindPrefix + strings .Title (pkg .Name )
107
- }
108
- fileBases [len (fileBases )- 1 ] = "Universe"
109
-
110
- // Add the generated packages to GOPATH for reverse bindings.
111
- gopath := fmt .Sprintf ("GOPATH=%s%c%s" , outDir , filepath .ListSeparator , goEnv ("GOPATH" ))
112
- env = append (env , gopath )
113
-
114
- if err := writeGoMod (filepath .Join (outDir , "src" ), t .platform , t .arch ); err != nil {
115
- return err
116
- }
117
-
118
- // Run `go mod tidy` to force to create go.sum.
119
- // Without go.sum, `go build` fails as of Go 1.16.
120
- if modulesUsed {
121
- if err := goModTidyAt (outSrcDir , env ); err != nil {
122
- return err
123
- }
124
- }
125
-
126
- path , err := goAppleBindArchive (name + "-" + t .platform + "-" + t .arch , env , outSrcDir )
127
- if err != nil {
128
- return fmt .Errorf ("%s/%s: %v" , t .platform , t .arch , err )
129
- }
130
-
131
152
versionsDir := filepath .Join (frameworkDir , "Versions" )
132
153
versionsADir := filepath .Join (versionsDir , "A" )
133
154
titlePath := filepath .Join (versionsADir , title )
134
155
if frameworkArchCount [frameworkDir ] > 1 {
135
156
// Not the first static lib, attach to a fat library and skip create headers
136
157
fatCmd := exec .Command (
137
158
"xcrun" ,
138
- "lipo" , path , titlePath , "-create" , "-output" , titlePath ,
159
+ "lipo" , appleArchiveFilepath ( name , t ) , titlePath , "-create" , "-output" , titlePath ,
139
160
)
140
161
if err := runCmd (fatCmd ); err != nil {
141
162
return err
@@ -159,12 +180,18 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
159
180
160
181
lipoCmd := exec .Command (
161
182
"xcrun" ,
162
- "lipo" , path , "-create" , "-o" , titlePath ,
183
+ "lipo" , appleArchiveFilepath ( name , t ) , "-create" , "-o" , titlePath ,
163
184
)
164
185
if err := runCmd (lipoCmd ); err != nil {
165
186
return err
166
187
}
167
188
189
+ fileBases := make ([]string , len (pkgs )+ 1 )
190
+ for i , pkg := range pkgs {
191
+ fileBases [i ] = bindPrefix + strings .Title (pkg .Name )
192
+ }
193
+ fileBases [len (fileBases )- 1 ] = "Universe"
194
+
168
195
// Copy header file next to output archive.
169
196
var headerFiles []string
170
197
if len (fileBases ) == 1 {
@@ -236,7 +263,6 @@ func goAppleBind(gobind string, pkgs []*packages.Package, targets []targetInfo)
236
263
if err != nil {
237
264
return err
238
265
}
239
-
240
266
}
241
267
242
268
// Finally combine all frameworks to an XCFramework
@@ -267,13 +293,12 @@ var appleModuleMapTmpl = template.Must(template.New("iosmmap").Parse(`framework
267
293
export *
268
294
}` ))
269
295
270
- func goAppleBindArchive (name string , env []string , gosrc string ) (string , error ) {
271
- archive := filepath .Join (tmpdir , name + ".a" )
272
- err := goBuildAt (gosrc , "./gobind" , env , "-buildmode=c-archive" , "-o" , archive )
273
- if err != nil {
274
- return "" , err
275
- }
276
- return archive , nil
296
+ func appleArchiveFilepath (name string , t targetInfo ) string {
297
+ return filepath .Join (tmpdir , name + "-" + t .platform + "-" + t .arch + ".a" )
298
+ }
299
+
300
+ func goAppleBindArchive (out string , env []string , gosrc string ) error {
301
+ return goBuildAt (gosrc , "./gobind" , env , "-buildmode=c-archive" , "-o" , out )
277
302
}
278
303
279
304
var appleBindHeaderTmpl = template .Must (template .New ("apple.h" ).Parse (`
0 commit comments