Some checks failed
Test / Create distribution (push) Successful in 33s
Test / Sandbox (push) Successful in 2m15s
Test / Hakurei (push) Successful in 3m7s
Test / Hpkg (push) Failing after 4m0s
Test / Sandbox (race detector) (push) Successful in 4m14s
Test / Hakurei (race detector) (push) Successful in 4m51s
Test / Flake checks (push) Has been skipped
This is simultaneously more efficient and less error-prone. This change caused minor API changes in multiple other packages. Signed-off-by: Ophestra <cat@gensokyo.uk>
117 lines
4.0 KiB
Go
117 lines
4.0 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"strconv"
|
|
"sync/atomic"
|
|
|
|
"hakurei.app/container"
|
|
"hakurei.app/hst"
|
|
"hakurei.app/internal/hlog"
|
|
)
|
|
|
|
const bash = "bash"
|
|
|
|
var (
|
|
dataHome *container.Absolute
|
|
)
|
|
|
|
func init() {
|
|
// dataHome
|
|
if a, err := container.NewAbs(os.Getenv("HAKUREI_DATA_HOME")); err == nil {
|
|
dataHome = a
|
|
} else {
|
|
dataHome = container.AbsFHSVarLib.Append("hakurei/" + strconv.Itoa(os.Getuid()))
|
|
}
|
|
}
|
|
|
|
var (
|
|
pathBin = container.AbsFHSRoot.Append("bin")
|
|
|
|
pathNix = container.MustAbs("/nix/")
|
|
pathNixStore = pathNix.Append("store/")
|
|
pathCurrentSystem = container.AbsFHSRun.Append("current-system")
|
|
pathSwBin = pathCurrentSystem.Append("sw/bin/")
|
|
pathShell = pathSwBin.Append(bash)
|
|
|
|
pathData = container.MustAbs("/data")
|
|
pathDataData = pathData.Append("data")
|
|
)
|
|
|
|
func lookPath(file string) string {
|
|
if p, err := exec.LookPath(file); err != nil {
|
|
log.Fatalf("%s: command not found", file)
|
|
return ""
|
|
} else {
|
|
return p
|
|
}
|
|
}
|
|
|
|
var beforeRunFail = new(atomic.Pointer[func()])
|
|
|
|
func mustRun(name string, arg ...string) {
|
|
hlog.Verbosef("spawning process: %q %q", name, arg)
|
|
cmd := exec.Command(name, arg...)
|
|
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
|
if err := cmd.Run(); err != nil {
|
|
if f := beforeRunFail.Swap(nil); f != nil {
|
|
(*f)()
|
|
}
|
|
log.Fatalf("%s: %v", name, err)
|
|
}
|
|
}
|
|
|
|
type appPathSet struct {
|
|
// ${dataHome}/${id}
|
|
baseDir *container.Absolute
|
|
// ${baseDir}/app
|
|
metaPath *container.Absolute
|
|
// ${baseDir}/files
|
|
homeDir *container.Absolute
|
|
// ${baseDir}/cache
|
|
cacheDir *container.Absolute
|
|
// ${baseDir}/cache/nix
|
|
nixPath *container.Absolute
|
|
}
|
|
|
|
func pathSetByApp(id string) *appPathSet {
|
|
pathSet := new(appPathSet)
|
|
pathSet.baseDir = dataHome.Append(id)
|
|
pathSet.metaPath = pathSet.baseDir.Append("app")
|
|
pathSet.homeDir = pathSet.baseDir.Append("files")
|
|
pathSet.cacheDir = pathSet.baseDir.Append("cache")
|
|
pathSet.nixPath = pathSet.cacheDir.Append("nix")
|
|
return pathSet
|
|
}
|
|
|
|
func appendGPUFilesystem(config *hst.Config) {
|
|
config.Container.Filesystem = append(config.Container.Filesystem, []hst.FilesystemConfig{
|
|
// flatpak commit 763a686d874dd668f0236f911de00b80766ffe79
|
|
{Src: container.AbsFHSDev.Append("dri"), Device: true},
|
|
// mali
|
|
{Src: container.AbsFHSDev.Append("mali"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("mali0"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("umplock"), Device: true},
|
|
// nvidia
|
|
{Src: container.AbsFHSDev.Append("nvidiactl"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia-modeset"), Device: true},
|
|
// nvidia OpenCL/CUDA
|
|
{Src: container.AbsFHSDev.Append("nvidia-uvm"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia-uvm-tools"), Device: true},
|
|
|
|
// flatpak commit d2dff2875bb3b7e2cd92d8204088d743fd07f3ff
|
|
{Src: container.AbsFHSDev.Append("nvidia0"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia1"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia2"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia3"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia4"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia5"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia6"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia7"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia8"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia9"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia10"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia11"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia12"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia13"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia14"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia15"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia16"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia17"), Device: true},
|
|
{Src: container.AbsFHSDev.Append("nvidia18"), Device: true}, {Src: container.AbsFHSDev.Append("nvidia19"), Device: true},
|
|
}...)
|
|
}
|