Fwd: D nixpkgs related flake & overlays in org mode

Ralph Amissah ralph.amissah at gmail.com
Mon Jul 17 17:52:52 UTC 2023


hey, what happened to my earlier/original post (of a bit over an hour ago)?

Is there a limit on length? or are unrecognized email gateways or
addresses blocked? or perhaps it is under review and I am just a bit
overly impatient? or is there some other policy?

It is long and probably less well formatted here. Once again:

---------- Forwarded message ---------
From: Ralph.Amissah
Date: Mon, Jul 17, 2023 at 12:35 PM
Subject: D nixpkgs related flake & overlays in org mode
To: Dlang Digitalmars-d <digitalmars-d at puremagic.com>

Here (in the latter part of this posting) is an emacs org-mode file,
containing some of my D related nix flakes and nixpkg overlays. Use of
Emacs (org-mode) is a convenience, so I can post in an email a working
code structure (a subdirectory with multiple files). (I am curious to
see how an org mode file looks on the mailing list? hopefully rendered
in text mode)

Within this post is quite an intersection of specialized choice niches
(D, Nix, (Doom) Emacs org-mode :-) I find Nix/NixOS to be an invaluable
development platform and user environment, I would not consider (going
back to) anything else. In an earlier thread I suggested that I might
post this, and I have had it ready to go since I mentioned it, so here
it is.

Some introductory links:

- https://nixos.org/
  https://discourse.nixos.org/
  not so long ago on hacker news, this, "NixOS for the impatient":
  https://news.ycombinator.com/item?id=36260626
  and perhaps on flakes this thread:
  https://discourse.nixos.org/t/should-nix-flakes-become-the-default-installation-method-for-packages/29127
  a fairly recent 17 minute enthusiastic youtube presentation:
  NIX OS: the BEST package manager on the MOST SOLID Linux distribution
  https://www.youtube.com/watch?v=DMQWirkx5EY

- https://github.com/doomemacs/doomemacs
  https://orgmode.org/

The org file (content of this mail) produces the nix D environment and
allows you to customize it to your needs. The resulting output files
would probably be better shared as a small git repo, but I don't think I
want the responsibility of maintaining it. A git repo would make sense
as between overlays some adjustment apart from changing the version and
the identifying nix sha256 may be necessary. A git flake if held
remotely could also be incorporated directly from a git repo, into other
D related developmental work, however, again, if it were to be used in
this way there would be a responsibility in maintaining it.

In emacs org mode:

- switch to org-mode or save as a file starting at the org-mode header

- saving file (or rather "tangling" the file) produces a subdirectory
  "./dlang-nix-flakes" containing nix flakes and overlays which makes it
  possible on a nix enabled system to activate the scripts and build
  updated nix versions of the documents.

- the file paths to be written are contained in the :tangle line within
  the org file.

- within the org file some substitution takes place of the named item
  within angle brackets with what it refers to. It is easy to change the
  stored version and sha values for different version of say ldc or dub

- "code" blocks in the org file are syntax highlighted appropriately for
  each syntax if desired.

The way of working on nixpkgs without overlays would be to shallow clone
the whole of nixpkgs, and make any changes you wish to that shallow
clone, and point to your clone within your flake.nix or shell.nix as
your source of build instructions.

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

With overlays, you can start by copying the nixpkg work on the package
you are interest in, (e.g. ldc) that is available in the shallow clone,
and modify it in the overlay and work with the overlay. (without concern
for the clone other than to check from time to time whether there have
been updates to the nixpkg, or perhaps to share your work upstream with
nixpkgs if you make an update or a generic improvement to the way the
package is built). Of interest though is that on the whole the changes
made in your overlay (if generic improvements to the build package)
could be shared upstream and used in nixpkgs. Here for example dub tests
that were previously removed because they failed, do not fail, and so no
longer need to be removed.

Flake build instructions and overlays could be provided by the D
community (git) independent of having them placed in the nixpkg
repository. (Once prepared there would be no reason not to have them
upstream as part of nixpkgs).

for compilers only ldc2 is available in working order:

- ldc: works, the D compiler currently working in nixpkgs

- dmd: is packaged but not working in nixpkgs & the version here is not
  linked properly. The build package needs work, there is a small
  challenge for you, please fix.

- gdc: has not been made available in nixpkgs with gcc13, remedy this
  please if you can.

- dub: works fine (there was a change in behavior >= 1.31.0 that for nix
  flake builds of packages residing in a local directory tree require
  the setting to pwd in the buildPhase for nix).

More caveats,

- I use NixOS. I have never used Nix on another OS or linux
  distribution, (it presumably works (or can be made to work) on linux
  distros, and windows and macOS), what I have here is only tested on
  NixOS, and presumably should work with nix on linux at least, but is
  not tested.

- Similarly, Nix has a reputation for being great for cross-platform
  building; I to date have only been concerned with x86_64-linux ... and
  have not had cause to see that it works (as it should) on anything
  else.

- in emacs:

  - either:
    - load the text for this mail
    - set this email text to :org-mode

  - or:
    - save the text at the start of the org mode file to a file and
      continue
    - load the org file you just created

  - run :org-babel-tangle

  - the following directory sub-directories within it and files will be
    created

   note org variables enclosed in double angle brackets are expanded,
   and can be made to refer to alternative settings

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

nix flake update && nix flake check && nix flake info && echo "" &&
nix flake show

dlang-nix-flakes (see flake.nix)
  ├───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.33.1---broken'
  │       ├───dsh-overlay-dtest-tilix: development environment
'overlay---ldc-1.33.0-beta2---dub-1.33.1---tilix---gtkd'
  │       ├───dsh-overlay-dtools: development environment
'overlay---ldc-1.33.0-beta2---dub-1.33.1---dtools-2.103.1'
  │       └───dsh-overlay-ldc-dub: development environment
'overlay---ldc-1.33.0-beta2---dub-1.33.1'
  └───packages
      └───x86_64-linux
          ├───check-tilix: package 'tilix-1.9.5'
          ├───default: package 'dummy-0.0.1'
          └───dummy-ldc: package 'dummy-0.0.1'

nix flake update && nix flake check && nix flake info && echo "" &&
nix flake show

for the ldc and dub made available in the overlay (ldc-1.33.0-beta2 &
dub-1.33.1):

nix develop ".#dsh-overlay-ldc-dub"

for the ldc and dub currently available in nixpkgs:

nix develop ".#dsh-nixpkgs-ldc-dub"

to build a dummy package using the overlay versions of ldc and dub:

nix build ".#dummy-ldc" --print-build-logs

nix shell .

Have fun

The org file follows (originally saved in file: dlang-nix-flakes.org ):

-*- 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 at gmail.com][ralph.amissah at 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 files ( written to ./dlang-nix-flakes/ )
** README

#+HEADER: :tangle "./dlang-nix-flakes/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 at gmail.com][ralph.amissah at gmail.com]]
,#+COPYRIGHT:   Copyright (C) 2022 Ralph Amissah
,#+LICENSE:     Boost Software License 1.0
,#+LANGUAGE:    en
,#+STARTUP:     content hideblocks hidestars noindent entitiespretty

,* README for D related dev shells with 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.

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

  ./dlang-nix-flakes

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.

./dlang-nix-flakes 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>> ) KO ✗
  - 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 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 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 "./dlang-nix-flakes/.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
!*.json
!*.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 "./dlang-nix-flakes/.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 "./dlang-nix-flakes/.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 $SHELL

  ❯❯ nix develop
  ❯❯ nix develop -c $SHELL
  ❯❯ 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 "./dlang-nix-flakes/.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 "./dlang-nix-flakes/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.0.1";
    shell = ./shell.nix;
    devEnv = ./.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;
    };
    preBuild = ''
      export HOME=$(pwd)
    '';
    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; # packages available in nixpkgs
as modified/updated by local overlays
      pkgs = nixpkgsFor.${system};     # packages available in nixpkgs
    in
      with pkgs-ovl; {
        default = stdenv.mkDerivation {
          inherit pname;
          inherit version;
          meta.mainProgram = "dummy";
          executable = true;
          src = self;
          inherit shell;
          inherit devEnv;
          nativeBuildInputs = with pkgs; [dub ldc gnumake]; # [ dub
dmd ]; [ dub ldc ]; [ dub gdc ];
          buildPhase = with pkgs; ''
            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
            # dub build --cache=local --compiler=$(type -P $DC_)
--build=$DC_ --combined --skip-registry=all
            runHook postBuild
          '';
          inherit preBuild;
          inherit checkPhase;
          inherit installPhase;
          inherit postInstall;
        };
        dummy-ldc = 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
            dub build --cache=local --compiler=$(type -P ldc2)
--build=ldc2 --combined --skip-registry=all
            runHook postBuild
          '';
          inherit preBuild;
          inherit checkPhase;
          inherit installPhase;
          inherit postInstall;
        };
        check-tilix = tilix;
      });
    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 "./dlang-nix-flakes/shell.nix"
#+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 gx
      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 $SHELL
      #'
    '';
  }
#+END_SRC

*** default.nix

will automatically build the default development shell, perhaps unecessary

#+HEADER: :tangle-NO "./dlang-nix-flakes/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

* d dummy example package
** dummy.d example package to build

#+HEADER: :tangle "./dlang-nix-flakes/src/dummy.d"
#+BEGIN_SRC d
import std.stdio;
mixin(import("version.txt"));
string program_name = "dummy";
@system void main() {
  writeln("D says hello");
  scope(success) {
    writefln(
      "~ run complete, ok ~ (%s-%s.%s.%s, %s D:%s)",
      program_name,
      _ver.major, _ver.minor, _ver.patch,
      __VENDOR__, __VERSION__,
    );
  }
}
#+END_SRC

** views/version.txt (for dummy example package)

#+HEADER: :tangle "./dlang-nix-flakes/views/version.txt"
#+BEGIN_SRC d
/+ obt - org-mode generated file +/
struct Version {
  int major;
  int minor;
  int patch;
}
enum _ver = Version(0, 0, 1);
version (Posix) {
  version (DigitalMars) {
  } else version (LDC) {
  } else version (GNU) {
  } else {
    static assert (0, "Unsupported D compiler");
  }
} else {
  static assert (0, "Unsupported D compiler");
}
#+END_SRC

** dub.json (for dummy example package)

#+HEADER: :tangle "./dlang-nix-flakes/dub.json"
#+BEGIN_SRC json
{
  "authors": [
                               "Ralph Amissah"
  ],
  "name":                      "dummy",
  "version":                   "0.0.1",
  "description":               "dummy example & test",
  "homepage":                  "https://sisudoc.org",
  "license":                   "BSL-1.0",
  "targetPath":                "./bin",
  "sourcePaths":               [ "./src" ],
  "stringImportPaths":         [ "./views" ],
  "buildRequirements":         [ "allowWarnings" ],
  "targetType":                "executable",
  "buildTypes": {
    "dmd": {
      "dflags":                [ "-J=views", "-I=src" ],
      "buildOptions":          [ "inline", "verbose" ],
      "buildRequirements":     [ "allowWarnings" ]
    },
    "ldc2": {
      "dflags":                [ "-O2", "-J=views", "-I=src" ],
      "buildOptions":          [ "optimize", "inline", "verbose" ],
      "buildRequirements":     [ "allowWarnings" ]
    },
    "ldmd2": {
      "dflags":                [ "-O2", "-boundscheck=on", "-J=views",
"-I=src", "-color=on" ],
      "buildOptions":          [ "optimize", "inline", "verbose" ],
      "buildRequirements":     [ "allowWarnings" ]
    },
    "gdc": {
      "dflags":                [ "-O2", "-J=views", "-I=src" ],
      "buildOptions":          [ "optimize", "inline" ],
      "buildRequirements":     [ "allowWarnings" ]
    },
    "gdmd": {
      "dflags":                [ "-O2", "-J=views", "-I=src" ],
      "buildOptions":          [ "optimize", "inline" ],
      "buildRequirements":     [ "allowWarnings" ]
    }
  },
  "configurations": [
    {
      "name":                  "default",
      "targetName":            "dummy"
    },
    {
      "name":                  "ldc2",
      "targetName":            "dummy-ldc"
    },
    {
      "name":                  "ldmd2",
      "targetName":            "dummy-ldmd"
    },
    {
      "name":                  "dmd",
      "targetName":            "dummy-dmd"
    },
    {
      "name":                  "gdc",
      "targetName":            "dummy-gdc"
    },
    {
      "name":                  "gdmd",
      "targetName":            "dummy-gdmd"
    }
  ]
}
#+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 "./dlang-nix-flakes/nix-overlays/ldc/default.nix"
#+BEGIN_SRC nix
import ./generic.nix {
  <<ldc_version_info>>
}
#+END_SRC

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

#+HEADER: :tangle "./dlang-nix-flakes/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 "./dlang-nix-flakes/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 "./dlang-nix-flakes/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-beta2>>
#+END_SRC

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

**** 1.33.0-beta2

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

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

#+NAME: ldc_hash_1_33_0-beta2
#+BEGIN_SRC nix
sha256-ICtIrLItQsvhCHFh3l7Ki1x154xI6ygmAbw+pmlFTlY=
#+END_SRC

**** 1.33.0-beta1

- nix-prefetch-url --unpack
https://github.com/ldc-developers/ldc/archive/refs/tags/v1.33.0-beta1.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/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

#+HEADER: :tangle "./dlang-nix-flakes/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 "./dlang-nix-flakes/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 at out@/include/dmd -L-L at 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 "./dlang-nix-flakes/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 "./dlang-nix-flakes/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
*** 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 "./dlang-nix-flakes/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_33_1>>
#+END_SRC

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

**** 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 "./dlang-nix-flakes/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



More information about the Digitalmars-d mailing list