{
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
'';
};
};
}