-*- mode: org -*-
#+TITLE:       configuration nix
#+DESCRIPTION: makefile for spine
#+FILETAGS:    :spine:build:tools:
#+AUTHOR:      Ralph Amissah
#+EMAIL:       [[mailto:ralph.amissah@gmail.com][ralph.amissah@gmail.com]]
#+COPYRIGHT:   Copyright (C) 2015 - 2023 Ralph Amissah
#+LANGUAGE:    en
#+STARTUP:     show4levels 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:t ::t |:t ^:nil -:t f:t *:t

* nix :nix:

#+NAME: nixpkgs_local
#+BEGIN_SRC sh
/srv/nix/nixpkgs
#+END_SRC

** spine

- default.nix
- shell.nix

*** envrc :envrc:
**** .envrc

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

#+HEADER: :tangle ../.envrc
#+BEGIN_SRC sh
NIX_ENFORCE_PURITY=1
# - https://github.com/nix-community/nix-direnv
NixDirEnvVersion="2.2.1"
NixDirEnvSHA="sha256-zelF0vLbEl5uaqrfIzbgNzJWGmLzCmYAkInj/LNxvKs="
#NixDirEnvSHAget="sha256-0000000000000000000000000000000000000000000="
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 makefile
#if [ -f .envrc-local ]; then
#  source_env_if_exists .envrc-local || source .envrc-local
#fi
PATH_add result/bin
use flake .
#use flake .#default
#+END_SRC

**** .envrc-local CHECK MODIFY

- bespoke modify appropriately and generate if needed

#+HEADER: :tangle ../.envrc-local_
#+HEADER: :noweb yes
#+BEGIN_SRC sh
#export NIX_PATH=/nix/var/nix/profiles/per-user/root/channels/nixos
#export NIX_PATH=/srv/nix/nixpkgs
#export NIX_PATH=nixpkgs=/srv/nix/nixpkgs
export DFLAGS="-O2 -inline -boundscheck=on -color=on"
export SpineVER=$(git describe --long --tags | sed 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g')
#export SpineBIN=result/bin
export SpinePROJ=~/grotto/repo/git.repo/projects/doc-reform/code/software/spine
export SpineDOC=~/grotto/repo/git.repo/projects/project-spine/doc-reform-markup/spine-markup-samples
export SpineOUT=/srv/www/spine
export SpineOUTversioned=/srv/www/spine/$SpineVER
export SpineDBpath=/var/www/sqlite
#export SpineDBpath=/srv/www/spine/sqlite
export SpineCGIbin=/var/www/cgi/cgi-bin
export SpineSearchActionLocal='http://localhost/spine_search'
export SpineSearchActionRemote='https://sisudoc.org/spine_search'
export SpineCGIform='spine_search'
export SpineSQLdb='spine.search.db'
#+END_SRC

*** flake :flake:
**** flake.nix

#+HEADER: :tangle ../flake.nix
#+HEADER: :noweb yes
#+BEGIN_SRC nix
{
  description                  = "a sisu like parser & document generator";
  inputs.nixpkgs.url           = "<<nixpkgs_url>>";
  inputs.flake-utils.url       = "github:numtide/flake-utils";
  outputs = { self, nixpkgs, flake-utils } @inputs:
    let
      pname                    = "spine";
      version                  = "<<spine_version_set>>";
      shell                    = ./shell.nix; # ./default.nix;
      devEnv                   = ./.envrc; # ./shell.nix; # ./default.nix;
      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;  }); # nixpkgs instantiated for supported system types.
      checkPhase = ''
        runHook preCheck
        dub test --combined --skip-registry=all
        runHook postCheck
      '';
      installPhase = ''
        runHook preInstall
        mkdir -p $out/bin
        install -m755 ./bin/spine $out/bin/spine
        runHook postInstall
      '';
      postInstall = ''
        echo `ls -la $out/bin/spine`
        $out/bin/spine -v
      '';
    in {
      packages = forAllSystems (system:
        let pkgs               = nixpkgsFor.${system};
        in with pkgs; {
          default = stdenv.mkDerivation {
            inherit pname;
            inherit version;
            meta.mainProgram   = "spine";
            executable         = true;
            src                = self;
            inherit shell;
            inherit devEnv;
            buildInputs        = [ sqlite ];
            nativeBuildInputs  = [ dub ldc gnumake ]; # [ dub dmd ]; [ dub ldc ]; [ dub gdc ];
            buildPhase = ''
              runHook preBuild
              for DC_ in dmd ldmd2 ldc2 gdc gdmd; do
                echo "- check for D compiler $DC_"
                DC=$(type -P $DC_ || echo "")
                if [ ! "$DC" == "" ]; then break; fi
              done
              if [ "$DC" == "" ]; then exit "Error: could not find D compiler"; fi
              echo "$DC_ used as D compiler to build $pname"
              dub build --compiler=$DC --build=$DC_ --combined --skip-registry=all
              runHook postBuild
            '';
            inherit checkPhase;
            inherit installPhase;
            inherit postInstall;
          };
          spine-dmd = stdenv.mkDerivation {
            inherit pname;
            inherit version;
            meta.mainProgram   = "spine-dmd";
            executable         = true;
            src                = self;
            inherit shell;
            inherit devEnv;
            buildInputs        = [ sqlite ];
            nativeBuildInputs  = [ dub dmd gnumake ];
            buildPhase = ''
              runHook preBuild
              dub build --compiler=$(type -P dmd) --build=dmd --combined --skip-registry=all
              runHook postBuild
            '';
            inherit checkPhase;
            inherit installPhase;
            inherit postInstall;
          };
          spine-ldc = stdenv.mkDerivation {
            inherit pname;
            inherit version;
            meta.mainProgram   = "spine-ldc";
            executable         = true;
            src                = self;
            inherit shell;
            inherit devEnv;
            buildInputs        = [ sqlite ];
            nativeBuildInputs  = [ dub ldc gnumake ];
            buildPhase = ''
              runHook preBuild
              dub build --compiler=$(type -P ldc2) --build=ldc2 --combined --skip-registry=all
              runHook postBuild
            '';
            inherit checkPhase;
            inherit installPhase;
            inherit postInstall;
          };
          #spine-gdc = stdenv.mkDerivation {
          #  inherit pname;
          #  inherit version;
          #  meta.mainProgram   = "spine-gdc";
          #  executable         = true;
          #  src                = self;
          #  inherit shell;
          #  inherit devEnv;
          #  buildInputs        = [ sqlite ];
          #  nativeBuildInputs  = [ dub gdc gnumake ];
          #  buildPhase = ''
          #    runHook preBuild
          #    dub build --compiler=$(type -P gdc) --build=gdc --combined --skip-registry=all
          #    runHook postBuild
          #  '';
          #  inherit checkPhase;
          #  inherit installPhase;
          #  inherit postInstall;
          #};
          #vendorSha256 = "sha256-0Q00000000000000000000000000000000000000000=";
      });
      apps = forAllSystems (system: {
        default = {
          type                 = "app";
          program              = "${self.packages.${system}.default}/bin/spine";
        };
      });
      devShells = forAllSystems (system:
        let
          pkgs = nixpkgsFor.${system};
          shellHook = ''
            export DFLAGS="-O2 -inline -boundscheck=on -color=on"
            export Date=`date "+%Y%m%d"`
            export SpineVER=$(git describe --long --tags | sed 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g')
            ### set local values in .envrc-local (or modify here if you must)
            # export SpinePROJ=~/grotto/repo/git.repo/projects/doc-reform/code/software/spine
            # export SpineDOC=~/grotto/repo/git.repo/projects/project-spine/doc-reform-markup/spine-markup-samples
            # export SpineOUT=/srv/www/spine
            # export SpineDBpath=/var/www/sqlite
            # export SpineDBpath=/srv/www/spine/sqlite
            export SpineSRC=$SpinePROJ/src
            export SpineBIN=$SpinePROJ/result/bin
            export SpinePOD=$SpineDOC/markup/pod
            export SpineOUTversioned=$SpineOUT/$SpineVER
            export SpineSearchActionLocal='http://localhost/spine_search'
            # export SpineSearchActionRemote='https://sisudoc.org/spine_search'
            export SpineCGIform='spine_search'
            export SpineSQLdb='spine.search.db'
            export PROG_VER_GIT="`git describe --long --tags | sed -e 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g'`"
            export PROG_VER_DECLARED="`cat ./views/version.txt | grep --color=never "enum" | sed 's/.\+(\([0-9]\+\),[ \t]\+\([0-9]\+\),[ \t]\+\([0-9]\+\)[ \t]*).\+/\1.\2.\3/g'`"
            export spineNixHelp="cat ./.env/nix-commands"
            export spineTest="nix shell .#default --print-build-logs --command spine --very-verbose --epub --html --html-link-search --html-link-curate --curate --output=\"\$SpineOUT\" $SpinePOD/*"
            export spineHtml="spine --very-verbose --html --html-link-search --html-link-curate --curate --sqlite-update --sqlite-db-filename=\"spine.search.db\" --cgi-sqlite-search-filename=\"spine_search\" --sqlite-db-path=\"\$SpineDBpath\" --output=\"\$SpineOUT\" $SpinePOD/*"
            export spineEpub="spine --very-verbose --epub --output=\"\$SpineOUT\" $SpinePOD/*"
            export spineLatex="spine --very-verbose --latex --output=\"\$SpineOUT\" $SpinePOD/*"
            export spinePdf="spine --very-verbose --pdf --output=\"\$SpineOUT\" $SpinePOD/*"
            export spineSqliteCreateDB="spine --very-verbose --sqlite-db-recreate --sqlite-db-path=\"$SpineDBpath\" --sqlite-db-filename=\"spine.search.db\""
            export spineSqlite="spine --very-verbose --sqlite-discrete --sqlite-db-path=\"$SpineDBpath\" --sqlite-db-filename=\"spine.search.db\" --output=\"\$SpineOUT\" $SpinePOD/*"
            #export spineSqlite="spine --very-verbose --sqlite-update --sqlite-db-path=\"$SpineDBpath\" --sqlite-db-filename=\"spine.search.db\" --output=\"\$SpineOUT\" $SpinePOD/*"
          '';
        in with pkgs; {
          devShell = mkShell {
            name               = "spine base dev shell";
            inherit shell;
            inherit devEnv;
            #buildInputs        = [ sqlite ];
            #nativeBuildInputs  = [ dub dmd ldc gdc gnumake ];
            packages     = [
              sqlite
              dub dmd ldc gnumake
            ];
            inherit shellHook;
          };
          devShell-epub = mkShell {
            name               = "spine dev shell for epub output";
            inherit shell;
            inherit devEnv;
            packages = [
              dub dmd ldc gnumake
              sqlite
              libxml2
              html-tidy
              xmlstarlet
              epubcheck
              ebook_tools
              libxml2
              html-tidy
              xmlstarlet
              epubcheck
              ebook_tools
              epr
              sigil
              calibre #(suite includes: ebook-viewer)
              foliate
            ];
            inherit shellHook;
          };
          devShell-html = mkShell {
            name               = "spine dev shell for latex & pdf output";
            inherit shell;
            inherit devEnv;
            packages = [
              dub dmd ldc gnumake
              sqlite
            ];
            inherit shellHook;
          };
          devShell-latex-pdf = mkShell {
            name               = "spine dev shell for latex & pdf output";
            inherit shell;
            inherit devEnv;
            packages = [
              dub dmd ldc gnumake
              sqlite
              source-sans-pro
              source-serif-pro
              source-code-pro
              texlive.combined.scheme-full
            ];
            inherit shellHook;
          };
          devShell-sqlite = mkShell {
            name               = "spine dev shell for latex & pdf output";
            inherit shell;
            inherit devEnv;
            packages = [
              dub dmd ldc gnumake
              sqlite
            ];
            inherit shellHook;
          };
          devShell-i18n = mkShell {
            name               = "spine dev shell internationalization, po4a";
            inherit shell;
            inherit devEnv;
            packages = [
              dub dmd ldc gnumake
              sqlite
              perl534Packages.Po4a
            ];
            inherit shellHook;
          };
          default = import ./shell.nix { inherit pkgs; };
      });
  };
}
#+END_SRC

#+BEGIN_SRC nix
pname                    = "spine";
version                  = "<<spine_version_set>>";
shell                    = ./shell.nix; # ./default.nix;
devEnv                   = ./.envrc; # ./shell.nix; # ./default.nix;
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;  }); # nixpkgs instantiated for supported system types.
#+END_SRC

*** flake :flake:
**** notes?

- flake.nix
    /srv/nix/nixpkgs
    ./shell.nix
  - shell.nix
      ./pkgs/shell-pkgs.nix
    - pkgs/shell-pkgs.nix
  - default.nix
     ./nix/dub.selections.nix #
    - dub.selections.nix

- nix develop

- nix flake update

- nix shell -f default.nix --print-build-logs
- nix shell -c default.nix

- nix build `nix-instantiate`
- nix build -f default.nix --print-build-logs
- nix shell -f default.nix --print-build-logs
- nix develop --build -f derivation.nix -I .envrc --print-build-logs
- nix develop --profile .#default --print-build-logs --command spine -v

- nix search --json 2>/dev/null |jq
- nix flake show
- nix show-derivation

# nix-instantiate | nix-build

#nix flake update
#nix flake check
#nix flake show
#nix develop
#nix build .#default --print-build-logs

#+BEGIN_SRC nix
src = fetchTarball {
  url       = "file:///[path]/$(pname)-$(version).tar.gz";
  sha256    = "sha256:0000000000000000000000000000000000000000000000000000";
};
#+END_SRC

**** flake parts
***** flake metadata

#+NAME: flake_metadata
#+HEADER: :noweb yes
#+BEGIN_SRC nix
pname       = "spine";
version     = "<<spine_version_set>>";
description = "a sisu like parser and document generator";
#+END_SRC

***** flake inputs
****** flake inputs static

#+NAME: flake_inputs_nix
#+HEADER: :noweb yes
#+BEGIN_SRC nix
nixpkgs.url          = "github:nixos/nixpkgs";
flake-utils.url      = "github:numtide/flake-utils";
#+END_SRC

****** flake inputs for dub2nix

#+NAME: flake_inputs_dub2nix
#+HEADER: :noweb yes
#+BEGIN_SRC nix
flake-utils.url    = "github:numtide/flake-utils";
nixpkgs.url        = "github:nixos/nixpkgs";
d2sqlite3-src      = { url = "github:dlang-community/d2sqlite3"; flake = false; };
tinyendian-src     = { url = "github:kiith-sa/tinyendian";       flake = false; };
dyaml-src          = { url = "github:dlang-community/D-YAML";    flake = false; };
imageformats-src   = { url = "github:lgvz/imageformats";         flake = false; };
dub2nix-src        = { url = "github:lionello/dub2nix";          flake = false; };
#+END_SRC

***** flake outputs
****** flake outputs static

#+NAME: flake_outputs
#+HEADER: :noweb yes
#+BEGIN_SRC nix
self, nixpkgs, flake-utils
#+END_SRC

****** flake outputs for dub2nix

#+NAME: flake_outputs_dub2nix
#+HEADER: :noweb yes
#+BEGIN_SRC nix
self, nixpkgs, flake-utils, dub2nix-src, d2sqlite3-src, tinyendian-src, dyaml-src, imageformats-src
#+END_SRC

***** flake devshells

#+NAME: flake_devshells
#+HEADER: :noweb yes
#+BEGIN_SRC nix
devShells               = forAllSystems (system:
  let pkgs              = nixpkgsFor.${system};
  in {
    default = pkgs.mkShell {
      buildInputs       = with pkgs; [ git dub dmd ldc sqlite ];
    };
});
#+END_SRC

***** flake phases

#+NAME: flake_phases
#+HEADER: :noweb yes
#+BEGIN_SRC nix
buildPhase = ''
  runHook preBuild
  HOME="$PWD"
  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 --compiler=$DC --build=$DC_ --combined --skip-registry=all
  runHook postBuild
'';
<<flake_phases_other_than_buildPhase>>
#+END_SRC

#+NAME: flake_phases_other_than_buildPhase
#+HEADER: :noweb yes
#+BEGIN_SRC nix
checkPhase = ''
  runHook preCheck
  dub test --combined --skip-registry=all
  runHook postCheck
'';
installPhase = ''
  runHook preInstall
  mkdir -p $out/bin
  install -m755 ./bin/spine $out/bin/spine
  runHook postInstall
'';
postInstall = ''
  echo `ls -la $out/bin/spine`
  echo "
  nix build or nix develop? (suggestions):
  - nix build
    nix build .#default --print-build-logs
    nix flake update; nix build .#default --print-build-logs
      nix build --print-build-logs
  - nix run
    nix run .#default --print-build-logs
    nix run default.nix --print-build-logs
  - nix shell
    nix shell .#default --print-build-logs --command spine -v
  - nix develop
    nix develop --profile .#default --print-build-logs --command spine -v
    nix develop ; eval \"$buildPhase\"
    nix develop --build -f derivation.nix -I .envrc --print-build-logs
  - nix profile install . --print-build-logs
  spine -v
  nix-instantiate | nix show-derivation | jq
  "
  $out/bin/spine -v
'';
#+END_SRC

***** d-compiler (dmd ldc gdc)

- dmd ldc gdc

#+NAME: d-compiler
#+HEADER: :noweb yes
#+BEGIN_SRC nix
dmd
#+END_SRC

***** flake spine dub2nix

#+NAME: flake_output_spine_dub2nix
#+HEADER: :noweb yes
#+BEGIN_SRC nix
packages.x86_64-linux.spine =
  let
    pkgs            = import nixpkgs {
      system        = "x86_64-linux";
    };
    #targetOf = package: "${package.targetPath or "."}/${package.targetName or package.name}";
  in
    pkgs.stdenv.mkDerivation {
      pname         = "spine";
      version       = "<<spine_version_set>>";
      description   = "a sisu like parser and document generator";
      inherit self;
      src           = self;
      shell         = ./shell.nix;
      <<flake_phases>>
      buildInputs       = [ sqlite ];
      nativeBuildInputs = with pkgs; [ dub ldc ];
    };
#+END_SRC

***** flake misc

#+BEGIN_SRC nix
src = fetchTarball {
  url       = "file:///[path]/$(pname)-$(version).tar.gz";
  sha256    = "sha256:0000000000000000000000000000000000000000000000000000";
};
#+END_SRC

*** shell.nix :shell:
**** tangle

#+HEADER: :tangle ../shell.nix
#+HEADER: :tangle-mode (identity #o755)
#+HEADER: :shebang "#!/usr/bin/env -S nix-shell --pure\n#!nix-shell -i bash"
#+HEADER: :noweb yes
#+BEGIN_SRC nix
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
mkShell {
  buildInputs = [
    # ❯❯❯ nix_related
    #nix
    direnv
    #cachix
    nixVersions.unstable #nixFlakes
    nix-prefetch-git
    validatePkgConfig
    nix-output-monitor
    nix-tree
    jq
    git
    gnumake
    ps
    # ❯❯❯ d_build_related
    # ❯❯ package manager
    dub
    # ❯❯ compiler
    ldc
    #rund
    # ❯❯ linker
    #lld
    #mold
    # ❯❯ builder
    #ninja
    #meson
    # ❯❯❯ sqlite search related
    sqlite
    # ❯❯❯ pdf_latex_related
    # source-sans-pro
    # source-serif-pro
    # source-code-pro
    # texlive.combined.scheme-full
    # ❯❯❯ xml_and_epub_related
    # libxml2
    # html-tidy
    # xmlstarlet
    # epubcheck
    # ebook_tools
    # epr
    # sigil
    # calibre #(suite includes: ebook-viewer)
    # foliate
    # ❯❯❯ i18n translation related
    # perl534Packages.Po4a
  ];
  shellHook = ''
    nix flake update
    nix flake check
    nix flake show
    echo '
      shell.nix echo ❯❯

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

      ❯❯ nix develop
      ❯❯ nix develop -c zsh

      ❯❯ nix build
      ❯❯ nix build ".#default" --print-build-logs
      ❯❯ nix build ".#spine-dmd" --print-build-logs |& nom
      ❯❯ nix build ".#spine-ldc" --print-build-logs |& nom
      ❯❯ nix build ".#spine-gdc" --print-build-logs |& nom
    '
  '';
}
#+END_SRC

echo "ldc `${pkgs.ldc}/bin/ldc2 -v`"

**** Notes

#+BEGIN_SRC text
#% Notes

# - shell.nix -I .envrc
# - shell.nix -I .envrc --pure

# [ nix-shell ]

  # - nix-shell -I nixpkgs=/srv/nix/nixpkgs --pure
  # - nix-shell -p "with import /srv/nix/nixpkgs {}; ldc" --pure
  # - nix-shell -p "with import /srv/nix/nixpkgs {}; [dub ldc]" --pure

  # - nix-shell -p nixVersions.unstable #nixFlakes
  # - nix-shell -p nixFlakes --pure
  # - nix-shell -p nixFlakes --pure -p "with import /srv/nix/nixpkgs {}; [nix dub ldc git ps]"
  # - nix-shell shell.nix direnv: export +IN_NIX_SHELL
  # - nix-shell shell.nix

# [ nix-build ]

  # - nix-build -I nixpkgs=/srv/nix/nixpkgs # --pure
  # - nix-build -I .envrc --pure
  # - nix-build default.nix -I .envrc && result/bin/spine -v

# [ nix-instantiate ]

  # - nix-instantiate | nix show-derivation | jq
  # - nix-instantiate -I .envrc | nix show-derivation -f derivation.nix -I .envrc | jq
  # - nix-instantiate | nix show-derivation --recursive | jq
  # - nix-instantiate -I .envrc | nix show-derivation -f derivation.nix --recursive -I .envrc | jq
  # - nix-instantiate | nix-build
  # - nix-instantiate -I .envrc | nix-build -I .envrc

# [ nix shell ]

  # - nix shell -c default.nix
  # - nix shell -f default.nix --print-build-logs

# [ nix build ]

  # - nix build -I .envrc --print-build-logs
  # - nix build -f default.nix --print-build-logs
  # - nix build -f derivation.nix --print-build-logs

  # - nix build `nix-instantiate`
  # - nix build `nix-instantiate -I .envrc`

  # - nix build -f default.nix && ./result/bin/spine -v && noti -t "spine build" -m "see ./result/bin/spine"
  # - nix build .#default

# [ nix run ]

  # - nix run default.nix --print-build-logs
  # - nix run -I .envrc default.nix --print-build-logs
  # - nix run .#default

# - nix-shell -I .envrc --pure
# - nix develop --build -f derivation.nix -I .envrc --print-build-logs

# - nix-shell -p nixFlakes --pure -p "with import /srv/nix/nixpkgs {}; [nix dub ldc git ps]"
# - nix-build
# - nix build `nix-instantiate -I .envrc`

# - nix develop --build -f default.nix -I .envrc

# - nix-shell -I .envrc --pure
# - nix-build default.nix -I .envrc && result/bin/spine -v

# - nix shell -f default.nix --print-build-logs
# - nix-instantiate -I .envrc | nix-build -I .envrc
#+END_SRC

#+BEGIN_SRC text
#% Notes
- nix-shell

- shell.nix --pure
- shell.nix --pure -I .envrc

- nix-shell --pure -I nixpkgs=<<nixpkgs_local>>
- nix-shell --pure -p "with import <<nixpkgs_local>> {}; ldc"
- nix-shell --pure -p "with import /srv/nix/nixpkgs {}; [dub ldc]"

- shell.nix direnv: export +IN_NIX_SHELL

- nix-shell -p nixFlakes
- nix-shell -p nixFlakes --pure
- nix-shell -p nixFlakes --pure -p "with import /srv/nix/nixpkgs {}; [dub ldc]"

- shell.nix -I .envrc
- nix-shell -I nixpkgs=<provide local nix path>
- nix-shell -I nixpkgs=<provide local nix path> --pure
- shell.nix
- nix-shell shell.nix --pure

- nix shell -c default.nix

- nix run default.nix --print-build-logs
- nix run -I .envrc default.nix --print-build-logs

- nix develop

- nix-build -I nixpkgs=<provide local nix path>
- nix-build -I .envrc

- nix build -f default.nix --print-build-logs
- nix build -f derivation.nix --print-build-logs
- nix build -I .envrc --print-build-logs
- nix shell -f default.nix --print-build-logs
- nix develop --build -f derivation.nix -I .envrc --print-build-logs

- buildPhase

- nix build -f default.nix && noti
- nix build -f default.nix && ./result/bin/spine -v && noti -t "spine build" -m "see ./result/bin/spine"
- nix develop --build -f derivation.nix -I .envrc --print-build-logs

  ./result/bin/spine
#+END_SRC

*** default.nix :default:

- default.nix -I nixpkgs=<provide local nix path>
  e.g. default.nix -I nixpkgs=/srv/nix/nixpkgs

- nix-build -I nixpkgs=<provide local nix path>
  e.g. nix-build -I nixpkgs=<<nixpkgs_local>>

#+HEADER: :noweb yes
#+BEGIN_SRC sh
nix-build -I nixpkgs=<<nixpkgs_local>>
nix-build -I .envrc-local
nix-build -I .envrc
default.nix -I .envrc
default.nix

nix build -f default.nix --print-build-logs
nix build -f derivation.nix --print-build-logs
nix shell -f default.nix --print-build-logs
nix develop --build -f derivation.nix -I .envrc --print-build-logs

# nix build -f project.nix
# nix build -f spine.nix
#+END_SRC

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

* devEnv

nix profile install .

#+HEADER: :tangle ../devenv.nix
#+HEADER: :tangle-mode (identity #o644)
#+BEGIN_SRC nix
{ pkgs ? import <nixpkgs> { }, name ? "user-env" }:
with pkgs;
buildEnv {
  inherit name;
  extraOutputsToInstall = [ "out" "man" "lib" ]; # to get all needed symlinks
  paths = [
    # ❯❯❯ nix_related
    #nix # if not on NixOS, this is needed
    direnv
    #cachix
    nixVersions.unstable #nixFlakes
    nix-prefetch-git
    validatePkgConfig
    nix-output-monitor
    nix-tree
    jq
    git
    gnumake
    ps
    # ❯❯❯ d_build_related
    # ❯❯ package manager
    dub
    # ❯❯ compiler
    dmd
    ldc
    # ❯❯❯ sqlite search related
    sqlite
    # this will create a script that will rebuild and upgrade your setup; using shell script syntax
    (writeScriptBin "nix-rebuild" ''
      #!${stdenv.shell}
      #cd <path-to-flake> || exit 1
      nix flake update
      nix profile upgrade '.*'
    '')
    # puts in your root the nixpkgs version
    (writeTextFile {
      name = "nixpkgs-version";
      destination = "/nixpkgs-version";
      text = lib.version;
    })
  ];
}
#+END_SRC

*** derivation.nix :default:

#+HEADER: :tangle ../derivation.nix
#+HEADER: :tangle-mode (identity #o644)
#+HEADER: :noweb yes
#+BEGIN_SRC nix
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
  lib ? pkgs.lib,
  ldc ? null,
  dcompiler ? pkgs.ldc,
  dub ? pkgs.dub
}:
assert dcompiler != null;
with (
  with lib;
  let
    filterDub = name: type: let baseName = baseNameOf (toString name); in ! ( # filter function to remove the .dub package folder from src
      type == "directory" && baseName == ".dub"
    );
    targetOf = package: "${package.targetPath or "."}/${package.targetName or package.name}";
    # remove reference to build tools and library sources
    disallowedReferences = deps: [ dcompiler dub ];
    removeExpr = refs: ''remove-references-to ${lib.concatMapStrings (ref: " -t ${ref}") refs}'';
  in {
    mkDubDerivation = lib.makeOverridable ({
      src,
      nativeBuildInputs ? [],
      dubJSON ? src + "/dub.json",
      passthru ? {},
      package ? lib.importJSON dubJSON,
      ...
    } @ attrs: stdenv.mkDerivation (attrs // {
      pname = package.name;
      nativeBuildInputs = [ dcompiler dub pkgs.removeReferencesTo ] ++ nativeBuildInputs;
      disallowedReferences = disallowedReferences deps;
      passthru = passthru // {
        inherit dub dcompiler pkgs;
      };
      src = lib.cleanSourceWith {
        filter = filterDub;
        src = lib.cleanSource src;
      };
      preFixup = ''
        find $out/bin -type f -exec ${removeExpr (disallowedReferences deps)} '{}' + || true
      '';
      buildPhase = ''
        runHook preBuild
        HOME="$PWD"
        DFLAGS="-O2 -inline"
        for DC_ in dmd ldmd2 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 --compiler=$DC --build=release --combined --skip-registry=all
        runHook postBuild
      '';
      checkPhase = ''
        runHook preCheck
        HOME="$PWD"
        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)) {
      name = package.name; # use name from dub.json, unless pname and version are specified
    }));
  }
);
mkDubDerivation rec {
  pname         = "spine";
  version       = "<<spine_version_set>>";
  src           = ./.;
  nativeBuildInputs = with pkgs; [ dub ldc ];
  buildInputs = with pkgs; [ nixVersions.unstable sqlite ];
  meta = with pkgs.lib; {
    description = "A sisu like parser & document generator";
    longDescription = ''
      a sisu like parser & document generator
    '';
    homepage    = "https://sisudoc.org";
    license     = licenses.agpl3Plus;
    platforms   = platforms.linux;
    maintainers = [ "RalphAmissah" ];
  };
}
#+END_SRC

- unused
  - installPhase

#+BEGIN_SRC txt
installPhase = ''
  mkdir -p $out/bin
  cp spine $out/bin
  chmod +x $out/bin/spine
'';
#+END_SRC

*** project meta

#+NAME: nix_project_meta
#+HEADER: :noweb yes
#+BEGIN_SRC nix
meta = with pkgs.lib; {
  pname       = "spine";
  version     = "<<spine_version_set>>";
  description = "a sisu like document parser";
  longDescription = ''
    A sisu like parser and document generator
  '';
  homepage    = "https://sisudoc.org";
  license     = licenses.agpl3Plus;
  platforms   = platforms.linux;
  maintainers = [ "RalphAmissah" ];
};
#+END_SRC

*** dub.selections.json

#+HEADER: :NO-tangle ../dub.selections.json
#+BEGIN_SRC nix
{
	"fileVersion": 1,
	"versions": {
		"d2sqlite3": "0.19.1",
		"dyaml": "0.8.3",
		"imageformats": "7.0.2",
		"tinyendian": "0.2.0"
	}
}
#+END_SRC

*** dub.selections.nix

#+HEADER: :NO-tangle ../nix/dub.selections.nix
#+BEGIN_SRC nix
# This file was generated by https://github.com/lionello/dub2nix v0.2.3
[ {
  fetch = {
    type = "git";
    url = "https://github.com/dlang-community/d2sqlite3.git";
    rev = "v0.19.1";
    sha256 = "0rnsgla6xyr8r34knf7v6dwhacra96q1b5rhxcz9246inwhvrk5k";
    fetchSubmodules = false;
    date = "2020-07-21T12:32:51+02:00";
    deepClone = false;
    leaveDotGit = false;
    path = "/nix/store/hsi8xvl15w6fwlqvs042m1z5i88yc72i-d2sqlite3";
  };
} {
  fetch = {
    type = "git";
    url = "https://github.com/kiith-sa/tinyendian.git";
    rev = "v0.2.0";
    sha256 = "086gf5aga52wr5rj2paq54daj8lafn980x77b706vvvqaz2mlis8";
    fetchSubmodules = false;
    date = "2018-06-10T11:04:28+02:00";
    deepClone = false;
    leaveDotGit = false;
    path = "/nix/store/9c7fsmi5am84j6dq2mp3va306x3ay291-tinyendian";
  };
} {
  fetch = {
    type = "git";
    url = "https://github.com/kiith-sa/D-YAML.git";
    rev = "v0.8.3";
    sha256 = "13wy304xjbwkpgg7ilql1lkxkm83s87jm59ffnrg26slp7cx149q";
    fetchSubmodules = false;
    date = "2020-09-19T23:46:57+02:00";
    deepClone = false;
    leaveDotGit = false;
    path = "/nix/store/3i8i56lkmw2xq3lxr5h66v909waq2mqg-D-YAML";
  };
} {
  fetch = {
    type = "git";
    url = "https://github.com/lgvz/imageformats.git";
    rev = "v7.0.2";
    sha256 = "1mfbsmi4fs1xny4zqs6jyr04d5f4h03r9f6jadvkdqj5kd1k0ws7";
    fetchSubmodules = false;
    date = "2019-10-10T07:54:45+03:00";
    deepClone = false;
    leaveDotGit = false;
    path = "/nix/store/wn554pn21nzmpvw2hs7hvv9v9y0sgarg-imageformats";
  };
} ]
#+END_SRC

*** dub2nix & shared pkgs SHARED
**** dub2nix with pkgs shared

#+NAME: nix_with_pkgs
#+HEADER: :noweb yes
#+BEGIN_SRC nix
with pkgs; [
  <<nix_shell_with_pkgs_list>>
]
#+END_SRC

**** with pkgs list

#+NAME: nix_shell_with_pkgs_list
#+BEGIN_SRC nix
nixVersions.unstable #nixFlakes
rund
dub
ldc
sqlite
nix-prefetch-git
validatePkgConfig
nix-output-monitor
nix-tree
jq
git
#+END_SRC

** variables
*** nixpkgs path
**** selected

#+NAME: nixpkgs_url
#+BEGIN_SRC sh
<<nixpkgs_url_github>>
#+END_SRC

**** github official

#+NAME: nixpkgs_url_github
#+BEGIN_SRC sh
github:NixOS/nixpkgs/nixpkgs-unstable
#+END_SRC

**** localhost

#+NAME: nixpkgs_url_local
#+BEGIN_SRC sh
/srv/nix/nixpkgs
#+END_SRC

*** spine version SET VERSION :version:set:project:

#+NAME: spine_version_set
#+BEGIN_SRC sh
0.12.0
#+END_SRC

*** set names SET

#+NAME: spine_search_db
#+BEGIN_SRC sh
spine.search.db
#+END_SRC

#+NAME: spine_search_cgi
#+BEGIN_SRC sh
spine_search
#+END_SRC

*** nixpkgs_path SETUP
**** nixpkgs select path SELECT

#+NAME: nixpkgs_path
#+HEADER: :noweb yes
#+BEGIN_SRC nix
<<nixpkgs_path_local>>
#+END_SRC

**** nixpkgs path options

- <nixpkgs>

#+NAME: nixpkgs_path_default
#+HEADER: :noweb yes
#+BEGIN_SRC nix
<nixpkgs>
#+END_SRC

#+NAME: nix_path_directory
#+HEADER: :noweb yes
#+BEGIN_SRC nix
nixpkgs=<<nixpkgs_path_local>>
#+END_SRC

#+NAME: project_path_local_project
#+HEADER: :noweb yes
#+BEGIN_SRC nix
~/grotto/repo/git.repo/projects/project-spine/doc-reform
#+END_SRC

#+NAME: project_path_local_src
#+HEADER: :noweb yes
#+BEGIN_SRC nix
<<project_path_local_project>>/src
#+END_SRC

#+NAME: project_path_local_bin
#+HEADER: :noweb yes
#+BEGIN_SRC nix
<<project_path_local_project>>/result/bin
#+END_SRC

#+NAME: project_path_cgi_bin
#+BEGIN_SRC nix
/var/www/cgi/cgi-bin
#+END_SRC

#+NAME: project_path_local_doc
#+BEGIN_SRC nix
~/grotto/repo/git.repo/projects/project-spine/doc-reform-markup/spine-markup-samples
#+END_SRC

#+NAME: project_path_local_out
#+BEGIN_SRC nix
/srv/www/spine/$SpineVER
#+END_SRC

#+NAME: project_path_local_out_
#+HEADER: :noweb yes
#+BEGIN_SRC nix
/tmp/spine/$SpineVER/www
#+END_SRC

#+NAME: project_path_local_out_static
#+HEADER: :noweb yes
#+BEGIN_SRC nix
/srv/www/spine
#+END_SRC

#+NAME: project_path_local_out_static_
#+BEGIN_SRC nix
/var/www
#+END_SRC

#+NAME: project_path_sqlite
#+BEGIN_SRC nix
/var/www/sqlite
#+END_SRC

#+NAME: nixpkgs_url
#+BEGIN_SRC nix
github:nixos/nixpkgs
#+END_SRC

#+HEADER: :noweb yes
#+BEGIN_SRC nix
<<nixpkgs_path_local>>
#+END_SRC

- local path SET WARN

#+NAME: nixpkgs_path_local
#+BEGIN_SRC nix
/srv/nix/nixpkgs
#+END_SRC

**** project path options

- local path SET WARN

#+NAME: nix_path_channel
#+BEGIN_SRC nix
/nix/var/nix/profiles/per-user/root/channels/nixos
#+END_SRC

** texlive xetex xelatex shell.nix
*** shell.nix :shell:

#+BEGIN_SRC nix
#!/usr/bin/env -S nix-shell --pure
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = with pkgs; [
    nixVersions.unstable #nixFlakes
    nix-prefetch-git
    validatePkgConfig
    nix-output-monitor
    nix-tree
    jq
    git
    fontconfig
    source-sans-pro
    source-serif-pro
    source-code-pro
    #(texlive.combine {
    #  inherit (texlive) scheme-tetex xetex fontspec footmisc multirow titlesec listings anysize float graphics helvetic times courier;
    #})
    texlive.combined.scheme-full
    dejavu_fonts dejavu_fontsEnv
    liberation_ttf
    evince
    zathura
    apvlv
  ];
    #FONTCONFIG_FILE = makeFontsConf { fontDirectories = [
    #  liberation_ttf
    #];
  shellHook = ''
    if [[ -f ".envrc" ]]; then
      source .envrc
    fi
    #for texfile in *.tex; do xelatex -interaction=nonstopmode $texfile; done
    #for texfile in *.tex; do xelatex -interaction=batchmode $texfile; done
  '';
}
#+END_SRC

*** notes

#+BEGIN_SRC sh
nix-shell --run 'which xetex'
echo 'for texfile in *.tex; do echo "* --> " ~ $texfile && xelatex -interaction=batchmode $texfile; rm *.aux *.log *.toc *.out; done'

$SpineBIN/spine --latex --serial --output="$SpineOUT" $SpinePOD/* && for texfile in $SpineOUT/latex/*.tex; do xelatex -interaction=nonstopmode $texfile; done 2>&1 | tee _err.xelatex_.org; ls $SpineOUT/latex/*.{tex,pdf}

/run/current-system/sw/share/X11/fonts/

kpsewhich pdftexconfig.tex
/nix/store/2r4qa8rbll085nmpx56jg1rbmbir1zkp-texlive-combined-2021/share/texmf/tex/generic/tex-ini-files/pdftexconfig.tex
/nix/store/2r4qa8rbll085nmpx56jg1rbmbir1zkp-texlive-combined-2021/share/texmf/fonts/opentype/public/

find: texclive-fonts.conf
fc-cache && mkfontscale && mkfontdir

fc-match LiberationSans

cd /nix/var/nix/profiles/system/sw/share/X11/fonts
fc-query LiberationSans-Regular.ttf | grep '^\s\+family:' | cut -d'"' -f2
Liberation Sans
fc-query LiberationMono-Regular.ttf | grep '^\s\+family:' | cut -d'"' -f2
Liberation Mono

fc-query DejaVuSans.ttf | grep '^\s\+family:' | cut -d'"' -f2

$XDG_DATA_HOME/fonts
~/.local/share/fonts
#+END_SRC

** NOTES
*** nix-shell

- default.nix

#+BEGIN_SRC sh
nix-shell
nix-build
#+END_SRC

- project.nix

#+BEGIN_SRC sh
nix-shell
nix-build project.nix
#+END_SRC

*** nix-shell --pure

- default.nix

#+HEADER: :noweb yes
#+BEGIN_SRC sh
nix-shell --pure
nix-build -I nixpkgs=<<nixpkgs_local>>
nix-build -I .envrc
#+END_SRC

#+BEGIN_SRC sh
nix build -f default.nix --print-build-logs
nix build -f derivation.nix --print-build-logs
nix shell -f default.nix --print-build-logs
# nix build -f project.nix
# nix build -f spine.nix
nix develop --build -f derivation.nix -I .envrc --print-build-logs
nix develop --profile .#default --print-build-logs --command spine -v
#+END_SRC

*** derivation .drv

#+BEGIN_SRC sh
nix show-derivation /nix/store/q7n14bm8j5vzm62qaraczdb4bpyf59vv-spine-0.11.1.drv
#+END_SRC

**** .env/echo-nixNote CHECK MODIFY

#+HEADER: :tangle ../.env/nix-commands
#+BEGIN_SRC text
- nix flake update && nix flake check --show-trace && nix flake show && nix develop .#devShell

- nix build .#default --print-build-logs
- nix build .#spine-dmd --print-build-logs
- nix build .#spine-ldc --print-build-logs
- nix build .#spine-gdc --print-build-logs

- nix develop
  - nix develop .#devShell --print-build-logs
  - nix develop .#devShell-html --print-build-logs
  - nix develop .#devShell-epub --print-build-logs
  - nix develop .#devShell-latex-pdf --print-build-logs
  - nix develop .#devShell-sqlite --print-build-logs
  - nix develop .#devShell-i18n --print-build-logs

nix run .#default --print-build-logs

nix develop --build .#default --print-build-logs

nix-shell '<nixpkgs>' -A nix --pure
#+END_SRC

#+HEADER: :tangle ../.env/echo-nixNote
#+BEGIN_SRC sh
echo '-*- mode: org -*-

,* nixpkgs path?

  # eval "$(nix print-dev-env)"
' > nixNote_.org

echo "  <nixpkgs> == `nix-instantiate --find-file nixpkgs`" >> nixNote_.org

echo '
,* nix build and show derivation

,#+BEGIN_SRC sh
nix-shell --pure

nix-build
nix build -f default.nix --print-build-logs
nix shell -f default.nix --print-build-logs
nix develop --build -f derivation.nix -I .envrc --print-build-logs

nix-instantiate | nix-build

nix-instantiate -I .envrc | nix-build -I .envrc
nix build `nix-instantiate`
nix build `nix-instantiate -I .envrc`

nix develop

nix-instantiate | nix show-derivation | jq
nix-instantiate -I .envrc | nix show-derivation -f derivation.nix -I .envrc | jq

nix-instantiate | nix show-derivation --recursive | jq
nix-instantiate -I .envrc | nix show-derivation -f derivation.nix --recursive -I .envrc | jq

nix search --json 2>/dev/null |jq
,#+END_SRC

,* version and build info

,#+BEGIN_SRC sh' >> nixNote_.org

echo 'spine version (git) == $SpineVER' >> nixNote_.org
echo "spine version (git) == $SpineVER" >> nixNote_.org
echo 'nix-instantiate == `nix-instantiate`' >> nixNote_.org
echo "nix-instantiate == `nix-instantiate`" >> nixNote_.org

echo "#+END_SRC

,* initialised shell variables

,#+BEGIN_SRC sh
SpineSRC=$SpineSRC
SpineDOC=$SpineDOC
SpinePOD=$SpinePOD
SpineOUTversioned=$SpineOUTversioned
SpineOUT=$SpineOUT
,#+END_SRC
" >> nixNote_.org

echo '* spine run instruction examples
,** parallelized tasks
,*** doc source

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --pod --source --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,*** html & epub output

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --html --epub --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,*** sqlite db for each document - populate each db

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --sqlite-discrete --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,*** doc source; html, epub; sqlite outputs

,#+BEGIN_SRC sh
$SpineBIN/spine --verbose --pod --html --epub --sqlite-discrete --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,*** curate (authors topics)

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --curate --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,*** html, curate

,#+BEGIN_SRC sh
$SpineBIN/spine --verbose --dark --html --html-link-curate --curate --output="$SpineOUTversioned" $SpinePOD/*
$SpineBIN/spine --very-verbose --html --html-link-curate --curate --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,*** composite command: source pod, html, epub, curate, sqlite

,#+BEGIN_SRC sh
$SpineBIN/spine --verbose --dark --pod --epub --html --html-link-curate --curate --sqlite-discrete --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,** sequential tasks
,*** sqlite db (shared) - create db

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --sqlite-db-create --output="$SpineOUTversioned"
,#+END_SRC

,*** sqlite db (shared) - populate db

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --sqlite-update --output="$SpineOUTversioned" $SpineDOC/spine-markup-samples/markup/pod/*
,#+END_SRC

,*** sqlite db (shared) - drop db

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --sqlite-db-drop --output="$SpineOUTversioned"
,#+END_SRC

,*** sqlite db (shared) - create & populate db (single step)

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --sqlite-db-create --sqlite-update --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,*** composite command: source pod, html, epub, curate, sqlite

,#+BEGIN_SRC sh
$SpineBIN/spine --verbose --no-parallel --dark --pod --epub --html --html-link-curate --curate --sqlite-discrete --output="$SpineOUTversioned" $SpinePOD/*
,#+END_SRC

,** config [./pod/].dr/config_local_site

,#+BEGIN_SRC sh
cat $SpinePOD/.dr/config_local_site
$SpineBIN/spine --show-config $SpinePOD
$SpineBIN/spine --show-config --output="$SpineOUTversioned" $SpinePOD
,#+END_SRC

,** cgi operations (output to $SpineOUT /var/www)

,#+BEGIN_SRC sh
$SpineBIN/spine --very-verbose --sqlite-db-create --output="$SpineOUT" $SpinePOD/*

$SpineBIN/spine -v --cgi-search-form-codegen --output=$SpineOUT $SpinePOD/*

$SpineBIN/spine -v --show-config --config=$SpinePOD/.dr

$SpineBIN/spine --html $SpinePOD/*


$SpineBIN/spine -v --cgi-search-form-codegen --config=$SpinePOD/.dr/config_local_site
,#+END_SRC

,*** generate html linked to search form

,#+BEGIN_SRC sh
$SpineBIN/spine -v --html --html-link-search --html-link-curate --curate  --output=$SpineOUT $SpinePOD/*
,#+END_SRC

,*** create or re-create sql db (--sqlite-db-create or --sqlite-db-recreate)

,#+BEGIN_SRC sh
$SpineBIN/spine -v --sqlite-db-create --sqlite-db-filename="<<spine_search_db>>" --sqlite-db-path="$SpineDBpath"
$SpineBIN/spine -v --sqlite-db-recreate --sqlite-db-filename="<<spine_search_db>>" --sqlite-db-path="$SpineDBpath"
,#+END_SRC

,*** populate sqlite db

,#+BEGIN_SRC sh
$SpineBIN/spine -v --sqlite-update --sqlite-db-filename="<<spine_search_db>>" --output=$SpineOUT $SpinePOD/*
,#+END_SRC

,*** generate html (linked to search form), sql output, curate COMPOSITE

,#+BEGIN_SRC sh
$SpineBIN/spine -v --html --html-link-search --html-link-curate --curate --sqlite-update --sqlite-db-filename="<<spine_search_db>>" --cgi-sqlite-search-filename="<<spine_search_cgi>>" --sqlite-db-path="$SpineDBpath" --output="$SpineOUT" $SpinePOD/*
$SpineBIN/spine --epub --html --html-link-search --html-link-curate --curate --sqlite-update --sqlite-db-filename="spine.search.db" --cgi-sqlite-search-filename="spine_search" --cgi-url-action="https://sisudoc.org/spine_search" --ouput="$SpineOUT" $SpinePOD/*
,#+END_SRC

,*** generate html (linked to search form), sql output, curate COMPOSITE with resource configuration

if names and paths are configured in resource configuration file, e.g. $SpinePOD/.rc/config_local_site

,#+BEGIN_SRC sh
$SpineBIN/spine -v --html --html-link-search --html-link-curate --curate --sqlite-update $SpinePOD/*
,#+END_SRC

,#+BEGIN_SRC yaml
# sample resource configuration file ( $SpinePOD/.rc/config_local_site )
output:
  path:                        "/srv/www/spine"
default:
  language:                    "en"
  papersize:                   "a4"
  text_wrap:                   "80"
  digest:                      "sha256"
webserv:
  http:                        "http"
  domain:                      "localhost"
  data_http:                   "http"
  data_domain:                 "localhost"
  data_root_url:               "https://sisudoc.org"
  data_root_path:              "/srv/www/spine"
  images_root_part:            "image"
  cgi_search_form_title:       "≅ SiSU Spine search"
  cgi_http:                    "https"
  cgi_domain:                  "sisudoc.org"
  cgi_bin_url:                 "http://sisudoc.org/cgi-bin"
  cgi_bin_part:                "cgi-bin"
  cgi_bin_path:                "/var/www/cgi/cgi-bin"
  cgi_search_script:           "<<spine_search_cgi>>"
  cgi_action:                  "https://sisudoc.org/spine_search"
  db_sqlite_filename:          "<<spine_search_db>>"
  db_sqlite_path:              "/var/www/sqlite"
,#+END_SRC

,*** make search form

,#+BEGIN_SRC sh
$SpineBIN/spine -v --cgi-search-form-codegen --config=$SpinePOD/.dr/config_local_site
,#+END_SRC

,*** latex

,#+BEGIN_SRC sh
$SpineBIN/spine --latex --serial --output="$SpineOUT" $SpinePOD/*
ls $SpineOutstatic/latex/*.tex
,#+END_SRC
' >> nixNote_.org

#cat nixNote_.org

#echo "emacs nixNote_.org"
#echo "cat nixNote_.org"
#+END_SRC

*** makefile

#+HEADER: :tangle ../makefile_
#+BEGIN_SRC make
buildPhase:
	HOME=$${PWD}; \
	for DC_ in dmd ldmd2 gdmd; do \
	  echo "- check for D compiler $${DC_}"; \
	  DC=$$(type -P $${DC_} || echo ""); \
	  if [ ! "$${DC}" == "" ]; then \
	    break; \
	  fi; \
	done; \
  echo "D compiler = $${DC}"; \
	if [ "$${DC}" == "" ]; then \
    echo "Error: could not find D compiler"; \
	  exit 1; \
	fi; \
	echo "$${DC_} used as D compiler to build $${pname}"; \
	export DFLAGS="-O2 -inline"; \
	dub build --compiler=$${DC} --build=release --combined --skip-registry=all;
checkPhase:
	runHook preCheck; \
	HOME=$${PWD}; \
	dub test --combined --skip-registry=all; \
	runHook postCheck
installPhase:
	runHook preInstall; \
	mkdir -p $${out}/bin; \
	install -m755 ./bin/spine $${out}/bin/spine; \
	runHook postInstall
	#cp -r bin/spine $out/bin/.
postInstall:
	echo "$${out}/share/cgi-bin"; \
	echo `ls -la $${out}/bin/spine`
#+END_SRC