diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-06-09 16:01:12 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-06-09 16:05:04 +0900 |
| commit | ce06539ecaf07b5fe572b3c190b69bd01aaa7c93 (patch) | |
| tree | 9beeac96af791049294f97a5abacdfce3567f670 /internal/rosa | |
| parent | 69908e5a41b76e065cb08734543994a17e2053d7 (diff) | |
internal/rosa: expose supported architectures
This information is useful to external tooling and makes a lot more sense in this package than cmd/mbf. This change also fixes non-native artifact resolution during clean.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa')
| -rw-r--r-- | internal/rosa/rosa.go | 5 | ||||
| -rw-r--r-- | internal/rosa/state.go | 45 |
2 files changed, 47 insertions, 3 deletions
diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go index 0a61e9ec..a5972e35 100644 --- a/internal/rosa/rosa.go +++ b/internal/rosa/rosa.go @@ -443,12 +443,11 @@ func (t Toolchain) appendHandle(a []pkg.Artifact, pv pa, p ArtifactH) []pkg.Arti } pv[p] = struct{}{} - meta, _ := t.MustLoad(p) + meta, u := t.MustLoad(p) for _, d := range meta.Dependencies { a = t.appendHandle(a, pv, d) } - _, d := t.MustLoad(p) - return append(a, d) + return append(a, u) } // Append recursively appends multiple [Artifact] named by their handles, and diff --git a/internal/rosa/state.go b/internal/rosa/state.go index 6f2c05cb..864b70fa 100644 --- a/internal/rosa/state.go +++ b/internal/rosa/state.go @@ -9,6 +9,7 @@ import ( "errors" "io" "io/fs" + "iter" "net/http" "path/filepath" "reflect" @@ -22,6 +23,7 @@ import ( "unsafe" "hakurei.app/check" + "hakurei.app/container" "hakurei.app/internal/pkg" "hakurei.app/internal/rosa/azalea" ) @@ -239,6 +241,49 @@ func (s *S) wantsArch() { // Arch returns the target architecture. func (s *S) Arch() string { s.wantsArch(); return s.arch } +// Arches returns an iterator over supported emulation targets. +func Arches(qemu *check.Absolute) iter.Seq2[string, container.BinfmtEntry] { + return func(yield func(string, container.BinfmtEntry) bool) { + for _, target := range []struct { + arch, name string + offset byte + magic, mask string + }{{ + arch: "riscv64", + offset: 0, + magic: "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00", + mask: "\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff", + }, { + arch: "arm64", + name: "aarch64", + offset: 0, + magic: "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00", + mask: "\xff\xff\xff\xff\xff\xff\xff\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff", + }} { + name := target.name + if name == "" { + name = target.arch + } + var interpreter *check.Absolute + if qemu != nil { + interpreter = qemu.Append( + "system/bin", + "qemu-"+name, + ) + } + + if !yield(target.arch, container.BinfmtEntry{ + Offset: target.offset, + Magic: target.magic, + Mask: target.mask, + Interpreter: interpreter, + }) { + return + } + } + } +} + // Flags returns the current preset flags. func (s *S) Flags() int { return s.opts } |
