1# D (Dlang) {#dlang} 2 3Nixpkgs provides multiple D compilers such as `ldc` and `dmd`. 4These can be used like any other package during build time. 5 6However, Nixpkgs provides a build helper for compiling packages using the `dub` package manager. 7 8Here's an example: 9```nix 10{ 11 lib, 12 buildDubPackage, 13 fetchFromGitHub, 14 ncurses, 15 zlib, 16}: 17 18buildDubPackage rec { 19 pname = "btdu"; 20 version = "0.5.1"; 21 22 src = fetchFromGitHub { 23 owner = "CyberShadow"; 24 repo = "btdu"; 25 tag = "v${version}"; 26 hash = "sha256-3sSZq+5UJH02IO0Y1yL3BLHDb4lk8k6awb5ZysBQciE="; 27 }; 28 29 # generated by dub-to-nix, see below 30 dubLock = ./dub-lock.json; 31 32 buildInputs = [ 33 ncurses 34 zlib 35 ]; 36 37 installPhase = '' 38 runHook preInstall 39 install -Dm755 btdu -t $out/bin 40 runHook postInstall 41 ''; 42} 43``` 44 45Note that you need to define `installPhase` because `dub` doesn't know where files should go in `$out`. 46 47Also note that running `dub test` is disabled by default. You can enable it by setting `doCheck = true`. 48 49## Lockfiles {#dub-lockfiles} 50Nixpkgs has its own lockfile format for `dub` dependencies, because `dub`'s official "lockfile" format (`dub.selections.json`) is not hash-based. 51 52A lockfile can be generated using the `dub-to-nix` helper package. 53* Firstly, install `dub-to-nix` into your shell session by running `nix-shell -p dub-to-nix`. 54* Then navigate to the root of the source of the program you want to package. 55* Finally, run `dub-to-nix`, and it will print the lockfile to stdout. You can pipe stdout into a text file or just copy the output manually into a file. 56 57## `buildDubPackage` parameters {#builddubpackage-parameters} 58 59The `buildDubPackage` function takes an attrset of parameters that are passed on to `stdenv.mkDerivation`. 60 61The following parameters are specific to `buildDubPackage`: 62 63* `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`. 64 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) 65* `dubBuildType ? "release"`: The build type to pass to `dub build` as a value for the `--build=` flag. 66* `dubFlags ? []`: The flags to pass to `dub build` and `dub test`. 67* `dubBuildFlags ? []`: The flags to pass to `dub build`. 68* `dubTestFlags ? []`: The flags to pass to `dub test`. 69* `compiler ? ldc`: The D compiler to be used by `dub`.