{ description = "Blade"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; self.submodules = true; }; outputs = { nixpkgs, ... }: let system = "x86_64-linux"; pkgs = nixpkgs.legacyPackages.${system}.pkgsStatic; hostPkgs = nixpkgs.legacyPackages.${system}; mruby = pkgs.stdenv.mkDerivation { pname = "mruby"; version = "0.0.1"; src = pkgs.lib.cleanSourceWith { src = ./libs; name = "mruby-src"; }; patches = [ ./libs/changes.patch ]; nativeBuildInputs = with hostPkgs; [ ruby gnumake ]; buildPhase = '' cd mruby rake ''; installPhase = '' mkdir -p $out cp -r build/host/lib $out/lib cp -r build/host/include $out/include mkdir -p $out/bin cp build/host/bin/mrbc $out/bin/mrbc ''; }; blade = pkgs.stdenv.mkDerivation { pname = "blade"; version = "0.1.0"; src = ./.; nativeBuildInputs = with hostPkgs; [ bash pkg-config gnumake findutils binutils cpio gzip ]; buildInputs = [ pkgs.pkgsStatic.busybox mruby ]; buildPhase = '' make \ MRUBY_CFLAGS="-I${mruby}/include" \ MRUBY_LIBS="-L${mruby}/lib -lmruby" \ BUSYBOX="${pkgs.pkgsStatic.busybox}/bin/busybox" ''; installPhase = '' mkdir -p $out/bin cp bin/blade $out/bin/blade cp bin/initramfs.cpio.gz $out/bin/initramfs.cpio.gz ''; }; run-blade = hostPkgs.writeShellScriptBin "run-blade" '' set -euo pipefail exec ${hostPkgs.qemu}/bin/qemu-system-x86_64 \ --enable-kvm \ -m 512M \ -smp 2 \ -kernel "${hostPkgs.linux}/bzImage" \ -initrd ${blade}/bin/initramfs.cpio.gz \ -append "console=ttyS0 rdinit=/init" \ -nographic ''; in { packages.${system} = { default = blade; blade = blade; mruby = mruby; run-blade = run-blade; }; apps.${system} = { default = { type = "app"; program = "${run-blade}/bin/run-blade"; }; }; devShells.${system}.default = pkgs.mkShell { inputsFrom = [ blade ]; packages = with hostPkgs; [ linux qemu cpio gzip clang-tools pkg-config ccache gnumake bear ruby gdb binutils findutils ]; shellHook = '' export CC="ccache $CC" export CXX="ccache $CXX" export MRUBY_CFLAGS=-I${mruby}/include export MRUBY_LIBS="-L${mruby}/lib -lmruby" export BUSYBOX="${pkgs.pkgsStatic.busybox}/bin/busybox" export LINUX="${hostPkgs.linux}/bzImage" ''; }; }; }