-*- mode: org -*-
#+TITLE:       D nix, dev shells with overlays
#+DESCRIPTION: dlang related nixpkgs of interest (dlang cvompilers & tools)
#+FILETAGS:    :nixos:nixpkgs:dlang:compiler:
#+AUTHOR:      Ralph Amissah
#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
#+COPYRIGHT:   Copyright (C) 2020 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 ./dlang-nix-flakes/ )
** README

#+HEADER: :tangle "../nix-overlays/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) 2015 - 2023 Ralph Amissah
,#+LANGUAGE:    en
,#+STARTUP:     content hideblocks hidestars noindent entitiespretty
,#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
,#+PROPERTY:    header-args  :exports code
,#+PROPERTY:    header-args+ :noweb yes
,#+PROPERTY:    header-args+ :eval no
,#+PROPERTY:    header-args+ :results no
,#+PROPERTY:    header-args+ :cache no
,#+PROPERTY:    header-args+ :padline no

,* README for D related overlays
,** dlang-nix-overlays

Nix build overlays for building and testing 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.

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>> ) KO ✗
  - gdc     [not yet available]

(updates nixpkgs circa 2023-05-12)

dlang-nix-flakes.org --❯
  .
  └── nix-overlays
      ├── dmd
      │   ├── binary.nix
      │   ├── bootstrap.nix
      │   ├── default.nix
      │   └── generic.nix
      ├── dtools
      │   └── default.nix
      ├── dub
      │   └── default.nix
      ├── ldc
      │   ├── binary.nix
      │   ├── bootstrap.nix
      │   ├── default.nix
      │   └── generic.nix
      └── README

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 KO ✗ ( 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 from v1.31.0 FAILS to build packages with nix tools that previous version
  of dub built (from v1.23.0 to v1.30.0 which is currently in nixpkgs); FAILURE
  is from v1.31.0 through v1.32.1 (which is current at the time of this commit)

,** 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=

#+END_SRC

** .gitignore

#+HEADER: :tangle-NO "../nix-overlays/.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
!.envrc
!.envrc-local
!.envrc-nix
!flake.nix
!flake.lock
!nix-overlays
!nix-overlays/**
!shell.nix
!makefile
!justfile
!README
!*.nix
!*.org
!*.sh
!*.txt

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

** .env*
*** .envrc

#+HEADER: :tangle-NO "../nix-overlays/.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-NO "../nix-overlays/.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)"
echo '
  .envrc-local echo ❯❯

  ❯❯ nix flake update && nix flake check --show-trace && nix flake show && nix develop ".#devShell" -c zsh

  ❯❯ nix develop
  ❯❯ nix develop -c zsh
  ❯❯ nix develop ".#dsh-overlay-ldc" --print-build-logs

  ❯❯ nix build
  ❯❯ nix build ".#default" --print-build-logs
'
#+END_SRC

*** .envrc-nix

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

#+HEADER: :tangle-NO "../nix-overlays/.envrc-nix"
#+BEGIN_SRC sh
NIX_ENFORCE_PURITY=1
# - https://github.com/nix-community/nix-direnv
NixDirEnvVersion="2.3.0"
NixDirEnvSHA="sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8="
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 .envrc
watch_file .envrc-local
watch_file .envrc-nix
nix_direnv_watch_file flake.nix
nix_direnv_watch_file shell.nix
nix_direnv_watch_file .envrc
nix_direnv_watch_file .envrc-local
nix_direnv_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

** .nix
*** flake.nix

#+HEADER: :tangle-NO "../nix-overlays/flake.nix"
#+BEGIN_SRC nix
{
  description = "dub d package manager";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";
  outputs = {
    self,
    nixpkgs,
    flake-utils,
  } @ inputs: let
    name = "dev-dub";
    shell = ./shell.nix;
    devEnv = ./.envrc;
    supportedSystems = ["x86_64-linux"];
    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;
    };
  in {
    packages = forAllSystems (system: let
      pkgs-ovl = pkgsForSystem system;
      pkgs = nixpkgsFor.${system};
    in
      with pkgs-ovl; {
        default = dub;
      });
    devShells = forAllSystems (system: let
      pkgs-ovl = pkgsForSystem system;
      pkgs = 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>> - broken";
          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;
          #nativeBuildInputs = [ dub dmd ldc gdc gnumake ];
          #buildInputs = [ sqlite ];
          packages = with pkgs; [
            ldc
            dub
            gnumake
          ];
          inherit shellHook;
        };
        default = import ./shell.nix {inherit pkgs;};
      });
  };
}
#+END_SRC

*** shell.nix

#+HEADER: :tangle-NO "../nix-overlays/shell.nix"
#+HEADER: :tangle-mode (identity #o755)
#+HEADER: :shebang "#!/usr/bin/env -S nix-shell -I nixpkgs=/srv/nix/nixpkgs --pure\n#!nix-shell -i bash"
#+BEGIN_SRC nix
{pkgs ? import <nixpkgs> {}}:
with pkgs;
  mkShell {
    buildInputs = [
      # ❯❯❯ nix_related
      nix
      direnv
      nixVersions.unstable
      nix-prefetch-git
      validatePkgConfig
      nix-output-monitor
      #nix-tree
      #nvd
      jq
      alejandra
      git
      # ❯❯❯ dev
      ldc
      #rund
      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 zsh
      #'
    '';
  }
#+END_SRC

*** default.nix

will automatically build the default development shell, perhaps unecessary

#+HEADER: :tangle-NO "../nix-overlays/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 ./dlang-nix-flakes/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, llvm_14, 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 llvm_14.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}"
    "-DCMAKE_BUILD_TYPE=Release"
  ];

  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; [ ThomasMader lionello ];
    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; [ ThomasMader 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_33_0-beta1>>
#+END_SRC

#+NAME: ldc_hash
#+BEGIN_SRC nix
<<ldc_hash_1_33_0-beta1>>
#+END_SRC

**** 1.33.0-beta1

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

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

#+NAME: ldc_hash_1_33_0-beta1
#+BEGIN_SRC nix
sha256-axyjDAWwxHmG2yPhL6P8cF6XvVvapfw0AWLjUrVRoug=
#+END_SRC

**** 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

**** 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

**** 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

**** 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

**** 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

** dmd OK KO ✗ ISSUES
*** info
**** links

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

- 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

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

**** generic.nix

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

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

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.isDarwin then
      "osx"
    else
      stdenv.hostPlatform.parsed.kernel.name;

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

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

  enableParallelBuilding = true;

  srcs = [
    (fetchFromGitHub {
      owner = "dlang";
      repo = "dmd";
      rev = "v${version}";
      sha256 = dmdSha256;
      name = "dmd";
    })
    (fetchFromGitHub {
      owner = "dlang";
      repo = "phobos";
      rev = "v${version}";
      sha256 = phobosSha256;
      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/";
  #    sha256 = "sha256-N21mAPfaTo+zGCip4njejasraV5IsWVqlGR5eOdFZZE=";
  #  })
  #] ++ lib.optionals (lib.versionOlder version "2.092.2") [
  #  # Fixes C++ tests that compiled on older C++ but not on the current one
  #  (fetchpatch {
  #    url = "https://github.com/dlang/druntime/commit/438990def7e377ca1f87b6d28246673bb38022ab.patch";
  #    stripLen = 1;
  #    extraPrefix = "druntime/";
  #    sha256 = "sha256-/pPKK7ZK9E/mBrxm2MZyBNhYExE8p9jz8JqBdZSE6uY=";
  #  })
  #];

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

    rm dmd/compiler/test/runnable_cxx/cppa.d

    # Grep'd string changed with gdb 12
    #   https://issues.dlang.org/show_bug.cgi?id=23198
    substituteInPlace dmd/druntime/test/exceptions/Makefile \
      --replace 'in D main (' 'in _Dmain ('

    # We're using gnused on all platforms
    substituteInPlace dmd/druntime/test/coverage/Makefile \
      --replace 'freebsd osx' 'none'
  ''

  + lib.optionalString (lib.versionOlder version "2.091.0") ''
    # This one has tested against a hardcoded year, then against a current year on
    # and off again. It just isn't worth it to patch all the historical versions
    # of it, so just remove it until the most recent change.
    rm dmd/compiler/test/compilable/ddocYear.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 "/usr/bin/env bash" "${bash}/bin/bash"
  ''

  + lib.optionalString stdenv.isLinux ''
    substituteInPlace phobos/std/socket.d --replace "assert(ih.addrList[0] == 0x7F_00_00_01);" ""
  '' + lib.optionalString stdenv.isDarwin ''
    substituteInPlace phobos/std/socket.d --replace "foreach (name; names)" "names = []; foreach (name; names)"
  '';

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

  buildInputs = [
    curl
    tzdata
  ];

  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
    if [ -z $enableParallelBuilding ]; then
      buildJobs=1
    fi

    make -C dmd -f posix.mak $buildFlags -j$buildJobs HOST_DMD=${HOST_DMD}
    echo ${tzdata}/share/zoneinfo/ > TZDatabaseDirFile
    echo ${lib.getLib curl}/lib/libcurl${stdenv.hostPlatform.extensions.sharedLibrary} > LibcurlPathFile
    make -C phobos -f posix.mak $buildFlags -j$buildJobs DMD=${pathToDmd} DFLAGS="-version=TZDatabaseDir -version=LibcurlPath -J$PWD"

    runHook postBuild
  '';

  doCheck = true;

  checkFlags = buildFlags;

  # many tests are disbled 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
    if [ -z $enableParallelChecking ]; then
      checkJobs=1
    fi

    NIX_ENFORCE_PURITY= \
      make -C dmd/compiler/test $checkFlags CC=$CXX SHELL=$SHELL -j$checkJobs N=$checkJobs

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

    runHook postCheck
  '';

  installPhase = ''
    runHook preInstall

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

    installManPage dmd/docs/man/man*/*

    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
  '';

  meta = with lib; {
    description = "Official reference compiler for the D language";
    homepage = "https://dlang.org/";
    # Everything is now Boost licensed, even the backend.
    # https://github.com/dlang/dmd/pull/6680
    license = licenses.boost;
    maintainers = with maintainers; [ ThomasMader lionello dukc ];
    platforms = [ "x86_64-linux" "i686-linux" "x86_64-darwin" ];
  };
}
#+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 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 KO ✗

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

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

#+NAME: phobos_hash
#+BEGIN_SRC nix
<<phobos_hash_2_104_0>>
#+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 KO ✗ ISSUE (>= 1.31.0)
*** 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 == 1.30.0 OK ✓

- NOTES for dub >= 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

*** 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

    ./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; [ ThomasMader ];
    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_30_0>>
#+END_SRC

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

**** 1.33.0 OK ✓ KO ✗ ISSUE

- 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 ✓ KO ✗ ISSUE

- 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 ✓ KO ✗ ISSUE

- 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 ✓ KO ✗ ISSUE

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

#+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: blank_hash
#+BEGIN_SRC nix
sha256-0000000000000000000000000000000000000000000=
#+END_SRC

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