{ description = "BPF-based scheduler using sched-ext"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs = { nixpkgs.follows = "nixpkgs"; flake-utils.follows = "flake-utils"; }; }; }; outputs = { self, nixpkgs, flake-utils, rust-overlay }: flake-utils.lib.eachDefaultSystem (system: let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; config = { hardeningDisable = [ "stackprotector" "zerocallusedregs" ]; }; }; # Use a stable rust with specific components rustVersion = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-src" "rust-analyzer" "clippy" "rustfmt" ]; }; # Python with ML dependencies pythonEnv = pkgs.python3.withPackages (ps: with ps; [ pandas numpy scikit-learn matplotlib pytorch ]); # Dependencies based on scx_rustscheds nativeBuildInputs = with pkgs; [ pkg-config rustVersion llvmPackages.clang bpftools # bpftool pythonEnv # Add Python environment ]; buildInputs = with pkgs; [ elfutils zlib zstd libbpf ]; # Environment variables needed for compilation shellEnv = { LIBCLANG_PATH = "${pkgs.lib.getLib pkgs.llvmPackages.libclang}/lib"; BPF_CLANG = pkgs.lib.getExe pkgs.llvmPackages.clang; BPF_EXTRA_CFLAGS_PRE_INCL = pkgs.lib.concatStringsSep " " [ "-I${pkgs.libbpf}/include" "-I${pkgs.libbpf}/include/uapi" "-I${pkgs.libbpf}/include/linux" ]; BPF_EXTRA_CFLAGS = "-fno-stack-protector"; RUSTFLAGS = pkgs.lib.concatStringsSep " " [ "-C relocation-model=pic" "-C link-args=-lelf" "-C link-args=-lz" "-C link-args=-lzstd" "-L ${pkgs.libbpf}/lib" ]; }; in { # Development shell with all dependencies devShells.default = pkgs.mkShell { inherit nativeBuildInputs buildInputs; inherit (shellEnv) LIBCLANG_PATH BPF_CLANG BPF_EXTRA_CFLAGS_PRE_INCL BPF_EXTRA_CFLAGS RUSTFLAGS; hardeningDisable = [ "stackprotector" "zerocallusedregs" ]; # Additional development tools packages = with pkgs; [ cargo-watch cargo-expand samply just ]; # Shell hook to print some useful info shellHook = '' echo "BPF scheduler development environment" echo "Kernel: $(uname -r)" echo "Rust: $(rustc --version)" echo "Clang: $(clang --version | head -n1)" echo "Python: $(python --version)" ''; }; }); }