{ 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 ]; defs = [ { name = "1"; yacc = false; } { name = "2"; yacc = false; } { name = "3"; yacc = false; } { name = "4"; yacc = false; } { name = "5"; yacc = false; } { name = "6"; yacc = true; } { name = "7"; yacc = true; } { name = "8"; 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 -d main.y gcc -o exec y* ${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"; }; }) defs); # buildYacc = pkgs.writeScriptBin "build-yacc" # '' # set -e # prog_name="$1" # outdir="outputs/$prog_name" # mkdir -p "$outdir" # ${pkgs.flex}/bin/flex -o "$outdir"/lex.yy.cc "$prog_name"/main.l # ${pkgs.bison}/bin/yacc -b "$outdir"/y -d "$prog_name"/main.y # ${pkgs.gcc}/bin/gcc -o "$outdir"/exec "$outdir"/y.* # ./"$outdir"/exec < "$prog_name"/input # rm -r outputs # ''; in rec { devShell = pkgs.mkShell { nativeBuildInputs = nativeBuildInputs ++ (with pkgs; [ gcc ]); }; inherit apps; }); }