aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/state.go
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 /internal/rosa/state.go
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>
Diffstat (limited to 'internal/rosa/state.go')
-rw-r--r--internal/rosa/state.go45
1 files changed, 45 insertions, 0 deletions
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 }