aboutsummaryrefslogtreecommitdiffhomepage
path: root/spine.nix
blob: 0c0cf88b9332a447f1fcca5da97a9722ebed4404 (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
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/env -S nix-build
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
  ldc ? null,
  dcompiler ? pkgs.ldc,
  dub ? pkgs.dub
}:
assert dcompiler != null;
#with import ./nix/mkDub.nix { inherit pkgs; };
with ( # mkDub.nix
  assert dcompiler != null;
  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 = [ dcompiler 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: [ dcompiler 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 = [ dcompiler dub pkgs.removeReferencesTo ] ++ nativeBuildInputs;
      disallowedReferences = disallowedReferences deps;
      passthru = passthru // {
        inherit dub dcompiler 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}
        for dc_ in dmd ldmd2 gdmd; do
          echo "- check for D compiler $dc_"
          dc=$(type -P $dc_ || echo "")
          if [ ! "$dc" == "" ]; then
            break
          fi
        done
        if [ "$dc" == "" ]; then
          exit "Error: could not find D compiler"
        fi
        echo "$dc_ used as D compiler to build $pname"
        dub build --compiler=$dc --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.2";
  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
        rund
        dub
        ldc
        sqlite
        nix-prefetch-git
        validatePkgConfig
        jq
      ]
    )
  ];
  # buildPhase = [ ];
  installPhase = ''
    install -m755 -D spine $out/bin/spine
    echo "built $out/bin/spine"
  '';
  meta = with pkgs.lib; {
    homepage = http://sisudoc.org;
    description = "a sisu like document parser";
    license = licenses.agpl3Plus;
    platforms = platforms.linux;
    maintainers = [ RalphAmissah ];
  };
}