From ce06539ecaf07b5fe572b3c190b69bd01aaa7c93 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Tue, 9 Jun 2026 16:01:12 +0900 Subject: [PATCH] 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 --- cmd/mbf/cache.go | 22 +++------------------ cmd/mbf/main.go | 14 +++++++++---- internal/rosa/rosa.go | 5 ++--- internal/rosa/state.go | 45 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/cmd/mbf/cache.go b/cmd/mbf/cache.go index b683326f..71cef98b 100644 --- a/cmd/mbf/cache.go +++ b/cmd/mbf/cache.go @@ -8,7 +8,6 @@ import ( "testing" "hakurei.app/check" - "hakurei.app/container" "hakurei.app/internal/pkg" "hakurei.app/internal/rosa" "hakurei.app/message" @@ -111,24 +110,9 @@ func (cache *cache) open() (err error) { return } - pkg.RegisterArch("riscv64", container.BinfmtEntry{ - 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", - Interpreter: pathname.Append( - "system/bin", - "qemu-riscv64", - ), - }) - pkg.RegisterArch("arm64", container.BinfmtEntry{ - 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", - Interpreter: pathname.Append( - "system/bin", - "qemu-aarch64", - ), - }) + for arch, entry := range rosa.Arches(pathname) { + pkg.RegisterArch(arch, entry) + } } return diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go index 07ce8f0e..e4c6af96 100644 --- a/cmd/mbf/main.go +++ b/cmd/mbf/main.go @@ -883,13 +883,19 @@ func main() { func([]string) error { return cm.Do(func(cache *pkg.Cache) error { t := rosa.Native().Clone().Std() - a := t.Append(nil, t.CollectAll()...) - for arch := range pkg.Arch() { + handles := t.CollectAll() + + flags := t.Flags() + a := t.Append(nil, handles...) + for arch := range rosa.Arches(nil) { if arch == runtime.GOARCH { continue } - t.DropCaches(arch, t.Flags()) - a = t.Append(a, t.CollectAll()...) + + t.DropCaches(arch, rosa.OptLLVMNoLTO|rosa.OptSkipCheck) + a = t.Append(a, handles...) + t.DropCaches(arch, flags) + a = t.Append(a, handles...) } ids, checksums, err := cache.Clean( 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 }