From ce06539ecaf07b5fe572b3c190b69bd01aaa7c93 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Tue, 9 Jun 2026 16:01:12 +0900 Subject: 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 --- internal/rosa/rosa.go | 5 ++--- internal/rosa/state.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) (limited to 'internal') 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 } -- cgit v1.3.1