|
42 | 42 | ]; |
43 | 43 | }; |
44 | 44 |
|
| 45 | + rustfmtNightly = pkgs.rust-bin.nightly.latest.rustfmt; |
| 46 | + |
| 47 | + # Override rustfmt to use nightly |
| 48 | + rustfmt-nightly-bin = pkgs.writeShellScriptBin "rustfmt" '' |
| 49 | + exec ${rustfmtNightly}/bin/rustfmt "$@" |
| 50 | + ''; |
| 51 | + |
45 | 52 | # Factory to create environment for a specific ROS distro |
46 | 53 | mkRosEnv = |
47 | 54 | rosDistro: |
|
164 | 171 | { |
165 | 172 | default = mkDevShell { |
166 | 173 | name = "ros-z-dev-${rosDistro}"; |
167 | | - packages = commonBuildInputs ++ devTools ++ [ rosEnv.dev ] ++ pre-commit-check.enabledPackages; |
| 174 | + packages = [ |
| 175 | + rustfmt-nightly-bin |
| 176 | + ] |
| 177 | + ++ commonBuildInputs |
| 178 | + ++ devTools |
| 179 | + ++ [ rosEnv.dev ] |
| 180 | + ++ pre-commit-check.enabledPackages; |
168 | 181 | extraShellHook = pre-commit-check.shellHook; |
169 | 182 | banner = '' |
170 | 183 | echo "🦀 ros-z development environment (with ROS)" |
|
179 | 192 | }; |
180 | 193 | }; |
181 | 194 |
|
182 | | - # Cargo metadata |
183 | | - cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml); |
184 | | - |
185 | | - # Helper to create packages for a specific ROS distro |
186 | | - mkRosPackages = |
187 | | - rosDistro: |
188 | | - let |
189 | | - rosEnv = mkRosEnv rosDistro; |
190 | | - in |
191 | | - { |
192 | | - "ros-z-${rosDistro}" = mkRustPackage { |
193 | | - pname = "ros-z"; |
194 | | - buildAndTestSubdir = "ros-z"; |
195 | | - description = "Native Rust ROS 2 implementation using Zenoh - Core"; |
196 | | - }; |
197 | | - |
198 | | - "rcl-z-${rosDistro}" = mkRustPackage { |
199 | | - pname = "rcl-z"; |
200 | | - buildAndTestSubdir = "rcl-z"; |
201 | | - rosInputs = [ rosEnv.rcl ]; |
202 | | - description = "Native Rust ROS 2 implementation using Zenoh - RCL Bindings (${rosDistro})"; |
203 | | - }; |
204 | | - |
205 | | - "ros-z-msgs-${rosDistro}" = mkRustPackage { |
206 | | - pname = "ros-z-msgs"; |
207 | | - buildAndTestSubdir = "ros-z-msgs"; |
208 | | - rosInputs = [ rosEnv.msgs ]; |
209 | | - description = "Native Rust ROS 2 implementation using Zenoh - Message Definitions (${rosDistro})"; |
210 | | - }; |
211 | | - |
212 | | - "ros-z-full-${rosDistro}" = mkRustPackage { |
213 | | - pname = "ros-z"; |
214 | | - rosInputs = [ rosEnv.build ]; |
215 | | - description = cargoToml.workspace.package.description; |
216 | | - }; |
217 | | - }; |
218 | | - |
219 | | - # Common package attributes factory |
220 | | - mkRustPackage = |
221 | | - { |
222 | | - pname, |
223 | | - buildAndTestSubdir ? null, |
224 | | - rosInputs ? [ ], |
225 | | - description, |
226 | | - }: |
227 | | - pkgs.rustPlatform.buildRustPackage { |
228 | | - inherit pname; |
229 | | - version = cargoToml.workspace.package.version; |
230 | | - src = ./.; |
231 | | - inherit buildAndTestSubdir; |
232 | | - |
233 | | - cargoLock = { |
234 | | - lockFile = ./Cargo.lock; |
235 | | - }; |
236 | | - |
237 | | - nativeBuildInputs = commonBuildInputs; |
238 | | - buildInputs = rosInputs; |
239 | | - |
240 | | - inherit (commonEnvVars) LIBCLANG_PATH CLANG_PATH RUSTC_WRAPPER; |
241 | | - |
242 | | - meta = with pkgs.lib; { |
243 | | - inherit description; |
244 | | - homepage = cargoToml.workspace.package.homepage; |
245 | | - license = licenses.asl20; |
246 | | - maintainers = [ ]; |
247 | | - }; |
248 | | - }; |
249 | | - |
250 | 195 | # Generate shells for all distros |
251 | 196 | allDistroShells = builtins.listToAttrs ( |
252 | 197 | builtins.map (distro: { |
253 | 198 | name = distro; |
254 | 199 | value = mkRosShells distro; |
255 | 200 | }) distros |
256 | 201 | ); |
257 | | - # yamllint configuration |
258 | | - yamlFormat = pkgs.formats.yaml { }; |
259 | | - yamllintConfigData = { |
260 | | - extends = "default"; |
261 | | - rules = { |
262 | | - line-length = { |
263 | | - max = 120; |
264 | | - }; |
265 | | - document-start = "disable"; |
266 | | - truthy = "disable"; |
267 | | - }; |
268 | | - }; |
269 | | - yamllintConfig = yamlFormat.generate ".yamllint.yaml" yamllintConfigData; |
270 | | - |
271 | | - # markdownlint configuration |
272 | | - markdownlintConfig = { |
273 | | - MD013 = false; # Line length |
274 | | - MD033 = { |
275 | | - # Inline HTML |
276 | | - allowed_elements = [ |
277 | | - "div" |
278 | | - "h1" |
279 | | - "p" |
280 | | - "strong" |
281 | | - "a" |
282 | | - "sub" |
283 | | - ]; |
284 | | - }; |
285 | | - MD041 = false; # First line in file should be a top-level heading |
286 | | - }; |
287 | | - |
288 | 202 | # Pre-commit hooks configuration |
289 | | - pre-commit-check = git-hooks.lib.${system}.run { |
290 | | - src = ./.; |
291 | | - hooks = { |
292 | | - # Rust formatter |
293 | | - rustfmt.enable = true; |
294 | | - |
295 | | - # TOML formatter |
296 | | - taplo.enable = true; |
297 | | - |
298 | | - # YAML linter with relaxed rules |
299 | | - yamllint = { |
300 | | - enable = true; |
301 | | - settings.configPath = "${yamllintConfig}"; |
302 | | - }; |
303 | | - |
304 | | - # Markdown linter |
305 | | - markdownlint = { |
306 | | - enable = true; |
307 | | - settings.configuration = markdownlintConfig; |
308 | | - }; |
309 | | - |
310 | | - # Nix formatter |
311 | | - nixfmt-rfc-style.enable = true; |
312 | | - }; |
| 203 | + pre-commit-check = import ./nix/pre-commit.nix { |
| 204 | + inherit |
| 205 | + pkgs |
| 206 | + git-hooks |
| 207 | + system |
| 208 | + rustfmtNightly |
| 209 | + ; |
313 | 210 | }; |
314 | 211 | in |
315 | 212 | { |
|
326 | 223 | # Without ROS |
327 | 224 | noRos = mkDevShell { |
328 | 225 | name = "ros-z-no-ros"; |
329 | | - packages = commonBuildInputs ++ devTools ++ pre-commit-check.enabledPackages; |
| 226 | + packages = [ |
| 227 | + rustfmt-nightly-bin |
| 228 | + ] |
| 229 | + ++ commonBuildInputs |
| 230 | + ++ devTools |
| 231 | + ++ pre-commit-check.enabledPackages; |
330 | 232 | extraShellHook = pre-commit-check.shellHook; |
331 | 233 | banner = '' |
332 | 234 | echo "🦀 ros-z development environment (without ROS)" |
|
0 commit comments