about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/idris2/build-idris.nix
blob: e66306c4344b17cae8140fb998cbf0fcf2790988 (plain) (blame)
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{ stdenv, lib, idris2, makeWrapper
}:
# Usage: let
#          pkg = idris2Packages.buildIdris {
#            src = ...;
#            ipkgName = "my-pkg";
#            idrisLibraries = [ ];
#          };
#        in {
#          lib = pkg.library { withSource = true; };
#          bin = pkg.executable;
#        }
#
{ src
, ipkgName
, version ? "unversioned"
, idrisLibraries # Other libraries built with buildIdris
, ... }@attrs:

let
  propagate = libs: lib.unique (lib.concatMap (nextLib: [nextLib] ++ nextLib.propagatedIdrisLibraries) libs);
  ipkgFileName = ipkgName + ".ipkg";
  idrName = "idris2-${idris2.version}";
  libSuffix = "lib/${idrName}";
  propagatedIdrisLibraries = propagate idrisLibraries;
  libDirs =
    (lib.makeSearchPath libSuffix propagatedIdrisLibraries) +
    ":${idris2}/${idrName}";
  supportDir = "${idris2}/${idrName}/lib";
  drvAttrs = builtins.removeAttrs attrs [
    "ipkgName"
    "idrisLibraries"
  ];

  sharedAttrs = drvAttrs // {
    pname = ipkgName;
    inherit version;
    src = src;
    nativeBuildInputs = [ idris2 makeWrapper ] ++ attrs.nativeBuildInputs or [];
    buildInputs = propagatedIdrisLibraries ++ attrs.buildInputs or [];

    IDRIS2_PACKAGE_PATH = libDirs;

    buildPhase = ''
      runHook preBuild
      idris2 --build ${ipkgFileName}
      runHook postBuild
    '';

    passthru = {
      inherit propagatedIdrisLibraries;
    };
  };

in {
  executable = stdenv.mkDerivation (sharedAttrs // {
    installPhase = ''
      runHook preInstall
      mkdir -p $out/bin
      scheme_app="$(find ./build/exec -name '*_app')"
      if [ "$scheme_app" = ''' ]; then
        mv -- build/exec/* $out/bin/
        chmod +x $out/bin/*
        # ^ remove after Idris2 0.8.0 is released. will be superfluous:
        # https://github.com/idris-lang/Idris2/pull/3189
      else
        cd build/exec/*_app
        rm -f ./libidris2_support.so
        for file in *.so; do
          bin_name="''${file%.so}"
          mv -- "$file" "$out/bin/$bin_name"
          wrapProgram "$out/bin/$bin_name" \
            --prefix LD_LIBRARY_PATH : ${supportDir} \
            --prefix DYLD_LIBRARY_PATH : ${supportDir}
        done
      fi
      runHook postInstall
    '';
  });

  library = { withSource ? false }:
    let installCmd = if withSource then "--install-with-src" else "--install";
    in stdenv.mkDerivation (sharedAttrs // {
      installPhase = ''
        runHook preInstall
        mkdir -p $out/${libSuffix}
        export IDRIS2_PREFIX=$out/lib
        idris2 ${installCmd} ${ipkgFileName}
        runHook postInstall
      '';
    });
}