@@ -17,7 +17,7 @@ import (
17
17
"os"
18
18
"os/exec"
19
19
"path/filepath"
20
- "runtime "
20
+ "strings "
21
21
22
22
"github.com/hashicorp/go-multierror"
23
23
"github.com/u-root/u-root/pkg/cpio"
@@ -27,8 +27,8 @@ import (
27
27
var (
28
28
version = "go1.17.7"
29
29
V = log .Printf
30
- arch = runtime . GOARCH
31
- kern = runtime . GOOS
30
+ archList = flag . String ( "arches" , "amd64" , "comma-separated list of GOARCH" )
31
+ kernList = flag . String ( "kernels" , "linux" , "comma-seperate list of GOOS" )
32
32
bin string
33
33
testrun = true
34
34
dest = flag .String ("d" , "" , "Destination directory -- default is os.MkdirTemp" )
@@ -62,7 +62,7 @@ func clone(tmp, version, repo, dir, base string) error {
62
62
return nil
63
63
}
64
64
65
- func tidy (tmp , dir , base string ) error {
65
+ func tidy (tmp , dir , base , kern , arch string ) error {
66
66
c := exec .Command (filepath .Join (tmp , "go/bin/go" ), "mod" , "tidy" )
67
67
c .Stdout , c .Stderr = os .Stdout , os .Stderr
68
68
c .Env = append (c .Env , "GOPATH=" + tmp )
@@ -78,7 +78,7 @@ func tidy(tmp, dir, base string) error {
78
78
return nil
79
79
}
80
80
81
- func modinit (tmp , host , dir , base string ) error {
81
+ func modinit (tmp , host , dir , base , kern , arch string ) error {
82
82
path := filepath .Join (tmp , dir , base )
83
83
V ("modinit: check %q for go.mod" , path )
84
84
if _ , err := os .Stat (filepath .Join (path , "go.mod" )); err == nil {
@@ -117,13 +117,13 @@ func getgo(d, v string) error {
117
117
118
118
// build builds the code found in filepath.Join(tmp, dir)
119
119
// into bin.
120
- func build (tmp , sourcePath , dir , bin string , extra ... string ) error {
120
+ func build (tmp , sourcePath , dir , bin , kern , arch string , extra ... string ) error {
121
121
c := exec .Command (filepath .Join (tmp , "go/bin/go" ), "build" , "-o" , bin )
122
122
c .Args = append (c .Args , extra ... )
123
123
c .Dir = filepath .Join (sourcePath , dir )
124
124
c .Stdout , c .Stderr = os .Stdout , os .Stderr
125
125
c .Env = os .Environ ()
126
- c .Env = append (c .Env , "GOROOT_FINAL=/go" , "CGO_ENABLED=0" )
126
+ c .Env = append (c .Env , "GOROOT_FINAL=/go" , "CGO_ENABLED=0" , "GOOS=" + kern , "GOARCH=" + arch )
127
127
if err := c .Run (); err != nil {
128
128
return err
129
129
}
@@ -133,7 +133,7 @@ func build(tmp, sourcePath, dir, bin string, extra ...string) error {
133
133
// buildToolchain builds the needed Go toolchain binaries: go, compile, link,
134
134
// asm. We can no longer do this without the script. Damn.
135
135
// TODO: figure out what files we can remove.
136
- func buildToolchain (tmp string ) error {
136
+ func buildToolchain (tmp , kern , arch string ) error {
137
137
c := exec .Command ("bash" , "make.bash" )
138
138
c .Dir = filepath .Join (tmp , "go/src" )
139
139
c .Stdout , c .Stderr = os .Stdout , os .Stderr
@@ -173,7 +173,7 @@ func goName(p string) (string, string, string, error) {
173
173
return host , filepath .Dir (u .Path ), filepath .Base (u .Path ), nil
174
174
}
175
175
176
- func get (target string , args ... string ) error {
176
+ func get (target string , kernels , archs [] string , args ... string ) error {
177
177
var err error
178
178
for _ , d := range args {
179
179
V ("Get %q" , d )
@@ -189,28 +189,22 @@ func get(target string, args ...string) error {
189
189
err = multierror .Append (err , e )
190
190
continue
191
191
}
192
-
193
- if e := modinit (target , host , dir , base ); e != nil {
194
- err = multierror .Append (err , e )
195
- continue
196
- }
197
- if e := tidy (target , dir , base ); e != nil {
198
- err = multierror .Append (err , e )
199
- continue
192
+ for _ , kern := range kernels {
193
+ for _ , arch := range archs {
194
+ if e := modinit (target , host , dir , base , kern , arch ); e != nil {
195
+ err = multierror .Append (err , e )
196
+ continue
197
+ }
198
+ if e := tidy (target , dir , base , kern , arch ); e != nil {
199
+ err = multierror .Append (err , e )
200
+ continue
201
+ }
202
+ }
200
203
}
201
204
}
202
205
return err
203
206
}
204
207
205
- func init () {
206
- if a , ok := os .LookupEnv ("GOARCH" ); ok {
207
- arch = a
208
- }
209
- if a , ok := os .LookupEnv ("GOOS" ); ok {
210
- kern = a
211
- }
212
- }
213
-
214
208
func tree (d string ) error {
215
209
var err error
216
210
for _ , n := range []string {"tmp" , "dev" , "etc" } {
@@ -306,7 +300,10 @@ func ramfs(from, out string, filter ...string) error {
306
300
307
301
func main () {
308
302
flag .Parse ()
309
- V ("Building for %v_%v" , arch , kern )
303
+
304
+ kernels := strings .Split (* kernList , "," )
305
+ archs := strings .Split (* archList , "," )
306
+ V ("Building for %v_%v" , kernels , archs )
310
307
311
308
// Build the target directory
312
309
// Start with a temporary directory
@@ -333,21 +330,27 @@ func main() {
333
330
if err := tree (d ); err != nil {
334
331
log .Fatal (err )
335
332
}
336
- bin = filepath .Join (fmt .Sprintf ("%v_%v" , kern , arch ), "bin" )
337
- if err := os .MkdirAll (filepath .Join (d , bin ), 0755 ); err != nil {
338
- log .Fatal (err )
339
- }
340
-
341
333
if err := getgo (d , version ); err != nil {
342
334
log .Printf ("getgo errored, %v, keep going" , err )
343
335
}
344
- if err := buildToolchain (d ); err != nil {
345
- log .Fatal (err )
336
+
337
+ // Some things need GOOS and GOARCH awareness in surprising ways. Modules are once such.
338
+ for _ , kern := range kernels {
339
+ for _ , arch := range archs {
340
+ bin = filepath .Join (fmt .Sprintf ("%v_%v" , kern , arch ), "bin" )
341
+ if err := os .MkdirAll (filepath .Join (d , bin ), 0755 ); err != nil {
342
+ log .Fatal (err )
343
+ }
344
+
345
+ if err := buildToolchain (d , kern , arch ); err != nil {
346
+ log .Fatal (err )
347
+ }
348
+ }
346
349
}
347
350
if err := os .MkdirAll (filepath .Join (d , "src" ), 0755 ); err != nil {
348
351
log .Fatal (err )
349
352
}
350
- if err := get (
filepath .
Join (
d ,
"src" ),
append (
flag .
Args (),
"[email protected] :u-root/sourcery" )
... );
err != nil {
353
+ if err := get (
filepath .
Join (
d ,
"src" ),
kernels , archs , append (
flag .
Args (),
"[email protected] :u-root/sourcery" )
... );
err != nil {
351
354
log .Fatalf ("Getting packages: %v" , err )
352
355
}
353
356
@@ -360,20 +363,24 @@ func main() {
360
363
baseToolPath = pwd
361
364
}
362
365
V ("Build tools from %q" , baseToolPath )
363
- for _ , tool := range []string {"installcommand" , "init" } {
364
- goBin := filepath .Join (d , bin , tool )
365
- V ("Build %q in %q, install to %q" , tool , baseToolPath , goBin )
366
- if err := build (d , baseToolPath , tool , goBin ); err != nil {
367
- log .Fatalf ("Building %q -> %q: %v" , goBin , tool , err )
366
+ for _ , kern := range kernels {
367
+ for _ , arch := range archs {
368
+ for _ , tool := range []string {"installcommand" , "init" } {
369
+ goBin := filepath .Join (d , bin , tool )
370
+ V ("Build %q in %q, install to %q" , tool , baseToolPath , goBin )
371
+ if err := build (d , baseToolPath , tool , goBin , kern , arch ); err != nil {
372
+ log .Fatalf ("Building %q -> %q: %v" , goBin , tool , err )
373
+ }
374
+ }
375
+
368
376
}
369
377
}
370
-
371
378
if * outCPIO != "" {
372
379
if err := ramfs (d , * outCPIO ); err != nil {
373
380
log .Printf ("ramfs: %v" , err )
374
381
}
375
382
}
376
- log .Printf ("sudo strace -o syscalltrace -f unshare -m chroot %q /%q_%q/bin/init" , d , kern , arch )
377
- log .Printf ("unshare -m chroot %q /%q_%q/bin/init" , d , kern , arch )
383
+ log .Printf ("sudo strace -o syscalltrace -f unshare -m chroot %q /%q_%q/bin/init" , d , kernels , archs )
384
+ log .Printf ("unshare -m chroot %q /%q_%q/bin/init" , d , kernels , archs )
378
385
log .Printf ("rsync -avz --no-owner --no-group -I %q somewhere" , d )
379
386
}
0 commit comments