diff options
Diffstat (limited to 'pkgs/build-support/dlang/builddubpackage/default.nix')
-rw-r--r-- | pkgs/build-support/dlang/builddubpackage/default.nix | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/pkgs/build-support/dlang/builddubpackage/default.nix b/pkgs/build-support/dlang/builddubpackage/default.nix new file mode 100644 index 0000000000000..9295445b0f7c7 --- /dev/null +++ b/pkgs/build-support/dlang/builddubpackage/default.nix @@ -0,0 +1,124 @@ +{ + lib, + stdenv, + fetchurl, + linkFarm, + dub, + ldc, + removeReferencesTo, +}: + +# See https://nixos.org/manual/nixpkgs/unstable#dlang for more detailed usage information + +{ + # A lockfile generated by `dub-to-nix` from the source of the package. + # Can be either a path to the file, or an attrset already parsed with `lib.importJSON`. + dubLock, + # The build type to pass to `dub build` as a value for the `--build=` flag. + dubBuildType ? "release", + # The flags to pass to `dub build` and `dub test`. + dubFlags ? [ ], + # The flags to pass to `dub build`. + dubBuildFlags ? [ ], + # The flags to pass to `dub test`. + dubTestFlags ? [ ], + # The D compiler to be used by `dub`. + compiler ? ldc, + ... +}@args: + +let + makeDubDep = + { + pname, + version, + sha256, + }: + { + inherit pname version; + src = fetchurl { + name = "dub-${pname}-${version}.zip"; + url = "mirror://dub/${pname}/${version}.zip"; + inherit sha256; + }; + }; + + lockJson = if lib.isPath dubLock then lib.importJSON dubLock else dubLock; + + lockedDeps = lib.mapAttrsToList ( + pname: { version, sha256 }: makeDubDep { inherit pname version sha256; } + ) lockJson.dependencies; + + # a directory with multiple single element registries + # one big directory with all .zip files leads to version parsing errors + # when the name of a package is a prefix of the name of another package + dubRegistryBase = linkFarm "dub-registry-base" ( + map (dep: { + name = "${dep.pname}/${dep.pname}-${dep.version}.zip"; + path = dep.src; + }) lockedDeps + ); + + combinedFlags = "--skip-registry=all --compiler=${lib.getExe compiler} ${toString dubFlags}"; + combinedBuildFlags = "${combinedFlags} --build=${dubBuildType} ${toString dubBuildFlags}"; + combinedTestFlags = "${combinedFlags} ${toString dubTestFlags}"; +in +stdenv.mkDerivation ( + builtins.removeAttrs args [ "dubLock" ] + // { + strictDeps = args.strictDeps or true; + + nativeBuildInputs = args.nativeBuildInputs or [ ] ++ [ + dub + compiler + removeReferencesTo + ]; + + configurePhase = + args.configurePhase or '' + runHook preConfigure + + export DUB_HOME="$NIX_BUILD_TOP/.dub" + mkdir -p $DUB_HOME + + # register dependencies + ${lib.concatMapStringsSep "\n" (dep: '' + dub fetch ${dep.pname}@${dep.version} --cache=user --skip-registry=standard --registry=file://${dubRegistryBase}/${dep.pname} + '') lockedDeps} + + runHook postConfigure + ''; + + buildPhase = + args.buildPhase or '' + runHook preBuild + + dub build ${combinedBuildFlags} + + runHook postBuild + ''; + + doCheck = args.doCheck or false; + + checkPhase = + args.checkPhase or '' + runHook preCheck + + dub test ${combinedTestFlags} + + runHook postCheck + ''; + + preFixup = '' + ${args.preFixup or ""} + + find "$out" -type f -exec remove-references-to -t ${compiler} '{}' + + ''; + + disallowedReferences = [ compiler ]; + + meta = { + platforms = dub.meta.platforms; + } // args.meta or { }; + } +) |