{ inputs = { utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, utils, ... }: utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages."${system}"; nativeBuildInputs = with pkgs; [ gcc flex bison ]; execs = [ { name = "01"; yacc = false; } { name = "02"; yacc = false; } { name = "03"; yacc = false; } { name = "04"; yacc = false; } { name = "05"; yacc = false; } { name = "06"; yacc = true; } { name = "07"; yacc = true; } { name = "08"; yacc = true; } { name = "09"; yacc = true; } { name = "10"; yacc = true; } { name = "11"; yacc = true; } ]; apps = builtins.listToAttrs (builtins.map (def: let builder = pkgs.stdenv.mkDerivation { name = "${def.name}-v0.1.0"; src = ./.; buildInputs = nativeBuildInputs; unpackCmd = '' cp -r $src/${def.name} . ''; buildPhase = '' flex -o ${def.name}.yy.cc main.l if [[ ${pkgs.lib.trivial.boolToString def.yacc} = true ]]; then yacc -b ${def.name} -d main.y gcc -o exec ${def.name}.tab.c \ -include ${def.name}.tab.h \ -include ${def.name}.yy.cc else gcc -o exec ${def.name}.yy.cc fi ''; installPhase = '' mkdir -p $out/bin install -m 755 -D exec -t $out/bin/ ''; }; in { name = def.name; value = { type = "app"; program = "${builder}/bin/exec"; }; }) execs); in rec { devShell = pkgs.mkShell { nativeBuildInputs = nativeBuildInputs ++ (with pkgs; [ gcc ]); }; inherit apps; }); }