{ description = "Espressif QEMU fork with the xteink X3/X4 (ESP32-C3) machine and a wasm32 TCG backend"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self , nixpkgs , flake-utils , }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = nixpkgs.legacyPackages.${system}; keycodemapdb = pkgs.fetchFromGitLab { owner = "qemu-project"; repo = "keycodemapdb"; rev = "f5772a62ec52591ff6870b7e8ef32482371f22c6"; hash = "sha256-GbZ5mrUYLXMi0IX4IZzles0Oyc095ij2xAsiLNJwfKQ="; }; qemu-native-xteink = pkgs.stdenv.mkDerivation { pname = "qemu-native-xteink"; version = pkgs.lib.strings.trim (builtins.readFile ./VERSION); src = pkgs.lib.cleanSource ./.; nativeBuildInputs = with pkgs; [ bison flex meson ninja perl pkg-config python3 ]; buildInputs = with pkgs; [ dtc glib gtk3 libgcrypt libpng libslirp pixman zlib ]; dontUseMesonConfigure = true; postPatch = '' cp -r ${keycodemapdb} subprojects/keycodemapdb chmod -R u+w subprojects/keycodemapdb sed -i "/subdir('fp')/d" tests/meson.build substituteInPlace meson.build --replace-fail "static: true" "static: false" ''; configurePhase = '' runHook preConfigure export PKG_CONFIG_PATH=${pkgs.libslirp}/lib/pkgconfig''${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH} ./configure \ --prefix=$out \ --target-list=riscv32-softmmu \ --with-devices-riscv32=xteink \ --with-coroutine=ucontext \ --without-default-features \ --enable-system \ --enable-gcrypt \ --enable-gtk \ --enable-pixman \ --enable-png \ --enable-slirp \ --disable-werror \ --disable-docs \ --disable-tools runHook postConfigure ''; buildPhase = '' runHook preBuild ninja -C build qemu-system-riscv32 runHook postBuild ''; installPhase = '' runHook preInstall ninja -C build install runHook postInstall ''; }; xteink-emu = pkgs.writeShellApplication { name = "xteink-emu"; runtimeInputs = [ pkgs.uv pkgs.mtools pkgs.dosfstools ]; text = '' export XTEINK_QEMU=${qemu-native-xteink}/bin/qemu-system-riscv32 export XTEINK_BIOS=${qemu-native-xteink}/share/qemu export XTEINK_BOOTLOADER=${./scripts/assets/esp32c3-bootloader.bin} export XTEINK_PARTITIONS=${./scripts/assets/xteink-partitions.bin} exec uv run --script ${./scripts}/xteink-emu.py "$@" ''; }; in { packages.qemu-native-xteink = qemu-native-xteink; packages.xteink-emu = xteink-emu; apps.xteink-emu = { type = "app"; program = "${xteink-emu}/bin/xteink-emu"; }; # Native build/test shell. The wasm target is built by the parent # xteink-web-emulator repo via its emsdk Docker toolchain, not here. # # nix develop # ./configure --target-list=riscv32-softmmu --with-devices-riscv32=xteink \ # --enable-gcrypt && ninja -C build qemu-system-riscv32 devShells.default = pkgs.mkShell { inputsFrom = [ pkgs.qemu ]; packages = with pkgs; [ dosfstools git gnumake libgcrypt libslirp meson mtools ninja pixman pkg-config uv ]; }; } ); }