diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-05-17 16:44:13 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-05-17 17:50:30 +0900 |
| commit | 38bc2c750842826c5af4f66abe3e1905258cd274 (patch) | |
| tree | 75e1d17961fd980ff8b20a9dfd937789de10836e /internal/rosa/rosa.go | |
| parent | 30eb0d6a613ad268f6805ccbcdcabf158e7f526f (diff) | |
internal/rosa: pass stage alongside state
This cleans up many function signatures.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/rosa.go')
| -rw-r--r-- | internal/rosa/rosa.go | 146 |
1 files changed, 66 insertions, 80 deletions
diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go index 1f0fb729..8a1b59a3 100644 --- a/internal/rosa/rosa.go +++ b/internal/rosa/rosa.go @@ -104,49 +104,46 @@ func (s *S) earlyLDFLAGS(static bool) string { return p } -// Toolchain denotes the infrastructure to compile a [pkg.Artifact] on. -type Toolchain uint32 - const ( - // _toolchainBusybox denotes a busybox installation from the busyboxBin - // binary distribution. This is defined as a toolchain to make use of the - // toolchain abstractions to preprocess toolchainGentoo and is not a real, + // _stageBusybox denotes a busybox installation from the busyboxBin + // binary distribution. This is defined as a [Stage] to make use of the + // toolchain abstractions to preprocess stageGentoo and is not a real, // functioning toolchain. It does not contain any compilers. - _toolchainBusybox Toolchain = iota + _stageBusybox Stage = iota - // toolchainGentoo denotes the toolchain in a Gentoo stage3 tarball. Special - // care must be taken to compile correctly against this toolchain. - toolchainGentoo + // stageGentoo denotes the toolchain in a Gentoo stage3 tarball. Special + // care must be taken to compile correctly against this stage. + stageGentoo - // toolchainIntermediateGentoo is like to toolchainIntermediate, but - // compiled against toolchainGentoo. - toolchainIntermediateGentoo + // stageIntermediateGentoo is like stageIntermediate, but compiled against + // stageGentoo. + stageIntermediateGentoo - // toolchainStdGentoo is like Std, but bootstrapped from toolchainGentoo. - // This toolchain creates the first [Stage0] distribution. - toolchainStdGentoo + // stageStdGentoo is like Std, but bootstrapped from stageGentoo. This + // toolchain creates the first [Stage0] distribution. + stageStdGentoo - // toolchainStage0 denotes the stage0 toolchain. Special care must be taken + // stageEarly denotes the stage0 toolchain. Special care must be taken // to compile correctly against this toolchain. - toolchainStage0 + stageEarly - // toolchainIntermediate denotes the intermediate toolchain compiled against - // toolchainStage0. This toolchain should be functionally identical to [Std] + // stageIntermediate denotes the intermediate toolchain compiled against + // stageEarly. This toolchain should be functionally identical to [Std] // and is used to bootstrap [Std]. - toolchainIntermediate + stageIntermediate // Std denotes the standard Rosa OS toolchain. Std - // _toolchainEnd is the total number of toolchains available and does not - // denote a valid toolchain. - _toolchainEnd + // _stageEnd is the total number of stages available and does not denote a + // valid toolchain. + _stageEnd ) // isStage0 returns whether t is a stage0 toolchain. -func (t Toolchain) isStage0() bool { +func (t Stage) isStage0() bool { switch t { - case toolchainGentoo, toolchainStage0: + case stageGentoo, stageEarly: return true default: return false @@ -154,9 +151,9 @@ func (t Toolchain) isStage0() bool { } // isIntermediate returns whether t is an intermediate toolchain. -func (t Toolchain) isIntermediate() bool { +func (t Stage) isIntermediate() bool { switch t { - case toolchainIntermediateGentoo, toolchainIntermediate: + case stageIntermediateGentoo, stageIntermediate: return true default: return false @@ -164,9 +161,9 @@ func (t Toolchain) isIntermediate() bool { } // isStd returns whether t is considered functionally equivalent to [Std]. -func (t Toolchain) isStd() bool { +func (t Stage) isStd() bool { switch t { - case toolchainStdGentoo, Std: + case stageStdGentoo, Std: return true default: return false @@ -224,8 +221,7 @@ const ( ) // New returns a [pkg.Artifact] based on a [Toolchain] via s. -func (s *S) New( - t Toolchain, +func (t Toolchain) New( name string, flag int, extra []pkg.Artifact, @@ -238,21 +234,21 @@ func (s *S) New( const lcMessages = "LC_MESSAGES=C.UTF-8" var support []pkg.Artifact - switch t { - case _toolchainBusybox: + switch t.stage { + case _stageBusybox: name += "-early" - support = slices.Concat([]pkg.Artifact{s.newBusyboxBin()}, extra) + support = slices.Concat([]pkg.Artifact{t.newBusyboxBin()}, extra) env = fixupEnviron(env, nil, "/system/bin") - case toolchainGentoo, toolchainStage0: + case stageGentoo, stageEarly: name += "-boot" support = append(support, extra...) support = append(support, cureEtc{}) - if t == toolchainStage0 { - a, _ := s.Load(t, stage0Dist) + if t.stage == stageEarly { + a, _ := t.Load(stage0Dist) support = append(support, a) } else { - support = append(support, s.New(_toolchainBusybox, "gentoo", 0, nil, nil, nil, ` + support = append(support, t.S.New(_stageBusybox).New("gentoo", 0, nil, nil, nil, ` tar -C /work -xf /usr/src/stage3.tar.xz rm -rf /work/dev/ /work/proc/ ln -vs ../usr/bin /work/bin @@ -263,22 +259,22 @@ mkdir -vp /work/system/bin .) `, pkg.Path(AbsUsrSrc.Append("stage3.tar.xz"), false, pkg.NewHTTPGet( - nil, s.gentooStage3, - s.gentooStage3Checksum, + nil, t.gentooStage3, + t.gentooStage3Checksum, ), ))) } env = fixupEnviron(env, []string{ - EnvTriplet + "=" + s.triple(), + EnvTriplet + "=" + t.triple(), lcMessages, - "LDFLAGS=" + s.earlyLDFLAGS(true), + "LDFLAGS=" + t.earlyLDFLAGS(true), }, "/system/bin", "/usr/bin", ) - case toolchainIntermediateGentoo, toolchainStdGentoo, - toolchainIntermediate, Std: - if t.isIntermediate() { + case stageIntermediateGentoo, stageStdGentoo, + stageIntermediate, Std: + if t.stage.isIntermediate() { name += "-std" } @@ -292,7 +288,7 @@ mkdir -vp /work/system/bin base = Musl } - support = slices.Concat(extra, s.AppendPresets(t-1, []pkg.Artifact{ + support = slices.Concat(extra, t.S.New(t.stage-1).Append([]pkg.Artifact{ cureEtc{newIANAEtc()}, }, base, @@ -300,16 +296,16 @@ mkdir -vp /work/system/bin toybox, )) env = fixupEnviron(env, []string{ - EnvTriplet + "=" + s.triple(), + EnvTriplet + "=" + t.triple(), lcMessages, }, "/system/bin", "/bin") default: - panic("unsupported toolchain " + strconv.Itoa(int(t))) + panic("unsupported toolchain " + strconv.Itoa(int(t.stage))) } return pkg.NewExec( - name, s.arch, knownChecksum, pkg.ExecTimeoutMax, + name, t.arch, knownChecksum, pkg.ExecTimeoutMax, flag&THostNet != 0, flag&TExclusive != 0, fhs.AbsRoot, env, @@ -328,8 +324,7 @@ mkdir -vp /work/system/bin // NewPatchedSource returns [pkg.Artifact] of source with patches applied. If // passthrough is true, source is returned as is for zero length patches. -func (s *S) NewPatchedSource( - t Toolchain, +func (t Toolchain) NewPatchedSource( name, version string, source pkg.Artifact, passthrough bool, @@ -362,7 +357,7 @@ cat /usr/src/` + name + `-patches/* | \ ` aname += "-patched" } - return s.New(t, aname, 0, s.AppendPresets(t, nil, + return t.New(aname, 0, t.Append(nil, Patch, ), nil, nil, script, paths...) } @@ -431,42 +426,34 @@ func paGet() pa { return paPool.Get().(pa) } // paPut returns a pa to paPool. func paPut(pv pa) { clear(pv); paPool.Put(pv) } -// appendPreset recursively appends a [PArtifact] and its runtime dependencies. -func (s *S) appendPreset( - t Toolchain, - a []pkg.Artifact, - pv pa, p ArtifactH, -) []pkg.Artifact { +// appendHandle recursively appends an [Artifact] named by its handle, and its +// runtime dependencies. +func (t Toolchain) appendHandle(a []pkg.Artifact, pv pa, p ArtifactH) []pkg.Artifact { if _, ok := pv[p]; ok { return a } pv[p] = struct{}{} - for _, d := range s.Get(p).Dependencies { - a = s.appendPreset(t, a, pv, d) + for _, d := range t.MustGet(p).Dependencies { + a = t.appendHandle(a, pv, d) } - d, _ := s.Load(t, p) + d, _ := t.Load(p) return append(a, d) } -// AppendPresets recursively appends multiple [PArtifact] and their runtime -// dependencies. -func (s *S) AppendPresets( - t Toolchain, - a []pkg.Artifact, - presets ...ArtifactH, -) []pkg.Artifact { +// Append recursively appends multiple [Artifact] named by their handles, and +// their runtime dependencies. +func (t Toolchain) Append(a []pkg.Artifact, handles ...ArtifactH) []pkg.Artifact { pv := paGet() - for _, p := range presets { - a = s.appendPreset(t, a, pv, p) + for _, p := range handles { + a = t.appendHandle(a, pv, p) } paPut(pv) return a } // NewPackage constructs a [pkg.Artifact] via a build system helper. -func (s *S) NewPackage( - t Toolchain, +func (t Toolchain) NewPackage( name, version string, source pkg.Artifact, attr *PackageAttr, @@ -488,10 +475,10 @@ func (s *S) NewPackage( { pv := paGet() for _, p := range helper.extra(attr.Flag) { - extraRes = s.appendPreset(t, extraRes, pv, p) + extraRes = t.appendHandle(extraRes, pv, p) } for _, p := range extra { - extraRes = s.appendPreset(t, extraRes, pv, p) + extraRes = t.appendHandle(extraRes, pv, p) } paPut(pv) } @@ -535,19 +522,18 @@ cd '/usr/src/` + name + `/' panic("cannot remain in root") } - return s.New( - t, + return t.New( name+"-"+version, attr.Flag, extraRes, attr.KnownChecksum, attr.Env, - scriptEarly+helper.script(s, name), + scriptEarly+helper.script(t.S, name), slices.Concat(attr.Paths, []pkg.ExecPath{ pkg.Path(AbsUsrSrc.Append( name+sourceSuffix, - ), attr.Writable || wantsWrite, s.NewPatchedSource( - t, name, version, source, !attr.Chmod && !wantsChmod, attr.Patches..., + ), attr.Writable || wantsWrite, t.NewPatchedSource( + name, version, source, !attr.Chmod && !wantsChmod, attr.Patches..., )), })..., ) |
