aboutsummaryrefslogtreecommitdiff
path: root/flake.nix
blob: fb2e2cb74a6a3213bf375c662b215ba9501decf3 (plain)
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
{
  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; }
          { name = "12"; 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;
      });
}