aboutsummaryrefslogtreecommitdiffhomepage
path: root/spine.nix
blob: 0dc3f670d13f1e1ca40afc1754845e6e8ea598a3 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#!/usr/bin/env -S nix-build
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
  ldc ? pkgs.ldc,
  dub ? pkgs.dub
}:
#with import ./nix/mkDub.nix { inherit pkgs; };
with ( # mkDub.nix
  with stdenv;
  let
    # Filter function to remove the .dub package folder from src
    filterDub = name: type: let baseName = baseNameOf (toString name); in ! (
      type == "directory" && baseName == ".dub"
    );
    # Convert a GIT rev string (tag) to a simple semver version
    rev-to-version = builtins.replaceStrings ["v" "refs/tags/v"] ["" ""];
    dep2src = dubDep: pkgs.fetchgit { inherit (dubDep.fetch) url rev sha256 fetchSubmodules; };
    # Fetch a dependency (source only for now)
    fromDub = dubDep: mkDerivation rec {
      name = "${src.name}-${version}";
      version = rev-to-version dubDep.fetch.rev;
      nativeBuildInputs = [ ldc dub ];
      src = dep2src dubDep;
      buildPhase = ''
        runHook preBuild
        export HOME=$NIX_BUILD_TOP
        #export HOME=$PWD
        dub build -b=release
        runHook postBuild
      '';
      # outputs = [ "lib" ];
      # installPhase = ''
      #   runHook preInstall
      #   mkdir -p $out/bin
      #   runHook postInstall
      # '';
    };
    # Adds a local package directory (e.g. a git repository) to Dub
    dub-add-local = dubDep: "dub add-local ${(fromDub dubDep).src.outPath} ${rev-to-version dubDep.fetch.rev}";
    # The target output of the Dub package
    targetOf = package: "${package.targetPath or "."}/${package.targetName or package.name}";
    # Remove reference to build tools and library sources
    disallowedReferences = deps: [ ldc dub ] ++ builtins.map dep2src deps;
    removeExpr = refs: ''remove-references-to ${lib.concatMapStrings (ref: " -t ${ref}") refs}'';
  in {
    inherit fromDub;
    mkDubDerivation = lib.makeOverridable ({
      src,
      nativeBuildInputs ? [],
      dubJSON ? src + "/dub.json",
      selections ? src + "/nix/dub.selections.nix",
      deps ? import selections,
      passthru ? {},
      package ? lib.importJSON dubJSON,
      ...
    } @ attrs: stdenv.mkDerivation (attrs // {
      pname = package.name;
      nativeBuildInputs = [ ldc dub pkgs.removeReferencesTo ] ++ nativeBuildInputs;
      disallowedReferences = disallowedReferences deps;
      passthru = passthru // {
        inherit dub ldc pkgs;
      };
      src = lib.cleanSourceWith {
        filter = filterDub;
        src = lib.cleanSource src;
      };
      preFixup = ''
        find $out/bin -type f -exec ${removeExpr (disallowedReferences deps)} '{}' + || true
      '';
      buildPhase = ''
        runHook preBuild
        export HOME=$PWD
        ${lib.concatMapStringsSep "\n" dub-add-local deps}
        dub build --compiler=ldc2 --build=release --combined --skip-registry=all
        runHook postBuild
      '';
      checkPhase = ''
        runHook preCheck
        export HOME=$PWD
        ${lib.concatMapStringsSep "\n" dub-add-local deps}
        dub test --combined --skip-registry=all
        runHook postCheck
      '';
      installPhase = ''
        runHook preInstall
        mkdir -p $out/bin
        cp -r "${targetOf package}" $out/bin
        runHook postInstall
      '';
      meta = lib.optionalAttrs (package ? description) {
        description = package.description;
      } // attrs.meta or {};
    } // lib.optionalAttrs (!(attrs ? version)) {
      # Use name from dub.json, unless pname and version are specified
      name = package.name;
    }));
  }
);
mkDubDerivation rec {
  name = "spine-${version}";
  version = "0.11.1";
  src = ./.;
  buildInputs = [
    pkgs.sqlite
    (
      let
        dub2nix-src = fetchTarball {
          url = "https://github.com/lionello/dub2nix/archive/master.tar.gz";
        };
        dub2nix = (import dub2nix-src) { inherit pkgs; };
      in
      with pkgs; [
        nixFlakes
        dub
        ldc
        sqlite
        nix-prefetch-git
        validatePkgConfig
      ]
    )
  ];
  shellHook = ''
    # nix-build -I nixpkgs=<provide local nix path>
    nix-build
    echo "built spine"
  '';
  installPhase = ''
    install -m755 -D spine $out/bin/spine
    echo "built $out/bin/spine"
  '';
  meta = with stdenv.lib; {
    homepage = http://sisudoc.org;
    description = "a sisu like document parser";
    license = licenses.agpl3Plus;
    platforms = platforms.linux;
    maintainers = [ RalphAmissah ];
  };
}