From 2e34620551b30c099cacc386ba9127f0bd04f77c Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph.amissah@gmail.com>
Date: Sat, 28 Nov 2020 15:15:03 -0500
Subject: directory nixEnv (renamed from nixDevEnv)

---
 nixEnv/nixDevEnv/dub/mkDub-dmd.nix            | 121 ++++++++++++++++++++++++++
 nixEnv/nixDevEnv/dub/mkDub-ldc.nix            | 121 ++++++++++++++++++++++++++
 nixEnv/nixDevEnv/overlays/ldcVersion.nix      |  15 ++++
 nixEnv/nixDevEnv/shells/packages-ldc.nix      |  14 +++
 nixEnv/nixDevEnv/shells/shell-dmd-verNix.nix  |  12 +++
 nixEnv/nixDevEnv/shells/shell-dmd-verUser.nix |  14 +++
 nixEnv/nixDevEnv/shells/shell-ldc-verNix.nix  |   5 ++
 nixEnv/nixDevEnv/shells/shell-ldc-verUser.nix |   7 ++
 8 files changed, 309 insertions(+)
 create mode 100644 nixEnv/nixDevEnv/dub/mkDub-dmd.nix
 create mode 100644 nixEnv/nixDevEnv/dub/mkDub-ldc.nix
 create mode 100644 nixEnv/nixDevEnv/overlays/ldcVersion.nix
 create mode 100644 nixEnv/nixDevEnv/shells/packages-ldc.nix
 create mode 100644 nixEnv/nixDevEnv/shells/shell-dmd-verNix.nix
 create mode 100644 nixEnv/nixDevEnv/shells/shell-dmd-verUser.nix
 create mode 100644 nixEnv/nixDevEnv/shells/shell-ldc-verNix.nix
 create mode 100644 nixEnv/nixDevEnv/shells/shell-ldc-verUser.nix

(limited to 'nixEnv/nixDevEnv')

diff --git a/nixEnv/nixDevEnv/dub/mkDub-dmd.nix b/nixEnv/nixDevEnv/dub/mkDub-dmd.nix
new file mode 100644
index 0000000..a35f2d5
--- /dev/null
+++ b/nixEnv/nixDevEnv/dub/mkDub-dmd.nix
@@ -0,0 +1,121 @@
+{ pkgs ? import <nixpkgs> {},
+  stdenv ? pkgs.stdenv,
+  rdmd ? pkgs.rdmd,
+  dmd ? pkgs.dmd,
+  dub ? pkgs.dub }:
+
+with stdenv;
+let
+  # Filter function to remove the .dub package folder from src
+  filterDub = name: type: let baseName = baseNameOf (toString name); in ! (
+    type == "directory" && baseName == ".dub"
+  );
+
+  # Convert a GIT rev string (tag) to a simple semver version
+  rev-to-version = builtins.replaceStrings ["v" "refs/tags/v"] ["" ""];
+
+  dep2src = dubDep: pkgs.fetchgit { inherit (dubDep.fetch) url rev sha256 fetchSubmodules; };
+
+  # Fetch a dependency (source only for now)
+  fromDub = dubDep: mkDerivation rec {
+    name = "${src.name}-${version}";
+    version = rev-to-version dubDep.fetch.rev;
+    nativeBuildInputs = [ rdmd dmd dub ];
+    src = dep2src dubDep;
+
+    buildPhase = ''
+      runHook preBuild
+      export HOME=$PWD
+      dub build -b=release
+      runHook postBuild
+    '';
+
+    # outputs = [ "lib" ];
+
+    # installPhase = ''
+    #   runHook preInstall
+    #   mkdir -p $out/bin
+    #   runHook postInstall
+    # '';
+  };
+
+  # Adds a local package directory (e.g. a git repository) to Dub
+  dub-add-local = dubDep: "dub add-local ${(fromDub dubDep).src.outPath} ${rev-to-version dubDep.fetch.rev}";
+
+  # The target output of the Dub package
+  targetOf = package: "${package.targetPath or "."}/${package.targetName or package.name}";
+
+  # Remove reference to build tools and library sources
+  disallowedReferences = deps: [ dmd rdmd dub ] ++ builtins.map dep2src deps;
+
+  removeExpr = refs: ''remove-references-to ${lib.concatMapStrings (ref: " -t ${ref}") refs}'';
+
+in {
+  inherit fromDub;
+
+  mkDubDerivation = lib.makeOverridable ({
+    src,
+    nativeBuildInputs ? [],
+    dubJSON ? src + "/dub.json",
+    selections ? src + "/dub.selections.nix",
+    deps ? import selections,
+    passthru ? {},
+    package ? lib.importJSON dubJSON,
+    ...
+  } @ attrs: stdenv.mkDerivation (attrs // {
+
+    pname = package.name;
+
+    nativeBuildInputs = [ rdmd dmd dub pkgs.removeReferencesTo ] ++ nativeBuildInputs;
+    disallowedReferences = disallowedReferences deps;
+
+    passthru = passthru // {
+      inherit dub dmd rdmd pkgs;
+    };
+
+    src = lib.cleanSourceWith {
+      filter = filterDub;
+      src = lib.cleanSource src;
+    };
+
+    preFixup = ''
+      find $out/bin -type f -exec ${removeExpr (disallowedReferences deps)} '{}' + || true
+    '';
+
+    buildPhase = ''
+      runHook preBuild
+
+      export HOME=$PWD
+      ${lib.concatMapStringsSep "\n" dub-add-local deps}
+      dub build --build=release --combined --skip-registry=all
+
+      runHook postBuild
+    '';
+
+    checkPhase = ''
+      runHook preCheck
+
+      export HOME=$PWD
+      ${lib.concatMapStringsSep "\n" dub-add-local deps}
+      dub test --combined --skip-registry=all
+
+      runHook postCheck
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out/bin
+      cp -r "${targetOf package}" $out/bin
+
+      runHook postInstall
+    '';
+
+    meta = lib.optionalAttrs (package ? description) {
+      description = package.description;
+    } // attrs.meta or {};
+  } // lib.optionalAttrs (!(attrs ? version)) {
+    # Use name from dub.json, unless pname and version are specified
+    name = package.name;
+  }));
+}
diff --git a/nixEnv/nixDevEnv/dub/mkDub-ldc.nix b/nixEnv/nixDevEnv/dub/mkDub-ldc.nix
new file mode 100644
index 0000000..a9cbb82
--- /dev/null
+++ b/nixEnv/nixDevEnv/dub/mkDub-ldc.nix
@@ -0,0 +1,121 @@
+{ pkgs ? import <nixpkgs> {},
+  stdenv ? pkgs.stdenv,
+  ldc ? pkgs.ldc,
+  dub ? pkgs.dub
+}:
+
+with stdenv;
+let
+  # Filter function to remove the .dub package folder from src
+  filterDub = name: type: let baseName = baseNameOf (toString name); in ! (
+    type == "directory" && baseName == ".dub"
+  );
+
+  # Convert a GIT rev string (tag) to a simple semver version
+  rev-to-version = builtins.replaceStrings ["v" "refs/tags/v"] ["" ""];
+
+  dep2src = dubDep: pkgs.fetchgit { inherit (dubDep.fetch) url rev sha256 fetchSubmodules; };
+
+  # Fetch a dependency (source only for now)
+  fromDub = dubDep: mkDerivation rec {
+    name = "${src.name}-${version}";
+    version = rev-to-version dubDep.fetch.rev;
+    nativeBuildInputs = [ ldc dub ];
+    src = dep2src dubDep;
+
+    buildPhase = ''
+      runHook preBuild
+      export HOME=$PWD
+      dub build -b=release
+      runHook postBuild
+    '';
+
+    # outputs = [ "lib" ];
+
+    # installPhase = ''
+    #   runHook preInstall
+    #   mkdir -p $out/bin
+    #   runHook postInstall
+    # '';
+  };
+
+  # Adds a local package directory (e.g. a git repository) to Dub
+  dub-add-local = dubDep: "dub add-local ${(fromDub dubDep).src.outPath} ${rev-to-version dubDep.fetch.rev}";
+
+  # The target output of the Dub package
+  targetOf = package: "${package.targetPath or "."}/${package.targetName or package.name}";
+
+  # Remove reference to build tools and library sources
+  disallowedReferences = deps: [ ldc dub ] ++ builtins.map dep2src deps;
+
+  removeExpr = refs: ''remove-references-to ${lib.concatMapStrings (ref: " -t ${ref}") refs}'';
+
+in {
+  inherit fromDub;
+
+  mkDubDerivation = lib.makeOverridable ({
+    src,
+    nativeBuildInputs ? [],
+    dubJSON ? src + "/dub.json",
+    selections ? src + "/dub.selections.nix",
+    deps ? import selections,
+    passthru ? {},
+    package ? lib.importJSON dubJSON,
+    ...
+  } @ attrs: stdenv.mkDerivation (attrs // {
+
+    pname = package.name;
+
+    nativeBuildInputs = [ ldc dub pkgs.removeReferencesTo ] ++ nativeBuildInputs;
+    disallowedReferences = disallowedReferences deps;
+
+    passthru = passthru // {
+      inherit dub ldc pkgs;
+    };
+
+    src = lib.cleanSourceWith {
+      filter = filterDub;
+      src = lib.cleanSource src;
+    };
+
+    preFixup = ''
+      find $out/bin -type f -exec ${removeExpr (disallowedReferences deps)} '{}' + || true
+    '';
+
+    buildPhase = ''
+      runHook preBuild
+
+      export HOME=$PWD
+      ${lib.concatMapStringsSep "\n" dub-add-local deps}
+      dub build --compiler=ldc2 --build=release --combined --skip-registry=all
+
+      runHook postBuild
+    '';
+
+    checkPhase = ''
+      runHook preCheck
+
+      export HOME=$PWD
+      ${lib.concatMapStringsSep "\n" dub-add-local deps}
+      dub test --combined --skip-registry=all
+
+      runHook postCheck
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out/bin
+      cp -r "${targetOf package}" $out/bin
+
+      runHook postInstall
+    '';
+
+    meta = lib.optionalAttrs (package ? description) {
+      description = package.description;
+    } // attrs.meta or {};
+  } // lib.optionalAttrs (!(attrs ? version)) {
+    # Use name from dub.json, unless pname and version are specified
+    name = package.name;
+  }));
+}
diff --git a/nixEnv/nixDevEnv/overlays/ldcVersion.nix b/nixEnv/nixDevEnv/overlays/ldcVersion.nix
new file mode 100644
index 0000000..5bc7f7a
--- /dev/null
+++ b/nixEnv/nixDevEnv/overlays/ldcVersion.nix
@@ -0,0 +1,15 @@
+self: super: rec {
+  ldc = super.ldc.overrideAttrs(oldAttrs: rec {
+    pname   = "ldc";
+    version = "1.24.0";
+    sha256  = "0g5svf55i0kq55q49awmwqj9qi1n907cyrn1vjdjgs8nx6nn35gx";
+    name = "${pname}-${version}";
+    src = super.fetchurl {
+      url = "https://github.com/ldc-developers/ldc/releases/download/v${version}/ldc-${version}-src.tar.gz";
+      sha256 = sha256;
+    };
+    postUnpack = ''
+      patchShebangs .
+    '';
+  });
+}
diff --git a/nixEnv/nixDevEnv/shells/packages-ldc.nix b/nixEnv/nixDevEnv/shells/packages-ldc.nix
new file mode 100644
index 0000000..bcef059
--- /dev/null
+++ b/nixEnv/nixDevEnv/shells/packages-ldc.nix
@@ -0,0 +1,14 @@
+{ pkgs ? import <nixpkgs> {} }:
+let
+  dub2nix-src = fetchTarball {
+    url = "https://github.com/lionello/dub2nix/archive/master.tar.gz";
+  };
+  dub2nix = (import dub2nix-src) { inherit pkgs; };
+in
+with pkgs; [
+  nix
+  ldc
+  sqlite
+  nix-prefetch-git
+  validatePkgConfig
+]
diff --git a/nixEnv/nixDevEnv/shells/shell-dmd-verNix.nix b/nixEnv/nixDevEnv/shells/shell-dmd-verNix.nix
new file mode 100644
index 0000000..7f16efe
--- /dev/null
+++ b/nixEnv/nixDevEnv/shells/shell-dmd-verNix.nix
@@ -0,0 +1,12 @@
+{ pkgs ? import <nixpkgs> {} }:
+pkgs.mkShell {
+  buildInputs = with pkgs; [
+    nix
+    dub
+    dmd
+    rdmd
+    sqlite
+    dub2nix
+    nix-prefetch-git
+  ];
+}
diff --git a/nixEnv/nixDevEnv/shells/shell-dmd-verUser.nix b/nixEnv/nixDevEnv/shells/shell-dmd-verUser.nix
new file mode 100644
index 0000000..334aece
--- /dev/null
+++ b/nixEnv/nixDevEnv/shells/shell-dmd-verUser.nix
@@ -0,0 +1,14 @@
+{ pkgs ? import <nixpkgs>
+  { overlays = [ ]; }
+}:
+pkgs.mkShell {
+  buildInputs = with pkgs; [
+    nix
+    dub
+    dmd
+    rdmd
+    sqlite
+    dub2nix
+    nix-prefetch-git
+  ];
+}
diff --git a/nixEnv/nixDevEnv/shells/shell-ldc-verNix.nix b/nixEnv/nixDevEnv/shells/shell-ldc-verNix.nix
new file mode 100644
index 0000000..0a6aa9a
--- /dev/null
+++ b/nixEnv/nixDevEnv/shells/shell-ldc-verNix.nix
@@ -0,0 +1,5 @@
+{ pkgs ? import <nixpkgs> {} }:
+pkgs.mkShell {
+  buildInputs = with pkgs;
+  [ (import ./packages-ldc.nix { inherit pkgs; }) ];
+}
diff --git a/nixEnv/nixDevEnv/shells/shell-ldc-verUser.nix b/nixEnv/nixDevEnv/shells/shell-ldc-verUser.nix
new file mode 100644
index 0000000..1c9c092
--- /dev/null
+++ b/nixEnv/nixDevEnv/shells/shell-ldc-verUser.nix
@@ -0,0 +1,7 @@
+{ pkgs ? import <nixpkgs> {
+  overlays = [ (import ../overlays/ldcVersion.nix) ];
+} }:
+pkgs.mkShell {
+  buildInputs = with pkgs;
+  [ (import ./packages-ldc.nix { inherit pkgs; }) ];
+}
-- 
cgit v1.2.3