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