commit 96f814af9c65984e4c203af2017ee81a3224b8bb Author: Luke Willis <lukejw@monastech.xyz> Date: Sun, 8 Mar 2026 16:10:49 -0400 Initial commit (move to gitolite) Diffstat:
| A | README.md | | | 10 | ++++++++++ |
| A | mt/channels.scm | | | 49 | +++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages.scm | | | 52 | ++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/aseprite.scm | | | 156 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/desktop.scm | | | 255 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/fonts.scm | | | 50 | ++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/games.scm | | | 156 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/gtk.scm | | | 73 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/linux.scm | | | 45 | +++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/patches/age-passphrase-from-stdin.patch | | | 110 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/patches/glfw.diff | | | 36 | ++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/patches/prismlauncher.diff | | | 74 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/patches/stagit.diff | | | 42 | ++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/patches/sway-border-width.diff | | | 126 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/patches/wlr-apps.diff | | | 40 | ++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/rust-crates.scm | | | 1838 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/packages/version-control.scm | | | 12 | ++++++++++++ |
| A | mt/scripts.scm | | | 47 | +++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/scripts/mt-update | | | 151 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/services.scm | | | 176 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/services/labwc.scm | | | 94 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/services/version-control.scm | | | 247 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/services/web.scm | | | 19 | +++++++++++++++++++ |
| A | mt/system.scm | | | 40 | ++++++++++++++++++++++++++++++++++++++++ |
| A | mt/system/andrew.scm | | | 125 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| A | mt/system/install.scm | | | 35 | +++++++++++++++++++++++++++++++++++ |
| A | mt/utils.scm | | | 50 | ++++++++++++++++++++++++++++++++++++++++++++++++++ |
27 files changed, 4108 insertions(+), 0 deletions(-)
diff --git a/README.md b/README.md @@ -0,0 +1,10 @@ +# MonasTech + +This is the Guix channel used by all MonasTech systems. + +## Installation Image + +To build the installation image, run the following command (from the project root): +``` +guix time-machine -C mt/channels.scm -- system image -t iso9660 -L . mt/system/install.scm +``` diff --git a/mt/channels.scm b/mt/channels.scm @@ -0,0 +1,49 @@ +(define-module (mt channels) + #:use-module (gnu services base) + #:use-module (guix channels) + #:use-module (guix gexp) + #:export (%mt-channels + %mt-substitute-urls + %mt-authorized-guix-keys)) + +(define %mt-channels + (list (channel + (name 'nonguix) + (url "https://gitlab.com/nonguix/nonguix") + (commit "4811a684f4ced58cebfa945c3ccbbca6c26807fd") + (introduction + (make-channel-introduction + "897c1a470da759236cc11798f4e0a5f7d4d59fbc" + (openpgp-fingerprint + "2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5")))) + (channel + (name 'guix) + (branch "master") + (url "https://codeberg.org/guix/guix") + (commit "79655af5e2eb44dfc3475b7ff30e0d4c890abd03") + (introduction + (make-channel-introduction + "9edb3f66fd807b096b48283debdcddccfea34bad" + (openpgp-fingerprint + "BBB0 2DDF 2CEA F6A8 0D1D E643 A2A0 6DF2 A33A 54FA")))))) + +(define %mt-substitute-urls + `("https://substitutes.monastech.xyz" + ,@%default-substitute-urls + "https://substitutes.nonguix.org")) + +(define %mt-authorized-guix-keys + (cons* + (plain-file "nonguix.pub" "\ +(public-key + (ecc + (curve Ed25519) + (q #C1FD53E5D4CE971933EC50C9F307AE2171A2D3B52C804642A7A35F84F3A4EA98#)))") + (plain-file "monastech.pub" "\ +(public-key + (ecc + (curve Ed25519) + (q #52A437D7AEB4E4007976A93BDDA585B319DCFDE6A0204BBFE4B09C51065768D9#)))") + %default-authorized-guix-keys)) + +%mt-channels diff --git a/mt/packages.scm b/mt/packages.scm @@ -0,0 +1,52 @@ +(define-module (mt packages) + #:use-module (guix gexp) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix git-download) + #:use-module (guix build-system meson) + #:use-module (gnu packages) + #:use-module (gnu packages freedesktop) + #:use-module (gnu packages pkg-config)) + +;; This file is used for defining things useful for packaging and/or packages that +;; have not yet been categorized. + +(define-public wlr-apps + (let ((commit "2e70ab38c3671e0b28c36c8208560f45cc46f36a") + (revision "1")) + (package + (name "wlr-apps") + (version (git-version "0.3" revision commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/Light034/wlr-apps/") + (commit commit))) + (file-name (git-file-name name version)) + ;; The patch makes it output only minimized windows + (patches (list (local-file "packages/patches/wlr-apps.diff"))) + (sha256 + (base32 + "1pz4gb98q6ncxxbwzank09xf2038d6jmh5phrd5k9918spf9ly79")))) + (build-system meson-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'fix-hardcoded-paths + (lambda* (#:key inputs outputs #:allow-other-keys) + (substitute* "meson.build" + (("/usr") (assoc-ref inputs "wlr-protocols")))))))) + (native-inputs + (list pkg-config)) + (inputs + (list wayland + wayland-protocols + wlr-protocols)) + (home-page "https://github.com/Light034/wlr-apps/") + (synopsis "Outputs JSON info using `wlr-foreign-toplevel-management`") + (description + "This program intends to be a simple way to use +wlr-foreign-toplevel-management to retrieve information directly from the compositor +and print it out in json format. Its main purpose is to be used with eww to create a +widget that displays the current active toplevels.") + (license license:expat)))) diff --git a/mt/packages/aseprite.scm b/mt/packages/aseprite.scm @@ -0,0 +1,156 @@ +(define-module (mt packages aseprite) + #:use-module (guix build utils) + #:use-module (guix packages) + #:use-module (guix gexp) + #:use-module (guix download) + #:use-module (guix build-system cmake) + #:use-module (guix build-system copy) + #:use-module (gnu packages compression) + #:use-module (gnu packages curl) + #:use-module (gnu packages fontutils) + #:use-module (gnu packages gl) + #:use-module (gnu packages gtk) + #:use-module (gnu packages image) + #:use-module (gnu packages markup) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages xdisorg) + #:use-module (gnu packages xml) + #:use-module (gnu packages xorg) + #:use-module ((guix licenses) #:prefix license:)) + +(define-public tinyexif + (package + (name "tinyexif") + (version "1.0.4") + (source + (origin + (method url-fetch) + (uri (string-append + "https://github.com/cdcseacave/TinyEXIF/archive/refs/tags/" + version ".tar.gz")) + (sha256 + (base32 + "15fk3dr5i0830h8l2fd2ld68lwj4409prszkxlrvv1ldgk1dx134")))) + (build-system cmake-build-system) + (arguments + (list + #:tests? #f)) + (inputs (list tinyxml2)) + (home-page "https://github.com/cdcseacave/TinyEXIF") + (synopsis "Small JPEG metadata parser for C++") + (description "TinyEXIF is a tiny, lightweight C++ library for parsing the \ +metadata existing inside JPEG files.") + (license license:expat))) + +;; TODO: Compile from source + +(define-public skia-aseprite + (package + (name "skia-aseprite") + (version "m124") + (source (origin + (method url-fetch/zipbomb) + (uri "https://github.com/aseprite/skia/releases/download/m124-08a5439a6b/Skia-Linux-Release-x64.zip") + (sha256 + (base32 + "1f58x393lslxs9pd50y5jrxl83g0p927bcsflg5cw92g4jdyh9x3")))) + (build-system copy-build-system) + (home-page "https://github.com/aseprite/skia") + (synopsis "2D graphics library (aseprite fork)") + (description "This package contains static binaries used specifically for\ +the compilation of Aseprite.") + (license license:bsd-3))) + +(define-public aseprite + (package + (name "aseprite") + (version "1.3.16.1") + (source (origin + (method url-fetch/zipbomb) + (uri "https://github.com/aseprite/aseprite/releases/download/v1.3.16/Aseprite-v1.3.16.1-Source.zip") + (sha256 + (base32 + "06jmvq8z0m7m9yj229aqpga2illx9hhya2r45i1vvxvjyp7yfqc9")))) + (build-system cmake-build-system) + (arguments + (list + #:tests? #f + #:configure-flags #~(list "-DLAF_BACKEND=skia" + (string-append "-DSKIA_DIR=" + #$skia-aseprite) + (string-append "-DSKIA_LIBRARY_DIR=" + #$skia-aseprite + "/out/Release-x64") + (string-append "-DSKIA_LIBRARY=" + #$skia-aseprite + "/out/Release-x64/libskia.a") + ;; Use shared libs (when possible) + "-DUSE_SHARED_CMARK=ON" + "-DUSE_SHARED_CURL=ON" + "-DUSE_SHARED_GIFLIB=ON" + "-DUSE_SHARED_ZLIB=ON" + "-DUSE_SHARED_LIBPNG=ON" + "-DUSE_SHARED_TINYEXIF=ON" + "-DUSE_SHARED_TINYXML=ON" + "-DUSE_SHARED_PIXMAN=ON" + "-DUSE_SHARED_FREETYPE=ON" + "-DUSE_SHARED_HARFBUZZ=ON") + #:phases + #~(modify-phases %standard-phases + (add-after 'install 'add-desktop-files + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (share (string-append out "/share")) + (applications (string-append share "/applications"))) + ;; Setup desktop entry + (mkdir-p applications) + (let ((port (open-file (string-append applications + "/aseprite.desktop") + "w"))) + (display + ;; TODO: Create more complex file + (string-append "[Desktop Entry] + Name=Aseprite + Exec=" out "/bin/aseprite + Icon=aseprite + Type=Application") + port) + (close-port port)) + ;; Setup default icon + (mkdir-p (string-append share + "/icons/hicolor/128x128/apps")) + (copy-file + (string-append share + "/aseprite/data/icons/ase128.png") + (string-append share + "/icons/hicolor/128x128/apps/aseprite.png")))))))) + (inputs + (list skia-aseprite + libx11 + libxcursor + libxi + libxrandr + mesa + fontconfig + ;; Optional shared deps + cmark + curl + giflib + zlib + libpng + tinyexif + tinyxml2 + pixman + freetype + harfbuzz)) + (native-inputs + (list pkg-config)) + (home-page "https://www.aseprite.org/") + (synopsis "Animated sprite editor and pixel art tool") + (description "Aseprite lets you create 2D animations for videogames. From \ +sprites, to pixel-art, retro style graphics, and whatever you like about the \ +8-bit and 16-bit era.") + ;; TODO: Include Aseprite EULA + (license #f))) + +aseprite diff --git a/mt/packages/desktop.scm b/mt/packages/desktop.scm @@ -0,0 +1,255 @@ +(define-module (mt packages desktop) + #:use-module (guix packages) + #:use-module (guix licenses) + #:use-module (guix download) + #:use-module (guix git) + #:use-module (guix git-download) + #:use-module (guix build-system cargo) + #:use-module (guix build-system copy) + #:use-module (guix build-system meson) + #:use-module (guix build-system trivial) + #:use-module (guix gexp) + #:use-module (gnu packages) + #:use-module (gnu packages authentication) + #:use-module (gnu packages base) + #:use-module (gnu packages bash) + #:use-module (gnu packages freedesktop) + #:use-module (gnu packages gnome) + #:use-module (gnu packages golang-crypto) + #:use-module (gnu packages glib) + #:use-module (gnu packages gtk) + #:use-module (gnu packages man) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages shells) + #:use-module (gnu packages version-control) + #:use-module (gnu packages wm) + #:use-module (gnu packages xdisorg) + #:use-module (nonguix build-system chromium-binary) + #:use-module (mt packages rust-crates)) + +;; TODO: Verify that this isn't mega scuffed (read: validate deps) +(define-public webcord + (package + (name "webcord") + (version "4.12.1") + (source + (origin + (method url-fetch) + (uri + (string-append + "https://github.com/SpacingBat3/WebCord/releases/download/v" + version "/webcord_" version "_amd64.deb")) + (sha256 + (base32 "0icm9wf1bg5mlr9zkvw8hm45ihq2qhz1a8ancxjrlsp5pji04fyx")))) + (supported-systems '("x86_64-linux")) + (build-system chromium-binary-build-system) + (arguments + (list #:validate-runpath? #f ; TODO: fails on wrapped binary and included other files + #:wrapper-plan + #~'(("lib/webcord/webcord" (("out" "/lib/webcord")))) + #:phases + #~(modify-phases %standard-phases + (replace 'binary-unpack + (lambda _ + (mkdir "binary") + (chdir "binary") + (invoke "ar" "x" "../webcord_4.12.1_amd64.deb") + (invoke "tar" "xvf" "data.tar.zst") + (invoke "rm" "-rvf" + "control.tar.zst" + "data.tar.zst" + "../webcord_4.12.1_amd64.deb") + )) + (add-after 'binary-unpack 'setup-cwd + (lambda _ + (copy-recursively "usr/" ".") + ;; Remove unneeded files. + (delete-file-recursively "usr") + ;; Fix the .desktop file binary location. + (substitute* '("share/applications/webcord.desktop") + (("Exec=webcord") + (string-append "Exec=" #$output "/bin/webcord")) +))) + ))) + (home-page "https://github.com/SpacingBat3/WebCord/") + (synopsis "A Discord and SpaceBar electron-based client implemented without Discord API.") + (description #f) + (license #f))) + +;; TODO: Make my own suckless wayland widget engine + +;; Thanks, bdunahu! +(define-public eww + (let ((commit "fddb4a09b107237819e661151e007b99b5cab36d") + (revision "2")) + (package + (name "eww") + (version (git-version "0.6.0" revision commit)) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/elkowar/eww") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 "0ihgcxppywpcp24zhws1if6h7cxbrq2vd53wyh36j5mxylpbi59w")))) + (build-system cargo-build-system) + (arguments + `(#:install-source? #f + #:cargo-install-paths '("crates/eww"))) + (inputs (cons* gdk-pixbuf + glib + gtk+ + gtk-layer-shell + libdbusmenu + (cargo-inputs 'eww #:module '(mt packages rust-crates)))) + (native-inputs (list pkg-config)) + (home-page "https://elkowar.github.io/eww") + (synopsis "Widget system that works in any window manager") + (description + "Eww (Elkowars Wacky Widgets) is a standalone widget system made in Rust +that allows you to implement your own, custom widgets in any window manager. + +Configured in yuck, a language based around S-expressions and themed using CSS, +it is easy to customize and provides all the flexibility you need.") + (license expat)))) + +(define-public gruvbox-plus-icon-pack + (package + (name "gruvbox-plus-icon-pack") + (version "6.3.0") + (source (origin + (method url-fetch/zipbomb) + (uri (string-append + "https://github.com/SylEleuth/gruvbox-plus-icon-pack/releases/download/v" + version "/gruvbox-plus-icon-pack-" version ".zip")) + (sha256 + (base32 + "0m8r0lifrgva8f79h66hgyaarjqq5km1fj2mx7jaaq21jw5kd8rw")))) + (build-system copy-build-system) + (arguments + `(#:install-plan `(("Gruvbox-Plus-Dark" "share/icons/") + ("Gruvbox-Plus-Light" "share/icons/")))) + (home-page "https://github.com/SylEleuth/gruvbox-plus-icon-pack") + (synopsis "Gruvbox Plus icon pack for Linux desktops based on Gruvbox color theme.") + (description #f) + (license gpl3+))) + +(define-public lavalauncher + (package + (name "lavalauncher") + (version "2.1.1") + (source (origin + (method url-fetch) + (uri (string-append "https://git.sr.ht/~leon_plickat/lavalauncher/archive/v" + version ".tar.gz")) + (sha256 + (base32 + "0fvw970yx4p8yvbw99q8ca6c3kwq92fk8ja3smbws651007dn7lm")))) + (build-system meson-build-system) + (native-inputs + (list pkg-config + scdoc)) + (inputs + (list wayland + wayland-protocols + libxkbcommon + cairo + librsvg)) + (home-page "https://git.sr.ht/~leon_plickat/lavalauncher") + (synopsis "LavaLauncher is a simple launcher panel for Wayland desktops.") + (description #f) + (license gpl3+))) + +;; Add some extra options to sway, generally for ricing +(define-public sway-with-options + (package + (inherit sway) + (source (origin + (inherit (package-source sway)) + (patches + (list + ;; Replace the hardcoded border width with an option + (local-file "patches/sway-border-width.diff"))))))) + +;; dash is a good POSIX shell for scripts in my experience +(define dash-w-sh-symlink + (package + (inherit dash) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'install 'install-sh-symlink + (lambda* (#:key outputs #:allow-other-keys) + ;; Add a `sh' -> `dash' link. + (let ((out (assoc-ref outputs "out"))) + (with-directory-excursion (string-append out "/bin") + (symlink "dash" "sh") + #t))))))))) + +;; TODO: Rewrite sta.sh with libage somehow? This is slightly jank. +;; I will probably do a C or Rust rewrite in the future. +(define-public age-with-stdin-passphrase + (package + (inherit age) + (source (origin + (inherit (package-source age)) + (patches (list + (local-file "patches/age-passphrase-from-stdin.patch"))))))) + +;; Package +(define-public stash + (package + (name "stash") + (version "0.1.0-1") + ;; Use local directory as source + (source (origin + (method git-fetch) + (uri (git-reference + (url "git://monastech.xyz/stash") + (commit "f71553bbc412bfa989fb6ef51fb9a186fcd5521b"))) + (sha256 + (base32 + "1pz4gb98q6ncxxbwzank09xf2038d6jmh5phrd5k9918spf9ly79")))) + (build-system trivial-build-system) + (arguments + `(#:modules ((guix build utils)) + #:builder + (begin + (use-modules (guix build utils)) + (let* ((bin-dir (string-append %output "/bin")) + (bin (string-append bin-dir "/sta.sh")) + (get-input-bin (lambda (input-name bin-name) + (string-append + (assoc-ref %build-inputs input-name) + (string-append "/bin/" bin-name)))) + (wrapper-helper (lambda (var value) + `(,var ":" = (,(string-append + "${" var ":=" value "}"))))) + (copy-script (lambda (file dest) + (copy-file file dest) + (patch-shebang dest + (list (string-append + (assoc-ref %build-inputs "dash") + "/bin"))) + (chmod dest #o555)))) + (mkdir-p bin-dir) + (copy-script (string-append (assoc-ref %build-inputs "source") "/sta.sh") + bin) + (wrap-program bin #:sh (get-input-bin "bash-minimal" "bash") + (wrapper-helper "TOFI" (get-input-bin "tofi" "tofi")) + (wrapper-helper "AGE" (get-input-bin "age" "age")) + (wrapper-helper "AGEKEYGEN" (get-input-bin "age" "age-keygen")) + (wrapper-helper "OATHTOOL" (get-input-bin "oath-toolkit" "oathtool"))))))) + (inputs (list bash-minimal ;; Needed for wrap-program + dash-w-sh-symlink + tofi + age-with-stdin-passphrase + oath-toolkit)) + (home-page "https://git.loquat.dev/stash") + (synopsis "Simple password manager shell script") + (description #f) + (license gpl3+))) + +webcord diff --git a/mt/packages/fonts.scm b/mt/packages/fonts.scm @@ -0,0 +1,50 @@ +(define-module (mt packages fonts) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix gexp) + #:use-module (guix build-system copy) + #:use-module (gnu packages python)) + +(define-public font-ioskeley-mono + (package + (name "font-ioskeley-mono") + (version "2025.10.09-6") + (source (origin + (method url-fetch/zipbomb) + (uri (string-append "https://github.com/ahatem/IoskeleyMono/releases/download/" + version "/IoskeleyMono-TTF-Hinted.zip")) + (sha256 + (base32 + "14xykmw7fa9kbq07x7fkh6kyycqsianbp7xp5md869xdzps7cin8")))) + (build-system copy-build-system) + (arguments + (list + #:install-plan #~'(("TTF/" "share/fonts/truetype/")))) + (home-page "https://github.com/ahatem/IoskeleyMono/") + (synopsis "Modification of the Iosevka typeface designed to mimic the look +and feel of Berkeley Mono as closely as possible") + (description #f) + (license license:silofl1.1))) + +(define-public font-fira-mono-nerd-font + (package + (name "font-fira-mono-nerd-font") + (version "3.4.0") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/ryanoasis/nerd-fonts/releases/download/v" + version "/FiraMono.tar.xz")) + (sha256 + (base32 + "0x2swc1lxa28v3ybbg05lc0x9b0q0jy7jvkf1bbjmypxzsbxqjif")))) + (build-system copy-build-system) + (arguments + (list + ;; Copy only the fonts from the base directory + ;; TODO: Find a better option + #:install-plan #~'(("." "share/fonts/truetype/" #:include-regexp (".*\\.otf$"))))) + (home-page "https://github.com/ryanoasis/nerd-fonts/") + (synopsis "Monospace cut of Fira Sans with Nerd Font patches") + (description #f) + (license license:silofl1.1))) diff --git a/mt/packages/games.scm b/mt/packages/games.scm @@ -0,0 +1,156 @@ +(define-module (mt packages games) + #:use-module ((guix licenses) #:prefix license:) + #:use-module (guix packages) + #:use-module (guix git-download) + #:use-module (gnu packages audio) + #:use-module (gnu packages compression) + #:use-module (gnu packages elf) + #:use-module (gnu packages gl) + #:use-module (gnu packages image) + #:use-module (gnu packages java) + #:use-module (gnu packages kde-frameworks) + #:use-module (gnu packages libedit) + #:use-module (gnu packages linux) + #:use-module (gnu packages markup) + #:use-module (gnu packages ncurses) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages pulseaudio) + #:use-module (gnu packages qt) + #:use-module (gnu packages speech) + #:use-module (gnu packages sqlite) + #:use-module (gnu packages video) + #:use-module (guix build-system cmake) + #:use-module (guix build-system meson) + #:use-module (guix build-system qt) + #:use-module (guix download) + #:use-module (guix gexp)) + +;; Controller patches for GLFW 3.4 +;; Pulled from https://github.com/mdqinc/SDL_GameControllerDB + +;; Mappings for the 8BitDo Ultimate 2C controller. +(define 8bitdo-ultimate-2c-patch + (plain-file "8bitdo-ultimate-2c-glfw-3.4.patch" "\ +--- a/src/mappings.h 2025-10-23 11:33:49.165631631 -0400 ++++ b/src/mappings.h 2025-10-23 11:35:10.850409920 -0400 +@@ -996,6 +996,9 @@ + \"03000000c0160000e105000001010000,Xin-Mo Xin-Mo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux,\", + \"03000000120c0000100e000011010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\", + \"03000000120c0000101e000011010000,ZEROPLUS P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,\", ++\"03000000c82d00000a31000014010000,8BitDo Ultimate 2C,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,\", ++\"03000000c82d00001d30000011010000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\", ++\"05000000c82d00001b30000001000000,8BitDo Ultimate 2C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b5,paddle2:b2,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,\" + #endif // GLFW_BUILD_LINUX_JOYSTICK + };")) + +;; TODO: Build with ALL controllers +(define-public glfw-mc + (package + (inherit glfw-3.4) + (name "glfw-mc") + (version "3.4") + (source (origin + (method url-fetch) + (uri (string-append "https://github.com/glfw/glfw" + "/releases/download/" version + "/glfw-" version ".zip")) + (sha256 + (base32 + "1sd396kkn53myp61kxrd18h7b1q4ix173hhxhvl0iz8j4x5h1v5m")) + (patches (list 8bitdo-ultimate-2c-patch + (local-file "patches/glfw.diff"))))) + (synopsis "A patched version of GLFW 3.4 that works better with Minecraft +out of the box. Intended to replace the bundled version."))) + +;; TODO: scout-service-type? + +(define-public scout + (let ((commit "71de2be41e158396cecc112fe3c16d7166b9b392") + (revision "1")) + (package + (name "scout") + (version (git-version "0.1.0" revision commit)) + (source + (origin + (method git-fetch) + (uri + (git-reference + (url "git://monastech.xyz/scout") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1hcij56vdjyq68xbqs5pfxcn1fhb0lkrqh45xigi14yxpbxlic5d")))) + (build-system meson-build-system) + (inputs (list pkg-config glfw-mc mesa libepoxy libinih)) + (synopsis "A simple game launcher.") + (description #f) + (home-page #f) + (license license:gpl3+)))) + +;; For playing Minecraft. Setup to run on Wayland by default. +;; TODO: Support X11 +(define-public prismlauncher + (package + (name "prismlauncher") + (version "9.4") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/PrismLauncher/PrismLauncher") + (recursive? #t) + (commit version))) + (file-name (git-file-name name version)) + (patches (list (local-file "patches/prismlauncher.diff"))) + (sha256 + (base32 + "1xxgyx0z5r3hk3yk4gglbfwvq2qk1j9a0dkrv55j4vrlkni79nrm")))) + (build-system cmake-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'install 'patch-paths + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((out (assoc-ref outputs "out")) + (bin (string-append out "/bin/prismlauncher")) + (jdk21 (assoc-ref inputs "jdk21")) + (jdk17 (assoc-ref inputs "jdk17")) + (qtwayland (assoc-ref inputs "qtwayland")) + (qtsvg (assoc-ref inputs "qtsvg"))) + (wrap-program bin + ;; Add all the OpenJDK versions for Minecraft as needed + `("PRISMLAUNCHER_JAVA_PATHS" ":" suffix (,(string-append jdk21 "/bin/java") + ,(string-append jdk17 "/bin/java"))) + ;; Fix QT plugins (primarily for wayland support) + `("QT_PLUGIN_PATH" ":" prefix ,(map (lambda (package) + (string-append package "/lib/qt6/plugins")) + (list qtwayland qtsvg))) + ;; Add runtime libraries for MC + ;; TODO: Provide these via PrismLauncher wrapper + `("LD_LIBRARY_PATH" ":" prefix + (,@(map (lambda (dep) + (string-append (assoc-ref inputs dep) + "/lib")) + '("glfw" "mesa" "pulseaudio" "openal" "flite"))))) + #t)))))) + (native-inputs (list pkg-config extra-cmake-modules)) + (inputs + `(("zlib" ,zlib) + ("qtbase" ,qtbase) + ("qt5compat" ,qt5compat) + ("qtnetworkauth" ,qtnetworkauth) + ("qtwayland" ,qtwayland) + ("qtsvg" ,qtsvg) + ;; Java versions to include + ("jdk17" ,openjdk17 "jdk") + ("jdk21" ,openjdk21 "jdk") + ;; Runtime deps for MC itself + ("glfw" ,glfw-mc) + ("mesa" ,mesa) + ("flite" ,flite) + ("openal" ,openal) + ("pulseaudio" ,pulseaudio))) + (home-page "https://prismlauncher.org/") + (synopsis #f) + (description #f) + (license license:gpl3))) diff --git a/mt/packages/gtk.scm b/mt/packages/gtk.scm @@ -0,0 +1,73 @@ +(define-module (mt packages gtk) + #:use-module (guix packages) + #:use-module (guix gexp) + #:use-module (guix git-download) + #:use-module (guix build-system trivial) + #:use-module (gnu packages base) + #:use-module (gnu packages bash) + #:use-module (gnu packages web) + #:use-module ((guix licenses) #:prefix license:)) + +(define-public gruvbox-gtk-theme + (let ((commit "578cd220b5ff6e86b078a6111d26bb20ec8c733f") + (revision "1")) + (package + (name "gruvbox-gtk-theme") + (version (git-version "1.0.23" revision commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/Fausto-Korpsvart/Gruvbox-GTK-Theme/") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "1fmpma44hp9a7b2nklvm900l62ni8smmjc9g4a9y1x53ys7hyyj5")))) + (build-system trivial-build-system) + (arguments + `(#:modules ((guix build utils)) + #:builder + (begin + (use-modules (guix build utils)) + + (let ((install-dir (string-append %output "/share/themes")) + (source (assoc-ref %build-inputs "source")) + (bash (assoc-ref %build-inputs "bash")) + (coreutils (assoc-ref %build-inputs "coreutils")) + (sassc (assoc-ref %build-inputs "sassc")) + (sed (assoc-ref %build-inputs "sed")) + (stderr (current-error-port))) + ;; Copy necessary files + (copy-recursively (string-append source "/themes") + (getcwd)) + ;; Prepare script + (patch-shebang "install.sh" + (list (string-append bash "/bin"))) + ;; Build theme(s) + (mkdir-p install-dir) + (let ((pid (spawn "install.sh" + (list "install.sh" + "-t" "all" + "-d" install-dir) + #:output stderr + #:error stderr + #:search-path? #f + #:environment + (list (string-append + "PATH=" + coreutils "/bin" + ":" + sassc "/bin" + ":" + sed "/bin"))))) + (if (not (eqv? 0 (status:exit-val (cdr (waitpid pid))))) + (error "Install script failed!"))))))) + (native-inputs + (list bash + coreutils + sed + sassc)) + (home-page "https://github.com/Fausto-Korpsvart/Gruvbox-GTK-Theme") + (synopsis "A GTK theme based on the Gruvbox colour palette.") + (description #f) + (license license:gpl3)))) diff --git a/mt/packages/linux.scm b/mt/packages/linux.scm @@ -0,0 +1,45 @@ +(define-module (mt packages linux) + #:use-module (gnu) + #:use-module (guix packages) + #:use-module (guix git-download) + #:use-module (guix build-system linux-module) + #:use-module (guix licenses) + #:use-module (guix utils)) + +(define-public rtl88x2bu-linux-module + (let ((commit "77a82dbac7192bb49fa87458561b0f2455cdc88f") + (revision "30")) + (package + (name "rtl88x2bu-linux-module") + (version (git-version "5.13.1" revision commit)) + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/RinCat/RTL88x2BU-Linux-Driver") + (commit commit))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1qrhd4698808axm6mliq810s3yj8aj7nv890pdvpbir8nvn6c44h")))) + (build-system linux-module-build-system) + (arguments + (list + #:make-flags #~(list (string-append "CC=" + #$(cc-for-target)) + (string-append "KSRC=" + (assoc-ref %build-inputs + "linux-module-builder") + "/lib/modules/build")) + #:phases #~(modify-phases %standard-phases + (replace 'build + (lambda* (#:key (make-flags '()) + (parallel-build? #t) #:allow-other-keys) + (apply invoke "make" + `(,@(if parallel-build? + `("-j" ,(number->string (parallel-job-count))) + '()) ,@make-flags))))) + #:tests? #f)) ;no test suite + (home-page "https://github.com/RinCat/RTL88x2BU-Linux-Driver") + (synopsis "Realtek RTL88x2BU WiFi USB Driver for Linux") + (description #f) + (license gpl2)))) diff --git a/mt/packages/patches/age-passphrase-from-stdin.patch b/mt/packages/patches/age-passphrase-from-stdin.patch @@ -0,0 +1,110 @@ +From b4f09bfa98e46fa66414cb3d37fab46eb13cb127 Mon Sep 17 00:00:00 2001 +From: Alexander Yastrebov <yastrebov.alex@gmail.com> +Date: Fri, 20 Jun 2025 23:12:08 +0200 +Subject: [PATCH] Decrypt with passphrase from stdin + +Read passphrase from stdin when it is not used for input data. + +Fixes #603 +--- + cmd/age/age.go | 12 +++++++++++- + cmd/age/testdata/output_file.txt | 2 +- + cmd/age/testdata/scrypt.txt | 6 +++--- + cmd/age/testdata/terminal.txt | 9 ++++++++- + 4 files changed, 23 insertions(+), 6 deletions(-) + +diff --git a/cmd/age/age.go b/cmd/age/age.go +index e5d17e2b..275e17b2 100644 +--- a/cmd/age/age.go ++++ b/cmd/age/age.go +@@ -455,10 +455,20 @@ func decryptNotPass(flags identityFlags, in io.Reader, out io.Writer) { + } + + func decryptPass(in io.Reader, out io.Writer) { ++ passphrase := passphrasePromptForDecryption ++ ++ if in != os.Stdin && !term.IsTerminal(int(os.Stdin.Fd())) { ++ passphrase = func() (string, error) { ++ b, err := io.ReadAll(os.Stdin) ++ b = bytes.TrimRight(b, "\n") ++ return string(b), err ++ } ++ } ++ + identities := []age.Identity{ + // If there is an scrypt recipient (it will have to be the only one and) + // this identity will be invoked. +- &LazyScryptIdentity{passphrasePromptForDecryption}, ++ &LazyScryptIdentity{passphrase}, + } + + decrypt(identities, in, out) +diff --git a/cmd/age/testdata/output_file.txt b/cmd/age/testdata/output_file.txt +index 5b16d654..24b5219f 100644 +--- a/cmd/age/testdata/output_file.txt ++++ b/cmd/age/testdata/output_file.txt +@@ -54,7 +54,7 @@ cmp inputcopy input + # https://github.com/FiloSottile/age/issues/159 + ttyin terminal + age -p -a -o test.age input +-ttyin terminalwrong ++ttyin -stdin terminalwrong + ! age -o test.out -d test.age + ttyout 'Enter passphrase' + stderr 'incorrect passphrase' +diff --git a/cmd/age/testdata/scrypt.txt b/cmd/age/testdata/scrypt.txt +index 93298855..abc26895 100644 +--- a/cmd/age/testdata/scrypt.txt ++++ b/cmd/age/testdata/scrypt.txt +@@ -10,14 +10,14 @@ ttyout 'Enter passphrase' + ! stdout . + + # decrypt with a provided passphrase +-ttyin terminal ++ttyin -stdin terminal + age -d test.age + ttyout 'Enter passphrase' + ! stderr . + cmp stdout input + + # decrypt with the wrong passphrase +-ttyin wrong ++ttyin -stdin wrong + ! age -d test.age + stderr 'incorrect passphrase' + +@@ -27,7 +27,7 @@ ttyin empty + age -p -o test.age + ! stderr . + ! stdout . +-ttyin autogenerated ++ttyin -stdin autogenerated + age -d test.age + cmp stdout input + +diff --git a/cmd/age/testdata/terminal.txt b/cmd/age/testdata/terminal.txt +index b2cf0078..8923b7d5 100644 +--- a/cmd/age/testdata/terminal.txt ++++ b/cmd/age/testdata/terminal.txt +@@ -34,7 +34,12 @@ age -p -a -o test.age + ttyout 'Enter passphrase' + ! stderr . + # check the file was encrypted correctly +-ttyin terminal ++ttyin -stdin terminal ++age -d test.age ++cmp stdout input ++ ++# read passphrase from stdin ++stdin password + age -d test.age + cmp stdout input + +@@ -53,5 +58,7 @@ test + -- terminal -- + password + password ++-- password -- ++password + -- empty -- + diff --git a/mt/packages/patches/glfw.diff b/mt/packages/patches/glfw.diff @@ -0,0 +1,36 @@ +diff --git a/src/wl_window.c b/src/wl_window.c +index 5b491ff..986f872 100644 +--- a/src/wl_window.c ++++ b/src/wl_window.c +@@ -2227,8 +2227,8 @@ void _glfwSetWindowTitleWayland(_GLFWwindow* window, const char* title) + void _glfwSetWindowIconWayland(_GLFWwindow* window, + int count, const GLFWimage* images) + { +- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, +- "Wayland: The platform does not support setting the window icon"); ++ //_glfwInputError(GLFW_FEATURE_UNAVAILABLE, ++ // "Wayland: The platform does not support setting the window icon"); + } + + void _glfwGetWindowPosWayland(_GLFWwindow* window, int* xpos, int* ypos) +@@ -2236,16 +2236,16 @@ void _glfwGetWindowPosWayland(_GLFWwindow* window, int* xpos, int* ypos) + // A Wayland client is not aware of its position, so just warn and leave it + // as (0, 0) + +- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, +- "Wayland: The platform does not provide the window position"); ++ //_glfwInputError(GLFW_FEATURE_UNAVAILABLE, ++ // "Wayland: The platform does not provide the window position"); + } + + void _glfwSetWindowPosWayland(_GLFWwindow* window, int xpos, int ypos) + { + // A Wayland client can not set its position, so just warn + +- _glfwInputError(GLFW_FEATURE_UNAVAILABLE, +- "Wayland: The platform does not support setting the window position"); ++ //_glfwInputError(GLFW_FEATURE_UNAVAILABLE, ++ // "Wayland: The platform does not support setting the window position"); + } + + void _glfwGetWindowSizeWayland(_GLFWwindow* window, int* width, int* height) diff --git a/mt/packages/patches/prismlauncher.diff b/mt/packages/patches/prismlauncher.diff @@ -0,0 +1,74 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 808c7d8cd..b6fb57e0a 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -180,8 +180,8 @@ endif() + ##################################### Set Application options ##################################### + + ######## Set URLs ######## +-set(Launcher_NEWS_RSS_URL "https://prismlauncher.org/feed/feed.xml" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from.") +-set(Launcher_NEWS_OPEN_URL "https://prismlauncher.org/news" CACHE STRING "URL that gets opened when the user clicks 'More News'") ++set(Launcher_NEWS_RSS_URL "https://www.minecraft.net/en-us/feeds/community-content/rss" CACHE STRING "URL to fetch Prism Launcher's news RSS feed from.") ++set(Launcher_NEWS_OPEN_URL "https://www.minecraft.net/en-us/articles" CACHE STRING "URL that gets opened when the user clicks 'More News'") + set(Launcher_HELP_URL "https://prismlauncher.org/wiki/help-pages/%1" CACHE STRING "URL (with arg %1 to be substituted with page-id) that gets opened when the user requests help") + set(Launcher_LOGIN_CALLBACK_URL "https://prismlauncher.org/successful-login" CACHE STRING "URL that gets opened when the user successfully logins.") + set(Launcher_FMLLIBS_BASE_URL "https://files.prismlauncher.org/fmllibs/" CACHE STRING "URL for FML Libraries.") +diff --git a/launcher/Application.cpp b/launcher/Application.cpp +index 9ecde7bd2..f5b659f26 100644 +--- a/launcher/Application.cpp ++++ b/launcher/Application.cpp +@@ -660,9 +660,9 @@ Application::Application(int& argc, char** argv) : QApplication(argc, argv) + m_settings->registerSetting("OnlineFixes", false); + + // Native library workarounds +- m_settings->registerSetting("UseNativeOpenAL", false); ++ m_settings->registerSetting("UseNativeOpenAL", true); + m_settings->registerSetting("CustomOpenALPath", ""); +- m_settings->registerSetting("UseNativeGLFW", false); ++ m_settings->registerSetting("UseNativeGLFW", true); + m_settings->registerSetting("CustomGLFWPath", ""); + + // Performance related options +@@ -1934,4 +1934,4 @@ bool Application::checkQSavePath(QString path) + } + } + return false; +-} +\ No newline at end of file ++} +diff --git a/launcher/resources/backgrounds/backgrounds.qrc b/launcher/resources/backgrounds/backgrounds.qrc +index e63a25b5a..e55faf15e 100644 +--- a/launcher/resources/backgrounds/backgrounds.qrc ++++ b/launcher/resources/backgrounds/backgrounds.qrc +@@ -13,17 +13,5 @@ + <file alias="rory-flat-xmas">rory-flat-xmas.png</file> + <file alias="rory-flat-bday">rory-flat-bday.png</file> + <file alias="rory-flat-spooky">rory-flat-spooky.png</file> +- <!-- teawie images --> +- <!-- copyright (c) SympathyTea 2023 --> +- <!-- these are licensed under the CC BY-SA 4.0 and have been unmodified aside from downscaling --> +- <!-- the full license with appropriate notices is avalible at https://creativecommons.org/licenses/by-sa/4.0/ --> +- <file alias="teawie">teawie.png</file> +- <!-- https://commons.wikimedia.org/wiki/File:Teawie.png --> +- <file alias="teawie-xmas">teawie-xmas.png</file> +- <!-- https://commons.wikimedia.org/wiki/File:Teawie_Holiday.png --> +- <file alias="teawie-bday">teawie-bday.png</file> +- <!-- https://commons.wikimedia.org/wiki/File:Teawie_Party.png --> +- <file alias="teawie-spooky">teawie-spooky.png</file> +- <!-- https://commons.wikimedia.org/wiki/File:Teawie_Halloween.png --> + </qresource> + </RCC> +diff --git a/launcher/ui/themes/ThemeManager.cpp b/launcher/ui/themes/ThemeManager.cpp +index 30a1fe7be..397561a03 100644 +--- a/launcher/ui/themes/ThemeManager.cpp ++++ b/launcher/ui/themes/ThemeManager.cpp +@@ -295,8 +295,7 @@ void ThemeManager::initializeCatPacks() + { + QList<std::pair<QString, QString>> defaultCats{ { "kitteh", QObject::tr("Background Cat (from MultiMC)") }, + { "rory", QObject::tr("Rory ID 11 (drawn by Ashtaka)") }, +- { "rory-flat", QObject::tr("Rory ID 11 (flat edition, drawn by Ashtaka)") }, +- { "teawie", QObject::tr("Teawie (drawn by SympathyTea)") } }; ++ { "rory-flat", QObject::tr("Rory ID 11 (flat edition, drawn by Ashtaka)") } }; + for (auto [id, name] : defaultCats) { + addCatPack(std::unique_ptr<CatPack>(new BasicCatPack(id, name))); + } diff --git a/mt/packages/patches/stagit.diff b/mt/packages/patches/stagit.diff @@ -0,0 +1,42 @@ +diff --git a/stagit-index.c b/stagit-index.c +index 6402296..0cc3591 100644 +--- a/stagit-index.c ++++ b/stagit-index.c +@@ -101,10 +101,10 @@ writeheader(FILE *fp) + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n" + "<title>", fp); + xmlencode(fp, description, strlen(description)); +- fprintf(fp, "</title>\n<link rel=\"icon\" type=\"image/png\" href=\"%sfavicon.png\" />\n", relpath); +- fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%sstyle.css\" />\n", relpath); ++ fprintf(fp, "</title>\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon.png\" />\n", relpath); ++ fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\" />\n", relpath); + fputs("</head>\n<body>\n", fp); +- fprintf(fp, "<table>\n<tr><td><img src=\"%slogo.png\" alt=\"\" width=\"32\" height=\"32\" /></td>\n" ++ fprintf(fp, "<table>\n<tr><td><img src=\"/logo.png\" alt=\"\" width=\"32\" height=\"32\" /></td>\n" + "<td><span class=\"desc\">", relpath); + xmlencode(fp, description, strlen(description)); + fputs("</span></td></tr><tr><td></td><td>\n" +diff --git a/stagit.c b/stagit.c +index 409714b..9248616 100644 +--- a/stagit.c ++++ b/stagit.c +@@ -511,16 +511,16 @@ writeheader(FILE *fp, const char *title) + if (description[0]) + fputs(" - ", fp); + xmlencode(fp, description, strlen(description)); +- fprintf(fp, "</title>\n<link rel=\"icon\" type=\"image/png\" href=\"%sfavicon.png\" />\n", relpath); ++ fprintf(fp, "</title>\n<link rel=\"icon\" type=\"image/png\" href=\"/favicon.png\" />\n", relpath); + fputs("<link rel=\"alternate\" type=\"application/atom+xml\" title=\"", fp); + xmlencode(fp, name, strlen(name)); + fprintf(fp, " Atom Feed\" href=\"%satom.xml\" />\n", relpath); + fputs("<link rel=\"alternate\" type=\"application/atom+xml\" title=\"", fp); + xmlencode(fp, name, strlen(name)); + fprintf(fp, " Atom Feed (tags)\" href=\"%stags.xml\" />\n", relpath); +- fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"%sstyle.css\" />\n", relpath); ++ fprintf(fp, "<link rel=\"stylesheet\" type=\"text/css\" href=\"/style.css\" />\n", relpath); + fputs("</head>\n<body>\n<table><tr><td>", fp); +- fprintf(fp, "<a href=\"../%s\"><img src=\"%slogo.png\" alt=\"\" width=\"32\" height=\"32\" /></a>", ++ fprintf(fp, "<a href=\"../%s\"><img src=\"/logo.png\" alt=\"\" width=\"32\" height=\"32\" /></a>", + relpath, relpath); + fputs("</td><td><h1>", fp); + xmlencode(fp, strippedname, strlen(strippedname)); diff --git a/mt/packages/patches/sway-border-width.diff b/mt/packages/patches/sway-border-width.diff @@ -0,0 +1,126 @@ +diff --git a/include/sway/commands.h b/include/sway/commands.h +index 5210d3ba..f04144eb 100644 +--- a/include/sway/commands.h ++++ b/include/sway/commands.h +@@ -246,6 +246,8 @@ sway_cmd bar_colors_cmd_statusline; + sway_cmd bar_colors_cmd_focused_statusline; + sway_cmd bar_colors_cmd_urgent_workspace; + ++sway_cmd bar_cmd_border_width; ++ + sway_cmd input_cmd_seat; + sway_cmd input_cmd_accel_profile; + sway_cmd input_cmd_calibration_matrix; +diff --git a/include/sway/config.h b/include/sway/config.h +index bb770c6f..c20194a0 100644 +--- a/include/sway/config.h ++++ b/include/sway/config.h +@@ -405,6 +405,8 @@ struct bar_config { + list_t *tray_outputs; // char * + int tray_padding; + #endif ++ ++ int border_width; + }; + + struct bar_binding { +diff --git a/include/swaybar/config.h b/include/swaybar/config.h +index 361acd99..05f93884 100644 +--- a/include/swaybar/config.h ++++ b/include/swaybar/config.h +@@ -75,6 +75,8 @@ struct swaybar_config { + list_t *tray_outputs; // char * + int tray_padding; + #endif ++ ++ int border_width; + }; + + #if HAVE_TRAY +diff --git a/sway/commands/bar/height.c b/sway/commands/bar/height.c +index 945eb707..2aeeb626 100644 +--- a/sway/commands/bar/height.c ++++ b/sway/commands/bar/height.c +@@ -18,3 +18,21 @@ struct cmd_results *bar_cmd_height(int argc, char **argv) { + height, config->current_bar->id); + return cmd_results_new(CMD_SUCCESS, NULL); + } ++ ++// I can't add a new file in a diff so just stuff my function here ++struct cmd_results *bar_cmd_border_width(int argc, char **argv) { ++ struct cmd_results *error = NULL; ++ if ((error = checkarg(argc, "border_width", EXPECTED_EQUAL_TO, 1))) { ++ return error; ++ } ++ int border_width = atoi(argv[0]); ++ if (border_width < 0) { ++ return cmd_results_new(CMD_INVALID, ++ "Invalid border_width value: %s", argv[0]); ++ } ++ config->current_bar->border_width = border_width; ++ sway_log(SWAY_DEBUG, "Setting border_width to %d on bar: %s", ++ border_width, config->current_bar->id); ++ return cmd_results_new(CMD_SUCCESS, NULL); ++} ++ +diff --git a/swaybar/config.c b/swaybar/config.c +index 55bfcb72..056d3845 100644 +--- a/swaybar/config.c ++++ b/swaybar/config.c +@@ -81,6 +81,8 @@ struct swaybar_config *init_config(void) { + wl_list_init(&config->tray_bindings); + #endif + ++ config->border_width = 1; ++ + return config; + } + +diff --git a/swaybar/render.c b/swaybar/render.c +index 45faefa9..33d6efa6 100644 +--- a/swaybar/render.c ++++ b/swaybar/render.c +@@ -21,7 +21,6 @@ + + static const int WS_HORIZONTAL_PADDING = 5; + static const double WS_VERTICAL_PADDING = 1.5; +-static const double BORDER_WIDTH = 1; + + struct render_context { + cairo_t *cairo; +@@ -432,7 +431,7 @@ static uint32_t predict_workspace_button_length(cairo_t *cairo, + + int ws_vertical_padding = WS_VERTICAL_PADDING; + int ws_horizontal_padding = WS_HORIZONTAL_PADDING; +- int border_width = BORDER_WIDTH; ++ int border_width = config->border_width; + + uint32_t ideal_height = ws_vertical_padding * 2 + text_height + + border_width * 2; +@@ -481,7 +480,7 @@ static uint32_t predict_binding_mode_indicator_length(cairo_t *cairo, + + int ws_vertical_padding = WS_VERTICAL_PADDING; + int ws_horizontal_padding = WS_HORIZONTAL_PADDING; +- int border_width = BORDER_WIDTH; ++ int border_width = config->border_width; + + uint32_t ideal_height = text_height + ws_vertical_padding * 2 + + border_width * 2; +@@ -558,7 +557,7 @@ static uint32_t render_binding_mode_indicator(struct render_context *ctx, + + int ws_vertical_padding = WS_VERTICAL_PADDING; + int ws_horizontal_padding = WS_HORIZONTAL_PADDING; +- int border_width = BORDER_WIDTH; ++ int border_width = config->border_width; + + uint32_t ideal_height = text_height + ws_vertical_padding * 2 + + border_width * 2; +@@ -638,7 +637,7 @@ static uint32_t render_workspace_button(struct render_context *ctx, + + int ws_vertical_padding = WS_VERTICAL_PADDING; + int ws_horizontal_padding = WS_HORIZONTAL_PADDING; +- int border_width = BORDER_WIDTH; ++ int border_width = config->border_width; + + uint32_t ideal_height = ws_vertical_padding * 2 + text_height + + border_width * 2; diff --git a/mt/packages/patches/wlr-apps.diff b/mt/packages/patches/wlr-apps.diff @@ -0,0 +1,40 @@ +diff --git a/src/wlr-apps.c b/src/wlr-apps.c +index 779d45d..eeef9cb 100644 +--- a/src/wlr-apps.c ++++ b/src/wlr-apps.c +@@ -286,10 +286,20 @@ void print_toplevel_json_array(void) { + } + + printf("["); ++ ++ bool printed_any = false; + + for (size_t i = 0; i < global_info_list.count; ++i) { + struct toplevel_info *info = &global_info_list.items[i]; + ++ if (!info->minimized) { ++ continue; ++ } ++ ++ if (printed_any) { ++ printf(","); ++ } ++ + printf("{\"id\":%u,", info->tl_id); + + printf("\"title\":"); +@@ -307,10 +317,11 @@ void print_toplevel_json_array(void) { + } + + printf( +- "\"maximized\":%s,\"minimized\":%s,\"active\":%s,\"fullscreen\":%s}%s", ++ "\"maximized\":%s,\"minimized\":%s,\"active\":%s,\"fullscreen\":%s}", + info->maximized ? "true" : "false", info->minimized ? "true" : "false", +- info->active ? "true" : "false", info->fullscreen ? "true" : "false", +- (i < global_info_list.count - 1) ? "," : ""); ++ info->active ? "true" : "false", info->fullscreen ? "true" : "false"); ++ ++ printed_any = true; + } + + printf("]\n"); diff --git a/mt/packages/rust-crates.scm b/mt/packages/rust-crates.scm @@ -0,0 +1,1838 @@ +(define-module (mt packages rust-crates) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix git-download) + #:use-module (guix build-system cargo) + #:use-module ((gnu packages rust-sources) #:prefix package:) + #:export (lookup-cargo-inputs)) + +(define rust-addr2line-0.24.1 + (crate-source "addr2line" "0.24.1" + "0xfkfsk45dwps3jq4n5ikk7v15i6g51cpnnivxgl1ga28j71vyzm")) + +(define rust-adler2-2.0.0 + (crate-source "adler2" "2.0.0" + "09r6drylvgy8vv8k20lnbvwq8gp09h7smfn6h1rxsy15pgh629si")) + +(define rust-ahash-0.8.11 + (crate-source "ahash" "0.8.11" + "04chdfkls5xmhp1d48gnjsmglbqibizs3bpbj6rsj604m10si7g8")) + +(define rust-aho-corasick-1.1.3 + (crate-source "aho-corasick" "1.1.3" + "05mrpkvdgp5d20y2p989f187ry9diliijgwrs254fs9s1m1x6q4f")) + +(define rust-allocator-api2-0.2.18 + (crate-source "allocator-api2" "0.2.18" + "0kr6lfnxvnj164j1x38g97qjlhb7akppqzvgfs0697140ixbav2w")) + +(define rust-android-system-properties-0.1.5 + (crate-source "android_system_properties" "0.1.5" + "04b3wrz12837j7mdczqd95b732gw5q7q66cv4yn4646lvccp57l1")) + +(define rust-android-tzdata-0.1.1 + (crate-source "android-tzdata" "0.1.1" + "1w7ynjxrfs97xg3qlcdns4kgfpwcdv824g611fq32cag4cdr96g9")) + +(define rust-anstream-0.6.15 + (crate-source "anstream" "0.6.15" + "09nm4qj34kiwgzczdvj14x7hgsb235g4sqsay3xsz7zqn4d5rqb4")) + +(define rust-anstyle-1.0.8 + (crate-source "anstyle" "1.0.8" + "1cfmkza63xpn1kkz844mgjwm9miaiz4jkyczmwxzivcsypk1vv0v")) + +(define rust-anstyle-parse-0.2.5 + (crate-source "anstyle-parse" "0.2.5" + "1jy12rvgbldflnb2x7mcww9dcffw1mx22nyv6p3n7d62h0gdwizb")) + +(define rust-anstyle-query-1.1.1 + (crate-source "anstyle-query" "1.1.1" + "0aj22iy4pzk6mz745sfrm1ym14r0y892jhcrbs8nkj7nqx9gqdkd")) + +(define rust-anstyle-wincon-3.0.4 + (crate-source "anstyle-wincon" "3.0.4" + "1y2pkvsrdxbcwircahb4wimans2pzmwwxad7ikdhj5lpdqdlxxsv")) + +(define rust-anyhow-1.0.89 + (crate-source "anyhow" "1.0.89" + "1xh1vg89n56h6nqikcmgbpmkixjds33492klrp9m96xrbmhgizc6")) + +(define rust-ascii-canvas-3.0.0 + (crate-source "ascii-canvas" "3.0.0" + "1in38ziqn4kh9sw89ys4naaqzvvjscfs0m4djqbfq7455v5fq948")) + +(define rust-async-broadcast-0.5.1 + (crate-source "async-broadcast" "0.5.1" + "0avdqbci1qdlfc4glc3wqrb0wi5ffc7bqv2q1wg14syayvdwqj3w")) + +(define rust-async-channel-2.3.1 + (crate-source "async-channel" "2.3.1" + "0skvwxj6ysfc6d7bhczz9a2550260g62bm5gl0nmjxxyn007id49")) + +(define rust-async-io-1.13.0 + (crate-source "async-io" "1.13.0" + "1byj7lpw0ahk6k63sbc9859v68f28hpaab41dxsjj1ggjdfv9i8g")) + +(define rust-async-io-2.3.4 + (crate-source "async-io" "2.3.4" + "1s679l7x6ijh8zcxqn5pqgdiyshpy4xwklv86ldm1rhfjll04js4")) + +(define rust-async-lock-2.8.0 + (crate-source "async-lock" "2.8.0" + "0asq5xdzgp3d5m82y5rg7a0k9q0g95jy6mgc7ivl334x7qlp4wi8")) + +(define rust-async-lock-3.4.0 + (crate-source "async-lock" "3.4.0" + "060vh45i809wcqyxzs5g69nqiqah7ydz0hpkcjys9258vqn4fvpz")) + +(define rust-async-process-1.8.1 + (crate-source "async-process" "1.8.1" + "126s968lvhg9rlwsnxp7wfzkfn7rl87p0dlvqqlibn081ax3hr7a")) + +(define rust-async-recursion-1.1.1 + (crate-source "async-recursion" "1.1.1" + "04ac4zh8qz2xjc79lmfi4jlqj5f92xjvfaqvbzwkizyqd4pl4hrv")) + +(define rust-async-signal-0.2.10 + (crate-source "async-signal" "0.2.10" + "1wxrq3871l00mil43nmh0akvwjjjnv0bn7n2pzwbvh00k0s00zk3")) + +(define rust-async-task-4.7.1 + (crate-source "async-task" "4.7.1" + "1pp3avr4ri2nbh7s6y9ws0397nkx1zymmcr14sq761ljarh3axcb")) + +(define rust-async-trait-0.1.83 + (crate-source "async-trait" "0.1.83" + "1p8q8gm4fv2fdka8hwy2w3f8df7p5inixqi7rlmbnky3wmysw73j")) + +(define rust-atk-0.18.0 + (crate-source "atk" "0.18.0" + "1r0pdczm9jyh6lpn5hc3nmpbmp8ilbab52d6kypyi06x2x5h3bxl")) + +(define rust-atk-sys-0.18.0 + ;; TODO: Check bundled sources. + (crate-source "atk-sys" "0.18.0" + "0280k0xw21n3zzri8ynk5mxy7v1mk9d506l962lhngp3j1yhn7i5")) + +(define rust-atomic-waker-1.1.2 + (crate-source "atomic-waker" "1.1.2" + "1h5av1lw56m0jf0fd3bchxq8a30xv0b4wv8s4zkp4s0i7mfvs18m")) + +(define rust-autocfg-1.4.0 + (crate-source "autocfg" "1.4.0" + "09lz3by90d2hphbq56znag9v87gfpd9gb8nr82hll8z6x2nhprdc")) + +(define rust-backtrace-0.3.74 + (crate-source "backtrace" "0.3.74" + "06pfif7nwx66qf2zaanc2fcq7m64i91ki9imw9xd3bnz5hrwp0ld")) + +(define rust-base64-0.22.1 + (crate-source "base64" "0.22.1" + "1imqzgh7bxcikp5vx3shqvw9j09g9ly0xr0jma0q66i52r7jbcvj")) + +(define rust-bincode-1.3.3 + (crate-source "bincode" "1.3.3" + "1bfw3mnwzx5g1465kiqllp5n4r10qrqy88kdlp3jfwnq2ya5xx5i")) + +(define rust-bit-set-0.6.0 + (crate-source "bit-set" "0.6.0" + "0kzlffh7gp1ks2jjh3cyvkrqhgg99qc9b81k26di0hi70c71lj7h")) + +(define rust-bit-vec-0.7.0 + (crate-source "bit-vec" "0.7.0" + "08kzw2z8hr4yhm80mr5k62ilir6q3gm35f56717s7h6ghzr4zifj")) + +(define rust-bitflags-1.3.2 + (crate-source "bitflags" "1.3.2" + "12ki6w8gn1ldq7yz9y680llwk5gmrhrzszaa17g1sbrw2r2qvwxy")) + +(define rust-bitflags-2.6.0 + (crate-source "bitflags" "2.6.0" + "1pkidwzn3hnxlsl8zizh0bncgbjnw7c41cx7bby26ncbzmiznj5h")) + +(define rust-block-buffer-0.10.4 + (crate-source "block-buffer" "0.10.4" + "0w9sa2ypmrsqqvc20nhwr75wbb5cjr4kkyhpjm1z1lv2kdicfy1h")) + +(define rust-blocking-1.6.1 + (crate-source "blocking" "1.6.1" + "1si99l8zp7c4zq87y35ayjgc5c9b60jb8h0k14zfcs679z2l2gvh")) + +(define rust-bumpalo-3.16.0 + (crate-source "bumpalo" "3.16.0" + "0b015qb4knwanbdlp1x48pkb4pm57b8gidbhhhxr900q2wb6fabr")) + +(define rust-byteorder-1.5.0 + (crate-source "byteorder" "1.5.0" + "0jzncxyf404mwqdbspihyzpkndfgda450l0893pz5xj685cg5l0z")) + +(define rust-bytes-1.7.2 + (crate-source "bytes" "1.7.2" + "1wzs7l57iwqmrszdpr2mmqf1b1hgvpxafc30imxhnry0zfl9m3a2")) + +(define rust-bytesize-2.0.1 + (crate-source "bytesize" "2.0.1" + "1fmchbqbk4pvzh0g4qmsgxlq2scdn4qgfg5fxvqaqjj114rgij53")) + +(define rust-cached-0.53.1 + (crate-source "cached" "0.53.1" + "0ik8fr14wlfd2mfh3jw3p3dcd8dq0bmrmhngwifwya3bmrak3mxl")) + +(define rust-cached-proc-macro-0.23.0 + (crate-source "cached_proc_macro" "0.23.0" + "1ajxgl0w9vm55dk47qb0cq1akzncrwqcy78y37idq41dxm2s2hig")) + +(define rust-cached-proc-macro-types-0.1.1 + (crate-source "cached_proc_macro_types" "0.1.1" + "1h3gw61v1inay4g3b8pirxlz18m81k63dw2q18zj9fnmidmkds5d")) + +(define rust-cairo-rs-0.18.5 + (crate-source "cairo-rs" "0.18.5" + "1qjfkcq3mrh3p01nnn71dy3kn99g21xx3j8xcdvzn8ll2pq6x8lc")) + +(define rust-cairo-sys-rs-0.18.2 + (crate-source "cairo-sys-rs" "0.18.2" + "0lfsxl7ylw3phbnwmz3k58j1gnqi6kc2hdc7g3bb7f4hwnl9yp38")) + +(define rust-cc-1.1.22 + (crate-source "cc" "1.1.22" + "1q4h1d9nc6saf8vym8rs795h18irq6612578psd1b68pz1hych4m")) + +(define rust-cfg-aliases-0.2.1 + (crate-source "cfg_aliases" "0.2.1" + "092pxdc1dbgjb6qvh83gk56rkic2n2ybm4yvy76cgynmzi3zwfk1")) + +(define rust-cfg-expr-0.15.8 + (crate-source "cfg-expr" "0.15.8" + "00lgf717pmf5qd2qsxxzs815v6baqg38d6m5i6wlh235p14asryh")) + +(define rust-cfg-expr-0.17.0 + (crate-source "cfg-expr" "0.17.0" + "174y5f7035cx99d83hn1m97xd5xr83nd5fpkcxr3w8nkqihh12fh")) + +(define rust-cfg-if-1.0.0 + (crate-source "cfg-if" "1.0.0" + "1za0vb97n4brpzpv8lsbnzmq5r8f2b0cpqqr0sy8h5bn751xxwds")) + +(define rust-chrono-0.4.41 + (crate-source "chrono" "0.4.41" + "0k8wy2mph0mgipq28vv3wirivhb31pqs7jyid0dzjivz0i9djsf4")) + +(define rust-chrono-tz-0.10.0 + (crate-source "chrono-tz" "0.10.0" + "1dnkmhlf8jfxskrzir0y6fdbpf8mqnaz5igql9cklwh0dl2dhvfd")) + +(define rust-chrono-tz-build-0.4.0 + (crate-source "chrono-tz-build" "0.4.0" + "19qh9c3v7v4czf8z8vrhdy4jmkc6nyzd4svlwwlm493sswsflkz9")) + +(define rust-chumsky-0.9.3 + (crate-source "chumsky" "0.9.3" + "1jcnafc8rjfs1al08gqzyn0kpbaizgdwrd0ajqafspd18ikxdswf")) + +(define rust-clap-4.5.18 + (crate-source "clap" "4.5.18" + "1lsxa59bgfxaag1q65ndp801h7vw9dffsly0zzx1mb13nd1nm5dh")) + +(define rust-clap-builder-4.5.18 + (crate-source "clap_builder" "4.5.18" + "06wnncyif421qgrkd73hhhfych773avpx903b1nhhd0nsinicwjd")) + +(define rust-clap-complete-4.5.29 + (crate-source "clap_complete" "4.5.29" + "13ivddyrv6dsrf5w8ibh59wiyxrhkdgyxhxqf0c8fq2c7w67cdw9")) + +(define rust-clap-derive-4.5.18 + (crate-source "clap_derive" "4.5.18" + "1ardb26bvcpg72q9myr7yir3a8c83gx7vxk1cccabsd9n73s1ija")) + +(define rust-clap-lex-0.7.2 + (crate-source "clap_lex" "0.7.2" + "15zcrc2fa6ycdzaihxghf48180bnvzsivhf0fmah24bnnaf76qhl")) + +(define rust-codemap-0.1.3 + (crate-source "codemap" "0.1.3" + "091azkslwkcijj3lp9ymb084y9a0wm4fkil7m613ja68r2snkrxr")) + +(define rust-codespan-reporting-0.11.1 + (crate-source "codespan-reporting" "0.11.1" + "0vkfay0aqk73d33kh79k1kqxx06ka22894xhqi89crnc6c6jff1m")) + +(define rust-colorchoice-1.0.2 + (crate-source "colorchoice" "1.0.2" + "1h18ph538y8yjmbpaf8li98l0ifms2xmh3rax9666c5qfjfi3zfk")) + +(define rust-concurrent-queue-2.5.0 + (crate-source "concurrent-queue" "2.5.0" + "0wrr3mzq2ijdkxwndhf79k952cp4zkz35ray8hvsxl96xrx1k82c")) + +(define rust-console-0.15.8 + (crate-source "console" "0.15.8" + "1sz4nl9nz8pkmapqni6py7jxzi7nzqjxzb3ya4kxvmkb0zy867qf")) + +(define rust-core-foundation-sys-0.8.7 + ;; TODO: Check bundled sources. + (crate-source "core-foundation-sys" "0.8.7" + "12w8j73lazxmr1z0h98hf3z623kl8ms7g07jch7n4p8f9nwlhdkp")) + +(define rust-cpufeatures-0.2.14 + (crate-source "cpufeatures" "0.2.14" + "1q3qd9qkw94vs7n5i0y3zz2cqgzcxvdgyb54ryngwmjhfbgrg1k0")) + +(define rust-crossbeam-channel-0.5.13 + (crate-source "crossbeam-channel" "0.5.13" + "1wkx45r34v7g3wyi3lg2wz536lrrrab4h4hh741shfhr8rlhsj1k")) + +(define rust-crossbeam-deque-0.8.5 + (crate-source "crossbeam-deque" "0.8.5" + "03bp38ljx4wj6vvy4fbhx41q8f585zyqix6pncz1mkz93z08qgv1")) + +(define rust-crossbeam-epoch-0.9.18 + (crate-source "crossbeam-epoch" "0.9.18" + "03j2np8llwf376m3fxqx859mgp9f83hj1w34153c7a9c7i5ar0jv")) + +(define rust-crossbeam-utils-0.8.20 + (crate-source "crossbeam-utils" "0.8.20" + "100fksq5mm1n7zj242cclkw6yf7a4a8ix3lvpfkhxvdhbda9kv12")) + +(define rust-crypto-common-0.1.6 + (crate-source "crypto-common" "0.1.6" + "1cvby95a6xg7kxdz5ln3rl9xh66nz66w46mm3g56ri1z5x815yqv")) + +(define rust-darling-0.20.10 + (crate-source "darling" "0.20.10" + "1299h2z88qn71mizhh05j26yr3ik0wnqmw11ijds89l8i9nbhqvg")) + +(define rust-darling-core-0.20.10 + (crate-source "darling_core" "0.20.10" + "1rgr9nci61ahnim93yh3xy6fkfayh7sk4447hahawah3m1hkh4wm")) + +(define rust-darling-macro-0.20.10 + (crate-source "darling_macro" "0.20.10" + "01kq3ibbn47czijj39h3vxyw0c2ksd0jvc097smcrk7n2jjs4dnk")) + +(define rust-dbusmenu-glib-0.1.0 + (crate-source "dbusmenu-glib" "0.1.0" + "155q311s8zn830x06d7w7sk950xqs5w7xw5rirkf0xaprkf2j5px")) + +(define rust-dbusmenu-glib-sys-0.1.0 + ;; TODO: Check bundled sources. + (crate-source "dbusmenu-glib-sys" "0.1.0" + "1synl6ix79a5bgihywd70zdl1n0rmjbwjlxr891wj6076d0fvybz")) + +(define rust-dbusmenu-gtk3-0.1.0 + (crate-source "dbusmenu-gtk3" "0.1.0" + "0vj3k0pn2m6j0wj28qcy5jwgvwlva91ic4fnwk791mzfafzh4pmi")) + +(define rust-dbusmenu-gtk3-sys-0.1.0 + ;; TODO: Check bundled sources. + (crate-source "dbusmenu-gtk3-sys" "0.1.0" + "1jkfrdhiygd2jvfrywhy41xl3xmn7ppci6sp9jl3h3pci9gvlc3g")) + +(define rust-derivative-2.2.0 + (crate-source "derivative" "2.2.0" + "02vpb81wisk2zh1d5f44szzxamzinqgq2k8ydrfjj2wwkrgdvhzw")) + +(define rust-derive-more-1.0.0 + (crate-source "derive_more" "1.0.0" + "01cd8pskdjg10dvfchi6b8a9pa1ja1ic0kbn45dl8jdyrfwrk6sa")) + +(define rust-derive-more-impl-1.0.0 + (crate-source "derive_more-impl" "1.0.0" + "08mxyd456ygk68v5nfn4dyisn82k647w9ri2jl19dqpvmnp30wyb")) + +(define rust-diff-0.1.13 + (crate-source "diff" "0.1.13" + "1j0nzjxci2zqx63hdcihkp0a4dkdmzxd7my4m7zk6cjyfy34j9an")) + +(define rust-digest-0.10.7 + (crate-source "digest" "0.10.7" + "14p2n6ih29x81akj097lvz7wi9b6b9hvls0lwrv7b6xwyy0s5ncy")) + +(define rust-dirs-next-2.0.0 + (crate-source "dirs-next" "2.0.0" + "1q9kr151h9681wwp6is18750ssghz6j9j7qm7qi1ngcwy7mzi35r")) + +(define rust-dirs-sys-next-0.1.2 + (crate-source "dirs-sys-next" "0.1.2" + "0kavhavdxv4phzj4l0psvh55hszwnr0rcz8sxbvx20pyqi2a3gaf")) + +(define rust-dyn-clone-1.0.17 + (crate-source "dyn-clone" "1.0.17" + "09cig7dgg6jnqa10p4233nd8wllbjf4ffsw7wj0m4lwa5w3z0vhd")) + +(define rust-either-1.13.0 + (crate-source "either" "1.13.0" + "1w2c1mybrd7vljyxk77y9f4w9dyjrmp3yp82mk7bcm8848fazcb0")) + +(define rust-ena-0.14.3 + (crate-source "ena" "0.14.3" + "1m9a5hqk6qn5sqnrc40b55yr97drkfdzd0jj863ksqff8gfqn91x")) + +(define rust-encode-unicode-0.3.6 + (crate-source "encode_unicode" "0.3.6" + "07w3vzrhxh9lpjgsg2y5bwzfar2aq35mdznvcp3zjl0ssj7d4mx3")) + +(define rust-enumflags2-0.7.10 + (crate-source "enumflags2" "0.7.10" + "0g8kmhaqxq44v76wh971biljrgaqbjc8fbyw2d1z3wsnb5zxncnj")) + +(define rust-enumflags2-derive-0.7.10 + (crate-source "enumflags2_derive" "0.7.10" + "1s29iqx3gj5l5s19a22lpn0nljhp5l9smqac99126n2qhfhlh3fy")) + +(define rust-env-logger-0.10.2 + (crate-source "env_logger" "0.10.2" + "1005v71kay9kbz1d5907l0y7vh9qn2fqsp2yfgb8bjvin6m0bm2c")) + +(define rust-equivalent-1.0.1 + (crate-source "equivalent" "1.0.1" + "1malmx5f4lkfvqasz319lq6gb3ddg19yzf9s8cykfsgzdmyq0hsl")) + +(define rust-errno-0.3.9 + (crate-source "errno" "0.3.9" + "1fi0m0493maq1jygcf1bya9cymz2pc1mqxj26bdv7yjd37v5qk2k")) + +(define rust-event-listener-2.5.3 + (crate-source "event-listener" "2.5.3" + "1q4w3pndc518crld6zsqvvpy9lkzwahp2zgza9kbzmmqh9gif1h2")) + +(define rust-event-listener-3.1.0 + (crate-source "event-listener" "3.1.0" + "1hihkg6ihvb6p9yi7nq11di8mhd5y0iqv81ij6h0rf0fvsy7ff6r")) + +(define rust-event-listener-5.3.1 + (crate-source "event-listener" "5.3.1" + "1fkm6q4hjn61wl52xyqyyxai0x9w0ngrzi0wf1qsf8vhsadvwck0")) + +(define rust-event-listener-strategy-0.5.2 + (crate-source "event-listener-strategy" "0.5.2" + "18f5ri227khkayhv3ndv7yl4rnasgwksl2jhwgafcxzr7324s88g")) + +(define rust-extend-1.2.0 + (crate-source "extend" "1.2.0" + "003dnm6vdfx5ja0j6p7ifabgf9zdjyps0y1c7pvvyq4x3wpns6ii")) + +(define rust-fastrand-1.9.0 + (crate-source "fastrand" "1.9.0" + "1gh12m56265ihdbzh46bhh0jf74i197wm51jg1cw75q7ggi96475")) + +(define rust-fastrand-2.1.1 + (crate-source "fastrand" "2.1.1" + "19nyzdq3ha4g173364y2wijmd6jlyms8qx40daqkxsnl458jmh78")) + +(define rust-field-offset-0.3.6 + (crate-source "field-offset" "0.3.6" + "0zq5sssaa2ckmcmxxbly8qgz3sxpb8g1lwv90sdh1z74qif2gqiq")) + +(define rust-filetime-0.2.25 + (crate-source "filetime" "0.2.25" + "11l5zr86n5sr6g6k6sqldswk0jzklm0q95rzikxcns0yk0p55h1m")) + +(define rust-fixedbitset-0.4.2 + (crate-source "fixedbitset" "0.4.2" + "101v41amgv5n9h4hcghvrbfk5vrncx1jwm35rn5szv4rk55i7rqc")) + +(define rust-fnv-1.0.7 + (crate-source "fnv" "1.0.7" + "1hc2mcqha06aibcaza94vbi81j6pr9a1bbxrxjfhc91zin8yr7iz")) + +(define rust-fsevent-sys-4.1.0 + ;; TODO: Check bundled sources. + (crate-source "fsevent-sys" "4.1.0" + "1liz67v8b0gcs8r31vxkvm2jzgl9p14i78yfqx81c8sdv817mvkn")) + +(define rust-futures-0.3.30 + (crate-source "futures" "0.3.30" + "1c04g14bccmprwsvx2j9m2blhwrynq7vhl151lsvcv4gi0b6jp34")) + +(define rust-futures-channel-0.3.30 + (crate-source "futures-channel" "0.3.30" + "0y6b7xxqdjm9hlcjpakcg41qfl7lihf6gavk8fyqijsxhvbzgj7a")) + +(define rust-futures-core-0.3.30 + (crate-source "futures-core" "0.3.30" + "07aslayrn3lbggj54kci0ishmd1pr367fp7iks7adia1p05miinz")) + +(define rust-futures-executor-0.3.30 + (crate-source "futures-executor" "0.3.30" + "07dh08gs9vfll2h36kq32q9xd86xm6lyl9xikmmwlkqnmrrgqxm5")) + +(define rust-futures-io-0.3.30 + (crate-source "futures-io" "0.3.30" + "1hgh25isvsr4ybibywhr4dpys8mjnscw4wfxxwca70cn1gi26im4")) + +(define rust-futures-lite-1.13.0 + (crate-source "futures-lite" "1.13.0" + "1kkbqhaib68nzmys2dc8j9fl2bwzf2s91jfk13lb2q3nwhfdbaa9")) + +(define rust-futures-lite-2.3.0 + (crate-source "futures-lite" "2.3.0" + "19gk4my8zhfym6gwnpdjiyv2hw8cc098skkbkhryjdaf0yspwljj")) + +(define rust-futures-macro-0.3.30 + (crate-source "futures-macro" "0.3.30" + "1b49qh9d402y8nka4q6wvvj0c88qq91wbr192mdn5h54nzs0qxc7")) + +(define rust-futures-sink-0.3.30 + (crate-source "futures-sink" "0.3.30" + "1dag8xyyaya8n8mh8smx7x6w2dpmafg2din145v973a3hw7f1f4z")) + +(define rust-futures-task-0.3.30 + (crate-source "futures-task" "0.3.30" + "013h1724454hj8qczp8vvs10qfiqrxr937qsrv6rhii68ahlzn1q")) + +(define rust-futures-util-0.3.30 + (crate-source "futures-util" "0.3.30" + "0j0xqhcir1zf2dcbpd421kgw6wvsk0rpxflylcysn1rlp3g02r1x")) + +(define rust-gdk-0.18.0 + (crate-source "gdk" "0.18.0" + "0iinlc369mrp5aj4fcw5ppb1fx1dxnckd5gwvfy5xdzkvqdhifpm")) + +(define rust-gdk-pixbuf-0.18.5 + (crate-source "gdk-pixbuf" "0.18.5" + "1v7svvl0g7zybndmis5inaqqgi1mvcc6s1n8rkb31f5zn3qzbqah")) + +(define rust-gdk-pixbuf-sys-0.18.0 + ;; TODO: Check bundled sources. + (crate-source "gdk-pixbuf-sys" "0.18.0" + "1xya543c4ffd2n7aiwwrdxsyc9casdbasafi6ixcknafckm3k61z")) + +(define rust-gdk-sys-0.18.0 + ;; TODO: Check bundled sources. + (crate-source "gdk-sys" "0.18.0" + "1whznljhqqni5sk1qwazkc75ik5gmc1zh8590cbswv9qndn8bzri")) + +(define rust-gdkx11-0.18.0 + (crate-source "gdkx11" "0.18.0" + "1klwrpwsap76m879gzivcafwnd3wpnf3i40jj9whylwxj2jahbnv")) + +(define rust-gdkx11-sys-0.18.0 + ;; TODO: Check bundled sources. + (crate-source "gdkx11-sys" "0.18.0" + "0hrhnm5gll7rmg2kr3q2qf1ghky9f1f0z6dq74lssv749q7z1s7y")) + +(define rust-generic-array-0.14.7 + (crate-source "generic-array" "0.14.7" + "16lyyrzrljfq424c3n8kfwkqihlimmsg5nhshbbp48np3yjrqr45")) + +(define rust-gethostname-0.4.3 + (crate-source "gethostname" "0.4.3" + "063qqhznyckwx9n4z4xrmdv10s0fi6kbr17r6bi1yjifki2y0xh1")) + +(define rust-getrandom-0.2.15 + (crate-source "getrandom" "0.2.15" + "1mzlnrb3dgyd1fb84gvw10pyr8wdqdl4ry4sr64i1s8an66pqmn4")) + +(define rust-gimli-0.31.0 + (crate-source "gimli" "0.31.0" + "0r1d55xdi1k2l5ah9p0n23i93pm47cl8apjm8rwgqd1j7yi5w21j")) + +(define rust-gio-0.18.4 + (crate-source "gio" "0.18.4" + "0wsc6mnx057s4ailacg99dwgna38dbqli5x7a6y9rdw75x9qzz6l")) + +(define rust-gio-sys-0.18.1 + ;; TODO: Check bundled sources. + (crate-source "gio-sys" "0.18.1" + "1lip8z35iy9d184x2qwjxlbxi64q9cpayy7v1p5y9xdsa3w6smip")) + +(define rust-glib-0.18.5 + (crate-source "glib" "0.18.5" + "1r8fw0627nmn19bgk3xpmcfngx3wkn7mcpq5a8ma3risx3valg93")) + +(define rust-glib-macros-0.18.5 + (crate-source "glib-macros" "0.18.5" + "1p5cla53fcp195zp0hkqpmnn7iwmkdswhy7xh34002bw8y7j5c0b")) + +(define rust-glib-sys-0.18.1 + ;; TODO: Check bundled sources. + (crate-source "glib-sys" "0.18.1" + "164qhsfmlzd5mhyxs8123jzbdfldwxbikfpq5cysj3lddbmy4g06")) + +(define rust-gobject-sys-0.18.0 + ;; TODO: Check bundled sources. + (crate-source "gobject-sys" "0.18.0" + "0i6fhp3m6vs3wkzyc22rk2cqj68qvgddxmpaai34l72da5xi4l08")) + +(define rust-grass-0.13.4 + (crate-source "grass" "0.13.4" + "151wydlb0543hcyv00g06wiakrp6p5xnr3g4703qzxky8cb859pp")) + +(define rust-grass-compiler-0.13.4 + (crate-source "grass_compiler" "0.13.4" + "1xngzb4h04fkdhyagrwcqanrl7arghj3v5sl84cfab12y3vkv7id")) + +(define rust-gtk-0.18.1 + (crate-source "gtk" "0.18.1" + "0349cpwasirgxqgsf3md0m5p9nixzsknvw55643f2q0bwbhgbi4k")) + +(define rust-gtk-layer-shell-0.8.1 + (crate-source "gtk-layer-shell" "0.8.1" + "10vk23j43wq29isjnd2y752l7zqca8wa642abbdcsm8b0x1idd5d")) + +(define rust-gtk-layer-shell-sys-0.7.1 + ;; TODO: Check bundled sources. + (crate-source "gtk-layer-shell-sys" "0.7.1" + "0d7yj7i29qdwy188q63p6wifmjrn5agii6r3pvc9aldznp5pbamr")) + +(define rust-gtk-sys-0.18.0 + ;; TODO: Check bundled sources. + (crate-source "gtk-sys" "0.18.0" + "08kpdl7ldj8lyv4dyhp9pdk61qj8yyyha5f1jssc1hg23nzkf53p")) + +(define rust-gtk3-macros-0.18.0 + (crate-source "gtk3-macros" "0.18.0" + "0pnpp8bddisgyd1m39xhrw6kd9lawqd2xxvxzdl2jn6vcgxkw1n6")) + +(define rust-hashbrown-0.14.5 + (crate-source "hashbrown" "0.14.5" + "1wa1vy1xs3mp11bn3z9dv0jricgr6a2j0zkf1g19yz3vw4il89z5")) + +(define rust-heck-0.4.1 + (crate-source "heck" "0.4.1" + "1a7mqsnycv5z4z5vnv1k34548jzmc0ajic7c1j8jsaspnhw5ql4m")) + +(define rust-heck-0.5.0 + (crate-source "heck" "0.5.0" + "1sjmpsdl8czyh9ywl3qcsfsq9a307dg4ni2vnlwgnzzqhc4y0113")) + +(define rust-hermit-abi-0.3.9 + (crate-source "hermit-abi" "0.3.9" + "092hxjbjnq5fmz66grd9plxd0sh6ssg5fhgwwwqbrzgzkjwdycfj")) + +(define rust-hermit-abi-0.4.0 + (crate-source "hermit-abi" "0.4.0" + "1k1zwllx6nfq417hy38x4akw1ivlv68ymvnzyxs76ffgsqcskxpv")) + +(define rust-hex-0.4.3 + (crate-source "hex" "0.4.3" + "0w1a4davm1lgzpamwnba907aysmlrnygbqmfis2mqjx5m552a93z")) + +(define rust-hifijson-0.2.2 + (crate-source "hifijson" "0.2.2" + "0hjwcn3hj7bmwqw084lbbvmwx7lnkfyid6b74wd0c30pwcyann4r")) + +(define rust-humantime-2.1.0 + (crate-source "humantime" "2.1.0" + "1r55pfkkf5v0ji1x6izrjwdq9v6sc7bv99xj6srywcar37xmnfls")) + +(define rust-iana-time-zone-0.1.61 + (crate-source "iana-time-zone" "0.1.61" + "085jjsls330yj1fnwykfzmb2f10zp6l7w4fhq81ng81574ghhpi3")) + +(define rust-iana-time-zone-haiku-0.1.2 + (crate-source "iana-time-zone-haiku" "0.1.2" + "17r6jmj31chn7xs9698r122mapq85mfnv98bb4pg6spm0si2f67k")) + +(define rust-ident-case-1.0.1 + (crate-source "ident_case" "1.0.1" + "0fac21q6pwns8gh1hz3nbq15j8fi441ncl6w4vlnd1cmc55kiq5r")) + +(define rust-indexmap-2.5.0 + (crate-source "indexmap" "2.5.0" + "1r87dlvyg04fa9m4m6pkvwsdx54rx471fas66qff40bk5ym01fb8")) + +(define rust-inotify-0.9.6 + (crate-source "inotify" "0.9.6" + "1zxb04c4qccp8wnr3v04l503qpxzxzzzph61amlqbsslq4z9s1pq")) + +(define rust-inotify-sys-0.1.5 + ;; TODO: Check bundled sources. + (crate-source "inotify-sys" "0.1.5" + "1syhjgvkram88my04kv03s0zwa66mdwa5v7ddja3pzwvx2sh4p70")) + +(define rust-insta-1.40.0 + (crate-source "insta" "1.40.0" + "0q5b0ssw8ilj0ni6s2swpd1spv78q5yxp594fxl1i13kg8fa94v5")) + +(define rust-instant-0.1.13 + (crate-source "instant" "0.1.13" + "08h27kzvb5jw74mh0ajv0nv9ggwvgqm8ynjsn2sa9jsks4cjh970")) + +(define rust-io-lifetimes-1.0.11 + (crate-source "io-lifetimes" "1.0.11" + "1hph5lz4wd3drnn6saakwxr497liznpfnv70via6s0v8x6pbkrza")) + +(define rust-is-terminal-0.4.13 + (crate-source "is-terminal" "0.4.13" + "0jwgjjz33kkmnwai3nsdk1pz9vb6gkqvw1d1vq7bs3q48kinh7r6")) + +(define rust-is-terminal-polyfill-1.70.1 + (crate-source "is_terminal_polyfill" "1.70.1" + "1kwfgglh91z33kl0w5i338mfpa3zs0hidq5j4ny4rmjwrikchhvr")) + +(define rust-itertools-0.13.0 + (crate-source "itertools" "0.13.0" + "11hiy3qzl643zcigknclh446qb9zlg4dpdzfkjaa9q9fqpgyfgj1")) + +(define rust-itoa-1.0.11 + (crate-source "itoa" "1.0.11" + "0nv9cqjwzr3q58qz84dcz63ggc54yhf1yqar1m858m1kfd4g3wa9")) + +(define rust-jaq-core-1.5.1 + (crate-source "jaq-core" "1.5.1" + "1m6xq8ldf9n9j3r92lvvalkv71xaxgci3y7xjc9ci14cw2ga1zfn")) + +(define rust-jaq-interpret-1.5.0 + (crate-source "jaq-interpret" "1.5.0" + "0yz1dahd0r6p76mai5n4cqx016z4yn9ia2fi7ngzvwsaqb1mxs9g")) + +(define rust-jaq-parse-1.0.3 + (crate-source "jaq-parse" "1.0.3" + "10pfdpmw5apzx9dckmbldhsk58r6cqyiyn19v6naipbc2k9xfih3")) + +(define rust-jaq-std-1.6.0 + (crate-source "jaq-std" "1.6.0" + "1h8v663wwgv2k40cr4pzmzj69hz0843kfjjr7d1p0fzxg1asbfmz")) + +(define rust-jaq-syn-1.6.0 + (crate-source "jaq-syn" "1.6.0" + "0j1rdmr33fzb4b96n6jg1jvczsby0jpcn7i60i330wcc8bj4z90v")) + +(define rust-js-sys-0.3.70 + ;; TODO: Check bundled sources. + (crate-source "js-sys" "0.3.70" + "0yp3rz7vrn9mmqdpkds426r1p9vs6i8mkxx8ryqdfadr0s2q0s0q")) + +(define rust-keccak-0.1.5 + (crate-source "keccak" "0.1.5" + "0m06swsyd58hvb1z17q6picdwywprf1yf1s6l491zi8r26dazhpc")) + +(define rust-kqueue-1.0.8 + (crate-source "kqueue" "1.0.8" + "033x2knkbv8d3jy6i9r32jcgsq6zm3g97zh5la43amkv3g5g2ivl")) + +(define rust-kqueue-sys-1.0.4 + ;; TODO: Check bundled sources. + (crate-source "kqueue-sys" "1.0.4" + "12w3wi90y4kwis4k9g6fp0kqjdmc6l00j16g8mgbhac7vbzjb5pd")) + +(define rust-lalrpop-0.21.0 + (crate-source "lalrpop" "0.21.0" + "15ypxmqkzfv3340ngvc9g6n78ikpi8b3kpav3y6n446nw8iz6mkf")) + +(define rust-lalrpop-util-0.21.0 + (crate-source "lalrpop-util" "0.21.0" + "1qcg3ph4hkdwd0x7sghgq3fgaiyqfxaha8rml1jjrndsvbswi38h")) + +(define rust-lasso-0.7.3 + (crate-source "lasso" "0.7.3" + "1yz92fy2zv6wslfwwf3j7lw1wxja8d91rrcwgfzv751l1ajys53f")) + +(define rust-lazy-static-1.5.0 + (crate-source "lazy_static" "1.5.0" + "1zk6dqqni0193xg6iijh7i3i44sryglwgvx20spdvwk3r6sbrlmv")) + +(define rust-libc-0.2.159 + (crate-source "libc" "0.2.159" + "1i9xpia0hn1y8dws7all8rqng6h3lc8ymlgslnljcvm376jrf7an")) + +(define rust-libm-0.2.8 + (crate-source "libm" "0.2.8" + "0n4hk1rs8pzw8hdfmwn96c4568s93kfxqgcqswr7sajd2diaihjf")) + +(define rust-libredox-0.1.3 + (crate-source "libredox" "0.1.3" + "139602gzgs0k91zb7dvgj1qh4ynb8g1lbxsswdim18hcb6ykgzy0")) + +(define rust-linked-hash-map-0.5.6 + (crate-source "linked-hash-map" "0.5.6" + "03vpgw7x507g524nx5i1jf5dl8k3kv0fzg8v3ip6qqwbpkqww5q7")) + +(define rust-linux-raw-sys-0.3.8 + ;; TODO: Check bundled sources. + (crate-source "linux-raw-sys" "0.3.8" + "068mbigb3frrxvbi5g61lx25kksy98f2qgkvc4xg8zxznwp98lzg")) + +(define rust-linux-raw-sys-0.4.14 + ;; TODO: Check bundled sources. + (crate-source "linux-raw-sys" "0.4.14" + "12gsjgbhhjwywpqcrizv80vrp7p7grsz5laqq773i33wphjsxcvq")) + +(define rust-lock-api-0.4.12 + (crate-source "lock_api" "0.4.12" + "05qvxa6g27yyva25a5ghsg85apdxkvr77yhkyhapj6r8vnf8pbq7")) + +(define rust-log-0.4.22 + (crate-source "log" "0.4.22" + "093vs0wkm1rgyykk7fjbqp2lwizbixac1w52gv109p5r4jh0p9x7")) + +(define rust-maplit-1.0.2 + (crate-source "maplit" "1.0.2" + "07b5kjnhrrmfhgqm9wprjw8adx6i225lqp49gasgqg74lahnabiy")) + +(define rust-memchr-2.7.4 + (crate-source "memchr" "2.7.4" + "18z32bhxrax0fnjikv475z7ii718hq457qwmaryixfxsl2qrmjkq")) + +(define rust-memoffset-0.7.1 + (crate-source "memoffset" "0.7.1" + "1x2zv8hv9c9bvgmhsjvr9bymqwyxvgbca12cm8xkhpyy5k1r7s2x")) + +(define rust-memoffset-0.9.1 + (crate-source "memoffset" "0.9.1" + "12i17wh9a9plx869g7j4whf62xw68k5zd4k0k5nh6ys5mszid028")) + +(define rust-miniz-oxide-0.8.0 + (crate-source "miniz_oxide" "0.8.0" + "1wadxkg6a6z4lr7kskapj5d8pxlx7cp1ifw4daqnkzqjxych5n72")) + +(define rust-mio-0.8.11 + (crate-source "mio" "0.8.11" + "034byyl0ardml5yliy1hmvx8arkmn9rv479pid794sm07ia519m4")) + +(define rust-mio-1.0.2 + (crate-source "mio" "1.0.2" + "1v1cnnn44awxbcfm4zlavwgkvbyg7gp5zzjm8mqf1apkrwflvq40")) + +(define rust-new-debug-unreachable-1.0.6 + (crate-source "new_debug_unreachable" "1.0.6" + "11phpf1mjxq6khk91yzcbd3ympm78m3ivl7xg6lg2c0lf66fy3k5")) + +(define rust-nix-0.26.4 + (crate-source "nix" "0.26.4" + "06xgl4ybb8pvjrbmc3xggbgk3kbs1j0c4c0nzdfrmpbgrkrym2sr")) + +(define rust-nix-0.29.0 + (crate-source "nix" "0.29.0" + "0ikvn7s9r2lrfdm3mx1h7nbfjvcc6s9vxdzw7j5xfkd2qdnp9qki")) + +(define rust-notify-6.1.1 + (crate-source "notify" "6.1.1" + "0bad98r0ilkhhq2jg3zs11zcqasgbvxia8224wpasm74n65vs1b2")) + +(define rust-ntapi-0.4.1 + (crate-source "ntapi" "0.4.1" + "1r38zhbwdvkis2mzs6671cm1p6djgsl49i7bwxzrvhwicdf8k8z8")) + +(define rust-num-traits-0.2.19 + (crate-source "num-traits" "0.2.19" + "0h984rhdkkqd4ny9cif7y2azl3xdfb7768hb9irhpsch4q3gq787")) + +(define rust-object-0.36.4 + (crate-source "object" "0.36.4" + "02h7k38dwi8rndc3y81n6yjxijbss99p2jm9c0b6ak5c45c1lkq8")) + +(define rust-once-cell-1.19.0 + (crate-source "once_cell" "1.19.0" + "14kvw7px5z96dk4dwdm1r9cqhhy2cyj1l5n5b29mynbb8yr15nrz")) + +(define rust-ordered-stream-0.2.0 + (crate-source "ordered-stream" "0.2.0" + "0l0xxp697q7wiix1gnfn66xsss7fdhfivl2k7bvpjs4i3lgb18ls")) + +(define rust-pango-0.18.3 + (crate-source "pango" "0.18.3" + "1r5ygq7036sv7w32kp8yxr6vgggd54iaavh3yckanmq4xg0px8kw")) + +(define rust-pango-sys-0.18.0 + ;; TODO: Check bundled sources. + (crate-source "pango-sys" "0.18.0" + "1iaxalcaaj59cl9n10svh4g50v8jrc1a36kd7n9yahx8j7ikfrs3")) + +(define rust-parking-2.2.1 + (crate-source "parking" "2.2.1" + "1fnfgmzkfpjd69v4j9x737b1k8pnn054bvzcn5dm3pkgq595d3gk")) + +(define rust-parking-lot-0.12.3 + (crate-source "parking_lot" "0.12.3" + "09ws9g6245iiq8z975h8ycf818a66q3c6zv4b5h8skpm7hc1igzi")) + +(define rust-parking-lot-core-0.9.10 + (crate-source "parking_lot_core" "0.9.10" + "1y3cf9ld9ijf7i4igwzffcn0xl16dxyn4c5bwgjck1dkgabiyh0y")) + +(define rust-parse-zoneinfo-0.3.1 + (crate-source "parse-zoneinfo" "0.3.1" + "093cs8slbd6kyfi6h12isz0mnaayf5ha8szri1xrbqj4inqhaahz")) + +(define rust-petgraph-0.6.5 + (crate-source "petgraph" "0.6.5" + "1ns7mbxidnn2pqahbbjccxkrqkrll2i5rbxx43ns6rh6fn3cridl")) + +(define rust-phf-0.11.2 + (crate-source "phf" "0.11.2" + "1p03rsw66l7naqhpgr1a34r9yzi1gv9jh16g3fsk6wrwyfwdiqmd")) + +(define rust-phf-codegen-0.11.2 + (crate-source "phf_codegen" "0.11.2" + "0nia6h4qfwaypvfch3pnq1nd2qj64dif4a6kai3b7rjrsf49dlz8")) + +(define rust-phf-generator-0.11.2 + (crate-source "phf_generator" "0.11.2" + "1c14pjyxbcpwkdgw109f7581cc5fa3fnkzdq1ikvx7mdq9jcrr28")) + +(define rust-phf-macros-0.11.2 + (crate-source "phf_macros" "0.11.2" + "0js61lc0bhzzrbd9vhpcqp11vvwckdkz3g7k95z5h1k651p68i1l")) + +(define rust-phf-shared-0.10.0 + (crate-source "phf_shared" "0.10.0" + "15n02nc8yqpd8hbxngblar2g53p3nllc93d8s8ih3p5cf7bnlydn")) + +(define rust-phf-shared-0.11.2 + (crate-source "phf_shared" "0.11.2" + "0azphb0a330ypqx3qvyffal5saqnks0xvl8rj73jlk3qxxgbkz4h")) + +(define rust-pico-args-0.5.0 + (crate-source "pico-args" "0.5.0" + "05d30pvxd6zlnkg2i3ilr5a70v3f3z2in18m67z25vinmykngqav")) + +(define rust-pin-project-lite-0.2.14 + (crate-source "pin-project-lite" "0.2.14" + "00nx3f04agwjlsmd3mc5rx5haibj2v8q9b52b0kwn63wcv4nz9mx")) + +(define rust-pin-utils-0.1.0 + (crate-source "pin-utils" "0.1.0" + "117ir7vslsl2z1a7qzhws4pd01cg2d3338c47swjyvqv2n60v1wb")) + +(define rust-piper-0.2.4 + (crate-source "piper" "0.2.4" + "0rn0mjjm0cwagdkay77wgmz3sqf8fqmv9d9czm79mvr2yj8c9j4n")) + +(define rust-pkg-config-0.3.31 + (crate-source "pkg-config" "0.3.31" + "1wk6yp2phl91795ia0lwkr3wl4a9xkrympvhqq8cxk4d75hwhglm")) + +(define rust-polling-2.8.0 + (crate-source "polling" "2.8.0" + "1kixxfq1af1k7gkmmk9yv4j2krpp4fji2r8j4cz6p6d7ihz34bab")) + +(define rust-polling-3.7.3 + (crate-source "polling" "3.7.3" + "04b5zdgz0m9ydbzcr3f9a55749gqbj0y89d0nz9nrv0x636r09yc")) + +(define rust-ppv-lite86-0.2.20 + (crate-source "ppv-lite86" "0.2.20" + "017ax9ssdnpww7nrl1hvqh2lzncpv04nnsibmnw9nxjnaqlpp5bp")) + +(define rust-precomputed-hash-0.1.1 + (crate-source "precomputed-hash" "0.1.1" + "075k9bfy39jhs53cb2fpb9klfakx2glxnf28zdw08ws6lgpq6lwj")) + +(define rust-pretty-assertions-1.4.1 + (crate-source "pretty_assertions" "1.4.1" + "0v8iq35ca4rw3rza5is3wjxwsf88303ivys07anc5yviybi31q9s")) + +(define rust-pretty-env-logger-0.5.0 + (crate-source "pretty_env_logger" "0.5.0" + "076w9dnvcpx6d3mdbkqad8nwnsynb7c8haxmscyrz7g3vga28mw6")) + +(define rust-proc-macro-crate-1.3.1 + (crate-source "proc-macro-crate" "1.3.1" + "069r1k56bvgk0f58dm5swlssfcp79im230affwk6d9ck20g04k3z")) + +(define rust-proc-macro-crate-2.0.2 + (crate-source "proc-macro-crate" "2.0.2" + "092x5acqnic14cw6vacqap5kgknq3jn4c6jij9zi6j85839jc3xh")) + +(define rust-proc-macro-error-1.0.4 + (crate-source "proc-macro-error" "1.0.4" + "1373bhxaf0pagd8zkyd03kkx6bchzf6g0dkwrwzsnal9z47lj9fs")) + +(define rust-proc-macro-error-attr-1.0.4 + (crate-source "proc-macro-error-attr" "1.0.4" + "0sgq6m5jfmasmwwy8x4mjygx5l7kp8s4j60bv25ckv2j1qc41gm1")) + +(define rust-proc-macro2-1.0.86 + (crate-source "proc-macro2" "1.0.86" + "0xrv22p8lqlfdf1w0pj4si8n2ws4aw0kilmziwf0vpv5ys6rwway")) + +(define rust-pure-rust-locales-0.8.1 + (crate-source "pure-rust-locales" "0.8.1" + "0fkkwggiq2053rmiah2h06dz6w3yhy9pa82g30vy3sbcmqcgv40i")) + +(define rust-quick-xml-0.37.1 + (crate-source "quick-xml" "0.37.1" + "00vagwspb7j87v34ybvylphf9isf8bb5zy9fcgcb91rrzyyjjbzj")) + +(define rust-quote-1.0.37 + (crate-source "quote" "1.0.37" + "1brklraw2g34bxy9y4q1nbrccn7bv36ylihv12c9vlcii55x7fdm")) + +(define rust-rand-0.8.5 + (crate-source "rand" "0.8.5" + "013l6931nn7gkc23jz5mm3qdhf93jjf0fg64nz2lp4i51qd8vbrl")) + +(define rust-rand-chacha-0.3.1 + (crate-source "rand_chacha" "0.3.1" + "123x2adin558xbhvqb8w4f6syjsdkmqff8cxwhmjacpsl1ihmhg6")) + +(define rust-rand-core-0.6.4 + (crate-source "rand_core" "0.6.4" + "0b4j2v4cb5krak1pv6kakv4sz6xcwbrmy2zckc32hsigbrwy82zc")) + +(define rust-rayon-1.10.0 + (crate-source "rayon" "1.10.0" + "1ylgnzwgllajalr4v00y4kj22klq2jbwllm70aha232iah0sc65l")) + +(define rust-rayon-core-1.12.1 + (crate-source "rayon-core" "1.12.1" + "1qpwim68ai5h0j7axa8ai8z0payaawv3id0lrgkqmapx7lx8fr8l")) + +(define rust-redox-syscall-0.5.6 + (crate-source "redox_syscall" "0.5.6" + "0fx1c883b6jqw5v5b4cdv1sfm2bnss36w97qscal786krhay8nim")) + +(define rust-redox-users-0.4.6 + (crate-source "redox_users" "0.4.6" + "0hya2cxx6hxmjfxzv9n8rjl5igpychav7zfi1f81pz6i4krry05s")) + +(define rust-ref-cast-1.0.23 + (crate-source "ref-cast" "1.0.23" + "0ca9fi5jsdibaidi2a55y9i1k1q0hvn4f6xlm0fmh7az9pwadw6c")) + +(define rust-ref-cast-impl-1.0.23 + (crate-source "ref-cast-impl" "1.0.23" + "1rpkjlsr99g8nb5ripffz9n9rb3g32dmw83x724l8wykjgkh7hxw")) + +(define rust-regex-1.10.6 + (crate-source "regex" "1.10.6" + "06cnlxwzyqfbw1za1i7ks89ns4i2kr0lpg5ykx56b8v7dd6df6a2")) + +(define rust-regex-automata-0.4.7 + (crate-source "regex-automata" "0.4.7" + "1pwjdi4jckpbaivpl6x4v5g4crb37zr2wac93wlfsbzgqn6gbjiq")) + +(define rust-regex-syntax-0.8.4 + (crate-source "regex-syntax" "0.8.4" + "16r0kjy20vx33dr4mhasj5l1f87czas714x2fz6zl0f8wwxa0rks")) + +(define rust-rustc-demangle-0.1.24 + (crate-source "rustc-demangle" "0.1.24" + "07zysaafgrkzy2rjgwqdj2a8qdpsm6zv6f5pgpk9x0lm40z9b6vi")) + +(define rust-rustc-version-0.4.1 + (crate-source "rustc_version" "0.4.1" + "14lvdsmr5si5qbqzrajgb6vfn69k0sfygrvfvr2mps26xwi3mjyg")) + +(define rust-rustix-0.37.27 + (crate-source "rustix" "0.37.27" + "1lidfswa8wbg358yrrkhfvsw0hzlvl540g4lwqszw09sg8vcma7y")) + +(define rust-rustix-0.38.37 + (crate-source "rustix" "0.38.37" + "04b8f99c2g36gyggf4aphw8742k2b1vls3364n2z493whj5pijwa")) + +(define rust-rustversion-1.0.17 + (crate-source "rustversion" "1.0.17" + "1mm3fckyvb0l2209in1n2k05sws5d9mpkszbnwhq3pkq8apjhpcm")) + +(define rust-ryu-1.0.18 + (crate-source "ryu" "1.0.18" + "17xx2s8j1lln7iackzd9p0sv546vjq71i779gphjq923vjh5pjzk")) + +(define rust-same-file-1.0.6 + (crate-source "same-file" "1.0.6" + "00h5j1w87dmhnvbv9l8bic3y7xxsnjmssvifw2ayvgx9mb1ivz4k")) + +(define rust-scopeguard-1.2.0 + (crate-source "scopeguard" "1.2.0" + "0jcz9sd47zlsgcnm1hdw0664krxwb5gczlif4qngj2aif8vky54l")) + +(define rust-semver-1.0.23 + (crate-source "semver" "1.0.23" + "12wqpxfflclbq4dv8sa6gchdh92ahhwn4ci1ls22wlby3h57wsb1")) + +(define rust-serde-1.0.215 + (crate-source "serde" "1.0.215" + "13xqkw93cw9rnbkm0zy1apnilzq7l2xf1qw8m1nkga8i1fnw24v5")) + +(define rust-serde-derive-1.0.215 + (crate-source "serde_derive" "1.0.215" + "1h2nswy0rmzblil38h12wxsgni1ik63rk22wy19g48v9hrpqc7md")) + +(define rust-serde-json-1.0.128 + (crate-source "serde_json" "1.0.128" + "1n43nia50ybpcfmh3gcw4lcc627qsg9nyakzwgkk9pm10xklbxbg")) + +(define rust-serde-repr-0.1.19 + (crate-source "serde_repr" "0.1.19" + "1sb4cplc33z86pzlx38234xr141wr3cmviqgssiadisgl8dlar3c")) + +(define rust-serde-spanned-0.6.8 + (crate-source "serde_spanned" "0.6.8" + "1q89g70azwi4ybilz5jb8prfpa575165lmrffd49vmcf76qpqq47")) + +(define rust-sha1-0.10.6 + (crate-source "sha1" "0.10.6" + "1fnnxlfg08xhkmwf2ahv634as30l1i3xhlhkvxflmasi5nd85gz3")) + +(define rust-sha3-0.10.8 + (crate-source "sha3" "0.10.8" + "0q5s3qlwnk8d5j34jya98j1v2p3009wdmnqdza3yydwgi8kjv1vm")) + +(define rust-shlex-1.3.0 + (crate-source "shlex" "1.3.0" + "0r1y6bv26c1scpxvhg2cabimrmwgbp4p3wy6syj9n0c4s3q2znhg")) + +(define rust-signal-hook-registry-1.4.2 + (crate-source "signal-hook-registry" "1.4.2" + "1cb5akgq8ajnd5spyn587srvs4n26ryq0p78nswffwhv46sf1sd9")) + +(define rust-similar-2.6.0 + (crate-source "similar" "2.6.0" + "0vk89dx2mmjp81pmszsa1s3mpzvbiy4krvfbq3s3mc3k27wd9q8x")) + +(define rust-simple-signal-1.1.1 + (crate-source "simple-signal" "1.1.1" + "12r82dpipdkkfmslp04pd3b2fpr9h4zxjfs8axynchncmm2dmxsk")) + +(define rust-siphasher-0.3.11 + (crate-source "siphasher" "0.3.11" + "03axamhmwsrmh0psdw3gf7c0zc4fyl5yjxfifz9qfka6yhkqid9q")) + +(define rust-slab-0.4.9 + (crate-source "slab" "0.4.9" + "0rxvsgir0qw5lkycrqgb1cxsvxzjv9bmx73bk5y42svnzfba94lg")) + +(define rust-smallvec-1.13.2 + (crate-source "smallvec" "1.13.2" + "0rsw5samawl3wsw6glrsb127rx6sh89a8wyikicw6dkdcjd1lpiw")) + +(define rust-smart-default-0.7.1 + (crate-source "smart-default" "0.7.1" + "1hgzs1250559bpayxmn46gzas5ycqn39wkf4srjgqh4461k1ic0f")) + +(define rust-socket2-0.4.10 + (crate-source "socket2" "0.4.10" + "03ack54dxhgfifzsj14k7qa3r5c9wqy3v6mqhlim99cc03y1cycz")) + +(define rust-socket2-0.5.7 + (crate-source "socket2" "0.5.7" + "070r941wbq76xpy039an4pyiy3rfj7mp7pvibf1rcri9njq5wc6f")) + +(define rust-static-assertions-1.1.0 + (crate-source "static_assertions" "1.1.0" + "0gsl6xmw10gvn3zs1rv99laj5ig7ylffnh71f9l34js4nr4r7sx2")) + +(define rust-string-cache-0.8.7 + (crate-source "string_cache" "0.8.7" + "0fr90a54ibsrnfjq5la77yjd641g6vqv8f1v3pmpbxa2cbkkh4gr")) + +(define rust-strsim-0.11.1 + (crate-source "strsim" "0.11.1" + "0kzvqlw8hxqb7y598w1s0hxlnmi84sg5vsipp3yg5na5d1rvba3x")) + +(define rust-strum-0.26.3 + (crate-source "strum" "0.26.3" + "01lgl6jvrf4j28v5kmx9bp480ygf1nhvac8b4p7rcj9hxw50zv4g")) + +(define rust-strum-macros-0.26.4 + (crate-source "strum_macros" "0.26.4" + "1gl1wmq24b8md527cpyd5bw9rkbqldd7k1h38kf5ajd2ln2ywssc")) + +(define rust-syn-1.0.109 + (crate-source "syn" "1.0.109" + "0ds2if4600bd59wsv7jjgfkayfzy3hnazs394kz6zdkmna8l3dkj")) + +(define rust-syn-2.0.87 + (crate-source "syn" "2.0.87" + "0bd3mfcswvn4jkrp7ich5kk58kmpph8412yxd36nsfnh8vilrai5")) + +(define rust-sysinfo-0.31.4 + (crate-source "sysinfo" "0.31.4" + "1gm1d4pxwnx4gmh6kwawchv8v8djb7y0a3qvbsq09cwrhx7vwp9m")) + +(define rust-system-deps-6.2.2 + (crate-source "system-deps" "6.2.2" + "0j93ryw031n3h8b0nfpj5xwh3ify636xmv8kxianvlyyipmkbrd3")) + +(define rust-system-deps-7.0.3 + (crate-source "system-deps" "7.0.3" + "01d0fllzpkfybzadyaq1vlx70imzj56dxs4rk9w2f4ikkypkmlk6")) + +(define rust-target-lexicon-0.12.16 + (crate-source "target-lexicon" "0.12.16" + "1cg3bnx1gdkdr5hac1hzxy64fhw4g7dqkd0n3dxy5lfngpr1mi31")) + +(define rust-tempfile-3.12.0 + (crate-source "tempfile" "3.12.0" + "0r3sm3323crr50ranvask8z4qb3x5zfqxs1mrzab1swlqz8cvjq4")) + +(define rust-term-0.7.0 + (crate-source "term" "0.7.0" + "07xzxmg7dbhlirpyfq09v7cfb9gxn0077sqqvszgjvyrjnngi7f5")) + +(define rust-termcolor-1.4.1 + (crate-source "termcolor" "1.4.1" + "0mappjh3fj3p2nmrg4y7qv94rchwi9mzmgmfflr8p2awdj7lyy86")) + +(define rust-thiserror-1.0.64 + (crate-source "thiserror" "1.0.64" + "114s8lmssxl0c2480s671am88vzlasbaikxbvfv8pyqrq6mzh2nm")) + +(define rust-thiserror-impl-1.0.64 + (crate-source "thiserror-impl" "1.0.64" + "1hvzmjx9iamln854l74qyhs0jl2pg3hhqzpqm9p8gszmf9v4x408")) + +(define rust-tokio-1.40.0 + (crate-source "tokio" "1.40.0" + "166rllhfkyqp0fs7sxn6crv74iizi4wzd3cvxkcpmlk52qip1c72")) + +(define rust-tokio-macros-2.4.0 + (crate-source "tokio-macros" "2.4.0" + "0lnpg14h1v3fh2jvnc8cz7cjf0m7z1xgkwfpcyy632g829imjgb9")) + +(define rust-tokio-util-0.7.12 + (crate-source "tokio-util" "0.7.12" + "0spc0g4irbnf2flgag22gfii87avqzibwfm0si0d1g0k9ijw7rv1")) + +(define rust-toml-0.8.2 + (crate-source "toml" "0.8.2" + "0g9ysjaqvm2mv8q85xpqfn7hi710hj24sd56k49wyddvvyq8lp8q")) + +(define rust-toml-datetime-0.6.3 + (crate-source "toml_datetime" "0.6.3" + "0jsy7v8bdvmzsci6imj8fzgd255fmy5fzp6zsri14yrry7i77nkw")) + +(define rust-toml-edit-0.19.15 + (crate-source "toml_edit" "0.19.15" + "08bl7rp5g6jwmfpad9s8jpw8wjrciadpnbaswgywpr9hv9qbfnqv")) + +(define rust-toml-edit-0.20.2 + (crate-source "toml_edit" "0.20.2" + "0f7k5svmxw98fhi28jpcyv7ldr2s3c867pjbji65bdxjpd44svir")) + +(define rust-tracing-0.1.40 + (crate-source "tracing" "0.1.40" + "1vv48dac9zgj9650pg2b4d0j3w6f3x9gbggf43scq5hrlysklln3")) + +(define rust-tracing-attributes-0.1.27 + (crate-source "tracing-attributes" "0.1.27" + "1rvb5dn9z6d0xdj14r403z0af0bbaqhg02hq4jc97g5wds6lqw1l")) + +(define rust-tracing-core-0.1.32 + (crate-source "tracing-core" "0.1.32" + "0m5aglin3cdwxpvbg6kz0r9r0k31j48n0kcfwsp6l49z26k3svf0")) + +(define rust-typenum-1.17.0 + (crate-source "typenum" "1.17.0" + "09dqxv69m9lj9zvv6xw5vxaqx15ps0vxyy5myg33i0kbqvq0pzs2")) + +(define rust-uds-windows-1.1.0 + (crate-source "uds_windows" "1.1.0" + "1fb4y65pw0rsp0gyfyinjazlzxz1f6zv7j4zmb20l5pxwv1ypnl9")) + +(define rust-unescape-0.1.0 + (crate-source "unescape" "0.1.0" + "0vlgws15n4kz8xq4igzr1f80nbiyr838k687hn6ly8a36an7vffc")) + +(define rust-unicode-ident-1.0.13 + (crate-source "unicode-ident" "1.0.13" + "1zm1xylzsdfvm2a5ib9li3g5pp7qnkv4amhspydvgbmd9k6mc6z9")) + +(define rust-unicode-width-0.1.14 + (crate-source "unicode-width" "0.1.14" + "1bzn2zv0gp8xxbxbhifw778a7fc93pa6a1kj24jgg9msj07f7mkx")) + +(define rust-unicode-xid-0.2.6 + (crate-source "unicode-xid" "0.2.6" + "0lzqaky89fq0bcrh6jj6bhlz37scfd8c7dsj5dq7y32if56c1hgb")) + +(define rust-urlencoding-2.1.3 + (crate-source "urlencoding" "2.1.3" + "1nj99jp37k47n0hvaz5fvz7z6jd0sb4ppvfy3nphr1zbnyixpy6s")) + +(define rust-utf8parse-0.2.2 + (crate-source "utf8parse" "0.2.2" + "088807qwjq46azicqwbhlmzwrbkz7l4hpw43sdkdyyk524vdxaq6")) + +(define rust-version-check-0.9.5 + (crate-source "version_check" "0.9.5" + "0nhhi4i5x89gm911azqbn7avs9mdacw2i3vcz3cnmz3mv4rqz4hb")) + +(define rust-version-compare-0.2.0 + (crate-source "version-compare" "0.2.0" + "12y9262fhjm1wp0aj3mwhads7kv0jz8h168nn5fb8b43nwf9abl5")) + +(define rust-wait-timeout-0.2.0 + (crate-source "wait-timeout" "0.2.0" + "1xpkk0j5l9pfmjfh1pi0i89invlavfrd9av5xp0zhxgb29dhy84z")) + +(define rust-waker-fn-1.2.0 + (crate-source "waker-fn" "1.2.0" + "1dvk0qsv88kiq22x8w0qz0k9nyrxxm5a9a9czdwdvvhcvjh12wii")) + +(define rust-walkdir-2.5.0 + (crate-source "walkdir" "2.5.0" + "0jsy7a710qv8gld5957ybrnc07gavppp963gs32xk4ag8130jy99")) + +(define rust-wasi-0.11.0+wasi-snapshot-preview1 + (crate-source "wasi" "0.11.0+wasi-snapshot-preview1" + "08z4hxwkpdpalxjps1ai9y7ihin26y9f476i53dv98v45gkqg3cw")) + +(define rust-wasm-bindgen-0.2.93 + (crate-source "wasm-bindgen" "0.2.93" + "1dfr7pka5kwvky2fx82m9d060p842hc5fyyw8igryikcdb0xybm8")) + +(define rust-wasm-bindgen-backend-0.2.93 + (crate-source "wasm-bindgen-backend" "0.2.93" + "0yypblaf94rdgqs5xw97499xfwgs1096yx026d6h88v563d9dqwx")) + +(define rust-wasm-bindgen-macro-0.2.93 + (crate-source "wasm-bindgen-macro" "0.2.93" + "1kycd1xfx4d9xzqknvzbiqhwb5fzvjqrrn88x692q1vblj8lqp2q")) + +(define rust-wasm-bindgen-macro-support-0.2.93 + (crate-source "wasm-bindgen-macro-support" "0.2.93" + "0dp8w6jmw44srym6l752nkr3hkplyw38a2fxz5f3j1ch9p3l1hxg")) + +(define rust-wasm-bindgen-shared-0.2.93 + (crate-source "wasm-bindgen-shared" "0.2.93" + "1104bny0hv40jfap3hp8jhs0q4ya244qcrvql39i38xlghq0lan6")) + +(define rust-web-time-1.1.0 + (crate-source "web-time" "1.1.0" + "1fx05yqx83dhx628wb70fyy10yjfq1jpl20qfqhdkymi13rq0ras")) + +(define rust-winapi-0.3.9 + (crate-source "winapi" "0.3.9" + "06gl025x418lchw1wxj64ycr7gha83m44cjr5sarhynd9xkrm0sw")) + +(define rust-winapi-i686-pc-windows-gnu-0.4.0 + (crate-source "winapi-i686-pc-windows-gnu" "0.4.0" + "1dmpa6mvcvzz16zg6d5vrfy4bxgg541wxrcip7cnshi06v38ffxc")) + +(define rust-winapi-util-0.1.9 + (crate-source "winapi-util" "0.1.9" + "1fqhkcl9scd230cnfj8apfficpf5c9vhwnk4yy9xfc1sw69iq8ng")) + +(define rust-winapi-x86-64-pc-windows-gnu-0.4.0 + (crate-source "winapi-x86_64-pc-windows-gnu" "0.4.0" + "0gqq64czqb64kskjryj8isp62m2sgvx25yyj3kpc2myh85w24bki")) + +(define rust-windows-0.57.0 + (crate-source "windows" "0.57.0" + "0hqid10bqvxa3pbpgvrh2cilf950lxsd9zqfv3rldc73v2s2qd0j")) + +(define rust-windows-aarch64-gnullvm-0.48.5 + (crate-source "windows_aarch64_gnullvm" "0.48.5" + "1n05v7qblg1ci3i567inc7xrkmywczxrs1z3lj3rkkxw18py6f1b")) + +(define rust-windows-aarch64-gnullvm-0.52.6 + (crate-source "windows_aarch64_gnullvm" "0.52.6" + "1lrcq38cr2arvmz19v32qaggvj8bh1640mdm9c2fr877h0hn591j")) + +(define rust-windows-aarch64-msvc-0.48.5 + (crate-source "windows_aarch64_msvc" "0.48.5" + "1g5l4ry968p73g6bg6jgyvy9lb8fyhcs54067yzxpcpkf44k2dfw")) + +(define rust-windows-aarch64-msvc-0.52.6 + (crate-source "windows_aarch64_msvc" "0.52.6" + "0sfl0nysnz32yyfh773hpi49b1q700ah6y7sacmjbqjjn5xjmv09")) + +(define rust-windows-core-0.52.0 + (crate-source "windows-core" "0.52.0" + "1nc3qv7sy24x0nlnb32f7alzpd6f72l4p24vl65vydbyil669ark")) + +(define rust-windows-core-0.57.0 + (crate-source "windows-core" "0.57.0" + "0bc3jxw2jw76xkk3ddvnp5b2m76qmbzv1qncgvb6qrlhl8wj9vfj")) + +(define rust-windows-i686-gnu-0.48.5 + (crate-source "windows_i686_gnu" "0.48.5" + "0gklnglwd9ilqx7ac3cn8hbhkraqisd0n83jxzf9837nvvkiand7")) + +(define rust-windows-i686-gnu-0.52.6 + (crate-source "windows_i686_gnu" "0.52.6" + "02zspglbykh1jh9pi7gn8g1f97jh1rrccni9ivmrfbl0mgamm6wf")) + +(define rust-windows-i686-gnullvm-0.52.6 + (crate-source "windows_i686_gnullvm" "0.52.6" + "0rpdx1537mw6slcpqa0rm3qixmsb79nbhqy5fsm3q2q9ik9m5vhf")) + +(define rust-windows-i686-msvc-0.48.5 + (crate-source "windows_i686_msvc" "0.48.5" + "01m4rik437dl9rdf0ndnm2syh10hizvq0dajdkv2fjqcywrw4mcg")) + +(define rust-windows-i686-msvc-0.52.6 + (crate-source "windows_i686_msvc" "0.52.6" + "0rkcqmp4zzmfvrrrx01260q3xkpzi6fzi2x2pgdcdry50ny4h294")) + +(define rust-windows-implement-0.57.0 + (crate-source "windows-implement" "0.57.0" + "1mqs7qypclnmx5r8yq5jy3g2d8i27vzag9yzzzxzpdnmb70ds1wi")) + +(define rust-windows-interface-0.57.0 + (crate-source "windows-interface" "0.57.0" + "19zwlzr0q1z9s692681yb5w2lhvwcyx4v95s25hfdkd3isry9gi9")) + +(define rust-windows-link-0.1.1 + (crate-source "windows-link" "0.1.1" + "0f2cq7imbrppsmmnz8899hfhg07cp5gq6rh0bjhb1qb6nwshk13n")) + +(define rust-windows-result-0.1.2 + (crate-source "windows-result" "0.1.2" + "1y274q1v0vy21lhkgslpxpq1m08hvr1mcs2l88h1b1gcx0136f2y")) + +(define rust-windows-sys-0.48.0 + ;; TODO: Check bundled sources. + (crate-source "windows-sys" "0.48.0" + "1aan23v5gs7gya1lc46hqn9mdh8yph3fhxmhxlw36pn6pqc28zb7")) + +(define rust-windows-sys-0.52.0 + ;; TODO: Check bundled sources. + (crate-source "windows-sys" "0.52.0" + "0gd3v4ji88490zgb6b5mq5zgbvwv7zx1ibn8v3x83rwcdbryaar8")) + +(define rust-windows-sys-0.59.0 + ;; TODO: Check bundled sources. + (crate-source "windows-sys" "0.59.0" + "0fw5672ziw8b3zpmnbp9pdv1famk74f1l9fcbc3zsrzdg56vqf0y")) + +(define rust-windows-targets-0.48.5 + (crate-source "windows-targets" "0.48.5" + "034ljxqshifs1lan89xwpcy1hp0lhdh4b5n0d2z4fwjx2piacbws")) + +(define rust-windows-targets-0.52.6 + (crate-source "windows-targets" "0.52.6" + "0wwrx625nwlfp7k93r2rra568gad1mwd888h1jwnl0vfg5r4ywlv")) + +(define rust-windows-x86-64-gnu-0.48.5 + (crate-source "windows_x86_64_gnu" "0.48.5" + "13kiqqcvz2vnyxzydjh73hwgigsdr2z1xpzx313kxll34nyhmm2k")) + +(define rust-windows-x86-64-gnu-0.52.6 + (crate-source "windows_x86_64_gnu" "0.52.6" + "0y0sifqcb56a56mvn7xjgs8g43p33mfqkd8wj1yhrgxzma05qyhl")) + +(define rust-windows-x86-64-gnullvm-0.48.5 + (crate-source "windows_x86_64_gnullvm" "0.48.5" + "1k24810wfbgz8k48c2yknqjmiigmql6kk3knmddkv8k8g1v54yqb")) + +(define rust-windows-x86-64-gnullvm-0.52.6 + (crate-source "windows_x86_64_gnullvm" "0.52.6" + "03gda7zjx1qh8k9nnlgb7m3w3s1xkysg55hkd1wjch8pqhyv5m94")) + +(define rust-windows-x86-64-msvc-0.48.5 + (crate-source "windows_x86_64_msvc" "0.48.5" + "0f4mdp895kkjh9zv8dxvn4pc10xr7839lf5pa9l0193i2pkgr57d")) + +(define rust-windows-x86-64-msvc-0.52.6 + (crate-source "windows_x86_64_msvc" "0.52.6" + "1v7rb5cibyzx8vak29pdrk8nx9hycsjs4w0jgms08qk49jl6v7sq")) + +(define rust-winnow-0.5.40 + (crate-source "winnow" "0.5.40" + "0xk8maai7gyxda673mmw3pj1hdizy5fpi7287vaywykkk19sk4zm")) + +(define rust-x11-2.21.0 + (crate-source "x11" "2.21.0" + "0bnvl09d7044k067gqdx1ln2r0ljp5f4675icwb0216d9i3aabah")) + +(define rust-x11rb-0.13.1 + (crate-source "x11rb" "0.13.1" + "04jyfm0xmc538v09pzsyr2w801yadsgvyl2p0p76hzzffg5gz4ax")) + +(define rust-x11rb-protocol-0.13.1 + (crate-source "x11rb-protocol" "0.13.1" + "0gfbxf2k7kbk577j3rjhfx7hm70kmwln6da7xyc4l2za0d2pq47c")) + +(define rust-xdg-home-1.3.0 + (crate-source "xdg-home" "1.3.0" + "1xm122zz0wjc8p8cmchij0j9nw34hwncb39jc7dc0mgvb2rdl77c")) + +(define rust-yansi-1.0.1 + (crate-source "yansi" "1.0.1" + "0jdh55jyv0dpd38ij4qh60zglbw9aa8wafqai6m0wa7xaxk3mrfg")) + +(define rust-zbus-3.15.2 + (crate-source "zbus" "3.15.2" + "1ri5gklhh3kl9gywym95679xs7n3sw2j3ky80jcd8siacc5ifpb7")) + +(define rust-zbus-macros-3.15.2 + (crate-source "zbus_macros" "3.15.2" + "19g0d7d4b8l8ycw498sz8pwkplv300j31i9hnihq0zl81xxljcbi")) + +(define rust-zbus-names-2.6.1 + (crate-source "zbus_names" "2.6.1" + "13achs6jbrp4l0jy5m6nn7v89clfgb63qhldkg5ddgjh6y6p6za3")) + +(define rust-zerocopy-0.7.35 + (crate-source "zerocopy" "0.7.35" + "1w36q7b9il2flg0qskapgi9ymgg7p985vniqd09vi0mwib8lz6qv")) + +(define rust-zerocopy-derive-0.7.35 + (crate-source "zerocopy-derive" "0.7.35" + "0gnf2ap2y92nwdalzz3x7142f2b83sni66l39vxp2ijd6j080kzs")) + +(define rust-zvariant-3.15.2 + (crate-source "zvariant" "3.15.2" + "1nxj9x187jl32fd32zvq8hfn6lyq3kjadb2q7f6kb6x0igl2pvsf")) + +(define rust-zvariant-derive-3.15.2 + (crate-source "zvariant_derive" "3.15.2" + "1nbydrkawjwxan12vy79qsrn7gwc483mpfzqs685ybyppv04vhip")) + +(define rust-zvariant-utils-1.0.1 + (crate-source "zvariant_utils" "1.0.1" + "00625h3240rixvfhq6yhws1d4bwf3vrf74v8s69b97aq27cg0d3j")) + +(define-cargo-inputs lookup-cargo-inputs + (eww => + (list rust-addr2line-0.24.1 + rust-adler2-2.0.0 + rust-ahash-0.8.11 + rust-aho-corasick-1.1.3 + rust-allocator-api2-0.2.18 + rust-android-tzdata-0.1.1 + rust-android-system-properties-0.1.5 + rust-anstream-0.6.15 + rust-anstyle-1.0.8 + rust-anstyle-parse-0.2.5 + rust-anstyle-query-1.1.1 + rust-anstyle-wincon-3.0.4 + rust-anyhow-1.0.89 + rust-ascii-canvas-3.0.0 + rust-async-broadcast-0.5.1 + rust-async-channel-2.3.1 + rust-async-io-1.13.0 + rust-async-io-2.3.4 + rust-async-lock-2.8.0 + rust-async-lock-3.4.0 + rust-async-process-1.8.1 + rust-async-recursion-1.1.1 + rust-async-signal-0.2.10 + rust-async-task-4.7.1 + rust-async-trait-0.1.83 + rust-atk-0.18.0 + rust-atk-sys-0.18.0 + rust-atomic-waker-1.1.2 + rust-autocfg-1.4.0 + rust-backtrace-0.3.74 + rust-base64-0.22.1 + rust-bincode-1.3.3 + rust-bit-set-0.6.0 + rust-bit-vec-0.7.0 + rust-bitflags-1.3.2 + rust-bitflags-2.6.0 + rust-block-buffer-0.10.4 + rust-blocking-1.6.1 + rust-bumpalo-3.16.0 + rust-byteorder-1.5.0 + rust-bytes-1.7.2 + rust-bytesize-2.0.1 + rust-cached-0.53.1 + rust-cached-proc-macro-0.23.0 + rust-cached-proc-macro-types-0.1.1 + rust-cairo-rs-0.18.5 + rust-cairo-sys-rs-0.18.2 + rust-cc-1.1.22 + rust-cfg-expr-0.15.8 + rust-cfg-expr-0.17.0 + rust-cfg-if-1.0.0 + rust-cfg-aliases-0.2.1 + rust-chrono-0.4.41 + rust-chrono-tz-0.10.0 + rust-chrono-tz-build-0.4.0 + rust-chumsky-0.9.3 + rust-clap-4.5.18 + rust-clap-builder-4.5.18 + rust-clap-complete-4.5.29 + rust-clap-derive-4.5.18 + rust-clap-lex-0.7.2 + rust-codemap-0.1.3 + rust-codespan-reporting-0.11.1 + rust-colorchoice-1.0.2 + rust-concurrent-queue-2.5.0 + rust-console-0.15.8 + rust-core-foundation-sys-0.8.7 + rust-cpufeatures-0.2.14 + rust-crossbeam-channel-0.5.13 + rust-crossbeam-deque-0.8.5 + rust-crossbeam-epoch-0.9.18 + rust-crossbeam-utils-0.8.20 + rust-crypto-common-0.1.6 + rust-darling-0.20.10 + rust-darling-core-0.20.10 + rust-darling-macro-0.20.10 + rust-dbusmenu-glib-0.1.0 + rust-dbusmenu-glib-sys-0.1.0 + rust-dbusmenu-gtk3-0.1.0 + rust-dbusmenu-gtk3-sys-0.1.0 + rust-derivative-2.2.0 + rust-derive-more-1.0.0 + rust-derive-more-impl-1.0.0 + rust-diff-0.1.13 + rust-digest-0.10.7 + rust-dirs-next-2.0.0 + rust-dirs-sys-next-0.1.2 + rust-dyn-clone-1.0.17 + rust-either-1.13.0 + rust-ena-0.14.3 + rust-encode-unicode-0.3.6 + rust-enumflags2-0.7.10 + rust-enumflags2-derive-0.7.10 + rust-env-logger-0.10.2 + rust-equivalent-1.0.1 + rust-errno-0.3.9 + rust-event-listener-2.5.3 + rust-event-listener-3.1.0 + rust-event-listener-5.3.1 + rust-event-listener-strategy-0.5.2 + rust-extend-1.2.0 + rust-fastrand-1.9.0 + rust-fastrand-2.1.1 + rust-field-offset-0.3.6 + rust-filetime-0.2.25 + rust-fixedbitset-0.4.2 + rust-fnv-1.0.7 + rust-fsevent-sys-4.1.0 + rust-futures-0.3.30 + rust-futures-channel-0.3.30 + rust-futures-core-0.3.30 + rust-futures-executor-0.3.30 + rust-futures-io-0.3.30 + rust-futures-lite-1.13.0 + rust-futures-lite-2.3.0 + rust-futures-macro-0.3.30 + rust-futures-sink-0.3.30 + rust-futures-task-0.3.30 + rust-futures-util-0.3.30 + rust-gdk-0.18.0 + rust-gdk-pixbuf-0.18.5 + rust-gdk-pixbuf-sys-0.18.0 + rust-gdk-sys-0.18.0 + rust-gdkx11-0.18.0 + rust-gdkx11-sys-0.18.0 + rust-generic-array-0.14.7 + rust-gethostname-0.4.3 + rust-getrandom-0.2.15 + rust-gimli-0.31.0 + rust-gio-0.18.4 + rust-gio-sys-0.18.1 + rust-glib-0.18.5 + rust-glib-macros-0.18.5 + rust-glib-sys-0.18.1 + rust-gobject-sys-0.18.0 + rust-grass-0.13.4 + rust-grass-compiler-0.13.4 + rust-gtk-0.18.1 + rust-gtk-layer-shell-0.8.1 + rust-gtk-layer-shell-sys-0.7.1 + rust-gtk-sys-0.18.0 + rust-gtk3-macros-0.18.0 + rust-hashbrown-0.14.5 + rust-heck-0.4.1 + rust-heck-0.5.0 + rust-hermit-abi-0.3.9 + rust-hermit-abi-0.4.0 + rust-hex-0.4.3 + rust-hifijson-0.2.2 + rust-humantime-2.1.0 + rust-iana-time-zone-0.1.61 + rust-iana-time-zone-haiku-0.1.2 + rust-ident-case-1.0.1 + rust-indexmap-2.5.0 + rust-inotify-0.9.6 + rust-inotify-sys-0.1.5 + rust-insta-1.40.0 + rust-instant-0.1.13 + rust-io-lifetimes-1.0.11 + rust-is-terminal-0.4.13 + rust-is-terminal-polyfill-1.70.1 + rust-itertools-0.13.0 + rust-itoa-1.0.11 + rust-jaq-core-1.5.1 + rust-jaq-interpret-1.5.0 + rust-jaq-parse-1.0.3 + rust-jaq-std-1.6.0 + rust-jaq-syn-1.6.0 + rust-js-sys-0.3.70 + rust-keccak-0.1.5 + rust-kqueue-1.0.8 + rust-kqueue-sys-1.0.4 + rust-lalrpop-0.21.0 + rust-lalrpop-util-0.21.0 + rust-lasso-0.7.3 + rust-lazy-static-1.5.0 + rust-libc-0.2.159 + rust-libm-0.2.8 + rust-libredox-0.1.3 + rust-linked-hash-map-0.5.6 + rust-linux-raw-sys-0.3.8 + rust-linux-raw-sys-0.4.14 + rust-lock-api-0.4.12 + rust-log-0.4.22 + rust-maplit-1.0.2 + rust-memchr-2.7.4 + rust-memoffset-0.7.1 + rust-memoffset-0.9.1 + rust-miniz-oxide-0.8.0 + rust-mio-0.8.11 + rust-mio-1.0.2 + rust-new-debug-unreachable-1.0.6 + rust-nix-0.26.4 + rust-nix-0.29.0 + rust-notify-6.1.1 + rust-ntapi-0.4.1 + rust-num-traits-0.2.19 + rust-object-0.36.4 + rust-once-cell-1.19.0 + rust-ordered-stream-0.2.0 + rust-pango-0.18.3 + rust-pango-sys-0.18.0 + rust-parking-2.2.1 + rust-parking-lot-0.12.3 + rust-parking-lot-core-0.9.10 + rust-parse-zoneinfo-0.3.1 + rust-petgraph-0.6.5 + rust-phf-0.11.2 + rust-phf-codegen-0.11.2 + rust-phf-generator-0.11.2 + rust-phf-macros-0.11.2 + rust-phf-shared-0.10.0 + rust-phf-shared-0.11.2 + rust-pico-args-0.5.0 + rust-pin-project-lite-0.2.14 + rust-pin-utils-0.1.0 + rust-piper-0.2.4 + rust-pkg-config-0.3.31 + rust-polling-2.8.0 + rust-polling-3.7.3 + rust-ppv-lite86-0.2.20 + rust-precomputed-hash-0.1.1 + rust-pretty-assertions-1.4.1 + rust-pretty-env-logger-0.5.0 + rust-proc-macro-crate-1.3.1 + rust-proc-macro-crate-2.0.2 + rust-proc-macro-error-1.0.4 + rust-proc-macro-error-attr-1.0.4 + rust-proc-macro2-1.0.86 + rust-pure-rust-locales-0.8.1 + rust-quick-xml-0.37.1 + rust-quote-1.0.37 + rust-rand-0.8.5 + rust-rand-chacha-0.3.1 + rust-rand-core-0.6.4 + rust-rayon-1.10.0 + rust-rayon-core-1.12.1 + rust-redox-syscall-0.5.6 + rust-redox-users-0.4.6 + rust-ref-cast-1.0.23 + rust-ref-cast-impl-1.0.23 + rust-regex-1.10.6 + rust-regex-automata-0.4.7 + rust-regex-syntax-0.8.4 + rust-rustc-demangle-0.1.24 + rust-rustc-version-0.4.1 + rust-rustix-0.37.27 + rust-rustix-0.38.37 + rust-rustversion-1.0.17 + rust-ryu-1.0.18 + rust-same-file-1.0.6 + rust-scopeguard-1.2.0 + rust-semver-1.0.23 + rust-serde-1.0.215 + rust-serde-derive-1.0.215 + rust-serde-json-1.0.128 + rust-serde-repr-0.1.19 + rust-serde-spanned-0.6.8 + rust-sha1-0.10.6 + rust-sha3-0.10.8 + rust-shlex-1.3.0 + rust-signal-hook-registry-1.4.2 + rust-similar-2.6.0 + rust-simple-signal-1.1.1 + rust-siphasher-0.3.11 + rust-slab-0.4.9 + rust-smallvec-1.13.2 + rust-smart-default-0.7.1 + rust-socket2-0.4.10 + rust-socket2-0.5.7 + rust-static-assertions-1.1.0 + rust-string-cache-0.8.7 + rust-strsim-0.11.1 + rust-strum-0.26.3 + rust-strum-macros-0.26.4 + rust-syn-1.0.109 + rust-syn-2.0.87 + rust-sysinfo-0.31.4 + rust-system-deps-6.2.2 + rust-system-deps-7.0.3 + rust-target-lexicon-0.12.16 + rust-tempfile-3.12.0 + rust-term-0.7.0 + rust-termcolor-1.4.1 + rust-thiserror-1.0.64 + rust-thiserror-impl-1.0.64 + rust-tokio-1.40.0 + rust-tokio-macros-2.4.0 + rust-tokio-util-0.7.12 + rust-toml-0.8.2 + rust-toml-datetime-0.6.3 + rust-toml-edit-0.19.15 + rust-toml-edit-0.20.2 + rust-tracing-0.1.40 + rust-tracing-attributes-0.1.27 + rust-tracing-core-0.1.32 + rust-typenum-1.17.0 + rust-uds-windows-1.1.0 + rust-unescape-0.1.0 + rust-unicode-ident-1.0.13 + rust-unicode-width-0.1.14 + rust-unicode-xid-0.2.6 + rust-urlencoding-2.1.3 + rust-utf8parse-0.2.2 + rust-version-compare-0.2.0 + rust-version-check-0.9.5 + rust-wait-timeout-0.2.0 + rust-waker-fn-1.2.0 + rust-walkdir-2.5.0 + rust-wasi-0.11.0+wasi-snapshot-preview1 + rust-wasm-bindgen-0.2.93 + rust-wasm-bindgen-backend-0.2.93 + rust-wasm-bindgen-macro-0.2.93 + rust-wasm-bindgen-macro-support-0.2.93 + rust-wasm-bindgen-shared-0.2.93 + rust-web-time-1.1.0 + rust-winapi-0.3.9 + rust-winapi-i686-pc-windows-gnu-0.4.0 + rust-winapi-util-0.1.9 + rust-winapi-x86-64-pc-windows-gnu-0.4.0 + rust-windows-0.57.0 + rust-windows-core-0.52.0 + rust-windows-core-0.57.0 + rust-windows-implement-0.57.0 + rust-windows-interface-0.57.0 + rust-windows-link-0.1.1 + rust-windows-result-0.1.2 + rust-windows-sys-0.48.0 + rust-windows-sys-0.52.0 + rust-windows-sys-0.59.0 + rust-windows-targets-0.48.5 + rust-windows-targets-0.52.6 + rust-windows-aarch64-gnullvm-0.48.5 + rust-windows-aarch64-gnullvm-0.52.6 + rust-windows-aarch64-msvc-0.48.5 + rust-windows-aarch64-msvc-0.52.6 + rust-windows-i686-gnu-0.48.5 + rust-windows-i686-gnu-0.52.6 + rust-windows-i686-gnullvm-0.52.6 + rust-windows-i686-msvc-0.48.5 + rust-windows-i686-msvc-0.52.6 + rust-windows-x86-64-gnu-0.48.5 + rust-windows-x86-64-gnu-0.52.6 + rust-windows-x86-64-gnullvm-0.48.5 + rust-windows-x86-64-gnullvm-0.52.6 + rust-windows-x86-64-msvc-0.48.5 + rust-windows-x86-64-msvc-0.52.6 + rust-winnow-0.5.40 + rust-x11-2.21.0 + rust-x11rb-0.13.1 + rust-x11rb-protocol-0.13.1 + rust-xdg-home-1.3.0 + rust-yansi-1.0.1 + rust-zbus-3.15.2 + rust-zbus-macros-3.15.2 + rust-zbus-names-2.6.1 + rust-zerocopy-0.7.35 + rust-zerocopy-derive-0.7.35 + rust-zvariant-3.15.2 + rust-zvariant-derive-3.15.2 + rust-zvariant-utils-1.0.1))) diff --git a/mt/packages/version-control.scm b/mt/packages/version-control.scm @@ -0,0 +1,12 @@ +(define-module (mt packages version-control) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module ((gnu packages version-control) #:prefix gnu:)) + +(define-public stagit + (package + (inherit gnu:stagit) + (source (origin + (inherit (package-source gnu:stagit)) + (patches (list + (local-file "patches/stagit.diff"))))))) diff --git a/mt/scripts.scm b/mt/scripts.scm @@ -0,0 +1,47 @@ +(define-module (mt scripts) + #:use-module (gnu packages shells) + #:use-module (guix build-system trivial) + #:use-module (guix gexp) + #:use-module (guix packages) + #:export (mt-scripts)) + +(define dash-w-sh-symlink + (package + (inherit dash) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'install 'install-sh-symlink + (lambda* (#:key outputs #:allow-other-keys) + ;; Add a `sh' -> `dash' link. + (let ((out (assoc-ref outputs "out"))) + (with-directory-excursion (string-append out "/bin") + (symlink "dash" "sh") + #t))))))))) + +(define mt-scripts + (package + (name "mt-scripts") + (version "0.1") + (source (local-file "scripts" #:recursive? #t)) + (build-system trivial-build-system) + (arguments + `(#:modules ((guix build utils)) + #:builder + (begin + (use-modules (guix build utils)) + (let* ((bin-dir (string-append %output "/bin")) + (dash-bin (string-append (assoc-ref %build-inputs "dash") + "/bin")) + (copy-script (lambda (file dest) + (copy-file file dest) + (patch-shebang dest (list dash-bin)) + (chmod dest #o555)))) + (mkdir-p bin-dir) + (copy-recursively (assoc-ref %build-inputs "source") bin-dir + #:copy-file copy-script))))) + (inputs `(("dash" ,dash-w-sh-symlink))) + (home-page #f) + (synopsis "MonasTech shell scripts") + (description #f) + (license #f))) diff --git a/mt/scripts/mt-update b/mt/scripts/mt-update @@ -0,0 +1,151 @@ +#!/bin/sh +CLIENT="" +if [ -f "/etc/mt-client" ]; then + CLIENT=$(cat /etc/mt-client) +elif [ -n "$1" ]; then + CLIENT="$1" +else + CLIENT="$USER" +fi + +if [ -z "$CLIENT" ]; then + echo "No client?" + exit +fi + +DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/mt-update" +REPO_DIR="$DATA_DIR/$CLIENT" +CHANNEL_DIR="$DATA_DIR/channel" + +# Note that this script assumes the presence of +# 1) coreutils (duh) +# 2) notify-send +# 3) git +# 4) guix (also duh) + +mkdir -p "$DATA_DIR" + +NID=$(notify-send -t 0 -p "Checking for updates...") +NOTIF="notify-send -t 0 -r $NID" + +# +# Update channel +# + +CCOMMIT_A=$(git -C "$CHANNEL_DIR" rev-parse HEAD) +echo channel commit a $CCOMMIT_A + +if [ -d "$CHANNEL_DIR/.git" ]; then + git -C "$CHANNEL_DIR" pull +else + git clone "git@monastech.xyz:channel" "$CHANNEL_DIR" +fi + +CCOMMIT_B=$(git -C "$CHANNEL_DIR" rev-parse HEAD) +echo channel commit b $CCOMMIT_B + +# +# Update guix +# + +# This might seem arbitrary, but the channels in channels.scm are pinned to +# specific commits that are only updated once a specific version is deemed +# stable enough to be used by veryone. This should happen roughly once a month. + +PULLED="" +UPDATED_CHANNEL="" + +if [ "$CCOMMIT_A" != "$CCOMMIT_B" ]; then + UPDATED_CHANNEL="yes" + + # This doesn't seem to work properly. It's updated every time the channel is. + if [ -z "$CCOMMIT_A" ] \ + || { ! git -C "$CHANNEL_DIR" diff --quiet --exit-code "$CCOMMIT_A" "$CCOMMIT_B" mt/channels.scm; } + then + + $NOTIF "Updating channels..." \ + "This might take a few minutes." + + if guix pull -C "${CHANNEL_DIR}/mt/channels.scm"; then + notify-send -t 0 \ + "Channels updated!" \ + "Both home and system environments will be updated." + PULLED="yes" + else + notify-send -u critical -t 0 \ + "Failed to update channels!" + fi + fi +fi + +$NOTIF "Checking for updates..." + +COMMIT_A=$(git -C "$REPO_DIR" rev-parse HEAD) +echo commit a $COMMIT_A + +# +# Update configuration +# + +if [ -d "$REPO_DIR/.git" ]; then + git -C "$REPO_DIR" pull +else + git clone "git@monastech.xyz:$CLIENT" "$REPO_DIR" +fi + +COMMIT_B=$(git -C "$REPO_DIR" rev-parse HEAD) +echo commit b $COMMIT_B + +if [ "$COMMIT_A" != "$COMMIT_B" ] \ + || [ -n "$UPDATED_CHANNEL" ] +then + UPDATE_FAILED= + + if [ -z "$COMMIT_A" ] \ + || { ! git -C "$REPO_DIR" diff --quiet --exit-code "$COMMIT_A" "$COMMIT_B" home/; } \ + || [ -n "$PULLED" ] \ + || [ -n "$UPDATED_CHANNEL" ] + then + $NOTIF "Updating home environment..." + + if guix home -L "$CHANNEL_DIR" -L "$REPO_DIR" reconfigure "${REPO_DIR}/home/${USER}.scm"; then + notify-send -t 0 \ + "Updated home environment!" \ + "After all updates are complete, log out and log back in." + else + notify-send -u critical -t 0 \ + "Failed to build home environment!" + UPDATE_FAILED="yes" + fi + fi + + if [ -z "$COMMIT_A" ] \ + || { ! git -C "$REPO_DIR" diff --quiet --exit-code "$COMMIT_A" "$COMMIT_B" system/; } \ + || [ -n "$PULLED" ] \ + || [ -n "$UPDATED_CHANNEL" ] + then + $NOTIF "Updating system environment..." + + if pkexec guix system -L "$CHANNEL_DIR" -L "$REPO_DIR" reconfigure "${REPO_DIR}/system/$(cat /etc/hostname)".scm; then + notify-send -t 0 \ + "Updated system environment!" \ + "After all updates are complete, please restart the machine." + else + notify-send -u critical -t 0 \ + "Failed to update system environment!" + UPDATE_FAILED="yes" + fi + fi + + if [ -n "$UPDATE_FAILED" ]; then + echo "Resetting commits" + # Go back to the commit from before updates were attempted + git reset -C "$REPO_DIR" reset "$CCOMMIT_A" --hard + git reset -C "$REPO_DIR" reset "$COMMIT_A" --hard + fi + + $NOTIF "All updates are complete!" +else + $NOTIF "No updates are available." +fi + diff --git a/mt/services.scm b/mt/services.scm @@ -0,0 +1,176 @@ +(define-module (mt services) + #:use-module (srfi srfi-1) + #:use-module (guix gexp) + #:use-module (gnu packages admin) + #:use-module (gnu packages libusb) + #:use-module (gnu packages linux) + #:use-module (gnu packages nfs) + #:use-module (gnu services) + #:use-module (gnu services avahi) + #:use-module (gnu services base) + #:use-module (gnu services dbus) + #:use-module (gnu services desktop) + #:use-module (gnu services networking) + #:use-module (gnu services sound) + #:use-module (gnu services ssh) + #:use-module (gnu system) + #:use-module (gnu system privilege) + #:use-module (mt channels) + #:export (etc-mt-client-service + tuigreet-login-manager + greetd-helper-service + mt-base-services + %mt-bishop-services + %mt-clergy-services + %mt-laity-services + %mt-desktop-services)) + +(define (etc-mt-client-service client) + (simple-service 'etc-mt-client + etc-service-type + (list + `("mt-client" + ,(plain-file "mt-client" client))))) + +;; Generate a login manager script based on tuigreet +(define* (tuigreet-login-manager + #:key (args '("--time" + "--user-menu" + "--window-padding" "1" + "--asterisks" + "--remember" + "--remember-user-session")) + ;; TODO: Fix atrocious light mode + (colors (list "FFFCF0" "F2F0E5" + "AF3029" "D14D41" + "66800B" "879A39" + "AD8301" "D0A215" + "205EA6" "4385BE" + "A02F6F" "CE5D97" + "24837B" "3AA99F" + "100F0F" "6F6E69"))) + (let ((tuigreet-bin (file-append tuigreet "/bin/tuigreet")) + (setfont-bin (file-append kbd "/bin/setfont")) + (color-codes (list "P0" "P8" "P1" "P9" "P2" "PA" "P3" "PB" + "P4" "PC" "P5" "PD" "P6" "PE" "P7" "PF"))) + (program-file + "tuigreet-wrapper" + #~(begin + ;; TODO: Take font as argument + (system* #$setfont-bin "-d" "alt-8x8") + ;; Set TTY colors + (for-each (lambda (color-code color) + (display #\esc) + (display "]") + (display color-code) + (display color)) + '#$color-codes + '#$colors) + ;; Switch current process to tuigreet + (execl #$tuigreet-bin #$tuigreet-bin + #$@args))))) + + +;; Generate a greetd service +(define* (greetd-helper-service #:key (login-manager (tuigreet-login-manager))) + (service greetd-service-type + (greetd-configuration + (terminals + (list + (greetd-terminal-configuration (terminal-vt "1")) + (greetd-terminal-configuration (terminal-vt "2")) + (greetd-terminal-configuration (terminal-vt "3")) + (greetd-terminal-configuration (terminal-vt "4")) + (greetd-terminal-configuration (terminal-vt "5")) + (greetd-terminal-configuration (terminal-vt "6")) + (greetd-terminal-configuration + (terminal-vt "7") + (terminal-switch #t) + (default-session-command login-manager))))))) + +(define* (mt-base-services #:key (discover? #f)) + (append + (list + (service openssh-service-type + (openssh-configuration + (password-authentication? #f)))) + (modify-services %base-services + (guix-service-type + config => (guix-configuration + (inherit config) + (channels %mt-channels) + (discover? discover?) + (substitute-urls %mt-substitute-urls) + (authorized-keys %mt-authorized-guix-keys))) + (delete login-service-type) + (delete agetty-service-type) + (delete mingetty-service-type) + (delete console-font-service-type)))) + +;; Provide substitutes for all machines and perform build farm capabilities +;; TODO: Add anti-spam measures +;; TODO: Add build farm capabilities +;; TODO: +(define %mt-bishop-services + (append + (list + ;; Serial support + (service agetty-service-type (agetty-configuration (tty #f))) + ;; Ethernet-only internet + (service dhcpcd-service-type) + ;; Required by guix-publish + (service avahi-service-type) + ;; Host a substitute server on locahost. + ;; Each server should ideally serve this from a subdomain. + (service guix-publish-service-type + (guix-publish-configuration + (port 8080)))) + (mt-base-services))) + +(define %mt-clergy-services + (append + (list + ;; Host a local substitute server + (service guix-publish-service-type + (guix-publish-configuration + (host "0.0.0.0") + (advertise? #t)))) + (mt-base-services))) + +(define %mt-laity-services + (mt-base-services #:discover? #t)) + +;; These are basic services that will generally be used by all user systems. It +;; should contain everything necessary to begin building a basic desktop setup. +;; Essentially, these are all the "standard" services that you wouldn't need on +;; a server. +;; TODO: Add printer-related services +(define %mt-desktop-services + (list + ;; Essential + (service dbus-root-service-type) + (service elogind-service-type) + (service polkit-service-type) + polkit-wheel-service + (service avahi-service-type) ;; Used by guix-daemon + (service ntp-service-type) + + ;; Complimentary + fontconfig-file-system-service + (service udisks-service-type) + (service upower-service-type) ;; TODO: Make optional + + ;; Networking + (service network-manager-service-type) + (service wpa-supplicant-service-type) + (service usb-modeswitch-service-type) + + ;; Audio + (service pulseaudio-service-type) + (service alsa-service-type))) + +;; TODO: Create automatic update services +;; This would be for laity and clergy machines. It would basically check for +;; configuration / channel updates daily and notify users that updates are +;; available. They will not be forced to update. It would also prompt monthly to +;; perform a guix update. diff --git a/mt/services/labwc.scm b/mt/services/labwc.scm @@ -0,0 +1,94 @@ +(define-module (mt services labwc) + #:use-module (gnu home services) + #:use-module (guix gexp) + #:use-module (guix records) + #:export (home-labwc-configuration + home-labwc-configuration? + home-labwc-service-type)) + +;; TODO: Themerc generation + +(define-record-type* <home-labwc-configuration> + home-labwc-configuration + make-home-labwc-configuration + home-labwc-configuration? + ;; Labwc rc configurations in SXML + (rc home-labwc-configuration-rc + (default '())) + ;; Labwc menu configurations in SXML + (menu home-labwc-configuration-menu + (default '())) + ;; Either a list of strings containing commands or a file-like object + (autostart home-labwc-configuration-autostart + (default '())) + ;; Packages that will be used specifically by labwc to create the environment + (packages home-labwc-configuration-packages + (default '()))) + +(define (make-labwc-rc-file config) + (computed-file + "rc.xml" + #~(begin + (use-modules (sxml simple)) + (call-with-output-file #$output + (lambda (port) + (sxml->xml + '(*TOP* + (labwc_config + #$@config)) + port)))))) + +(define (make-labwc-menu-file config) + (computed-file + "menu.xml" + #~(begin + (use-modules (sxml simple)) + (call-with-output-file #$output + (lambda (port) + (sxml->xml + '(*TOP* + (openbox_menu + #$@config)) + port)))))) + +(define (make-labwc-autostart-file commands) + (computed-file + "autostart" + #~(begin + (call-with-output-file #$output + (lambda (port) + (for-each + (lambda (command) + (display command port) + (display ">/dev/null 2>&1 &" port) + (newline port)) + (list #$@commands))))))) + +(define (labwc-configuration-files cfg) + `(("labwc/rc.xml" ,(make-labwc-rc-file + (home-labwc-configuration-rc cfg))) + ("labwc/menu.xml" ,(make-labwc-menu-file + (home-labwc-configuration-menu cfg))) + ;; Use the provided autostart if it is a file-like object + ;; Othwerwise, generate one from the given list + ("labwc/autostart" ,(let ((autostart (home-labwc-configuration-autostart cfg))) + (if (file-like? autostart) + autostart + (make-labwc-autostart-file autostart)))))) + +(define (labwc-profile cfg) + (home-labwc-configuration-packages cfg)) + +;; TODO: Support simple autostart via list + +(define home-labwc-service-type + (service-type + (name 'home-labwc) + (extensions + (list (service-extension home-xdg-configuration-files-service-type + labwc-configuration-files) + (service-extension home-profile-service-type + labwc-profile))) + (description + "Setup configuration for labwc"))) + diff --git a/mt/services/version-control.scm b/mt/services/version-control.scm @@ -0,0 +1,247 @@ +(define-module (mt services version-control) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services shepherd) + #:use-module ((gnu services version-control) #:prefix gnu:) + #:use-module (gnu services web) + #:use-module (gnu system shadow) + #:use-module ((gnu packages version-control) #:select (git)) + #:use-module (gnu packages admin) + #:use-module (guix deprecation) + #:use-module (guix records) + #:use-module (guix gexp) + #:use-module (guix store) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (ice-9 format) + #:use-module (ice-9 match) + #:use-module (mt packages version-control) + #:export (git-daemon-service + git-daemon-service-type + git-daemon-configuration + git-daemon-configuration? + stagit-services + stagit-configuration + stagit-configuration?)) + +;;; Commentary: +;;; +;;; Version Control related services. +;;; +;;; Code: + + +;;; +;;; Git daemon. +;;; + +(define-record-type* <git-daemon-configuration> + git-daemon-configuration + make-git-daemon-configuration + git-daemon-configuration? + (package git-daemon-configuration-package ;file-like + (default git)) + (export-all? git-daemon-configuration-export-all ;boolean + (default #f)) + (base-path git-daemon-configuration-base-path ;string | #f + (default "/srv/git")) + (user-path git-daemon-configuration-user-path ;string | #f + (default #f)) + (listen git-daemon-configuration-listen ;list of string + (default '())) + (port git-daemon-configuration-port ;number | #f + (default #f)) + (whitelist git-daemon-configuration-whitelist ;list of string + (default '())) + (extra-options git-daemon-configuration-extra-options ;list of string + (default '()))) + +(define git-daemon-shepherd-service + (match-lambda + (($ <git-daemon-configuration> + package export-all? base-path user-path + listen port whitelist extra-options) + (let* ((git (file-append package "/bin/git")) + (command `(,git + "daemon" "--syslog" "--reuseaddr" + ,@(if export-all? + '("--export-all") + '()) + ,@(if base-path + `(,(string-append "--base-path=" base-path)) + '()) + ,@(if user-path + `(,(string-append "--user-path=" user-path)) + '()) + ,@(map (cut string-append "--listen=" <>) listen) + ,@(if port + `(,(string-append + "--port=" (number->string port))) + '()) + ,@extra-options + ,@whitelist))) + (list (shepherd-service + (documentation "Run the git-daemon.") + (requirement '(user-processes networking)) + (provision '(git-daemon)) + (start #~(make-forkexec-constructor '#$command + #:user "git" + #:group "git")) + (stop #~(make-kill-destructor)))))))) + +(define git-daemon-service-type + (service-type + (name 'git-daemon) + (extensions + (list (service-extension shepherd-root-service-type + git-daemon-shepherd-service))) + (description + "Expose Git repositories over the insecure @code{git://} TCP-based +protocol.") + (default-value (git-daemon-configuration)))) + +(define-record-type* <stagit-configuration> + stagit-configuration + make-stagit-configuration + stagit-configuration? + (package stagit-configuration-package ;file-like + (default stagit)) + (www-home stagit-configuration-www-home ;string + (default "/var/www/stagit")) + (gitolite-home stagit-configuration-gitolite-home ;string + (default "/var/lib/gitolite")) + (icon stagit-configuration-icon ;file-like + (default (plain-file "icon.svg" + "\n"))) + (stylesheet stagit-configuration-stylesheet ;file-like + (default (plain-file "style.css" + "\n"))) + (admin-pubkey stagit-configuration-admin-pubkey)) ;file-like + +;; Activation-time setup for stagit. +;; TODO: Cleanup + +(define (stagit-activation config) + (let* ((package (stagit-configuration-package config)) + (www-home (stagit-configuration-www-home config)) + (icon (stagit-configuration-icon config)) + (stylesheet (stagit-configuration-stylesheet config)) + (gitolite-home (stagit-configuration-gitolite-home config)) + (gitolite-hooks (string-append gitolite-home "/local/hooks/common")) + (git-home (string-append gitolite-home "/repositories")) + (post-receive (create-stagit-hook package + www-home + git-home))) + #~(begin + (use-modules (ice-9 match)) + + (let* ((user-info (getpwnam "git")) + (icon (string-append #$www-home "/favicon.png")) + (stylesheet (string-append #$www-home "/style.css")) + (post-receive (string-append #$gitolite-hooks "/post-receive"))) + ;; Setup files as the root user. + (if (not (file-exists? #$www-home)) + (mkdir-p #$www-home)) + (chown #$www-home (passwd:uid user-info) + (passwd:gid user-info)) + + ;; Setup files as the git user. + (match (primitive-fork) + (0 + (dynamic-wind + (const #t) + (lambda () + ;; Switch to the git user. + (setgid (passwd:gid user-info)) + (setuid (passwd:uid user-info)) + + ;; Setup files. + (if (file-exists? icon) + (delete-file icon)) + (symlink #$icon icon) + + (if (file-exists? stylesheet) + (delete-file stylesheet)) + (symlink #$stylesheet stylesheet) + + (mkdir-p #$gitolite-hooks) + (if (file-exists? post-receive) + (delete-file post-receive)) + (symlink #$post-receive post-receive) + + ;; Return to main thread. + (primitive-exit 0)) + (lambda () + (primitive-exit 1)))) + (pid (waitpid pid))))))) + +;; Create a post-receive hook. +;; TODO: Cleanup +;; TODO: Implement cache + +(define* (create-stagit-hook stagit + www-home + git-home) + (program-file "post-receive" + #~(begin + (use-modules (ice-9 ftw)) + + ;; Ignore private repositories. + (if (not (file-exists? "git-daemon-export-ok")) + (exit 0)) + + ;; Set correct file permissions. + (umask #o022) + + ;; Generate repository-specific content. + (let* ((src (getcwd)) + (name (basename src ".git")) + (dest (string-append #$www-home "/" name))) + (display "[stagit] Building ") + (display dest) + (display "\n") + (if (not (file-exists? dest)) + (mkdir dest)) + (chdir dest) + (system* (string-append #$stagit "/bin/stagit") + src)) + + ;; Generate index-specific content. + (chdir #$git-home) + (let ((index (string-append #$www-home "/index.html")) + (args (scandir (getcwd) + ;; Ignore hidden files + (lambda (name) + (and + (file-exists? (string-append name "/git-daemon-export-ok")) + (not (char=? (string-ref name 0) + #\.))))))) + (display "[stagit] Building ") + (display index) + (display "\n") + (call-with-output-file index + (lambda (out) + (waitpid + (spawn (string-append #$stagit "/bin/stagit-index") + (append (list "stagit-index") + args) + #:output out)))))))) + +(define (stagit-services stagit-configuration) + (list (service gnu:gitolite-service-type + (gnu:gitolite-configuration + (admin-pubkey + (stagit-configuration-admin-pubkey stagit-configuration)) + (home-directory + (stagit-configuration-gitolite-home stagit-configuration)) + (rc-file + (gnu:gitolite-rc-file + ;; Use the hooks generated by the activation script + (local-code "$ENV{HOME}/local"))))) + (service git-daemon-service-type + (git-daemon-configuration + (base-path (string-append (stagit-configuration-gitolite-home stagit-configuration) + "/repositories")))) + (simple-service 'stagit-activation + activation-service-type + (stagit-activation stagit-configuration)))) diff --git a/mt/services/web.scm b/mt/services/web.scm @@ -0,0 +1,19 @@ +(define-module (mt services web) + #:use-module (gnu services) + #:use-module (gnu services shepherd) + #:use-module (gnu packages admin) + #:use-module (gnu packages web) + #:use-module (gnu system shadow) + #:use-module (guix gexp)) + +;; TODO: Write custom git service +;; - Creates git user and group +;; - Sets up my custom git-shell environment +;; - Sets up stagit hooks to build directory +;; - Extends nginx to serve stagit pages + +;; TODO: Write dehydrated service for certs +;; - Write configuration files +;; - Extend nginx to automatically serve challenges +;; - Extend ? to create a daily cronjob +;; - One-shot registration diff --git a/mt/system.scm b/mt/system.scm @@ -0,0 +1,40 @@ +(define-module (mt system) + #:use-module (guix gexp) + #:use-module (gnu packages admin) + #:use-module (gnu packages curl) + #:use-module (gnu packages version-control) + #:use-module (gnu system) + #:use-module (gnu system file-systems) + #:use-module (mt scripts) + #:export (%mt-file-systems + %mt-swap-devices + %mt-base-packages)) + +;; Keeping these for compatibility, may change them later, namely boot partition +(define %mt-file-systems + (append + (list (file-system + (mount-point "/boot/efi") + (device (file-system-label "guix-boot")) + (type "vfat")) + (file-system + (mount-point "/") + (device (file-system-label "guix-root")) + (type "ext4")) + (file-system + (mount-point "/home") + (device (file-system-label "guix-home")) + (type "ext4"))) + %base-file-systems)) + +(define %mt-swap-devices + (list (swap-space + (target (file-system-label "guix-swap"))))) + +(define %mt-base-packages + (append + (list fastfetch + git + curl + mt-scripts) + %base-packages)) diff --git a/mt/system/andrew.scm b/mt/system/andrew.scm @@ -0,0 +1,125 @@ +(define-module (mt system andrew) + #:use-module (guix gexp) + #:use-module (guix packages) + #:use-module (guix git) + #:use-module (gnu bootloader) + #:use-module (gnu bootloader grub) + #:use-module (gnu services) + #:use-module (gnu services certbot) + #:use-module (gnu services version-control) + #:use-module (gnu services web) + #:use-module (gnu system) + #:use-module (gnu system keyboard) + #:use-module (gnu system shadow) + #:use-module (gnu packages rsync) + #:use-module (gnu packages version-control) + #:use-module (nongnu packages linux) + #:use-module (nongnu system linux-initrd) + #:use-module (mt services) + #:use-module (mt services version-control) + #:use-module (mt system) + #:export (andrew-os)) + +(define %issue " +Welcome to \"andrew\" the, first MonasTech server. +") + +(define andrew-os + (operating-system + (host-name "andrew") + (timezone "America/New_York") ;; Located in vinthill + (locale "en_US.utf8") + + (issue %issue) + + (keyboard-layout (keyboard-layout "us")) + + (kernel linux-lts) + (initrd microcode-initrd) + (firmware (list linux-firmware)) + + (bootloader (bootloader-configuration + (bootloader grub-efi-bootloader) + (targets '("/boot/efi")) + (keyboard-layout keyboard-layout))) + + (swap-devices %mt-swap-devices) + + (file-systems %mt-file-systems) + + (users + (cons* + (user-account + (name "lukejw") + (comment "Luke Willis") + (group "users") + (home-directory "/home/lukejw") + (supplementary-groups '("wheel"))) + %base-user-accounts)) + + (packages + (cons* + rsync + %mt-base-packages)) + + (services + (append + (list (service nginx-service-type + (nginx-configuration + (server-blocks + (list (nginx-server-configuration + (server-name '("monastech.xyz" "www.monastech.xyz")) + (listen '("443 ssl")) + (root "/var/www/monastech.xyz") + (ssl-certificate "/etc/dehydrated/certs/monastech.xyz/fullchain.pem") + (ssl-certificate-key "/etc/dehydrated/certs/monastech.xyz/privkey.pem")) + (nginx-server-configuration + (server-name '("git.monastech.xyz" "www.git.monastech.xyz")) + (listen '("443 ssl")) + (root "/var/www/git.monastech.xyz") + (ssl-certificate "/etc/dehydrated/certs/monastech.xyz/fullchain.pem") + (ssl-certificate-key "/etc/dehydrated/certs/monastech.xyz/privkey.pem")) + (nginx-server-configuration + (server-name '("loquat.dev" "www.loquat.dev")) + (listen '("443 ssl")) + (root "/var/www/loquat.dev") + (ssl-certificate "/etc/dehydrated/certs/loquat.dev/fullchain.pem") + (ssl-certificate-key "/etc/dehydrated/certs/loquat.dev/privkey.pem")) + (nginx-server-configuration + (server-name '("orthodox.kitchen" "www.orthodox.kitchen")) + (listen '("443 ssl")) + (root "/var/www/orthodox.kitchen") + (ssl-certificate "/etc/dehydrated/certs/orthodox.kitchen/fullchain.pem") + (ssl-certificate-key "/etc/dehydrated/certs/orthodox.kitchen/privkey.pem")) + (nginx-server-configuration + (server-name '("substitutes.monastech.xyz")) + (listen '("443 ssl")) + (ssl-certificate "/etc/dehydrated/certs/monastech.xyz/fullchain.pem") + (ssl-certificate-key "/etc/dehydrated/certs/monastech.xyz/privkey.pem") + (locations + (list (nginx-location-configuration + (uri "/") + (body (list "proxy_pass http://127.0.0.1:8080;")))))) + ;; Default HTTP server + (nginx-server-configuration + (server-name '("_")) + (listen '("80 default_server")) + (root "/var/www/monastech.xyz") + (locations + (list ;; Serve ACME challenges + (nginx-location-configuration + (uri "^~ /.well-known/acme-challenge") + (body (list "alias /var/www/dehydrated;"))) + ;; Redirect to HTTPS + (nginx-location-configuration + (uri "/") + (body (list "return 301 https://$host$request_uri;"))))))))))) + (stagit-services + (stagit-configuration + (www-home "/var/www/git.monastech.xyz") + (admin-pubkey (plain-file + "lukejw.pub" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEZ2qcwpwPdMmrXNrrqjqtuBw8lG9gxlAE+vwcZAHM3L lukejw@moses")))) + %mt-bishop-services)))) + +andrew-os diff --git a/mt/system/install.scm b/mt/system/install.scm @@ -0,0 +1,35 @@ +(define-module (mt system install) + #:use-module (guix gexp) + #:use-module (gnu packages text-editors) + #:use-module (gnu packages package-management) + #:use-module (gnu packages version-control) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services ssh) + #:use-module (gnu system) + #:use-module (gnu system install) + #:use-module (nongnu packages linux) + #:use-module (mt channels)) + +(operating-system + (inherit installation-os) + + (kernel linux-lts) + (firmware (list linux-firmware)) + + (packages + (append + (list git kakoune) + (operating-system-packages installation-os))) + + (services + (modify-services (operating-system-user-services installation-os) + ;; Configure Guix to have all the needed channels, substitutes and signing keys by default + (guix-service-type + config => (guix-configuration + (inherit config) + (guix (guix-for-channels %mt-channels)) + (channels %mt-channels) + (substitute-urls %mt-substitute-urls) + (discover? #t) + (authorized-keys %mt-authorized-guix-keys)))))) diff --git a/mt/utils.scm b/mt/utils.scm @@ -0,0 +1,50 @@ +(define-module (mt utils) + #:use-module (gnu home) + #:use-module (gnu packages video) + #:use-module (nongnu packages game-client) + #:use-module (nongnu packages video) + #:use-module (nonguix utils) + #:use-module (nongnu packages nvidia) + #:export (mt-transformation-nvidia-home-environment)) + +;; TODO: Master function that detects the type of variable passed +;; (operating-system or home-environment) and returns a transformation function +;; accordingly. + +(define* (mt-transformation-nvidia-home-environment #:key (driver nvda)) + "Return a procedure that transforms a home environment, setting up DRIVER +(default: nvda) for NVIDIA graphics card. If the environment variable +MT_DISABLE_NVIDIA is set, then this will simply return the home environment it +was passed." + (if (getenv "MT_DISABLE_NVIDIA") + ;; If it is set, just return the home environment. + (lambda (home-env) + (display "MT: MT_DISABLE_NVIDIA is set, not adjusting home environment \ +for NVIDIA drivers.\n" + (current-error-port)) + home-env) + ;; If it is not set, modify the home environment accordingly. + (lambda (home-env) + (let* ((port (current-error-port)) + (packages (map (lambda (package) + (cond + ;; Replace specific packages with specific + ;; NVIDIA variants. + ((eq? package steam) steam-nvidia) + ((eq? package obs) obs-nvidia) + ((eq? package mpv) mpv-nvidia) + ;; For all other packages, simply graft mesa + ;; for DRIVER. + (else (replace-mesa package + #:driver driver)))) + (home-environment-packages home-env))) + ;; TODO: Better understand how this works + (services (replace-mesa + (home-environment-user-services home-env) + #:driver driver))) + (display "MT: Adjusted home environment for NVIDIA drivers.\n" port) + ;; Return modified home environment + (home-environment + (inherit home-env) + (packages packages) + (services services))))))