-*- mode: org -*-
#+TITLE:       D nix, dev shells with overlays
#+DESCRIPTION: dlang related nixpkgs of interest (dlang compilers & tools)
#+FILETAGS:    :nixos:nixpkgs:dlang:compiler:
#+AUTHOR:      Ralph Amissah
#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
#+COPYRIGHT:   Copyright (C) 2023 Ralph Amissah
#+LICENSE:     Boost Software License 1.0
#+LANGUAGE:    en
#+STARTUP:     show3levels hideblocks hidestars noindent entitiespretty
#+PROPERTY:    header-args  :exports code
#+PROPERTY:    header-args+ :noweb yes
#+PROPERTY:    header-args+ :results no
#+PROPERTY:    header-args+ :cache no
#+PROPERTY:    header-args+ :padline no
#+PROPERTY:    header-args+ :mkdirp yes
#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t

* nix ( written to ../ )
** check updates CHECK

- https://github.com/nix-community/nix-direnv/releases
- https://github.com/dlang/dmd/tags
- https://github.com/ldc-developers/ldc/releases
- https://github.com/dlang/dub/releases
- https://github.com/dlang/tools/tags

** README

#+HEADER: :tangle "../README"
#+BEGIN_SRC org
-*- mode: org -*-
,#+TITLE:       D related overlays
,#+DESCRIPTION: ldc, dub, dtools: dlang compiler build tool and tools
,#+FILETAGS:    :dlang:build:tools:
,#+AUTHOR:      Ralph Amissah
,#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
,#+COPYRIGHT:   Copyright (C) 2022 - 2024 Ralph Amissah
,#+LANGUAGE:    en
,#+STARTUP:     content hideblocks hidestars noindent entitiespretty

,* README for D related dev shells with overlays
,** in emacs write (tangle) this (org) file for its output

This org file: "dlang-nix-flakes.org" when using emacs and saved (tangling output)
it creates and writes output to the subdirectory path:

  ..

and writes output there, this is to prevent accidentally writing over anything
in the directory in which the dlang-nix-flakes.org file happens to be saved.

.. becomes your nix flake work directory.

,** dlang-nix-flakes.org

the file dlang-nix-flakes.org contains nix related files for producing more
recent versions of the dlang compiler and build tools: ldc, dub and dtools, than
exist in nixpkgs at the time of publishing, in some cases with additional fixes.

.envrc files

nix control files
  - default.nix
  - shell.nix
  - flake.nix

nix overlays for (updates nixpkgs, more recent versions of):
  - ldc     ( 1.30.0 -> <<ldc_version>> )
  - dub     ( 1.23.0 -> <<dub_version>> ) [for nix versions 1.31.0 ... 1.33.0 broken]
  - dtools  ( 2.095.1 -> <<dtools_version>> )

  - dmd     ( 2.100.2 -> <<dmd_version>> )
  - gdc     [not yet available]

(updates nixpkgs circa 2023-05-12)

dlang-nix-flakes.org --❯
  .
  └── dlang-nix-flakes
      ├── #default.nix
      ├── flake.lock
      ├── flake.nix
      ├── README
      ├── shell.nix
      └── nix-overlays
          ├── dmd [not working]
          │   ├── binary.nix
          │   ├── bootstrap.nix
          │   ├── default.nix
          │   └── generic.nix
          ├── dtools
          │   └── default.nix
          ├── dub
          │   └── default.nix
          └── ldc
              ├── binary.nix
              ├── bootstrap.nix
              ├── default.nix
              └── generic.nix

search nixpkgs here:

- https://search.nixos.org/packages?channel=unstable&from=0&size=100&sort=relevance&query=

,** compilers
,*** ldc OK ✓ ( 1.30.0 -> <<ldc_version>> )

- https://wiki.dlang.org/LDC

- https://github.com/ldc-developers/ldc
  - https://github.com/ldc-developers/ldc/releases
    nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v<<ldc_version>>.tar.gz
  - https://github.com/ldc-developers/ldc/issues

- version in nixpkgs:
  - https://search.nixos.org/packages?channel=unstable&show=ldc&from=0&size=100&sort=relevance&type=packages&query=ldc

,*** dmd OK ✓ ( 2.100.2 -> <<dmd_version>> )

- https://dlang.org/
  - https://wiki.dlang.org/LDC

- https://github.com/dlang/dmd
  - https://github.com/dlang/dmd/tags
    nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v<<dmd_version>>.tar.gz
  - https://github.com/dlang/dmd/pulls

- version in nixpkgs:
  - https://search.nixos.org/packages?channel=unstable&show=dmd&from=0&size=100&sort=relevance&type=packages&query=dmd

- dmd nixpkg modified and appears to build ok, but it appears my overlay does
  not get things right REVIEW

- dmd on nixos FAILS to build (my working projects), appears not to find parts
  of itself

,*** gdc ( not provided yet with gcc12 in nixpkgs )

not yet provided in nixpkgs with gcc12, no attempt made

- https://wiki.dlang.org/GDC
  - https://wiki.dlang.org/GDC_Development

- https://github.com/D-Programming-GDC/gdc

,** build tool
,*** dub ( 1.23.0 -> <<dub_version>> )

- https://code.dlang.org/packages/dub

- https://github.com/dlang/dub
  - https://github.com/dlang/dub/releases
    nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v<<dub_version>>.tar.gz
  - https://github.com/dlang/dub/issues

- version in nixpkgs:
  - https://search.nixos.org/packages?channel=unstable&show=dub&from=0&size=100&sort=relevance&type=packages&query=dub

- dub nixpkg overlay is updated and runs most dub tests correctly

- dub OK ✓ ( 1.30.0 -> <<dub_version>> )

  from v1.31.0 requires seeting of pwd in buildPhase else fails to build
  packages with nix tools that previous version of dub built;

,** tools
,*** dtools OK ✓ ( 2.095.1 -> <<dtools_version>> )

- https://code.dlang.org/packages/dtools

- https://github.com/dlang/tools
  - https://github.com/dlang/tools/tags
    nix-prefetch --unpack https://github.com/dlang/tools/archive/refs/tags/v<<dtools_version>>.tar.gz
  - https://github.com/dlang/tools/issues

- version in nixpkgs
  - https://search.nixos.org/packages?channel=unstable&show=dtools&from=0&size=100&sort=relevance&type=packages&query=dtools

,** nixpkgs

It is possible to work directly against a local copy of nixpkgs. To do so you
would clone nixpkgs and point to the local nixpkgs as your build source.

git clone --depth=1 --branch master https://github.com/nixos/nixpkgs nixpkgs

- ./nixpkgs/pkgs/development/compilers/ldc
- ./nixpkgs/pkgs/development/compilers/dmd
- ./nixpkgs/pkgs/development/tools/build-managers/dub
- ./nixpkgs/pkgs/development/tools/dtools

- ./nixpkgs/pkgs/development/compilers/gcc

Note the overlays if copied to the nixpkgs path locations should work as they do
in the overlay, with a pointer to the cloned nixpkgs as nixpkgs repository
source. In fact the starting point for the overlays was to take verbatim what
was in nixpkgs and then to update and fix where necessary those packages.

It is possible to compare the changes made by the overlays here directly against
what is currently available in nixpkgs.

- https://search.nixos.org/packages?channel=unstable&size=100&sort=relevance&query=

nix flake update && nix flake check --show-trace && nix flake info && echo "" && nix flake show
  │
  ├───devShells
  │   └───x86_64-linux
  │       ├───default: development environment 'nix-shell'
  │       ├───dsh-nixpkgs-ldc-dub: development environment 'nixpkgs---ldc---dub'
  │       ├───dsh-overlay-dmd-dub: development environment 'overlay---dmd-2.104.0---dub-1.30.0---broken'
  │       ├───dsh-overlay-dtest-tilix: development environment 'overlay---ldc-1.32.2---dub-1.30.0---tilix---gtkd'
  │       ├───dsh-overlay-dtools: development environment 'overlay---ldc-1.32.2---dub-1.30.0---dtools-2.103.1'
  │       └───dsh-overlay-ldc-dub: development environment 'overlay---ldc-1.32.2---dub-1.30.0'
  └───packages
      └───x86_64-linux
          ├───check-local-dir-build: package 'dummy-0.1.0'
          ├───check-tilix: package 'tilix-1.9.5'
          └───default: package 'tilix-1.9.5'

#+END_SRC

** .gitignore

#+HEADER: :tangle "../.gitignore"
#+BEGIN_SRC sh
# git ls-files --others --exclude-from=.git/info/exclude
# git check-ignore -v flake.lock
# git clean -ix
# find . -name "*_" | xargs rm -rf
# find . -name "*.o" | xargs rm -rf
,*
!.gitignore
!nixDevEnv.sh
!.envrc
!.envrc-local
!.envrc-nix
!flake.nix
!flake.lock
!nix-overlays
!nix-overlays/**
!shell.nix
!makefile
!justfile
!README
!*.nix
!*.json
!*.org
!org/
!org/*.org
!*.sh
!*.d
!*.txt
!src
!src/**
!views

# EXCLUDED Files & directories - ensure excluded
.dub/**
tmp/**
,*_.org
,*_.nix
,*_.d
,*_.txt
,*_
,*.swp
,*~
,*.\#*
\#*
#+END_SRC

** .env*
*** .envrc

#+HEADER: :tangle "../nixDevEnv.sh"
#+BEGIN_SRC sh
if [ -f .envrc ]; then
  source_env_if_exists .envrc || source .envrc
fi
#+END_SRC

#+HEADER: :tangle "../.envrc"
#+BEGIN_SRC sh
if [ -f .envrc-local ]; then
  source_env_if_exists .envrc-local || source .envrc-local
fi
if [ -f .envrc-nix ]; then
  source_env_if_exists .envrc-nix || source .envrc-nix
fi
#+END_SRC

*** .envrc-local

#+HEADER: :tangle "../.envrc-local"
#+BEGIN_SRC sh
#if [[ !( -f ./nix-flakes.org) && -f ../dlang-nix-flakes.org ]]; then
#  # for editing purpose link to the .org file that creates ./dlang-nix-flakes/ content
#  ln -s ../dlang-nix-flakes.org ./nix-flakes.org
#fi
if [[ ! -d ./.git ]]; then
  git init
  git add .
fi
#eval "$(nix print-dev-env)"
#+END_SRC

*** .envrc-nix

- https://github.com/nix-community/nix-direnv
- https://github.com/nix-community/nix-direnv/releases
  - source_url
    - direnv fetchurl "https://raw.githubusercontent.com/nix-community/nix-direnv/<<direnv-version>>/direnvrc" "<<direnv-sha>>"
    - ${NixDirEnvVersion}

#+HEADER: :tangle "../.envrc-nix"
#+BEGIN_SRC sh
NIX_ENFORCE_PURITY=1
# - https://github.com/nix-community/nix-direnv
NixDirEnvVersion="<<direnv-version>>"
NixDirEnvSHA="<<direnv-sha>>"
if ! has nix_direnv_version || ! nix_direnv_version ${NixDirEnvVersion}; then
  source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/${NixDirEnvVersion}/direnvrc" "${NixDirEnvSHA}"
fi
watch_file flake.lock
watch_file flake.nix
watch_file shell.nix
watch_file makefile
watch_file nixDevEnv.sh
watch_file .envrc-local
watch_file .envrc-nix
nix flake update
nix flake check
nix flake show
echo ""
PATH_add result/bin
use flake .
#use flake .#default
#+END_SRC

*** 3.0.6

#+NAME: direnv-version
#+BEGIN_SRC sh
3.0.6
#+END_SRC

#+NAME: direnv-sha
#+BEGIN_SRC sh
sha256-RYcUJaRMf8oF5LznDrlCXbkOQrywm0HDv1VjYGaJGdM=
#+END_SRC

*** 3.0.4

#+BEGIN_SRC sh
3.0.4
#+END_SRC

#+BEGIN_SRC sh
sha256-DzlYZ33mWF/Gs8DDeyjr8mnVmQGx7ASYqA5WlxwvBG4=
#+END_SRC

*** 3.0.0

#+BEGIN_SRC sh
3.0.0
#+END_SRC

#+BEGIN_SRC sh
sha256-21TMnI2xWX7HkSTjFFri2UaohXVj854mgvWapWrxRXg=
#+END_SRC

*** 2.4.0

#+BEGIN_SRC sh
2.4.0
#+END_SRC

#+BEGIN_SRC sh
sha256-XQzUAvL6pysIJnRJyR7uVpmUSZfc7LSgWQwq/4mBr1U=
#+END_SRC

#+BEGIN_SRC sh
2.3.0
#+END_SRC

#+BEGIN_SRC sh
sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8=
#+END_SRC

#+NAME: direnv-sha_
#+BEGIN_SRC sh
sha256-0000000000000000000000000000000000000000000=
#+END_SRC

#+BEGIN_SRC sh
- https://github.com/nix-community/nix-direnv
NixDirEnvSHA="sha256-0000000000000000000000000000000000000000000="
direnv fetchurl https://raw.githubusercontent.com/nix-community/nix-direnv/${NixDirEnvVersion}/direnvrc
#+END_SRC

** .nix
*** flake.nix

#+HEADER: :tangle "../flake.nix"
#+BEGIN_SRC nix
{
  description = "build dummy D package using dub build tool";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";
  outputs = {
    self,
    nixpkgs,
    flake-utils,
    ...
  }@inputs: let
    pname = "dummy";
    version = "0.1.0";
    shell = ./shell.nix;
    devEnv = ./nixDevEnv.sh; # ./.envrc;
    supportedSystems = ["x86_64-linux"]; # [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];
    forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
    nixpkgsFor = forAllSystems (system: import nixpkgs {inherit system;});
    checkPhase = ''
      runHook preCheck
      #dub test --combined --skip-registry=all
      runHook postCheck
    '';
    localOverlay = (final: prev: {
      ldc = prev.callPackage ./nix-overlays/ldc {  };       # -> ok <<ldc_version>>
      dmd = prev.callPackage ./nix-overlays/dmd {  };       # -> ok <<dmd_version>>
      dub = prev.callPackage ./nix-overlays/dub {  };       # -> ? <<dub_version>>
      dtools = prev.callPackage ./nix-overlays/dtools {  }; # -> ok <<dtools_version>>
      #gdc = prev.callPackage ./nix-overlays/gdc {  };      # empty
    });
    pkgsForSystem = system: import nixpkgs {
      overlays = [
        localOverlay
      ];
      inherit system;
    };
    installPhase = ''
      runHook preInstall
      mkdir -p $out/bin
      install -m755 ./bin/dummy $out/bin/dummy
      runHook postInstall
    '';
    postInstall = ''
      echo `ls -la $out/bin/dummy`
      $out/bin/dummy -v
    '';
  in {
    packages = forAllSystems (system: let
      pkgs-ovl = pkgsForSystem system;
      pkgs-nix = nixpkgsFor.${system};
    in
      with pkgs-ovl; {
        default = tilix;
        check-tilix = tilix;
        check-local-dir-build = stdenv.mkDerivation {
          inherit pname;
          inherit version;
          meta.mainProgram = "dummy";
          executable = true;
          src = self;
          inherit shell;
          inherit devEnv;
          buildInputs = [sqlite];
          nativeBuildInputs = [dub ldc gnumake]; # [ dub dmd ]; [ dub ldc ]; [ dub gdc ];
          buildPhase = ''
            runHook preBuild
            for DC_ in dmd ldmd2 ldc2 gdc gdmd; do
              echo "- check for D compiler $DC_"
              DC=$(type -P $DC_ || echo "")
              if [ ! "$DC" == "" ]; then break; fi
            done
            if [ "$DC" == "" ]; then exit "Error: could not find D compiler"; fi
            echo "$DC_ used as D compiler to build $pname"
            dub build --cache=local --compiler=$DC --build=$DC_ --combined --skip-registry=all
            runHook postBuild
          '';
          inherit checkPhase;
          inherit installPhase;
          inherit postInstall;
        };
      });
    devShells = forAllSystems (system: let
      pkgs-ovl = pkgsForSystem system;
      pkgs-nix = nixpkgsFor.${system};
      shellHook = ''
      '';
    in
      with pkgs-ovl; {
        dsh-overlay-dtools = mkShell {
          name = "overlay - ldc-<<ldc_version>> - dub-<<dub_version>> - dtools-<<dtools_version>>";
          inherit shell;
          inherit devEnv;
          packages = [
            gnumake
            ldc
            dub
            dtools
          ];
          inherit shellHook;
        };
        dsh-overlay-ldc-dub = mkShell {
          name = "overlay - ldc-<<ldc_version>> - dub-<<dub_version>>";
          inherit shell;
          inherit devEnv;
          packages = [
            gnumake
            ldc
            dub
          ];
          inherit shellHook;
        };
        dsh-overlay-dmd-dub = mkShell {
          name = "overlay - dmd-<<dmd_version>> - dub-<<dub_version>>";
          inherit shell;
          inherit devEnv;
          packages = [
            gnumake
            dmd
            dub
          ];
          inherit shellHook;
        };
        dsh-overlay-dtest-tilix = mkShell {
          name = "overlay - ldc-<<ldc_version>> - dub-<<dub_version>> - tilix - gtkd";
          inherit shell;
          inherit devEnv;
          packages = [
            gnumake
            ldc
            gtkd
            tilix
            dub
          ];
          inherit shellHook;
        };
        #dsh-overlay-gdc = mkShell {
        #  name = "dub + gdc dev shell";
        #  inherit shell;
        #  inherit devEnv;
        #  packages = [
        #    gnumake
        #    gdc
        #    dub
        #  ];
        #  inherit shellHook;
        #};
        dsh-nixpkgs-ldc-dub = mkShell {
          name = "nixpkgs - ldc - dub";
          inherit shell;
          inherit devEnv;
          packages = with pkgs-nix; [
            ldc
            dub
            gnumake
          ];
          inherit shellHook;
        };
        dsh-nixpkgs-dmd-dub = mkShell {
          name = "nixpkgs - ldc - dub";
          inherit shell;
          inherit devEnv;
          packages = with pkgs-nix; [
            dmd
            dub
            gnumake
          ];
          inherit shellHook;
        };
        default = import ./shell.nix {inherit pkgs-nix;};
      });
  };
}
#+END_SRC

*** shell.nix

#+HEADER: :tangle "../shell.nix"
#+HEADER: :tangle-mode (identity #o755)
#+HEADER: :shebang "#!/usr/bin/env -S nix-shell --pure\n#!nix-shell -i bash"
#+HEADER: :noweb yes
#+BEGIN_SRC nix
{pkgs-nix ? import <nixpkgs> {}}:
with pkgs-nix;
  mkShell {
    buildInputs = [
      # ❯❯❯ nix_related
      #nix
      direnv
      nixVersions.latest #nixVersions.latest #nixVersions.git
      nix-prefetch-git
      validatePkgConfig
      nix-output-monitor
      #nix-tree
      #nvd
      jq #gx
      #alejandra
      git
      # ❯❯❯ dev
      gnumake
      ps
      # ❯❯❯ d_build_related
      # ❯❯ compiler
      #dmd
      #ldc
      #rund
      # ❯❯ package manager
      #dub
      # ❯❯ linker
      #lld
      #mold
      # ❯❯ builder
      #ninja
      #meson
      # ❯❯ tools
      #dub
      #dtools
      # ❯❯❯ test
      #tilix
      #gtkd
    ];
    shellHook = ''
      #echo '
      #  shell.nix echo ❯❯
      #  ❯❯ nix flake update && nix flake check --show-trace && nix flake show && nix develop ".#devShell" -c $SHELL
      #'
    '';
  }
#+END_SRC

*** default.nix

will automatically build the default development shell, perhaps unecessary

#+HEADER: :tangle-NO "../default.nix"
#+HEADER: :tangle-mode (identity #o755)
#+HEADER: :shebang "#!/usr/bin/env -S nix-build"
#+BEGIN_SRC nix
{pkgs ? import <nixpkgs> {}}:
pkgs.callPackage ./shell.nix {}
#+END_SRC

* nixpkgs overlays ( written to ../nix-overlays/ )
** ldc OK ✓
*** info
**** links

- https://wiki.dlang.org/LDC

- https://github.com/ldc-developers/ldc
  - https://github.com/ldc-developers/ldc/releases
  - https://github.com/ldc-developers/ldc/issues

- version in nixpkgs:
  - https://search.nixos.org/packages?channel=unstable&show=ldc&from=0&size=100&sort=relevance&type=packages&query=ldc

**** notes

- OK ldc 1.32.2 tested

*** overlays
**** default.nix OK ✓

#+HEADER: :tangle "../nix-overlays/ldc/default.nix"
#+BEGIN_SRC nix
import ./generic.nix {
  <<ldc_version_info>>
}
#+END_SRC

**** generic.nix OK ✓ (unaltered)

#+HEADER: :tangle "../nix-overlays/ldc/generic.nix"
#+BEGIN_SRC nix
{ version, sha256 }:
{ lib, stdenv, fetchurl, cmake, ninja, <<ldc_llvm_set>>, curl, tzdata
, libconfig, lit, gdb, unzip, darwin, bash
, callPackage, makeWrapper, runCommand, targetPackages
, ldcBootstrap ? callPackage ./bootstrap.nix { }
}:

let
  pathConfig = runCommand "ldc-lib-paths" {} ''
    mkdir $out
    echo ${tzdata}/share/zoneinfo/ > $out/TZDatabaseDirFile
    echo ${curl.out}/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} > $out/LibcurlPathFile
  '';

in

stdenv.mkDerivation rec {
  pname = "ldc";
  inherit version;

  src = fetchurl {
    url = "https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz";
    inherit sha256;
  };

  # https://issues.dlang.org/show_bug.cgi?id=19553
  hardeningDisable = [ "fortify" ];

  postUnpack = ''
    patchShebangs .
  ''
  + ''
      rm ldc-${version}-src/tests/dmd/fail_compilation/mixin_gc.d
      rm ldc-${version}-src/tests/dmd/runnable/xtest46_gc.d
      rm ldc-${version}-src/tests/dmd/runnable/testptrref_gc.d

      # test depends on current year
      rm ldc-${version}-src/tests/dmd/compilable/ddocYear.d
  ''
  + lib.optionalString stdenv.hostPlatform.isDarwin ''
      # https://github.com/NixOS/nixpkgs/issues/34817
      rm -r ldc-${version}-src/tests/plugins/addFuncEntryCall
  '';

  postPatch = ''
    # Setting SHELL=$SHELL when dmd testsuite is run doesn't work on Linux somehow
    #substituteInPlace tests/dmd/Makefile --replace "SHELL=/bin/bash" "SHELL=${bash}/bin/bash"
  ''
  + lib.optionalString stdenv.hostPlatform.isLinux ''
      substituteInPlace runtime/phobos/std/socket.d --replace "assert(ih.addrList[0] == 0x7F_00_00_01);" ""
  ''
  + lib.optionalString stdenv.hostPlatform.isDarwin ''
      substituteInPlace runtime/phobos/std/socket.d --replace "foreach (name; names)" "names = []; foreach (name; names)"
  '';

  nativeBuildInputs = [
    cmake ldcBootstrap lit lit.python <<ldc_llvm_set>>.dev makeWrapper ninja unzip
  ]
  ++ lib.optionals stdenv.hostPlatform.isDarwin [
    darwin.apple_sdk.frameworks.Foundation
  ]
  ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
    # https://github.com/NixOS/nixpkgs/pull/36378#issuecomment-385034818
    gdb
  ];

  buildInputs = [ curl tzdata ];

  cmakeFlags = [
    "-DD_FLAGS=-d-version=TZDatabaseDir;-d-version=LibcurlPath;-J${pathConfig}"
  ];

  postConfigure = ''
    export DMD=$PWD/bin/ldmd2
  '';

  makeFlags = [ "DMD=$DMD" ];

  fixNames = lib.optionalString stdenv.hostPlatform.isDarwin  ''
    fixDarwinDylibNames() {
      local flags=()

      for fn in "$@"; do
        flags+=(-change "$(basename "$fn")" "$fn")
      done

      for fn in "$@"; do
        if [ -L "$fn" ]; then continue; fi
        echo "$fn: fixing dylib"
        install_name_tool -id "$fn" "''${flags[@]}" "$fn"
      done
    }

    fixDarwinDylibNames $(find "$(pwd)/lib" -name "*.dylib")
    export DYLD_LIBRARY_PATH=$(pwd)/lib
  '';

  # https://github.com/ldc-developers/ldc/issues/2497#issuecomment-459633746
  additionalExceptions = lib.optionalString stdenv.hostPlatform.isDarwin
    "|druntime-test-shared";

  checkPhase = ''
    # Build default lib test runners
    ninja -j$NIX_BUILD_CORES all-test-runners

    ${fixNames}

    # Run dmd testsuite
    export DMD_TESTSUITE_MAKE_ARGS="-j$NIX_BUILD_CORES DMD=$DMD"
    ctest -V -R "dmd-testsuite"

    # Build and run LDC D unittests.
    ctest --output-on-failure -R "ldc2-unittest"

    # Run LIT testsuite.
    ctest -V -R "lit-tests"

    # Run default lib unittests
    ctest -j$NIX_BUILD_CORES --output-on-failure -E "ldc2-unittest|lit-tests|dmd-testsuite${additionalExceptions}"
  '';

  postInstall = ''
    wrapProgram $out/bin/ldc2 \
        --prefix PATH ":" "${targetPackages.stdenv.cc}/bin" \
        --set-default CC "${targetPackages.stdenv.cc}/bin/cc"
   '';

  meta = with lib; {
    description = "The LLVM-based D compiler";
    homepage = "https://github.com/ldc-developers/ldc";
    # from https://github.com/ldc-developers/ldc/blob/master/LICENSE
    license = with licenses; [ bsd3 boost mit ncsa gpl2Plus ];
    maintainers = with maintainers; [ lionello jtbx ];
    platforms = [ "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
  };
}
#+END_SRC

**** bootstrap.nix

#+HEADER: :tangle "../nix-overlays/ldc/bootstrap.nix"
#+BEGIN_SRC nix
<<ldc_bootstrap_1-25-0>>
#+END_SRC

#+NAME: ldc_bootstrap_1-25-0
#+BEGIN_SRC nix
{ callPackage }:
callPackage ./binary.nix {
  version = "1.25.0";
  hashes = {
    # Get these from `nix-prefetch-url https://github.com/ldc-developers/ldc/releases/download/v1.19.0/ldc2-1.19.0-osx-x86_64.tar.xz` etc..
    osx-x86_64 = "sha256-6iKnbS+oalLKmyS8qYD/wS21b7+O+VgsWG2iT4PrWPU=";
    linux-x86_64 = "sha256-sfg47RdlsIpryc3iZvE17OtLweh3Zw6DeuNJYgpuH+o=";
    linux-aarch64  = "sha256-UDZ43x4flSo+SfsPeE8juZO2Wtk2ZzwySk0ADHnvJBI=";
    osx-arm64  = "sha256-O/x0vy0wwQFaDc4uWSeMhx+chJKqbQb6e5QNYf+7DCw=";
  };
}
#+END_SRC

#+NAME: ldc_bootstrap_1-30-0
#+BEGIN_SRC nix
{ callPackage }:
callPackage ./binary.nix {
  version = "1.30.0";
  hashes = {
    # Get these from `nix store prefetch-file https://github.com/ldc-developers/ldc/releases/download/v1.19.0/ldc2-1.19.0-osx-x86_64.tar.xz` etc..
    osx-x86_64 = "sha256-AAWZvxuZC82xvrW6fpYm783TY+H8k3DvqE94ZF1yjmk=";
    linux-x86_64 = "sha256-V4TUzEfQhFrwiX07dHOgjdAoGkzausCkhnQIQNAU/eE=";
    linux-aarch64  = "sha256-kTeglub75iv/jWWNPCn15aCGAbmck0RQl6L7bFOUu7Y=";
    osx-arm64  = "sha256-Nb/owBdIeroB9jLMDvwjo8bvsTC9vFyJPLMTOMsSAd4=";
  };
}
#+END_SRC

- this is the ldc bootstrap in current use, nixpkgs:

#+BEGIN_SRC nix
{ callPackage }:
callPackage ./binary.nix {
  version = "1.30.0";
  hashes = {
    # Get these from `nix store prefetch-file https://github.com/ldc-developers/ldc/releases/download/v1.19.0/ldc2-1.19.0-osx-x86_64.tar.xz` etc..
    osx-x86_64 = "sha256-AAWZvxuZC82xvrW6fpYm783TY+H8k3DvqE94ZF1yjmk=";
    linux-x86_64 = "sha256-V4TUzEfQhFrwiX07dHOgjdAoGkzausCkhnQIQNAU/eE=";
    linux-aarch64  = "sha256-kTeglub75iv/jWWNPCn15aCGAbmck0RQl6L7bFOUu7Y=";
    osx-arm64  = "sha256-Nb/owBdIeroB9jLMDvwjo8bvsTC9vFyJPLMTOMsSAd4=";
  };
}
#+END_SRC

**** binary.nix (unaltered)

#+HEADER: :tangle "../nix-overlays/ldc/binary.nix"
#+BEGIN_SRC nix
{ lib, stdenv, fetchurl, curl, tzdata, autoPatchelfHook, fixDarwinDylibNames, libxml2
, version, hashes }:

let
  inherit (stdenv) hostPlatform;
  OS = if hostPlatform.isDarwin then "osx" else hostPlatform.parsed.kernel.name;
  ARCH = if hostPlatform.isDarwin && hostPlatform.isAarch64 then "arm64" else hostPlatform.parsed.cpu.name;
in stdenv.mkDerivation {
  pname = "ldc-bootstrap";
  inherit version;

  src = fetchurl rec {
    name = "ldc2-${version}-${OS}-${ARCH}.tar.xz";
    url = "https://github.com/ldc-developers/ldc/releases/download/v${version}/${name}";
    sha256 = hashes."${OS}-${ARCH}" or (throw "missing bootstrap sha256 for ${OS}-${ARCH}");
  };

  dontConfigure = true;
  dontBuild = true;

  nativeBuildInputs = lib.optionals hostPlatform.isLinux [
    autoPatchelfHook
  ] ++ lib.optional hostPlatform.isDarwin fixDarwinDylibNames;

  buildInputs = lib.optionals stdenv.hostPlatform.isLinux [ libxml2 stdenv.cc.cc ];

  propagatedBuildInputs = [ curl tzdata ];

  installPhase = ''
    mkdir -p $out

    mv bin etc import lib LICENSE README $out/
  '';

  meta = with lib; {
    description = "The LLVM-based D Compiler";
    homepage = "https://github.com/ldc-developers/ldc";
    # from https://github.com/ldc-developers/ldc/blob/master/LICENSE
    license = with licenses; [ bsd3 boost mit ncsa gpl2Plus ];
    maintainers = with maintainers; [ lionello ];
    platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];
  };
}
#+END_SRC

*** versions SET
**** selected version SET OK ✓
***** version & sha256 nix composite

#+NAME: ldc_version_info
#+BEGIN_SRC nix
version = "<<ldc_version>>";
sha256 = "<<ldc_hash>>";
#+END_SRC

***** select version SET OK ✓

#+NAME: ldc_version
#+BEGIN_SRC nix
<<ldc_version_1_39_0>>
#+END_SRC

#+NAME: ldc_hash
#+BEGIN_SRC nix
<<ldc_hash_1_39_0>>
#+END_SRC

#+NAME: ldc_llvm_set
#+BEGIN_SRC nix
<<ldc_llvm_set_1_39_0>>
#+END_SRC

**** 1.39 OK ✓
***** 1.39.0 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.39.0.tar.gz
- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz

#+NAME: ldc_version_1_39_0
#+BEGIN_SRC nix
1.39.0
#+END_SRC

#+NAME: ldc_hash_1_39_0
#+BEGIN_SRC nix
sha256-g5usNvYHMxjjbwsWN2fgO9vT9X2ZJWuXSUrEObWaRWI=
#+END_SRC

#+NAME: ldc_llvm_set_1_39_0
#+BEGIN_SRC nix
llvm_18
#+END_SRC

**** 1.38 OK ✓
***** 1.38.0 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.38.0.tar.gz
- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz

#+NAME: ldc_version_1_38_0
#+BEGIN_SRC nix
1.38.0
#+END_SRC

#+NAME: ldc_hash_1_38_0
#+BEGIN_SRC nix
sha256-ymI47+Ai40zTB2dB+KBwxqN3GWNRxhlJpIpIyZN5844=
#+END_SRC

#+NAME: ldc_llvm_set_1_38_0
#+BEGIN_SRC nix
llvm_18
#+END_SRC

**** 1.37 OK ✓
***** 1.37.0 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.37.0.tar.gz
- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz

#+NAME: ldc_version_1_37_0
#+BEGIN_SRC nix
1.37.0
#+END_SRC

#+NAME: ldc_hash_1_37_0
#+BEGIN_SRC nix
sha256-UOgK48Q2yQY3wsPUDzktwotyH3qrOh48o79PnCjboGQ=
#+END_SRC

#+NAME: ldc_llvm_set_1_37_0
#+BEGIN_SRC nix
llvm_17
#+END_SRC

**** 1.36 OK ✓
***** 1.36.0 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.36.0.tar.gz

#+NAME: ldc_version_1_36_0
#+BEGIN_SRC nix
1.36.0
#+END_SRC

#+NAME: ldc_hash_1_36_0
#+BEGIN_SRC nix
sha256-oAx5BzEjqIfBf0Rsd4KklVajUSo9Natna31Trhu41u8=
#+END_SRC

#+NAME: ldc_llvm_set_1_36_0
#+BEGIN_SRC nix
llvm_17
#+END_SRC

**** 1.35 OK ✓
***** 1.35.0 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.35.0.tar.gz

#+NAME: ldc_version_1_35_0
#+BEGIN_SRC nix
1.35.0
#+END_SRC

#+NAME: ldc_hash_1_35_0
#+BEGIN_SRC nix
sha256-bilpk3BsdsCT5gkTmqCz+HBDVfoPN1b2dY141EIm36A=
#+END_SRC

#+NAME: ldc_llvm_set_1_35_0
#+BEGIN_SRC nix
llvm_16
#+END_SRC

**** 1.34 OK ✓
***** 1.34.0 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.34.0.tar.gz

#+NAME: ldc_version_1_34_0
#+BEGIN_SRC nix
1.34.0
#+END_SRC

#+NAME: ldc_hash_1_34_0
#+BEGIN_SRC nix
sha256-MAXG6ceSWFOMg5eXZnZ6WePXTzy5CsLLDc5ddXO+txk=
#+END_SRC

#+NAME: ldc_llvm_set_1_34_0
#+BEGIN_SRC nix
llvm_16
#+END_SRC

**** 1.33 OK ✓
***** 1.33.0 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.33.0.tar.gz

#+NAME: ldc_version_1_33_0
#+BEGIN_SRC nix
1.33.0
#+END_SRC

#+NAME: ldc_hash_1_33_0
#+BEGIN_SRC nix
sha256-g0wbCMX1s6mPnvuvhjLw03fRfawcFxDkg8nuaEZYw6g=
#+END_SRC

#+NAME: ldc_llvm_set_1_33_0
#+BEGIN_SRC nix
llvm_15
#+END_SRC

**** 1.32
***** 1.32.2 OK ✓

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.32.1.tar.gz

#+NAME: ldc_version_1_32_2
#+BEGIN_SRC nix
1.32.2
#+END_SRC

#+NAME: ldc_hash_1_32_2
#+BEGIN_SRC nix
sha256-v6Sq7nQyChJohDyI4inzObLfCVOkvLT87VLr4N2hzZU=
#+END_SRC

#+NAME: ldc_llvm_set_1_32_2
#+BEGIN_SRC nix
llvm_15
#+END_SRC

***** 1.32.1

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.32.1.tar.gz

#+NAME: ldc_version_1_32_1
#+BEGIN_SRC nix
1.32.1
#+END_SRC

#+NAME: ldc_hash_1_32_1
#+BEGIN_SRC nix
sha256-s1U7+qiVJDF+zSHrLGPG6g+acIChYnXkb9p+OrNX6g8=
#+END_SRC

#+NAME: ldc_llvm_set_1_32_1
#+BEGIN_SRC nix
llvm_14
#+END_SRC

***** 1.32.0

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.32.0.tar.gz

#+NAME: ldc_version_1_32_0
#+BEGIN_SRC nix
1.32.0
#+END_SRC

#+NAME: ldc_hash_1_32_0
#+BEGIN_SRC nix
sha256-xO4L+RtBbdVkE1PZsme2pIYAxJnHgr6xEtLkYOMpvqw=
#+END_SRC

#+NAME: ldc_llvm_set_1_32_0
#+BEGIN_SRC nix
llvm_14
#+END_SRC

**** 1.31
***** 1.31.0

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.31.0.tar.gz

#+NAME: ldc_version_1_31_0
#+BEGIN_SRC nix
1.31.0
#+END_SRC

#+NAME: ldc_hash_1_31_0
#+BEGIN_SRC nix
sha256-8cjs6eHjWAbDRBvyT75mbN3Y7vN1WSwZzY/uRwHNVFg=
#+END_SRC

#+NAME: ldc_llvm_set_1_31_0
#+BEGIN_SRC nix
llvm_14
#+END_SRC

***** 1.30.0

- nix-prefetch-url --unpack https://github.com/ldc-developers/ldc/archive/refs/tags/v1.30.0.tar.gz

#+NAME: ldc_version_1_30_0
#+BEGIN_SRC nix
1.30.0
#+END_SRC

#+NAME: ldc_hash_1_30_0
#+BEGIN_SRC nix
sha256-/bs3bwgkLZF5IqaiKnc5gCF/r6MQBG/F1kWUkK8j2s0=
#+END_SRC

#+NAME: ldc_llvm_set_1_30_0
#+BEGIN_SRC nix
llvm_14
#+END_SRC

** dmd OK ✓
*** info
**** links

- https://dlang.org/
  - https://wiki.dlang.org/DMD

- https://github.com/dlang/dmd
  - https://github.com/dlang/dmd/tags
  - https://github.com/dlang/dmd/pulls

- version in nixpkgs:
  - https://search.nixos.org/packages?channel=unstable&show=dmd&from=0&size=100&sort=relevance&type=packages&query=dmd

**** notes KO ✗

- dmd nixpkg modified and appears to build ok

- ISSUES dmd on nixos FAILS to build (my working projects), appears not to find parts of itself

*** overlays
**** default.nix
***** default.nix  >=2.108.0)

#+HEADER: :tangle "../nix-overlays/dmd/default.nix"
#+BEGIN_SRC nix
import ./generic.nix {
  version = "<<dmd_version>>";
  dmdHash = "<<dmd_hash>>";
  phobosHash = "<<phobos_hash>>";
}
#+END_SRC

***** default.nix  < 2.108.0)


#+HEADER: :tangle-NO "../nix-overlays/dmd/default.nix"
#+BEGIN_SRC nix
import ./generic.nix {
  version = "<<dmd_version>>";
  dmdSha256 = "<<dmd_hash>>";
  phobosSha256 = "<<phobos_hash>>";
}
#+END_SRC

**** generic.nix

#+HEADER: :tangle "../nix-overlays/dmd/generic.nix"
#+BEGIN_SRC nix
{ version
, dmdHash
, phobosHash
}:

{ stdenv
, lib
, fetchFromGitHub
, removeReferencesTo
, makeWrapper
, which
, writeTextFile
, curl
, tzdata
, gdb
#, Foundation
, callPackage
, targetPackages
, fetchpatch
, bash
, installShellFiles
, git
, unzip
, dmdBootstrap ? callPackage ./bootstrap.nix { }
, dmdBin ? "${dmdBootstrap}/bin"
}:

let
  dmdConfFile = writeTextFile {
    name = "dmd.conf";
    text = (lib.generators.toINI { } {
      Environment = {
        DFLAGS = ''-I@out@/include/dmd -L-L@out@/lib -fPIC ${lib.optionalString (!targetPackages.stdenv.cc.isClang) "-L--export-dynamic"}'';
      };
    });
  };

  bits = builtins.toString stdenv.hostPlatform.parsed.cpu.bits;
  osname =
    if stdenv.hostPlatform.isDarwin then
      "osx"
    else
      stdenv.hostPlatform.parsed.kernel.name;

  pathToDmd = "\${NIX_BUILD_TOP}/dmd/generated/${osname}/release/${bits}/dmd";
in

stdenv.mkDerivation (finalAttrs: {
  pname = "dmd";
  inherit version;

  enableParallelBuilding = true;

  srcs = [
    (fetchFromGitHub {
      owner = "dlang";
      repo = "dmd";
      rev = "v${finalAttrs.version}";
      hash = dmdHash;
      name = "dmd";
    })
    (fetchFromGitHub {
      owner = "dlang";
      repo = "phobos";
      rev = "v${finalAttrs.version}";
      hash = phobosHash;
      name = "phobos";
    })
  ];

  sourceRoot = ".";

  # https://issues.dlang.org/show_bug.cgi?id=19553
  hardeningDisable = [ "fortify" ];

  patches = lib.optionals (lib.versionOlder version "2.088.0") [
    # Migrates D1-style operator overloads in DMD source, to allow building with
    # a newer DMD
    (fetchpatch {
      url = "https://github.com/dlang/dmd/commit/c4d33e5eb46c123761ac501e8c52f33850483a8a.patch";
      stripLen = 1;
      extraPrefix = "dmd/";
      hash = "sha256-N21mAPfaTo+zGCip4njejasraV5IsWVqlGR5eOdFZZE=";
    })
  ];

  postPatch = ''
    patchShebangs dmd/compiler/test/{runnable,fail_compilation,compilable,tools}{,/extra-files}/*.sh

    rm dmd/compiler/test/runnable/gdb1.d
    rm dmd/compiler/test/runnable/gdb10311.d
    rm dmd/compiler/test/runnable/gdb14225.d
    rm dmd/compiler/test/runnable/gdb14276.d
    rm dmd/compiler/test/runnable/gdb14313.d
    rm dmd/compiler/test/runnable/gdb14330.d
    rm dmd/compiler/test/runnable/gdb15729.sh
    rm dmd/compiler/test/runnable/gdb4149.d
    rm dmd/compiler/test/runnable/gdb4181.d
    rm dmd/compiler/test/compilable/ddocYear.d
    rm dmd/compiler/test/fail_compilation/needspkgmod.d

    # Disable tests that rely on objdump whitespace until fixed upstream:
    #   https://issues.dlang.org/show_bug.cgi?id=23317
    rm dmd/compiler/test/runnable/cdvecfill.sh
    rm dmd/compiler/test/compilable/cdcmp.d
  '' + lib.optionalString (lib.versionAtLeast version "2.089.0" && lib.versionOlder version "2.092.2") ''
    rm dmd/compiler/test/dshell/test6952.d
  '' + lib.optionalString (lib.versionAtLeast version "2.092.2") ''
    substituteInPlace dmd/compiler/test/dshell/test6952.d --replace-fail "/usr/bin/env bash" "${bash}/bin/bash"
  '' + lib.optionalString stdenv.hostPlatform.isLinux ''
    substituteInPlace phobos/std/socket.d --replace-fail "assert(ih.addrList[0] == 0x7F_00_00_01);" ""
  '' + lib.optionalString stdenv.hostPlatform.isDarwin ''
    substituteInPlace phobos/std/socket.d --replace-fail "foreach (name; names)" "names = []; foreach (name; names)"
  '';

  nativeBuildInputs = [
    makeWrapper
    which
    installShellFiles
  ] ++ lib.optionals (lib.versionOlder version "2.088.0") [
    git
  ];

  buildInputs = [
    curl
    tzdata
  # ] ++ lib.optionals stdenv.hostPlatform.isDarwin []
  #   Foundation
  ];

  nativeCheckInputs = [
    gdb
  ] ++ lib.optionals (lib.versionOlder version "2.089.0") [
    unzip
  ];

  buildFlags = [
    "BUILD=release"
    "ENABLE_RELEASE=1"
    "PIC=1"
  ];

  # Build and install are based on http://wiki.dlang.org/Building_DMD
  buildPhase = ''
    runHook preBuild

    export buildJobs=$NIX_BUILD_CORES
    [ -z "$enableParallelBuilding" ] && buildJobs=1

    ${dmdBin}/rdmd dmd/compiler/src/build.d -j$buildJobs $buildFlags \
      HOST_DMD=${dmdBin}/dmd
    make -C dmd/druntime -j$buildJobs DMD=${pathToDmd} $buildFlags
    echo ${tzdata}/share/zoneinfo/ > TZDatabaseDirFile
    echo ${lib.getLib curl}/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} \
      > LibcurlPathFile
    make -C phobos -j$buildJobs $buildFlags \
      DMD=${pathToDmd} DFLAGS="-version=TZDatabaseDir -version=LibcurlPath -J$PWD"

    runHook postBuild
  '';

  doCheck = true;

  # many tests are disabled because they are failing

  # NOTE: Purity check is disabled for checkPhase because it doesn't fare well
  # with the DMD linker. See https://github.com/NixOS/nixpkgs/issues/97420
  checkPhase = ''
    runHook preCheck

    export checkJobs=$NIX_BUILD_CORES
    [ -z "$enableParallelChecking" ] && checkJobs=1

    CC=$CXX HOST_DMD=${pathToDmd} NIX_ENFORCE_PURITY= \
      ${dmdBin}/rdmd dmd/compiler/test/run.d -j$checkJobs

    NIX_ENFORCE_PURITY= \
      make -C phobos unittest -j$checkJobs $checkFlags \
        DFLAGS="-version=TZDatabaseDir -version=LibcurlPath -J$PWD"

    runHook postCheck
  '';

  installPhase = ''
    runHook preInstall

    install -Dm755 ${pathToDmd} $out/bin/dmd

    installManPage dmd/docs/man/man*/*

    mkdir -p $out/include/dmd
    cp -r {dmd/druntime/import/*,phobos/{std,etc}} $out/include/dmd/

    mkdir $out/lib
    cp phobos/generated/${osname}/release/${bits}/libphobos2.* $out/lib/

    wrapProgram $out/bin/dmd \
      --prefix PATH : "${targetPackages.stdenv.cc}/bin" \
      --set-default CC "${targetPackages.stdenv.cc}/bin/cc"

    substitute ${dmdConfFile} "$out/bin/dmd.conf" --subst-var out

    runHook postInstall
  '';

  preFixup = ''
    find $out/bin -type f -exec ${removeReferencesTo}/bin/remove-references-to -t ${dmdBin}/dmd '{}' +
  '';

  disallowedReferences = [ dmdBootstrap ];

  passthru = {
    inherit dmdBootstrap;
  };

  meta = with lib; {
    description = "Official reference compiler for the D language";
    homepage = "https://dlang.org/";
    changelog = "https://dlang.org/changelog/${finalAttrs.version}.html";
    # Everything is now Boost licensed, even the backend.
    # https://github.com/dlang/dmd/pull/6680
    license = licenses.boost;
    mainProgram = "dmd";
    maintainers = with maintainers; [ lionello dukc jtbx ];
    platforms = [ "x86_64-linux" "i686-linux" "x86_64-darwin" ];
    # ld: section __DATA/__thread_bss has type zero-fill but non-zero file offset file '/private/tmp/nix-build-dmd-2.109.1.drv-0/.rdmd-301/rdmd-build.d-A1CF043A7D87C5E88A58F3C0EF5A0DF7/objs/build.o' for architecture x86_64
    # clang-16: error: linker command failed with exit code 1 (use -v to see invocation)
    broken = stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64;
  };
})
#+END_SRC

**** bootstrap.nix

#+HEADER: :tangle "../nix-overlays/dmd/bootstrap.nix"
#+BEGIN_SRC nix
{ callPackage }:
callPackage ./binary.nix {
  version = "2.090.1";
  hashes = {
    # Get these from `nix-prefetch-url http://downloads.dlang.org/releases/2.x/2.090.1/dmd.2.090.1.linux.tar.xz` etc..
    osx = "sha256-9HwGVO/8jfZ6aTiDIUi8w4C4Ukry0uUS8ACP3Ig8dmU=";
    linux = "sha256-ByCrIA4Nt7i9YT0L19VXIL1IqIp+iObcZux407amZu4=";
  };
}
#+END_SRC

**** binary.nix

#+HEADER: :tangle "../nix-overlays/dmd/binary.nix"
#+BEGIN_SRC nix
{ lib, stdenv, fetchurl, curl, tzdata, autoPatchelfHook, fixDarwinDylibNames, glibc
, version, hashes }:

let
  inherit (stdenv) hostPlatform;
  OS = if hostPlatform.isDarwin then "osx" else hostPlatform.parsed.kernel.name;
  MODEL = toString hostPlatform.parsed.cpu.bits;
in

# On linux pargets like `pkgsLLVM.dmd` `cc` does not expose `libgcc`
# and can't build `dmd`.
assert hostPlatform.isLinux -> (stdenv.cc.cc ? libgcc);
stdenv.mkDerivation {
  pname = "dmd-bootstrap";
  inherit version;

  src = fetchurl rec {
    name = "dmd.${version}.${OS}.tar.xz";
    url = "http://downloads.dlang.org/releases/2.x/${version}/${name}";
    sha256 = hashes.${OS} or (throw "missing bootstrap sha256 for OS ${OS}");
  };

  dontConfigure = true;
  dontBuild = true;

  nativeBuildInputs = lib.optionals hostPlatform.isLinux [
    autoPatchelfHook
  ] ++ lib.optionals hostPlatform.isDarwin [
    fixDarwinDylibNames
  ];
  propagatedBuildInputs = [
    curl
    tzdata
  ] ++ lib.optionals hostPlatform.isLinux [
    glibc
    stdenv.cc.cc.libgcc
  ];

  installPhase = ''
    runHook preInstall

    mkdir -p $out

    # try to copy model-specific binaries into bin first
    mv ${OS}/bin${MODEL} $out/bin || true

    mv src license.txt ${OS}/* $out/

    # move man into place
    mkdir -p $out/share
    mv man $out/share/

    # move docs into place
    mkdir -p $out/share/doc
    mv html/d $out/share/doc/

    # fix paths in dmd.conf (one level less)
    substituteInPlace $out/bin/dmd.conf --replace "/../../" "/../"

    runHook postInstall
  '';

  # Stripping on Darwin started to break libphobos2.a
  # Undefined symbols for architecture x86_64:
  #   "_rt_envvars_enabled", referenced from:
  #       __D2rt6config16rt_envvarsOptionFNbNiAyaMDFNbNiQkZQnZQq in libphobos2.a(config_99a_6c3.o)
  dontStrip = hostPlatform.isDarwin;

  meta = with lib; {
    description = "Digital Mars D Compiler Package";
    # As of 2.075 all sources and binaries use the boost license
    license = licenses.boost;
    maintainers = [ maintainers.lionello ];
    homepage = "https://dlang.org/";
    platforms = [ "x86_64-darwin" "i686-linux" "x86_64-linux" ];
  };
}
#+END_SRC

*** versions SET
**** selected version SET OK ✓

#+NAME: dmd_version
#+BEGIN_SRC nix
<<dmd_version_2_109_1>>
#+END_SRC

#+NAME: dmd_hash
#+BEGIN_SRC nix
<<dmd_hash_2_109_1>>
#+END_SRC

#+NAME: phobos_hash
#+BEGIN_SRC nix
<<phobos_hash_2_109_1>>
#+END_SRC

**** 2.109.1 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.109.1.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.109.1.tar.gz

#+NAME: dmd_version_2_109_1
#+BEGIN_SRC nix
2.109.1
#+END_SRC

#+NAME: phobos_hash_2_109_1
#+BEGIN_SRC nix
sha256-73I0k7tCBwe5tl4K6uMs3/nT2JTZ2SppFYzmokS4W5Y=
#+END_SRC

#+NAME: dmd_hash_2_109_1
#+BEGIN_SRC nix
sha256-3nCDPZnb4eQZmhYYxcH6qOmsP8or0KYuzAa5g/C9xdU=
#+END_SRC

**** 2.109.0 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.109.0.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.109.0.tar.gz

#+NAME: dmd_version_2_109_0
#+BEGIN_SRC nix
2.109.0
#+END_SRC

#+NAME: dmd_hash_2_109_0
#+BEGIN_SRC nix
sha256-unAZgyZyT6qomlj6pdlOx4h1SKuDjutl1/0FM9AhBWc=
#+END_SRC

#+NAME: phobos_hash_2_109_0
#+BEGIN_SRC nix
sha256-b91FeluFqhmjHd1wwkyq98QzIlwjE646xNj2n6hP3aM=
#+END_SRC

**** 2.108.0 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.108.0.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.108.0.tar.gz

#+NAME: dmd_version_2_108_0
#+BEGIN_SRC nix
2.108.0
#+END_SRC

#+NAME: dmd_hash_2_108_0
#+BEGIN_SRC nix
sha256-tlWcFgKtXzfqMMkOq4ezhZHdYCXFckjN5+m6jO4VH0U=
#+END_SRC

#+NAME: phobos_hash_2_108_0
#+BEGIN_SRC nix
sha256-uU8S4rABOfhpKh+MvSbclkbdf0hrsuKF8SIpWMnPpfU=
#+END_SRC

**** 2.107.0 - skip (asleep here apparently)

- asleep apparently

#+NAME: dmd_version_2_107_0
#+BEGIN_SRC nix
2.107.0
#+END_SRC

#+NAME: dmd_hash_2_107_0
#+BEGIN_SRC nix
<<sha256-blank>>
#+END_SRC

#+NAME: phobos_hash_2_107_0
#+BEGIN_SRC nix
<<sha256-blank>>
#+END_SRC

**** 2.106.1 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.106.1.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.106.1.tar.gz

#+NAME: dmd_version_2_106_1
#+BEGIN_SRC nix
2.106.1
#+END_SRC

#+NAME: dmd_hash_2_106_1
#+BEGIN_SRC nix
sha256-vjYa/Pxrz7J2htXT+fa+xaeen/Vxne++lELbHTSXBK8=
#+END_SRC

#+NAME: phobos_hash_2_106_1
#+BEGIN_SRC nix
sha256-yRL9ub3u4mREG9PVxBvgQ/LDXD57RadPTZ2h08qyh/s=
#+END_SRC

**** 2.104.0 KO ✗

- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.104.0.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.104.0.tar.gz

#+NAME: dmd_version_2_104_0
#+BEGIN_SRC nix
2.104.0
#+END_SRC

#+NAME: dmd_hash_2_104_0
#+BEGIN_SRC nix
sha256-yv+uW6cYAId2HK/YSPxsR9Xt0o3LWa97z8KyzjFik6s=
#+END_SRC

#+NAME: phobos_hash_2_104_0
#+BEGIN_SRC nix
sha256-cWp36Gd/lh3gy21bf9z0/RqzlJmf6ypmx72aMeakcec=
#+END_SRC

**** 2.102.2 KO ✗

- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.102.2.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.102.2.tar.gz

#+NAME: dmd_version_2_102_2
#+BEGIN_SRC nix
2.102.2
#+END_SRC

#+NAME: dmd_hash_2_102_2
#+BEGIN_SRC nix
sha256-der9nb31hJ+K1aJZdzIgs8+eRgVVsH97QnYEnVbKUws=
#+END_SRC

#+NAME: phobos_hash_2_102_2
#+BEGIN_SRC nix
sha256-SracmUm2aY/LDCyDqYuVS39pCbwO8UCL3TSB0CVHpHE=
#+END_SRC

**** 2.100.2 KO ✗

- nix-prefetch-url --unpack https://github.com/dlang/dmd/archive/refs/tags/v2.100.2.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/druntime/archive/refs/tags/v2.100.2.tar.gz
- nix-prefetch-url --unpack https://github.com/dlang/phobos/archive/refs/tags/v2.100.2.tar.gz

#+NAME: dmd_version_2_100_2
#+BEGIN_SRC nix
2.100.2
#+END_SRC

#+NAME: dmd_hash_2_100_2
#+BEGIN_SRC nix
sha256-o4+G3ARXIGObYHtHooYZKr+Al6kHpiwpMIog3i4BlDM=
#+END_SRC

#+NAME: druntime_hash_2_100_2
#+BEGIN_SRC nix
sha256-qXvY1ECN4mPwOGgOE1FWwvxoRvlSww3tGLWgBdhzAKo=
#+END_SRC

#+NAME: phobos_hash_2_100_2
#+BEGIN_SRC nix
sha256-kTHRaAKG7cAGb4IE/NGHWaZ8t7ZceKj03l6E8wLzJzs=
#+END_SRC

** dub OK
*** info
**** links

- https://code.dlang.org/packages/dub

- https://github.com/dlang/dub
  - https://github.com/dlang/dub/releases
  - https://github.com/dlang/dub/issues

- version in nixpkgs:
  - https://search.nixos.org/packages?channel=unstable&show=dub&from=0&size=100&sort=relevance&type=packages&query=dub

**** notes

- OK dub == current OK ✓

- NOTES for dub 1.33.0 >= 1.31.0 KO ✗
  - dub builds test tilix which calls in gtkd
  - ISSUES dub FAILS to build project from local disk that has built without issue
    since dub v1.23.0
    - BROKEN breaks on subproject ends up in nix: Error /homeless-shelter:
      Permission denied

- OK dub == 1.30.0 OK ✓

*** overlays
**** default.nix OK ✓

#+HEADER: :tangle "../nix-overlays/dub/default.nix"
#+BEGIN_SRC nix
{ lib, stdenv, fetchFromGitHub, curl, libevent, rsync, ldc, dcompiler ? ldc }:

assert dcompiler != null;

stdenv.mkDerivation rec {
  pname = "dub";
  version = "<<dub_version>>";

  enableParallelBuilding = true;

  src = fetchFromGitHub {
    owner = "dlang";
    repo = "dub";
    rev = "v${version}";
    sha256 = "<<dub_hash>>";
  };

  #postUnpack = ''
  #  patchShebangs .
  #'';

  dubvar = "\\$DUB";
  postPatch = ''
    patchShebangs test

    # Can be removed with https://github.com/dlang/dub/pull/1368
    substituteInPlace test/fetchzip.sh \
        --replace "dub remove" "\"${dubvar}\" remove"
  '';

  nativeBuildInputs = [ dcompiler libevent rsync ];
  buildInputs = [ curl ];

  buildPhase = ''
    for DC_ in dmd ldmd2 gdmd; do
      echo "... check for D compiler $DC_ ..."
      export DC=$(type -P $DC_ || echo "")
      if [ ! "$DC" == "" ]; then
        break
      fi
    done
    if [ "$DC" == "" ]; then
      exit "Error: could not find D compiler"
    fi
    echo "$DC_ found and used as D compiler in buildPhase for $pname"
    $DC ./build.d
    ./build
  '';

  doCheck = !stdenv.isDarwin;

  checkPhase = ''
    export DUB=$NIX_BUILD_TOP/source/bin/dub
    export PATH=$PATH:$NIX_BUILD_TOP/source/bin/
    #export DC=${dcompiler.out}/bin/${if dcompiler.pname=="ldc" then "ldc2" else dcompiler.pname}
    if [ "$DC" == "" ]; then
      exit "Error: could not find D compiler"
    fi
    echo "DC out --> $DC"
    export HOME=$TMP

    rm -rf test/issue502-root-import
    rm -rf test/dpath-variable
    #rm test/dpath-variable.sh
    rm -rf test/git-dependency
    rm -rf test/use-c-sources # added to build v1.33.0
    rm -rf test/pr2642-cache-db # added to build v1.34.0
    rm -rf test/pr2644-describe-artifact-path # added to build v1.36.0
    rm -rf test/pr2647-build-deep # added to build v1.36.0

    ./test/run-unittest.sh
  '';

  installPhase = ''
    mkdir -p $out/bin
    cp bin/dub $out/bin
  '';

  meta = with lib; {
    description = "Package and build manager for D applications and libraries";
    homepage = "https://code.dlang.org/";
    license = licenses.mit;
    maintainers = with maintainers; [ jtbx ];
    platforms = [ "x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
  };
}
#+END_SRC

*** versions SET
**** selected version SET

#+NAME: dub_version
#+BEGIN_SRC nix
<<dub_version_1_38_1>>
#+END_SRC

#+NAME: dub_hash
#+BEGIN_SRC nix
<<dub_hash_1_38_1>>
#+END_SRC

**** 1.38 OK ✓
***** 1.38.1

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.38.1.tar.gz

#+NAME: dub_version_1_38_1
#+BEGIN_SRC nix
1.38.1
#+END_SRC

#+NAME: dub_hash_1_38_1
#+BEGIN_SRC nix
sha256-8Lr/0sx4SKwU1aNOxZArta0RXpDM+EWl29ZsPDdPWFo=
#+END_SRC

**** 1.36 OK ✓
***** 1.36.0

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.36.0.tar.gz

#+NAME: dub_version_1_36_0
#+BEGIN_SRC nix
1.36.0
#+END_SRC

#+NAME: dub_hash_1_36_0
#+BEGIN_SRC nix
sha256-S8pls9zxbGAQTwqYf4bDT2q7Ow12S8bBsJE5UmsACBs=
#+END_SRC

**** 1.35 OK ✓
***** 1.35.0

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.35.0.tar.gz

#+NAME: dub_version_1_35_0
#+BEGIN_SRC nix
1.35.0
#+END_SRC

#+NAME: dub_hash_1_35_0
#+BEGIN_SRC nix
sha256-hC46XKE6lLLMLGMGl4vDnLDBQy6P/Z7o3ayDJj0Sois=
#+END_SRC

**** 1.34 OK ✓
***** 1.34.0

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.34.0.tar.gz

#+NAME: dub_version_1_34_0
#+BEGIN_SRC nix
1.34.0
#+END_SRC

#+NAME: dub_hash_1_34_0
#+BEGIN_SRC nix
sha256-hC46XKE6lLLMLGMGl4vDnLDBQy6P/Z7o3ayDJj0Sois=
#+END_SRC

**** 1.33 OK ✓
***** 1.33.1 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.33.1.tar.gz

#+NAME: dub_version_1_33_1
#+BEGIN_SRC nix
1.33.1
#+END_SRC

#+NAME: dub_hash_1_33_1
#+BEGIN_SRC nix
sha256-QFgUsO04VRXBDjGI5QQs7u9XrexG7/V34TMgJP1D8yA=
#+END_SRC

**** 1.33.0 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.33.0.tar.gz

#+NAME: dub_version_1_33_0
#+BEGIN_SRC nix
1.33.0
#+END_SRC

#+NAME: dub_hash_1_33_0
#+BEGIN_SRC nix
sha256-4Mha7WF6cg3DIccfpvOnheuvgfziv/7wo8iFsPXO4yY=
#+END_SRC

**** 1.32.1 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.32.1.tar.gz

#+NAME: dub_version_1_32_1
#+BEGIN_SRC nix
1.32.1
#+END_SRC

#+NAME: dub_hash_1_32_1
#+BEGIN_SRC nix
sha256-5pW3Fu3PQ1ZLJnsuh7fPpEBNbVQgGfFyiuMrAVOJKQA=
#+END_SRC

- ISSUES from 1.31.0 continuing

**** 1.31.1 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.31.1.tar.gz

#+NAME: dub_version_1_31_1
#+BEGIN_SRC nix
1.31.1
#+END_SRC

#+NAME: dub_hash_1_31_1
#+BEGIN_SRC nix
sha256-dp64D51ypowXS1+EYKRXh5hpa3rMmiotvKO2FW+i92w=
#+END_SRC

- ISSUES from 1.31.0 continuing

**** 1.31.0 OK ✓ NOTE

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.31.0.tar.gz

behavior change in dub requiring the setting of pwd in buildPhase

#+NAME: dub_version_1_31_0
#+BEGIN_SRC nix
1.31.0
#+END_SRC

#+NAME: dub_hash_1_31_0
#+BEGIN_SRC nix
sha256-Ki8HJOfWFM1tF86s7Ng3STgC/uu5acVTP0Dj87M0l54=
#+END_SRC

- ISSUES from 1.31.0 continuing
**** 1.30.0 OK ✓

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.30.0.tar.gz

#+NAME: dub_version_1_30_0
#+BEGIN_SRC nix
1.30.0
#+END_SRC

#+NAME: dub_hash_1_30_0
#+BEGIN_SRC nix
sha256-iVl7bjblvIxvrUX7Phq6h4AIAmZjNVkGYYFA1hhsE7c=
#+END_SRC

**** 1.29.1

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.29.1.tar.gz

#+NAME: dub_version_1_29_1
#+BEGIN_SRC nix
1.29.1
#+END_SRC

#+NAME: dub_hash_1_29_1
#+BEGIN_SRC nix
sha256-XDV9p1bDhRL6gX+nizzjoErNJm8NnQK5O8wNnizloss=
#+END_SRC

**** 1.28.0

- nix-prefetch-url --unpack https://github.com/dlang/dub/archive/refs/tags/v1.28.0.tar.gz

#+NAME: dub_version_1_28_0
#+BEGIN_SRC nix
1.28.0
#+END_SRC

#+NAME: dub_hash_1_28_0
#+BEGIN_SRC nix
sha256-GOeaQyu8Y/DxZEAJPdlGH9ie/ZRTqvAw2jjvM3dESbg=
#+END_SRC

** dtools OK ✓
*** info
**** links

- https://code.dlang.org/packages/dtools

- https://github.com/dlang/tools
  - https://github.com/dlang/tools/tags
    nix-prefetch --unpack https://github.com/dlang/tools/archive/refs/tags/v<<dtools_version>>.tar.gz
  - https://github.com/dlang/tools/issues

- version in nixpkgs
  - https://search.nixos.org/packages?channel=unstable&show=dtools&from=0&size=100&sort=relevance&type=packages&query=dtools

**** notes

- OK dtools 2.103.1

*** overlays
**** default.nix

#+HEADER: :tangle "../nix-overlays/dtools/default.nix"
#+BEGIN_SRC nix
{ stdenv, lib, fetchFromGitHub, fetchpatch, ldc, curl, gnumake42 }:

stdenv.mkDerivation rec {
  pname = "dtools";
  version = "<<dtools_version>>";

  src = fetchFromGitHub {
    owner = "dlang";
    repo = "tools";
    rev = "v${version}";
    sha256 = "<<dtools_hash>>";
    name = "dtools";
  };

  patches = [
    (fetchpatch {
      # part of https://github.com/dlang/tools/pull/441
      url = "https://github.com/dlang/tools/commit/6c6a042d1b08e3ec1790bd07a7f69424625ee866.patch"; # Fix LDC arm64 build
      sha256 = "sha256-x6EclTYN1Y5FG57KLhbBK0BZicSYcZoWO7MTVcP4T18=";
    })
  ];

  nativeBuildInputs = [ ldc gnumake42 ]; # fails with make 4.4
  buildInputs = [ curl ];

  makeCmd = ''
    make -f posix.mak all DMD_DIR=dmd DMD=${ldc.out}/bin/ldmd2 CC=${stdenv.cc}/bin/cc
  '';

  buildPhase = ''
    $makeCmd
  '';

  doCheck = true;

  checkPhase = ''
      $makeCmd test_rdmd
    '';

  installPhase = ''
      $makeCmd INSTALL_DIR=$out install
  '';

  meta = with lib; {
    description = "Ancillary tools for the D programming language compiler";
    homepage = "https://github.com/dlang/tools";
    license = lib.licenses.boost;
    maintainers = with maintainers; [ ThomasMader ];
    platforms = lib.platforms.unix;
  };
}
#+END_SRC

*** versions SET

- https://github.com/dlang/tools

**** selected version SET OK ✓

#+NAME: dtools_version
#+BEGIN_SRC nix
<<dtools_version_2_103_1>>
#+END_SRC

#+NAME: dtools_hash
#+BEGIN_SRC nix
<<dtools_hash_2_103_1>>
#+END_SRC

**** 2.103.1 OK ✓

- https://github.com/dlang/tools/releases/tag/v2.103.1

#+NAME: dtools_version_2_103_1
#+BEGIN_SRC nix
2.103.1
#+END_SRC

#+NAME: dtools_hash_2_103_1
#+BEGIN_SRC nix
sha256-XM4gUxcarQCOBR8W/o0iWAI54PyLDkH6CsDce22Cnu4=
#+END_SRC

**** 2.102.2

- https://github.com/dlang/tools/releases/tag/v2.102.2

#+NAME: dtools_version_2_102_2
#+BEGIN_SRC nix
2.102.2
#+END_SRC

#+NAME: dtools_hash_2_102_2
#+BEGIN_SRC nix
sha256-XM4gUxcarQCOBR8W/o0iWAI54PyLDkH6CsDce22Cnu4=
#+END_SRC

**** 2.095.1 current nixpkgs 20-03-17 OK ✓

- https://github.com/dlang/tools/releases/tag/v2.095.1

#+NAME: dtools_version_2_095_1
#+BEGIN_SRC nix
2.095.1
#+END_SRC

#+NAME: dtools_hash_2_095_1
#+BEGIN_SRC nix
sha256:0rdfk3mh3fjrb0h8pr8skwlq6ac9hdl1fkrkdl7n1fa2806b740b
#+END_SRC

** sha256 blank_hash

#+NAME: sha256-blank
#+BEGIN_SRC nix
sha256-0000000000000000000000000000000000000000000=
#+END_SRC

#+NAME: blank_hash
#+BEGIN_SRC nix
sha256-0000000000000000000000000000000000000000000=
#+END_SRC

#+NAME: assumed_hash
#+BEGIN_SRC nix
sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
#+END_SRC