diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go index df089e89..f3532326 100644 --- a/cmd/mbf/main.go +++ b/cmd/mbf/main.go @@ -58,6 +58,19 @@ func main() { log.Fatal("this program must not run as root") } + defer func() { + r := recover() + if r == nil { + return + } + + h, ok := r.(rosa.HandleError) + if !ok { + panic(r) + } + log.Fatal(h) + }() + ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) defer stop() diff --git a/internal/rosa/state.go b/internal/rosa/state.go index 89ee1840..67cfdf97 100644 --- a/internal/rosa/state.go +++ b/internal/rosa/state.go @@ -19,6 +19,9 @@ import ( // ArtifactH is a handle of the unique name of a prepared [pkg.Artifact]. type ArtifactH unique.Handle[string] +// H is a convenient function for acquiring an [ArtifactH] by name. +func H(name string) ArtifactH { return ArtifactH(unique.Make(name)) } + // String returns the name of p. func (handle ArtifactH) String() string { return unique.Handle[string](handle).Value() @@ -39,6 +42,14 @@ func (handle *ArtifactH) UnmarshalJSON(data []byte) error { return nil } +// A HandleError is panicked when attempting to acquire an [Artifact] via an +// invalid [ArtifactH] with the Must suite of methods. +type HandleError ArtifactH + +func (e HandleError) Error() string { + return "artifact " + strconv.Quote(ArtifactH(e).String()) + " not available" +} + type ( // Stage denotes the infrastructure to compile a [pkg.Artifact] on. Stage uint32 @@ -234,7 +245,7 @@ func (s *S) Get(handle ArtifactH) (meta *Artifact) { func (s *S) MustGet(handle ArtifactH) (meta *Artifact) { meta = s.Get(handle) if meta == nil { - panic("artifact " + strconv.Quote(handle.String()) + " not available") + panic(HandleError(handle)) } return } @@ -270,7 +281,7 @@ func (t Toolchain) Load(handle ArtifactH) (pkg.Artifact, string) { func (t Toolchain) MustLoad(handle ArtifactH) (pkg.Artifact, string) { a, version := t.Load(handle) if a == nil { - panic("artifact " + strconv.Quote(handle.String()) + " not available") + panic(HandleError(handle)) } return a, version } diff --git a/internal/rosa/state_native.go b/internal/rosa/state_native.go index 89d26dfa..c320642e 100644 --- a/internal/rosa/state_native.go +++ b/internal/rosa/state_native.go @@ -1,197 +1,195 @@ package rosa -import "unique" - var ( - LLVM = ArtifactH(unique.Make("llvm")) - EarlyInit = ArtifactH(unique.Make("earlyinit")) - ImageSystem = ArtifactH(unique.Make("system-image")) - ImageInitramfs = ArtifactH(unique.Make("initramfs-image")) - Kernel = ArtifactH(unique.Make("kernel")) - KernelHeaders = ArtifactH(unique.Make("kernel-headers")) - KernelSource = ArtifactH(unique.Make("kernel-source")) - Firmware = ArtifactH(unique.Make("firmware")) - ACL = ArtifactH(unique.Make("acl")) - ArgpStandalone = ArtifactH(unique.Make("argp-standalone")) - Attr = ArtifactH(unique.Make("attr")) - Autoconf = ArtifactH(unique.Make("autoconf")) - Automake = ArtifactH(unique.Make("automake")) - BC = ArtifactH(unique.Make("bc")) - Bash = ArtifactH(unique.Make("bash")) - Binutils = ArtifactH(unique.Make("binutils")) - Bison = ArtifactH(unique.Make("bison")) - Bzip2 = ArtifactH(unique.Make("bzip2")) - CMake = ArtifactH(unique.Make("cmake")) - Connman = ArtifactH(unique.Make("connman")) - Coreutils = ArtifactH(unique.Make("coreutils")) - Curl = ArtifactH(unique.Make("curl")) - DBus = ArtifactH(unique.Make("dbus")) - DTC = ArtifactH(unique.Make("dtc")) - Diffutils = ArtifactH(unique.Make("diffutils")) - Elfutils = ArtifactH(unique.Make("elfutils")) - Fakeroot = ArtifactH(unique.Make("fakeroot")) - Findutils = ArtifactH(unique.Make("findutils")) - Flex = ArtifactH(unique.Make("flex")) - FontUtil = ArtifactH(unique.Make("font-util")) - Freetype = ArtifactH(unique.Make("freetype")) - Fuse = ArtifactH(unique.Make("fuse")) - GMP = ArtifactH(unique.Make("gmp")) - GLib = ArtifactH(unique.Make("glib")) - Gawk = ArtifactH(unique.Make("gawk")) - GenInitCPIO = ArtifactH(unique.Make("gen_init_cpio")) - Gettext = ArtifactH(unique.Make("gettext")) - Git = ArtifactH(unique.Make("git")) - Glslang = ArtifactH(unique.Make("glslang")) - GnuTLS = ArtifactH(unique.Make("gnutls")) - Go = ArtifactH(unique.Make("go")) - Gperf = ArtifactH(unique.Make("gperf")) - Grep = ArtifactH(unique.Make("grep")) - Gzip = ArtifactH(unique.Make("gzip")) - Hakurei = ArtifactH(unique.Make("hakurei")) - HakureiDist = ArtifactH(unique.Make("hakurei-dist")) - Hwdata = ArtifactH(unique.Make("hwdata")) - IPTables = ArtifactH(unique.Make("iptables")) - Kmod = ArtifactH(unique.Make("kmod")) - LIT = ArtifactH(unique.Make("lit")) - LibX11 = ArtifactH(unique.Make("libX11")) - LibXau = ArtifactH(unique.Make("libXau")) - LibXdmcp = ArtifactH(unique.Make("libXdmcp")) - LibXext = ArtifactH(unique.Make("libXext")) - LibXfixes = ArtifactH(unique.Make("libXfixes")) - LibXfont2 = ArtifactH(unique.Make("libXfont2")) - LibXrandr = ArtifactH(unique.Make("libXrandr")) - LibXrender = ArtifactH(unique.Make("libXrender")) - LibXxf86vm = ArtifactH(unique.Make("libXxf86vm")) - Libarchive = ArtifactH(unique.Make("libarchive")) - Libbsd = ArtifactH(unique.Make("libbsd")) - Libcap = ArtifactH(unique.Make("libcap")) - Libconfig = ArtifactH(unique.Make("libconfig")) - LibdisplayInfo = ArtifactH(unique.Make("libdisplay-info")) - Libdrm = ArtifactH(unique.Make("libdrm")) - Libepoxy = ArtifactH(unique.Make("libepoxy")) - Libev = ArtifactH(unique.Make("libev")) - Libexpat = ArtifactH(unique.Make("libexpat")) - Libffi = ArtifactH(unique.Make("libffi")) - Libfontenc = ArtifactH(unique.Make("libfontenc")) - Libgd = ArtifactH(unique.Make("libgd")) - Libglvnd = ArtifactH(unique.Make("libglvnd")) - Libiconv = ArtifactH(unique.Make("libiconv")) - Libmd = ArtifactH(unique.Make("libmd")) - Libmnl = ArtifactH(unique.Make("libmnl")) - Libnftnl = ArtifactH(unique.Make("libnftnl")) - Libpciaccess = ArtifactH(unique.Make("libpciaccess")) - Libpng = ArtifactH(unique.Make("libpng")) - Libpsl = ArtifactH(unique.Make("libpsl")) - Libseccomp = ArtifactH(unique.Make("libseccomp")) - Libtasn1 = ArtifactH(unique.Make("libtasn1")) - Libtirpc = ArtifactH(unique.Make("libtirpc")) - Libtool = ArtifactH(unique.Make("libtool")) - Libucontext = ArtifactH(unique.Make("libucontext")) - Libunistring = ArtifactH(unique.Make("libunistring")) - Libva = ArtifactH(unique.Make("libva")) - LibxcbRenderUtil = ArtifactH(unique.Make("libxcb-render-util")) - LibxcbUtil = ArtifactH(unique.Make("libxcb-util")) - LibxcbUtilImage = ArtifactH(unique.Make("libxcb-util-image")) - LibxcbUtilKeysyms = ArtifactH(unique.Make("libxcb-util-keysyms")) - LibxcbUtilWM = ArtifactH(unique.Make("libxcb-util-wm")) - Libxcvt = ArtifactH(unique.Make("libxcvt")) - Libxkbfile = ArtifactH(unique.Make("libxkbfile")) - Libxml2 = ArtifactH(unique.Make("libxml2")) - Libxshmfence = ArtifactH(unique.Make("libxshmfence")) - Libxslt = ArtifactH(unique.Make("libxslt")) - Libxtrans = ArtifactH(unique.Make("libxtrans")) - LMSensors = ArtifactH(unique.Make("lm_sensors")) - M4 = ArtifactH(unique.Make("m4")) - MPC = ArtifactH(unique.Make("mpc")) - MPFR = ArtifactH(unique.Make("mpfr")) - Make = ArtifactH(unique.Make("make")) - Mesa = ArtifactH(unique.Make("mesa")) - Meson = ArtifactH(unique.Make("meson")) - Mksh = ArtifactH(unique.Make("mksh")) - MuslFts = ArtifactH(unique.Make("musl-fts")) - MuslObstack = ArtifactH(unique.Make("musl-obstack")) - NSS = ArtifactH(unique.Make("nss")) - NSSCACert = ArtifactH(unique.Make("nss-cacert")) - Ncurses = ArtifactH(unique.Make("ncurses")) - Nettle = ArtifactH(unique.Make("nettle")) - Ninja = ArtifactH(unique.Make("ninja")) - OpenSSL = ArtifactH(unique.Make("openssl")) - P11Kit = ArtifactH(unique.Make("p11-kit")) - PCRE2 = ArtifactH(unique.Make("pcre2")) - Parallel = ArtifactH(unique.Make("parallel")) - Patch = ArtifactH(unique.Make("patch")) - Perl = ArtifactH(unique.Make("perl")) - PerlLocaleGettext = ArtifactH(unique.Make("perl-Locale::gettext")) - PerlMIMECharset = ArtifactH(unique.Make("perl-MIME::Charset")) - PerlModuleBuild = ArtifactH(unique.Make("perl-Module::Build")) - PerlPodParser = ArtifactH(unique.Make("perl-Pod::Parser")) - PerlSGMLS = ArtifactH(unique.Make("perl-SGMLS")) - PerlTermReadKey = ArtifactH(unique.Make("perl-Term::ReadKey")) - PerlTestCmd = ArtifactH(unique.Make("perl-Test::Cmd")) - PerlTextCharWidth = ArtifactH(unique.Make("perl-Text::CharWidth")) - PerlTextWrapI18N = ArtifactH(unique.Make("perl-Text::WrapI18N")) - PerlUnicodeLineBreak = ArtifactH(unique.Make("perl-Unicode::LineBreak")) - PerlYAMLTiny = ArtifactH(unique.Make("perl-YAML::Tiny")) - Pixman = ArtifactH(unique.Make("pixman")) - PkgConfig = ArtifactH(unique.Make("pkg-config")) - Procps = ArtifactH(unique.Make("procps")) - Python = ArtifactH(unique.Make("python")) - PythonFlitCore = ArtifactH(unique.Make("python-flit-core")) - PythonHatchling = ArtifactH(unique.Make("python-hatchling")) - PythonIniConfig = ArtifactH(unique.Make("python-iniconfig")) - PythonMako = ArtifactH(unique.Make("python-mako")) - PythonMarkupSafe = ArtifactH(unique.Make("python-markupsafe")) - PythonPackaging = ArtifactH(unique.Make("python-packaging")) - PythonPathspec = ArtifactH(unique.Make("python-pathspec")) - PythonPluggy = ArtifactH(unique.Make("python-pluggy")) - PythonPyTest = ArtifactH(unique.Make("python-pytest")) - PythonPyYAML = ArtifactH(unique.Make("python-pyyaml")) - PythonPycparser = ArtifactH(unique.Make("python-pycparser")) - PythonPygments = ArtifactH(unique.Make("python-pygments")) - PythonSetuptools = ArtifactH(unique.Make("python-setuptools")) - PythonSetuptoolsSCM = ArtifactH(unique.Make("python-setuptools-scm")) - PythonTroveClassifiers = ArtifactH(unique.Make("python-trove-classifiers")) - PythonVCSVersioning = ArtifactH(unique.Make("python-vcs-versioning")) - PythonWheel = ArtifactH(unique.Make("python-wheel")) - QEMU = ArtifactH(unique.Make("qemu")) - Rdfind = ArtifactH(unique.Make("rdfind")) - Readline = ArtifactH(unique.Make("readline")) - Rsync = ArtifactH(unique.Make("rsync")) - Sed = ArtifactH(unique.Make("sed")) - SPIRVHeaders = ArtifactH(unique.Make("spirv-headers")) - SPIRVLLVMTranslator = ArtifactH(unique.Make("spirv-llvm-translator")) - SPIRVTools = ArtifactH(unique.Make("spirv-tools")) - SquashfsTools = ArtifactH(unique.Make("squashfs-tools")) - Strace = ArtifactH(unique.Make("strace")) - TamaGo = ArtifactH(unique.Make("tamago")) - Tar = ArtifactH(unique.Make("tar")) - Texinfo = ArtifactH(unique.Make("texinfo")) - Toybox = ArtifactH(unique.Make("toybox")) - toyboxEarly = ArtifactH(unique.Make("toybox-early")) - Unzip = ArtifactH(unique.Make("unzip")) - UtilLinux = ArtifactH(unique.Make("util-linux")) - VIM = ArtifactH(unique.Make("vim")) - Wayland = ArtifactH(unique.Make("wayland")) - WaylandProtocols = ArtifactH(unique.Make("wayland-protocols")) - XCB = ArtifactH(unique.Make("xcb")) - XCBProto = ArtifactH(unique.Make("xcb-proto")) - XDGDBusProxy = ArtifactH(unique.Make("xdg-dbus-proxy")) - XZ = ArtifactH(unique.Make("xz")) - Xkbcomp = ArtifactH(unique.Make("xkbcomp")) - XkeyboardConfig = ArtifactH(unique.Make("xkeyboard-config")) - XorgProto = ArtifactH(unique.Make("xorgproto")) - Xserver = ArtifactH(unique.Make("xserver")) - Zlib = ArtifactH(unique.Make("zlib")) - Zstd = ArtifactH(unique.Make("zstd")) - stage0Dist = ArtifactH(unique.Make("stage0-dist")) - llvmSource = ArtifactH(unique.Make("llvm-project")) - earlyCompilerRT = ArtifactH(unique.Make("early-compiler-rt")) - earlyRuntimes = ArtifactH(unique.Make("early-runtimes")) - buildcatrust = ArtifactH(unique.Make("python-buildcatrust")) - utilMacros = ArtifactH(unique.Make("util-macros")) - Musl = ArtifactH(unique.Make("musl")) - muslHeaders = ArtifactH(unique.Make("musl-headers")) - gcc = ArtifactH(unique.Make("gcc")) - nettle3 = ArtifactH(unique.Make("nettle3")) - Stage0 = ArtifactH(unique.Make("rosa-stage0")) + LLVM = H("llvm") + EarlyInit = H("earlyinit") + ImageSystem = H("system-image") + ImageInitramfs = H("initramfs-image") + Kernel = H("kernel") + KernelHeaders = H("kernel-headers") + KernelSource = H("kernel-source") + Firmware = H("firmware") + ACL = H("acl") + ArgpStandalone = H("argp-standalone") + Attr = H("attr") + Autoconf = H("autoconf") + Automake = H("automake") + BC = H("bc") + Bash = H("bash") + Binutils = H("binutils") + Bison = H("bison") + Bzip2 = H("bzip2") + CMake = H("cmake") + Connman = H("connman") + Coreutils = H("coreutils") + Curl = H("curl") + DBus = H("dbus") + DTC = H("dtc") + Diffutils = H("diffutils") + Elfutils = H("elfutils") + Fakeroot = H("fakeroot") + Findutils = H("findutils") + Flex = H("flex") + FontUtil = H("font-util") + Freetype = H("freetype") + Fuse = H("fuse") + GMP = H("gmp") + GLib = H("glib") + Gawk = H("gawk") + GenInitCPIO = H("gen_init_cpio") + Gettext = H("gettext") + Git = H("git") + Glslang = H("glslang") + GnuTLS = H("gnutls") + Go = H("go") + Gperf = H("gperf") + Grep = H("grep") + Gzip = H("gzip") + Hakurei = H("hakurei") + HakureiDist = H("hakurei-dist") + Hwdata = H("hwdata") + IPTables = H("iptables") + Kmod = H("kmod") + LIT = H("lit") + LibX11 = H("libX11") + LibXau = H("libXau") + LibXdmcp = H("libXdmcp") + LibXext = H("libXext") + LibXfixes = H("libXfixes") + LibXfont2 = H("libXfont2") + LibXrandr = H("libXrandr") + LibXrender = H("libXrender") + LibXxf86vm = H("libXxf86vm") + Libarchive = H("libarchive") + Libbsd = H("libbsd") + Libcap = H("libcap") + Libconfig = H("libconfig") + LibdisplayInfo = H("libdisplay-info") + Libdrm = H("libdrm") + Libepoxy = H("libepoxy") + Libev = H("libev") + Libexpat = H("libexpat") + Libffi = H("libffi") + Libfontenc = H("libfontenc") + Libgd = H("libgd") + Libglvnd = H("libglvnd") + Libiconv = H("libiconv") + Libmd = H("libmd") + Libmnl = H("libmnl") + Libnftnl = H("libnftnl") + Libpciaccess = H("libpciaccess") + Libpng = H("libpng") + Libpsl = H("libpsl") + Libseccomp = H("libseccomp") + Libtasn1 = H("libtasn1") + Libtirpc = H("libtirpc") + Libtool = H("libtool") + Libucontext = H("libucontext") + Libunistring = H("libunistring") + Libva = H("libva") + LibxcbRenderUtil = H("libxcb-render-util") + LibxcbUtil = H("libxcb-util") + LibxcbUtilImage = H("libxcb-util-image") + LibxcbUtilKeysyms = H("libxcb-util-keysyms") + LibxcbUtilWM = H("libxcb-util-wm") + Libxcvt = H("libxcvt") + Libxkbfile = H("libxkbfile") + Libxml2 = H("libxml2") + Libxshmfence = H("libxshmfence") + Libxslt = H("libxslt") + Libxtrans = H("libxtrans") + LMSensors = H("lm_sensors") + M4 = H("m4") + MPC = H("mpc") + MPFR = H("mpfr") + Make = H("make") + Mesa = H("mesa") + Meson = H("meson") + Mksh = H("mksh") + MuslFts = H("musl-fts") + MuslObstack = H("musl-obstack") + NSS = H("nss") + NSSCACert = H("nss-cacert") + Ncurses = H("ncurses") + Nettle = H("nettle") + Ninja = H("ninja") + OpenSSL = H("openssl") + P11Kit = H("p11-kit") + PCRE2 = H("pcre2") + Parallel = H("parallel") + Patch = H("patch") + Perl = H("perl") + PerlLocaleGettext = H("perl-Locale::gettext") + PerlMIMECharset = H("perl-MIME::Charset") + PerlModuleBuild = H("perl-Module::Build") + PerlPodParser = H("perl-Pod::Parser") + PerlSGMLS = H("perl-SGMLS") + PerlTermReadKey = H("perl-Term::ReadKey") + PerlTestCmd = H("perl-Test::Cmd") + PerlTextCharWidth = H("perl-Text::CharWidth") + PerlTextWrapI18N = H("perl-Text::WrapI18N") + PerlUnicodeLineBreak = H("perl-Unicode::LineBreak") + PerlYAMLTiny = H("perl-YAML::Tiny") + Pixman = H("pixman") + PkgConfig = H("pkg-config") + Procps = H("procps") + Python = H("python") + PythonFlitCore = H("python-flit-core") + PythonHatchling = H("python-hatchling") + PythonIniConfig = H("python-iniconfig") + PythonMako = H("python-mako") + PythonMarkupSafe = H("python-markupsafe") + PythonPackaging = H("python-packaging") + PythonPathspec = H("python-pathspec") + PythonPluggy = H("python-pluggy") + PythonPyTest = H("python-pytest") + PythonPyYAML = H("python-pyyaml") + PythonPycparser = H("python-pycparser") + PythonPygments = H("python-pygments") + PythonSetuptools = H("python-setuptools") + PythonSetuptoolsSCM = H("python-setuptools-scm") + PythonTroveClassifiers = H("python-trove-classifiers") + PythonVCSVersioning = H("python-vcs-versioning") + PythonWheel = H("python-wheel") + QEMU = H("qemu") + Rdfind = H("rdfind") + Readline = H("readline") + Rsync = H("rsync") + Sed = H("sed") + SPIRVHeaders = H("spirv-headers") + SPIRVLLVMTranslator = H("spirv-llvm-translator") + SPIRVTools = H("spirv-tools") + SquashfsTools = H("squashfs-tools") + Strace = H("strace") + TamaGo = H("tamago") + Tar = H("tar") + Texinfo = H("texinfo") + Toybox = H("toybox") + toyboxEarly = H("toybox-early") + Unzip = H("unzip") + UtilLinux = H("util-linux") + VIM = H("vim") + Wayland = H("wayland") + WaylandProtocols = H("wayland-protocols") + XCB = H("xcb") + XCBProto = H("xcb-proto") + XDGDBusProxy = H("xdg-dbus-proxy") + XZ = H("xz") + Xkbcomp = H("xkbcomp") + XkeyboardConfig = H("xkeyboard-config") + XorgProto = H("xorgproto") + Xserver = H("xserver") + Zlib = H("zlib") + Zstd = H("zstd") + stage0Dist = H("stage0-dist") + llvmSource = H("llvm-project") + earlyCompilerRT = H("early-compiler-rt") + earlyRuntimes = H("early-runtimes") + buildcatrust = H("python-buildcatrust") + utilMacros = H("util-macros") + Musl = H("musl") + muslHeaders = H("musl-headers") + gcc = H("gcc") + nettle3 = H("nettle3") + Stage0 = H("rosa-stage0") )