diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go index db5e80a..83bb671 100644 --- a/cmd/mbf/main.go +++ b/cmd/mbf/main.go @@ -109,46 +109,66 @@ func main() { ) } - c.NewCommand( - "stage3", - "Check for toolchain 3-stage non-determinism", - func(args []string) (err error) { - _, _, _, stage1 := (rosa.Std - 2).NewLLVM() - _, _, _, stage2 := (rosa.Std - 1).NewLLVM() - _, _, _, stage3 := rosa.Std.NewLLVM() - var ( - pathname *check.Absolute - checksum [2]unique.Handle[pkg.Checksum] - ) - - if pathname, _, err = cache.Cure(stage1); err != nil { - return err - } - log.Println("stage1:", pathname) - - if pathname, checksum[0], err = cache.Cure(stage2); err != nil { - return err - } - log.Println("stage2:", pathname) - if pathname, checksum[1], err = cache.Cure(stage3); err != nil { - return err - } - log.Println("stage3:", pathname) - - if checksum[0] != checksum[1] { - err = &pkg.ChecksumMismatchError{ - Got: checksum[0].Value(), - Want: checksum[1].Value(), - } - } else { - log.Println( - "stage2 is identical to stage3", - "("+pkg.Encode(checksum[0].Value())+")", + { + var ( + flagStage0 bool + ) + c.NewCommand( + "stage3", + "Check for toolchain 3-stage non-determinism", + func(args []string) (err error) { + _, _, _, stage1 := (rosa.Std - 2).NewLLVM() + _, _, _, stage2 := (rosa.Std - 1).NewLLVM() + _, _, _, stage3 := rosa.Std.NewLLVM() + var ( + pathname *check.Absolute + checksum [2]unique.Handle[pkg.Checksum] ) - } - return - }, - ) + + if pathname, _, err = cache.Cure(stage1); err != nil { + return err + } + log.Println("stage1:", pathname) + + if pathname, checksum[0], err = cache.Cure(stage2); err != nil { + return err + } + log.Println("stage2:", pathname) + if pathname, checksum[1], err = cache.Cure(stage3); err != nil { + return err + } + log.Println("stage3:", pathname) + + if checksum[0] != checksum[1] { + err = &pkg.ChecksumMismatchError{ + Got: checksum[0].Value(), + Want: checksum[1].Value(), + } + } else { + log.Println( + "stage2 is identical to stage3", + "("+pkg.Encode(checksum[0].Value())+")", + ) + } + + if flagStage0 { + if pathname, _, err = cache.Cure( + rosa.Std.Load(rosa.Stage0), + ); err != nil { + return err + } + log.Println(pathname) + } + + return + }, + ). + Flag( + &flagStage0, + "stage0", command.BoolFlag(false), + "Create bootstrap stage0 tarball", + ) + } { var ( diff --git a/internal/rosa/all.go b/internal/rosa/all.go index 0fdfdc8..6c1a8ab 100644 --- a/internal/rosa/all.go +++ b/internal/rosa/all.go @@ -83,6 +83,10 @@ const ( // stages only. This preset and its direct output must never be exposed. gcc + // Stage0 is a tarball containing all compile-time dependencies of artifacts + // part of the [Std] toolchain. + Stage0 + // _presetEnd is the total number of presets and does not denote a preset. _presetEnd ) diff --git a/internal/rosa/stage0.go b/internal/rosa/stage0.go new file mode 100644 index 0000000..7b34725 --- /dev/null +++ b/internal/rosa/stage0.go @@ -0,0 +1,39 @@ +package rosa + +import "hakurei.app/internal/pkg" + +func (t Toolchain) newStage0() pkg.Artifact { + musl, compilerRT, runtimes, clang := t.NewLLVM() + return t.New("rosa-stage0", 0, []pkg.Artifact{ + musl, + compilerRT, + runtimes, + clang, + + t.Load(Bzip2), + + t.Load(Patch), + t.Load(Make), + t.Load(CMake), + t.Load(Ninja), + + t.Load(Libffi), + t.Load(Python), + t.Load(Perl), + t.Load(Diffutils), + t.Load(Bash), + t.Load(Gawk), + t.Load(Coreutils), + t.Load(Findutils), + + t.Load(KernelHeaders), + }, nil, nil, ` +umask 377 +tar \ + -vjc \ + -C / \ + -f /work/stage0-`+triplet()+`.tar.bz2 \ + system bin usr/bin/env +`) +} +func init() { artifactsF[Stage0] = Toolchain.newStage0 } diff --git a/internal/rosa/toybox.go b/internal/rosa/toybox.go index 2e4d470..a35215b 100644 --- a/internal/rosa/toybox.go +++ b/internal/rosa/toybox.go @@ -16,7 +16,9 @@ func (t Toolchain) newToybox(suffix, script string) pkg.Artifact { ), nil, stage0Concat(t, []string{}, "ROSA_CHECK=make USER=cure tests", ), ` -ln -s ../system/bin/bash /bin/ || true +chmod +w /bin/ +ln -sf ../system/bin/bash /bin/ + cd /usr/src/toybox chmod +w kconfig tests rm \