Add nixgen package to quickly create development shells #211
| @ -5,8 +5,8 @@ | |||||||
|     vim wget git htop tmux pciutils tcpdump ripgrep nix-index nixos-option |     vim wget git htop tmux pciutils tcpdump ripgrep nix-index nixos-option | ||||||
|     nix-diff ipmitool freeipmi ethtool lm_sensors cmake gnumake file tree |     nix-diff ipmitool freeipmi ethtool lm_sensors cmake gnumake file tree | ||||||
|     ncdu config.boot.kernelPackages.perf ldns pv |     ncdu config.boot.kernelPackages.perf ldns pv | ||||||
|     # From bsckgs overlay |     # From jungle overlay | ||||||
|     osumb |     osumb nixgen | ||||||
|   ]; |   ]; | ||||||
| 
 | 
 | ||||||
|   programs.direnv.enable = true; |   programs.direnv.enable = true; | ||||||
|  | |||||||
| @ -37,6 +37,7 @@ let | |||||||
|     nanos6 = callPackage ./pkgs/nanos6/default.nix { }; |     nanos6 = callPackage ./pkgs/nanos6/default.nix { }; | ||||||
|     nanos6Debug = final.nanos6.override { enableDebug = true; }; |     nanos6Debug = final.nanos6.override { enableDebug = true; }; | ||||||
|     nixtools = callPackage ./pkgs/nixtools/default.nix { }; |     nixtools = callPackage ./pkgs/nixtools/default.nix { }; | ||||||
|  |     nixgen = callPackage ./pkgs/nixgen/default.nix { }; | ||||||
|     # Broken because of pkgsStatic.libcap |     # Broken because of pkgsStatic.libcap | ||||||
|     # See: https://github.com/NixOS/nixpkgs/pull/268791 |     # See: https://github.com/NixOS/nixpkgs/pull/268791 | ||||||
|     #nix-wrap = callPackage ./pkgs/nix-wrap/default.nix { }; |     #nix-wrap = callPackage ./pkgs/nix-wrap/default.nix { }; | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								pkgs/nixgen/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								pkgs/nixgen/default.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | { | ||||||
|  |   stdenv | ||||||
|  | , lib | ||||||
|  | }: | ||||||
|  | 
 | ||||||
|  | stdenv.mkDerivation { | ||||||
|  |   pname = "nixgen"; | ||||||
|  |   version = "0.0.1"; | ||||||
|  |   src = ./nixgen; | ||||||
|  |   dontUnpack = true; | ||||||
|  |   phases = [ "installPhase" ]; | ||||||
|  |   installPhase = '' | ||||||
|  |     mkdir -p $out/bin | ||||||
|  |     cp -a $src $out/bin/nixgen | ||||||
|  |   ''; | ||||||
|  |   meta = { | ||||||
|  |     description = "Quickly generate flake.nix from command line"; | ||||||
|  |     maintainers = with lib.maintainers.bsc; [ rarias ]; | ||||||
|  |     platforms = lib.platforms.linux; | ||||||
|  |     license = lib.licenses.gpl3Plus; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										97
									
								
								pkgs/nixgen/nixgen
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										97
									
								
								pkgs/nixgen/nixgen
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,97 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | # | ||||||
|  | # Copyright (c) 2025, Barcelona Supercomputing Center (BSC) | ||||||
|  | # SPDX-License-Identifier: GPL-3.0+ | ||||||
|  | # Author: Rodrigo Arias Mallo <rodrigo.arias@bsc.es> | ||||||
|  | 
 | ||||||
|  | function usage() { | ||||||
|  |   echo "USAGE: nixgen [-f] [package [...]] [-b package [...]]" >&2 | ||||||
|  |   echo "  Generates a flake.nix file with the given packages." >&2 | ||||||
|  |   echo "  After flake.nix is created, use 'nix develop' to enter the shell." >&2 | ||||||
|  |   echo "OPTIONS" >&2 | ||||||
|  |   echo "  -f               Overwrite existing flake.nix (default: no)." >&2 | ||||||
|  |   echo "  packages...      Add these packages to the shell." >&2 | ||||||
|  |   echo "  -b packages...   Add the dependencies needed to build these packages." >&2 | ||||||
|  |   echo "EXAMPLE" >&2 | ||||||
|  |   echo "  $ nixgen ovni bigotes -b nosv tampi" >&2 | ||||||
|  |   echo "  Adds the packages ovni and bigotes as well as all required dependencies" >&2 | ||||||
|  |   echo "  to build nosv and tampi." >&2 | ||||||
|  |   echo "AUTHOR" >&2 | ||||||
|  |   echo "  Rodrigo Arias Mallo <rodrigo.arias@bsc.es>" >&2 | ||||||
|  |   exit 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | mode=package | ||||||
|  | packages= | ||||||
|  | inputsFrom= | ||||||
|  | force= | ||||||
|  | 
 | ||||||
|  | if [[ $# -eq 0 ]]; then | ||||||
|  |   usage | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | while [[ $# -gt 0 ]]; do | ||||||
|  |     case $1 in -b) | ||||||
|  |       mode=build | ||||||
|  |       shift | ||||||
|  |       ;; | ||||||
|  |     -f) | ||||||
|  |       force=1 | ||||||
|  |       shift | ||||||
|  |       ;; | ||||||
|  |     -h) | ||||||
|  |       usage | ||||||
|  |       ;; | ||||||
|  |     -*|--*) | ||||||
|  |       echo "error: unknown option $1" >&2 | ||||||
|  |       exit 1 | ||||||
|  |       ;; | ||||||
|  |     *) | ||||||
|  |       if [ "$mode" == "package" ]; then | ||||||
|  |         packages+="${packages:+ }$1" | ||||||
|  |       else | ||||||
|  |         inputsFrom+="${inputsFrom:+ }$1" | ||||||
| 
					
					rarias marked this conversation as resolved
					
						
						
							Outdated
						
					
				 | |||||||
|  |       fi | ||||||
|  |       shift | ||||||
|  |       ;; | ||||||
|  |   esac | ||||||
|  | done | ||||||
|  | 
 | ||||||
|  | if [ ! "$force" -a -e flake.nix ]; then | ||||||
|  |   echo "error: flake.nix exists, force overwrite with -f" >&2 | ||||||
|  |   exit 1 | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | cat > flake.nix <<EOF | ||||||
|  | { | ||||||
|  |   inputs.jungle.url = "git+https://jungle.bsc.es/git/rarias/jungle"; | ||||||
|  |   outputs = { self, jungle }: | ||||||
|  |   let | ||||||
|  |     nixpkgs = jungle.inputs.nixpkgs; | ||||||
|  |     customOverlay = (final: prev: { | ||||||
|  |       # Example overlay, for now empty | ||||||
|  |     }); | ||||||
|  |     pkgs = import nixpkgs { | ||||||
|  |       system = "x86_64-linux"; | ||||||
|  |       overlays = [ | ||||||
|  |         # Apply jungle overlay to get our BSC custom packages | ||||||
|  |         jungle.outputs.bscOverlay | ||||||
|  |         # And on top apply our local changes to customize for cluster | ||||||
|  |         customOverlay | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |   in { | ||||||
|  |     devShells.x86_64-linux.default = pkgs.mkShell { | ||||||
|  |       pname = "devshell"; | ||||||
|  |       # Include these packages in the shell | ||||||
|  |       packages = with pkgs; [ | ||||||
|  |         $packages | ||||||
|  |       ]; | ||||||
|  |       # The dependencies needed to build these packages will be also included | ||||||
|  |       inputsFrom = with pkgs; [ | ||||||
|  |         $inputsFrom | ||||||
|  |       ]; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | EOF | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	
I think that we need
:+(${inputsFrom:+ }) since inputsFrom is defined (but empty). Otherwise, we'll have leading whitespace :DDamm, I tested
${foo:+ }on bash but wrote the wrong thing :D