1
0
forked from rosa/hakurei

internal/pkg: optionally register binfmt

This transparently supports curing foreign exec artifacts.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-05-07 18:04:59 +09:00
parent 8a3c3d145a
commit 8d72b9e5bd
17 changed files with 213 additions and 36 deletions

View File

@@ -6,6 +6,7 @@ import (
"errors"
"fmt"
"net/http"
"runtime"
"strconv"
"sync"
@@ -347,6 +348,9 @@ var (
// artifactsOnce is for lazy initialisation of artifacts.
artifactsOnce [_toolchainEnd][len(artifactsM)]sync.Once
// arch is the target architecture.
arch = runtime.GOARCH
// presetOpts globally modifies behaviour of presets.
presetOpts int
)
@@ -358,6 +362,9 @@ const (
OptLLVMNoLTO
)
// Arch returns the target architecture.
func Arch() string { return arch }
// Flags returns the current preset flags
func Flags() int { return presetOpts }
@@ -367,7 +374,12 @@ func zero[T any](p *T) { var v T; *p = v }
// DropCaches arranges for all cached [pkg.Artifact] to be freed some time after
// it returns. Must not be used concurrently with any other function from this
// package.
func DropCaches(flags int) {
func DropCaches(targetArch string, flags int) {
if targetArch == "" {
targetArch = runtime.GOARCH
}
arch = targetArch
presetOpts = flags
zero(&artifacts)
zero(&artifactsOnce)

View File

@@ -20,8 +20,8 @@ func TestLoad(t *testing.T) {
}
func BenchmarkAll(b *testing.B) {
flags := rosa.Flags()
b.Cleanup(func() { rosa.DropCaches(flags) })
arch, flags := rosa.Arch(), rosa.Flags()
b.Cleanup(func() { rosa.DropCaches(arch, flags) })
for b.Loop() {
for i := range rosa.PresetEnd {
@@ -29,7 +29,7 @@ func BenchmarkAll(b *testing.B) {
}
b.StopTimer()
rosa.DropCaches(0)
rosa.DropCaches("", 0)
b.StartTimer()
}
}

View File

@@ -105,7 +105,7 @@ func newBusyboxBin() pkg.Artifact {
}
return pkg.NewExec(
"busybox-bin-"+version, nil, pkg.ExecTimeoutMax, false,
"busybox-bin-"+version, arch, nil, pkg.ExecTimeoutMax, false,
fhs.AbsRoot, []string{
"PATH=/system/bin",
},

View File

@@ -327,7 +327,7 @@ mkdir -vp /work/system/bin
}
return pkg.NewExec(
name, knownChecksum, pkg.ExecTimeoutMax, flag&TExclusive != 0,
name, arch, knownChecksum, pkg.ExecTimeoutMax, flag&TExclusive != 0,
fhs.AbsRoot, env,
AbsSystem.Append("bin", "sh"),
[]string{"sh", absCureScript.String()},

View File

@@ -28,7 +28,7 @@ var (
)
func TestMain(m *testing.M) {
rosa.DropCaches(rosa.OptLLVMNoLTO)
rosa.DropCaches("", rosa.OptLLVMNoLTO)
container.TryArgv0(nil)
code := m.Run()
@@ -94,14 +94,14 @@ func TestCureAll(t *testing.T) {
}
func BenchmarkStage3(b *testing.B) {
flags := rosa.Flags()
b.Cleanup(func() { rosa.DropCaches(flags) })
arch, flags := rosa.Arch(), rosa.Flags()
b.Cleanup(func() { rosa.DropCaches(arch, flags) })
for b.Loop() {
rosa.Std.Load(rosa.LLVM)
b.StopTimer()
rosa.DropCaches(0)
rosa.DropCaches("", 0)
b.StartTimer()
}
}