llvmPackages_19.libclc: fix cross compilation (#366701)
[NixPkgs.git] / pkgs / build-support / dlang / builddubpackage / default.nix
blob31454d5cd69bf7c426446d0580afdfc34fcfef51
2   lib,
3   stdenv,
4   fetchurl,
5   fetchgit,
6   linkFarm,
7   dub,
8   ldc,
9   removeReferencesTo,
12 # See https://nixos.org/manual/nixpkgs/unstable#dlang for more detailed usage information
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:
31 let
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     };
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     };
63   lockJson = if lib.isPath dubLock then lib.importJSON dubLock else dubLock;
64   depsRaw = lib.mapAttrsToList (pname: args: { inherit pname; } // args) lockJson.dependencies;
66   dubDeps = map makeDubDep (lib.filter (args: !(args ? repository)) depsRaw);
67   gitDeps = map makeGitDep (lib.filter (args: args ? repository) depsRaw);
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   );
79   combinedFlags = "--skip-registry=all --compiler=${lib.getExe compiler} ${toString dubFlags}";
80   combinedBuildFlags = "${combinedFlags} --build=${dubBuildType} ${toString dubBuildFlags}";
81   combinedTestFlags = "${combinedFlags} ${toString dubTestFlags}";
83 stdenv.mkDerivation (
84   builtins.removeAttrs args [ "dubLock" ]
85   // {
86     strictDeps = args.strictDeps or true;
88     nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [
89       dub
90       compiler
91       removeReferencesTo
92     ];
94     configurePhase =
95       args.configurePhase or ''
96         runHook preConfigure
98         export DUB_HOME="$NIX_BUILD_TOP/.dub"
99         mkdir -p "$DUB_HOME"
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}
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}
112         runHook postConfigure
113       '';
115     buildPhase =
116       args.buildPhase or ''
117         runHook preBuild
119         dub build ${combinedBuildFlags}
121         runHook postBuild
122       '';
124     doCheck = args.doCheck or false;
126     checkPhase =
127       args.checkPhase or ''
128         runHook preCheck
130         dub test ${combinedTestFlags}
132         runHook postCheck
133       '';
135     preFixup = ''
136       ${args.preFixup or ""}
138       find "$out" -type f -exec remove-references-to -t ${compiler} '{}' +
139     '';
141     disallowedReferences = [ compiler ];
143     meta = {
144       platforms = dub.meta.platforms;
145     } // args.meta or { };
146   }