-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathflake.nix
More file actions
135 lines (129 loc) · 3.98 KB
/
Copy pathflake.nix
File metadata and controls
135 lines (129 loc) · 3.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
{
description = "suba dev environment (Nix)";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
riscv = pkgs.pkgsCross.riscv64-embedded;
loongarch = pkgs.pkgsCross.loongarch64-linux;
riscvAliases = pkgs.symlinkJoin {
name = "riscv64-unknown-elf-aliases";
paths = [];
postBuild = ''
mkdir -p $out/bin
for tool in gcc g++ gdb objcopy objdump ar ranlib nm; do
cat > "$out/bin/riscv64-unknown-elf-$tool" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
for candidate in riscv64-none-elf-TOOL riscv64-elf-TOOL; do
if command -v "$candidate" >/dev/null 2>&1; then
exec "$candidate" "$@"
fi
done
echo "riscv64-unknown-elf-TOOL: no suitable tool found in PATH" >&2
exit 127
EOF
chmod +x "$out/bin/riscv64-unknown-elf-$tool"
substituteInPlace "$out/bin/riscv64-unknown-elf-$tool" \
--replace "TOOL" "$tool"
done
'';
};
in {
devShells.default = pkgs.mkShell {
packages = with pkgs; [
autoconf
automake
bison
cacert
cargo-binutils
clang
cmake
curl
dtc
expat
fish
flex
gawk
gcc
gdb
git
gmp
gnumake
gperf
help2man
libslirp
libtool
lldb
mpfr
mpc
ncurses
ninja
nodejs
openssh
openssl
patchutils
pixman
pkg-config
python3
python3Packages.pip
python3Packages.tomli
qemu
readline
rust-analyzer
rustup
SDL2
sudo
texinfo
tmux
unzip
wget
xz
zlib
glib
llvmPackages.bintools
llvmPackages.llvm
riscv.buildPackages.binutils
riscv.buildPackages.gcc
riscv.buildPackages.gdb
riscvAliases
# LoongArch64 cross-compilation tools
loongarch.buildPackages.binutils
loongarch.buildPackages.gcc
loongarch.buildPackages.gdb
];
shellHook = ''
export CARGO_HOME="''${CARGO_HOME:-$HOME/.cargo}"
export RUSTUP_HOME="''${RUSTUP_HOME:-$HOME/.rustup}"
export PATH="$CARGO_HOME/bin:$PATH"
export RUSTUP_TOOLCHAIN="nightly-2025-10-28"
if ! rustup toolchain list | grep -q "nightly-2025-10-28"; then
echo "Rust nightly 2025-10-28 is not installed."
echo "Run:"
echo " rustup toolchain install nightly-2025-10-28"
echo " rustup default nightly-2025-10-28"
echo " rustup component add rustfmt clippy rust-src rust-analyzer llvm-tools"
echo " rustup target add \\"
echo " riscv64gc-unknown-none-elf \\"
echo " riscv64imac-unknown-none-elf \\"
echo " loongarch64-unknown-linux-gnu \\"
echo " loongarch64-unknown-none \\"
echo " x86_64-unknown-linux-gnu"
fi
# Configure cargo sparse index (matching devcontainer setup)
if [ ! -f "$CARGO_HOME/config.toml" ]; then
mkdir -p "$CARGO_HOME"
echo '[source.crates-io]' > "$CARGO_HOME/config.toml"
echo 'registry = "sparse+https://index.crates.io/"' >> "$CARGO_HOME/config.toml"
fi
if [ -z "$FISH_VERSION" ]; then
exec fish
fi
'';
};
});
}