{
  description = "CS162 with older toolchain for Pintos and Rust for gRPC lab";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-21.05";  # PINTOS使用的工具链比较老旧,用新的亲测会出现诡异问题
    nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";  # 用于 Rust 工具链
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs.nixpkgs.follows = "nixpkgs-unstable";
    };
  };

  outputs = {self, nixpkgs, nixpkgs-unstable, rust-overlay, ...}: let
    system = "x86_64-linux";
  in {
    devShells."${system}".default = let
      pkgs = import nixpkgs {
        inherit system;
      };
      pkgs-unstable = import nixpkgs-unstable {
        inherit system;
        overlays = [ rust-overlay.overlays.default ];
      };
    in pkgs.mkShell {
      packages = with pkgs; [
        # C 语言工具链 (保留原有的,使用旧版)
        binutils
        cgdb
        clang
        clang-tools
        cmake
        gdb
        valgrind
        qemu
        rpcbind
        bochs
        bear  # 用来生成compile_commands.json方便调试
        gcc
        perl
      ] ++ (with pkgs-unstable; [
        # Rust 工具链 (使用新版)
        (rust-bin.stable.latest.default.override {
          extensions = [ "rust-src" "rust-analyzer" ];
        })
        protobuf
        pkg-config
      ]);

      shellHook = ''
        # Create /usr/bin/perl symlink (requires sudo)
        # Always update to point to current perl
        if [ ! -f /usr/bin/perl ] || [ "$(readlink /usr/bin/perl)" != "$(which perl)" ]; then
          echo "Creating/updating /usr/bin/perl symlink (requires sudo)..."
          sudo mkdir -p /usr/bin
          sudo rm -f /usr/bin/perl
          sudo ln -sf $(which perl) /usr/bin/perl
        fi

        # Create /bin/ls symlink for hw-shell (requires sudo)
        if [ ! -f /bin/ls ]; then
          echo "Creating /bin/ls symlink (requires sudo)..."
          sudo mkdir -p /bin
          sudo ln -sf $(which ls) /bin/ls
        fi

        # Fix proc-macro linking issues for Rust
        export LD_LIBRARY_PATH=${pkgs-unstable.stdenv.cc.cc.lib}/lib:$LD_LIBRARY_PATH

        export PATH=$PWD/personal/proj-pregame/src/utils:$PATH
        export PATH=$PWD/group/src/utils:$PATH
        if command -v fish > /dev/null 2>&1; then
          exec fish
        fi
      '';
    };
  };
}