nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 lib,
3 stdenv,
4 fetchurl,
5 fetchgit,
6 linkFarm,
7 dub,
8 ldc,
9 removeReferencesTo,
10}:
11
12# See https://nixos.org/manual/nixpkgs/unstable#dlang for more detailed usage information
13
14{
15 # A lockfile generated by `dub-to-nix` from the source of the package.
16 # Can be either a path to the file, or an attrset already parsed with `lib.importJSON`.
17 dubLock,
18 # The build type to pass to `dub build` as a value for the `--build=` flag.
19 dubBuildType ? "release",
20 # The flags to pass to `dub build` and `dub test`.
21 dubFlags ? [ ],
22 # The flags to pass to `dub build`.
23 dubBuildFlags ? [ ],
24 # The flags to pass to `dub test`.
25 dubTestFlags ? [ ],
26 # The D compiler to be used by `dub`.
27 compiler ? ldc,
28 ...
29}@args:
30
31let
32 makeDubDep =
33 {
34 pname,
35 version,
36 sha256,
37 }:
38 {
39 inherit pname version;
40 src = fetchurl {
41 name = "dub-${pname}-${version}.zip";
42 url = "mirror://dub/${pname}/${version}.zip";
43 inherit sha256;
44 };
45 };
46
47 makeGitDep =
48 {
49 pname,
50 version,
51 repository,
52 sha256,
53 }:
54 {
55 inherit pname version;
56 src = fetchgit {
57 url = repository;
58 rev = version;
59 inherit sha256;
60 };
61 };
62
63 lockJson = if lib.isPath dubLock then lib.importJSON dubLock else dubLock;
64 depsRaw = lib.mapAttrsToList (pname: args: { inherit pname; } // args) lockJson.dependencies;
65
66 dubDeps = map makeDubDep (lib.filter (args: !(args ? repository)) depsRaw);
67 gitDeps = map makeGitDep (lib.filter (args: args ? repository) depsRaw);
68
69 # a directory with multiple single element registries
70 # one big directory with all .zip files leads to version parsing errors
71 # when the name of a package is a prefix of the name of another package
72 dubRegistryBase = linkFarm "dub-registry-base" (
73 map (dep: {
74 name = "${dep.pname}/${dep.pname}-${dep.version}.zip";
75 path = dep.src;
76 }) dubDeps
77 );
78
79 combinedFlags = "--skip-registry=all --compiler=${lib.getExe compiler} ${toString dubFlags}";
80 combinedBuildFlags = "${combinedFlags} --build=${dubBuildType} ${toString dubBuildFlags}";
81 combinedTestFlags = "${combinedFlags} ${toString dubTestFlags}";
82in
83stdenv.mkDerivation (
84 builtins.removeAttrs args [ "dubLock" ]
85 // {
86 strictDeps = args.strictDeps or true;
87
88 nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [
89 dub
90 compiler
91 removeReferencesTo
92 ];
93
94 configurePhase =
95 args.configurePhase or ''
96 runHook preConfigure
97
98 export DUB_HOME="$NIX_BUILD_TOP/.dub"
99 mkdir -p "$DUB_HOME"
100
101 # register dub dependencies
102 ${lib.concatMapStringsSep "\n" (dep: ''
103 dub fetch ${dep.pname}@${dep.version} --cache=user --skip-registry=standard --registry=file://${dubRegistryBase}/${dep.pname}
104 '') dubDeps}
105
106 # register git dependencies
107 ${lib.concatMapStringsSep "\n" (dep: ''
108 mkdir -p "$DUB_HOME/packages/${dep.pname}/${dep.version}"
109 cp -r --no-preserve=all ${dep.src} "$DUB_HOME/packages/${dep.pname}/${dep.version}/${dep.pname}"
110 '') gitDeps}
111
112 runHook postConfigure
113 '';
114
115 buildPhase =
116 args.buildPhase or ''
117 runHook preBuild
118
119 dub build ${combinedBuildFlags}
120
121 runHook postBuild
122 '';
123
124 doCheck = args.doCheck or false;
125
126 checkPhase =
127 args.checkPhase or ''
128 runHook preCheck
129
130 dub test ${combinedTestFlags}
131
132 runHook postCheck
133 '';
134
135 preFixup = ''
136 ${args.preFixup or ""}
137
138 find "$out" -type f -exec remove-references-to -t ${compiler} '{}' +
139 '';
140
141 disallowedReferences = [ compiler ];
142
143 meta = {
144 platforms = dub.meta.platforms;
145 }
146 // args.meta or { };
147 }
148)