aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-06-09 16:01:12 +0900
committerOphestra <cat@gensokyo.uk>2026-06-09 16:05:04 +0900
commitce06539ecaf07b5fe572b3c190b69bd01aaa7c93 (patch)
tree9beeac96af791049294f97a5abacdfce3567f670
parent69908e5a41b76e065cb08734543994a17e2053d7 (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>
-rw-r--r--cmd/mbf/cache.go22
-rw-r--r--cmd/mbf/main.go14
-rw-r--r--internal/rosa/rosa.go5
-rw-r--r--internal/rosa/state.go45
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 }