Files
nixpkgs/doc/languages-frameworks/dlang.section.md
Emily b5a4a0a6cc {gdc,gdmd}: drop
GDC 11 was the last version that could bootstrap without a D compiler,
and GDC don’t offer their own binaries any more. GCC 11 is now
end‐of‐life and being removed (as is GCC 12, even).

It’s possible that we could use another distribution’s binary
packages to bootstrap this, or go via our DMD package (it’s
apparently not possible to bootstrap GDC with LDC, but I’m not sure
about DMD), but as nobody has worked on it in the three years since
GCC 12 came out, it seems like interest is limited, and it’s more
of a yak shave than I’m up for right now.

A full from‐source bootstrap chain would of course be nice, but is
more the realm of the minimal bootstrap work than something we’d
want to keep GCC 11 around in the main package set indefinitely for.
2025-08-22 23:01:59 +01:00

2.4 KiB

D (Dlang)

Nixpkgs provides multiple D compilers such as ldc and dmd. These can be used like any other package during build time.

However, Nixpkgs provides a build helper for compiling packages using the dub package manager.

Here's an example:

{
  lib,
  buildDubPackage,
  fetchFromGitHub,
  ncurses,
  zlib,
}:

buildDubPackage rec {
  pname = "btdu";
  version = "0.5.1";

  src = fetchFromGitHub {
    owner = "CyberShadow";
    repo = "btdu";
    tag = "v${version}";
    hash = "sha256-3sSZq+5UJH02IO0Y1yL3BLHDb4lk8k6awb5ZysBQciE=";
  };

  # generated by dub-to-nix, see below
  dubLock = ./dub-lock.json;

  buildInputs = [
    ncurses
    zlib
  ];

  installPhase = ''
    runHook preInstall
    install -Dm755 btdu -t $out/bin
    runHook postInstall
  '';
}

Note that you need to define installPhase because dub doesn't know where files should go in $out.

Also note that running dub test is disabled by default. You can enable it by setting doCheck = true.

Lockfiles

Nixpkgs has its own lockfile format for dub dependencies, because dub's official "lockfile" format (dub.selections.json) is not hash based.

A lockfile can be generated using the dub-to-nix helper package.

  • Firstly, install dub-to-nix into your shell session by running nix-shell -p dub-to-nix
  • Then navigate to the root of the source of the program you want to package
  • Finally, run dub-to-nix and it will print the lockfile to stdout. You could pipe stdout into a text file or just copy the output manually into a file.

buildDubPackage parameters

The buildDubPackage function takes an attrset of parameters that are passed on to stdenv.mkDerivation.

The following parameters are specific to buildDubPackage:

  • dubLock: 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. The latter useful if the package uses dub dependencies not already in the lockfile. (e.g. if the package calls dub run some-dub-package manually)
  • dubBuildType ? "release": The build type to pass to dub build as a value for the --build= flag.
  • dubFlags ? []: The flags to pass to dub build and dub test.
  • dubBuildFlags ? []: The flags to pass to dub build.
  • dubTestFlags ? []: The flags to pass to dub test.
  • compiler ? ldc: The D compiler to be used by dub.