aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/rosa.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-05-17 13:07:12 +0900
committerOphestra <cat@gensokyo.uk>2026-05-17 15:56:53 +0900
commit30eb0d6a613ad268f6805ccbcdcabf158e7f526f (patch)
tree07e55baa52748fd139e183017eeb43f5f64cee59 /internal/rosa/rosa.go
parentc2ff9c9fa55ea569a5e70ee90d2eb0b2ee2a0540 (diff)
internal/rosa: key metadata by string
For upcoming azalea integration. The API is quite ugly right now to ease migration. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/rosa.go')
-rw-r--r--internal/rosa/rosa.go139
1 files changed, 66 insertions, 73 deletions
diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go
index 740746cf..1f0fb729 100644
--- a/internal/rosa/rosa.go
+++ b/internal/rosa/rosa.go
@@ -2,7 +2,6 @@
package rosa
import (
- "errors"
"path"
"slices"
"strconv"
@@ -54,8 +53,8 @@ var (
)
// linuxArch returns the architecture name used by linux corresponding to arch.
-func linuxArch() string {
- switch arch {
+func (s *S) linuxArch() string {
+ switch s.arch {
case "amd64":
return "x86_64"
case "arm64":
@@ -64,23 +63,23 @@ func linuxArch() string {
return "riscv64"
default:
- panic("unsupported target " + arch)
+ panic("unsupported target " + s.arch)
}
}
-// triplet returns the Rosa OS host triple corresponding to arch.
-func triplet() string {
- return linuxArch() + "-rosa-linux-musl"
+// triple returns the Rosa OS host triple corresponding to arch.
+func (s *S) triple() string {
+ return s.linuxArch() + "-rosa-linux-musl"
}
// perArch is a value that differs per architecture.
type perArch[T any] map[string]T
// unwrap returns the value for the current architecture.
-func (p perArch[T]) unwrap() T {
- v, ok := p[arch]
+func (p perArch[T]) unwrap(s *S) T {
+ v, ok := p[s.arch]
if !ok {
- panic("unsupported target " + arch)
+ panic("unsupported target " + s.arch)
}
return v
}
@@ -91,18 +90,18 @@ const (
)
// earlyLDFLAGS returns LDFLAGS corresponding to triplet.
-func earlyLDFLAGS(static bool) string {
- s := "-fuse-ld=lld " +
+func (s *S) earlyLDFLAGS(static bool) string {
+ p := "-fuse-ld=lld " +
"-L/system/lib -Wl,-rpath=/system/lib " +
- "-L/system/lib/" + triplet() + " " +
- "-Wl,-rpath=/system/lib/" + triplet() + " " +
+ "-L/system/lib/" + s.triple() + " " +
+ "-Wl,-rpath=/system/lib/" + s.triple() + " " +
"-rtlib=compiler-rt " +
"-unwindlib=libunwind " +
"-Wl,--as-needed"
if !static {
- s += " -Wl,--dynamic-linker=/system/bin/linker"
+ p += " -Wl,--dynamic-linker=/system/bin/linker"
}
- return s
+ return p
}
// Toolchain denotes the infrastructure to compile a [pkg.Artifact] on.
@@ -224,27 +223,9 @@ const (
THostNet
)
-var (
- // gentooStage3 is the url of a Gentoo stage3 tarball.
- gentooStage3 string
- // gentooStage3Checksum is the expected checksum of gentooStage3.
- gentooStage3Checksum pkg.Checksum
-)
-
-// SetGentooStage3 sets the Gentoo stage3 tarball url and checksum. It panics
-// if given zero values or if these values have already been set.
-func SetGentooStage3(url string, checksum pkg.Checksum) {
- if gentooStage3 != "" {
- panic(errors.New("attempting to set Gentoo stage3 url twice"))
- }
- if url == "" {
- panic(errors.New("attempting to set Gentoo stage3 url to the zero value"))
- }
- gentooStage3, gentooStage3Checksum = url, checksum
-}
-
-// New returns a [pkg.Artifact] compiled on this toolchain.
-func (t Toolchain) New(
+// New returns a [pkg.Artifact] based on a [Toolchain] via s.
+func (s *S) New(
+ t Toolchain,
name string,
flag int,
extra []pkg.Artifact,
@@ -260,7 +241,7 @@ func (t Toolchain) New(
switch t {
case _toolchainBusybox:
name += "-early"
- support = slices.Concat([]pkg.Artifact{newBusyboxBin()}, extra)
+ support = slices.Concat([]pkg.Artifact{s.newBusyboxBin()}, extra)
env = fixupEnviron(env, nil, "/system/bin")
case toolchainGentoo, toolchainStage0:
@@ -268,9 +249,10 @@ func (t Toolchain) New(
support = append(support, extra...)
support = append(support, cureEtc{})
if t == toolchainStage0 {
- support = append(support, t.Load(stage0Dist))
+ a, _ := s.Load(t, stage0Dist)
+ support = append(support, a)
} else {
- support = append(support, _toolchainBusybox.New("gentoo", 0, nil, nil, nil, `
+ support = append(support, s.New(_toolchainBusybox, "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
@@ -281,15 +263,15 @@ mkdir -vp /work/system/bin
.)
`, pkg.Path(AbsUsrSrc.Append("stage3.tar.xz"), false,
pkg.NewHTTPGet(
- nil, gentooStage3,
- gentooStage3Checksum,
+ nil, s.gentooStage3,
+ s.gentooStage3Checksum,
),
)))
}
env = fixupEnviron(env, []string{
- EnvTriplet + "=" + triplet(),
+ EnvTriplet + "=" + s.triple(),
lcMessages,
- "LDFLAGS=" + earlyLDFLAGS(true),
+ "LDFLAGS=" + s.earlyLDFLAGS(true),
}, "/system/bin",
"/usr/bin",
)
@@ -310,7 +292,7 @@ mkdir -vp /work/system/bin
base = Musl
}
- support = slices.Concat(extra, (t-1).AppendPresets([]pkg.Artifact{
+ support = slices.Concat(extra, s.AppendPresets(t-1, []pkg.Artifact{
cureEtc{newIANAEtc()},
},
base,
@@ -318,7 +300,7 @@ mkdir -vp /work/system/bin
toybox,
))
env = fixupEnviron(env, []string{
- EnvTriplet + "=" + triplet(),
+ EnvTriplet + "=" + s.triple(),
lcMessages,
}, "/system/bin", "/bin")
@@ -327,7 +309,7 @@ mkdir -vp /work/system/bin
}
return pkg.NewExec(
- name, arch, knownChecksum, pkg.ExecTimeoutMax,
+ name, s.arch, knownChecksum, pkg.ExecTimeoutMax,
flag&THostNet != 0,
flag&TExclusive != 0,
fhs.AbsRoot, env,
@@ -346,7 +328,8 @@ 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 (t Toolchain) NewPatchedSource(
+func (s *S) NewPatchedSource(
+ t Toolchain,
name, version string,
source pkg.Artifact,
passthrough bool,
@@ -379,7 +362,7 @@ cat /usr/src/` + name + `-patches/* | \
`
aname += "-patched"
}
- return t.New(aname, 0, t.AppendPresets(nil,
+ return s.New(t, aname, 0, s.AppendPresets(t, nil,
Patch,
), nil, nil, script, paths...)
}
@@ -407,7 +390,7 @@ type Helper interface {
// also empty. The special value helperInPlace omits the cd statement.
wantsDir() string
// script returns the helper-specific segment of cure script.
- script(name string) string
+ script(s *S, name string) string
}
// PackageAttr holds build-system-agnostic attributes.
@@ -436,55 +419,59 @@ type PackageAttr struct {
Flag int
}
-// pa holds whether a [PArtifact] is present.
-type pa = [PresetEnd]bool
+// pa holds whether an [ArtifactH] is present.
+type pa = map[ArtifactH]struct{}
// paPool holds addresses of pa.
-var paPool = sync.Pool{New: func() any { return new(pa) }}
+var paPool = sync.Pool{New: func() any { return make(pa) }}
// paGet returns the address of a new pa.
-func paGet() *pa { return paPool.Get().(*pa) }
+func paGet() pa { return paPool.Get().(pa) }
// paPut returns a pa to paPool.
-func paPut(pv *pa) { *pv = pa{}; paPool.Put(pv) }
+func paPut(pv pa) { clear(pv); paPool.Put(pv) }
// appendPreset recursively appends a [PArtifact] and its runtime dependencies.
-func (t Toolchain) appendPreset(
+func (s *S) appendPreset(
+ t Toolchain,
a []pkg.Artifact,
- pv *pa, p PArtifact,
+ pv pa, p ArtifactH,
) []pkg.Artifact {
- if pv[p] {
+ if _, ok := pv[p]; ok {
return a
}
- pv[p] = true
+ pv[p] = struct{}{}
- for _, d := range GetMetadata(p).Dependencies {
- a = t.appendPreset(a, pv, d)
+ for _, d := range s.Get(p).Dependencies {
+ a = s.appendPreset(t, a, pv, d)
}
- return append(a, t.Load(p))
+ d, _ := s.Load(t, p)
+ return append(a, d)
}
// AppendPresets recursively appends multiple [PArtifact] and their runtime
// dependencies.
-func (t Toolchain) AppendPresets(
+func (s *S) AppendPresets(
+ t Toolchain,
a []pkg.Artifact,
- presets ...PArtifact,
+ presets ...ArtifactH,
) []pkg.Artifact {
pv := paGet()
for _, p := range presets {
- a = t.appendPreset(a, pv, p)
+ a = s.appendPreset(t, a, pv, p)
}
paPut(pv)
return a
}
// NewPackage constructs a [pkg.Artifact] via a build system helper.
-func (t Toolchain) NewPackage(
+func (s *S) NewPackage(
+ t Toolchain,
name, version string,
source pkg.Artifact,
attr *PackageAttr,
helper Helper,
- extra ...PArtifact,
+ extra ...ArtifactH,
) pkg.Artifact {
if attr == nil {
attr = new(PackageAttr)
@@ -501,10 +488,10 @@ func (t Toolchain) NewPackage(
{
pv := paGet()
for _, p := range helper.extra(attr.Flag) {
- extraRes = t.appendPreset(extraRes, pv, p)
+ extraRes = s.appendPreset(t, extraRes, pv, p)
}
for _, p := range extra {
- extraRes = t.appendPreset(extraRes, pv, p)
+ extraRes = s.appendPreset(t, extraRes, pv, p)
}
paPut(pv)
}
@@ -548,18 +535,19 @@ cd '/usr/src/` + name + `/'
panic("cannot remain in root")
}
- return t.New(
+ return s.New(
+ t,
name+"-"+version,
attr.Flag,
extraRes,
attr.KnownChecksum,
attr.Env,
- scriptEarly+helper.script(name),
+ scriptEarly+helper.script(s, name),
slices.Concat(attr.Paths, []pkg.ExecPath{
pkg.Path(AbsUsrSrc.Append(
name+sourceSuffix,
- ), attr.Writable || wantsWrite, t.NewPatchedSource(
- name, version, source, !attr.Chmod && !wantsChmod, attr.Patches...,
+ ), attr.Writable || wantsWrite, s.NewPatchedSource(
+ t, name, version, source, !attr.Chmod && !wantsChmod, attr.Patches...,
)),
})...,
)
@@ -626,3 +614,8 @@ func newFromGitHubRelease(
compression,
)
}
+
+var native S
+
+// Native returns the global [S].
+func Native() *S { return &native }