{ description = "Bad Apple player running on UEFI using Rust"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; naersk.url = "github:nix-community/naersk"; }; outputs = { self, nixpkgs, naersk }: let systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ]; forEachSystem = f: nixpkgs.lib.genAttrs systems (system: let pkgs = import nixpkgs { inherit system; }; in f system pkgs); in { packages = forEachSystem (system: pkgs: let naersk-lib = naersk.lib.${system}; in { default = naersk-lib.buildPackage { pname = "badapple-uefi"; version = "0.1.0"; src = ./.; cargoBuildOptions = opts: opts ++ [ "--target" "aarch64-unknown-uefi" "--release" ]; doCheck = false; installPhase = '' runHook preInstall mkdir -p $out/EFI/BOOT $out/assets cp "$CARGO_TARGET_DIR/aarch64-unknown-uefi/release/badapple-uefi.efi" \ $out/EFI/BOOT/BOOTAA64.EFI cp -r ${./assets}/. $out/assets/ 2>/dev/null || true runHook postInstall ''; }; }); apps = forEachSystem (system: pkgs: let package = self.packages.${system}.default; ovmf = pkgs.OVMF.overrideAttrs (old: { meta = (old.meta or {}) // { broken = false; }; }); runtimePkgs = [ pkgs.qemu ovmf pkgs.coreutils pkgs.findutils ]; script = pkgs.writeShellScriptBin "badapple-qemu" '' set -euo pipefail export PATH="${pkgs.lib.makeBinPath runtimePkgs}:$PATH" esp="$(mktemp -d)" vars="$(mktemp)" trap 'rm -rf "$esp" "$vars"' EXIT mkdir -p "$esp/EFI/BOOT" "$esp/EFI/BADAPPLE" cp ${package}/EFI/BOOT/BOOTAA64.EFI "$esp/EFI/BOOT/BOOTAA64.EFI" if [ -d ${package}/assets ]; then cp -R ${package}/assets/. "$esp/EFI/BADAPPLE/" fi cp ${ovmf.fd}/FV/AAVMF_VARS.fd "$vars" qemu-system-aarch64 \ -machine virt \ -cpu cortex-a72 \ -m 1024 \ -drive if=pflash,format=raw,readonly=on,file=${ovmf.fd}/FV/AAVMF_CODE.fd \ -drive if=pflash,format=raw,file="$vars" \ -drive file=fat:rw:$esp,format=raw \ -device virtio-gpu-pci \ -device ramfb \ -net none \ -serial mon:stdio \ "$@" ''; in { qemu = { type = "app"; program = "${script}/bin/badapple-qemu"; }; }); devShells = forEachSystem (_: pkgs: { default = pkgs.mkShell { buildInputs = [ pkgs.rustup pkgs.qemu pkgs.ffmpeg pkgs.python3 pkgs.pkg-config ]; shellHook = '' rustup target add aarch64-unknown-uefi >/dev/null 2>&1 || true ''; }; }); }; }