-*- mode: org -*-
#+TITLE:       spine (doc_reform) (project) makefile
#+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 - 2020 Ralph Amissah
#+LANGUAGE:    en
#+STARTUP:     content hideblocks hidestars noindent entitiespretty
#+OPTIONS:     H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
#+PROPERTY:    header-args  :exports code
#+PROPERTY:    header-args+ :noweb yes
#+PROPERTY:    header-args+ :eval no
#+PROPERTY:    header-args+ :results no
#+PROPERTY:    header-args+ :cache no
#+PROPERTY:    header-args+ :padline no

[[./spine.org][spine.org]] VERSION
[[./spine_info.org][spine_info.org]]  [[../org/][org/]]

* version info VERSION :version:set:project:
** project

#+NAME: version_spine
#+BEGIN_SRC sh
0.11.1
#+END_SRC

** subprojects

- d2sqlite3

#+NAME: version_d2sqlite3
#+BEGIN_SRC sh
0.19.1
#+END_SRC

- imageformats

#+NAME: version_imageformats
#+BEGIN_SRC sh
7.0.2
#+END_SRC

- dyaml

#+NAME: version_dyaml
#+BEGIN_SRC sh
0.8.0
#+END_SRC

- tinyendian

#+NAME: version_tinyendian
#+BEGIN_SRC sh
0.2.0
#+END_SRC

** build tools if specified

- meson

#+NAME: version_meson
#+BEGIN_SRC sh
0.46
#+END_SRC

- soversion

#+NAME: version_soversion
0
#+END_SRC

* makefile :makefile:
** tangle

#+BEGIN_SRC makefile :tangle ../makefile
<<make_set_var_0_git_version>>
<<make_set_var_1_dub>>
<<make_set_var_2_project_details>>
<<make_set_var_3_emacs_org>>
<<make_set_var_4_markup_samples_pods>>
<<make_set_var_5_markup_samples_search_dirs>>
<<make_find_markup_samples_0_pod_and_dir>>
<<make_find_markup_samples_1_pod>>
<<make_find_markup_samples_2_dir>>
<<make_dub_upgrade>>
<<make_compile_0_compiler_default>>
<<make_compile_1_compiler_all>>
<<make_compile_2_compiler_all_versioned>>
<<make_compile_3_compiler_all_debug>>
<<make_meson_build>>
<<make_clean_tangle_compile_0_all_clean>>
<<make_clean_tangle_compile_1_all_clean_versioned>>
<<make_clean_tangle_compile_2_all_clean_debug>>
<<make_dub_compile_dmd_0_default>>
<<make_dub_compile_dmd_1_debug>>
<<make_dub_compile_dmd_2_versioned>>
<<make_dub_compile_dmd_3_release>>
<<make_dub_compile_gdc_0_default>>
<<make_dub_compile_gdc_1_debug>>
<<make_dub_compile_gdc_2_versioned>>
<<make_dub_compile_gdc_3_release>>
<<make_dub_compile_ldc_0_default>>
<<make_dub_compile_ldc_1_debug>>
<<make_dub_compile_ldc_2_versioned>>
<<make_dub_compile_ldc_3_release>>
<<make_initialization_operations_0_parts>>
<<make_initialization_operations_1_git_version>>
<<make_initialization_operations_2_assemble>>
<<make_project_testrun_0_find_pods>>
<<make_project_testrun_1>>
<<make_project_testrun_2>>
<<make_project_testrun_3>>
<<make_project_testrun_4>>
<<make_project_testrun_5>>
<<make_project_testrun_6>>
<<make_project_testrun_7>>
<<make_project_testrun_8>>
<<make_project_testrun_9>>
<<make_project_testrun_10>>
<<make_project_testrun_11>>
<<make_project_testrun_12>>
<<make_tangle_0>>
<<make_tangle_1>>
<<make_nix_project_shell>>
<<make_git_snapshot>>
<<make_phony>>
#+END_SRC

** settings [+2] :settings:
*** git version stamp :git:version:

#+NAME: make_set_var_0_git_version
#+BEGIN_SRC makefile
PROG_VER_GIT :=$(shell echo `git describe --long --tags | sed -e "s/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g"`)
PROG_VER_DECLARED :=$(shell echo `cat ./views/version.txt | grep --color=never "enum" | sed 's/.\+(\([0-9]\+\),[ \t]\+\([0-9]\+\),[ \t]\+\([0-9]\+\)[ \t]*).\+/\1.\2.\3/g'`)
#+END_SRC

*** dub (build tool) :dub:

#+NAME: make_set_var_1_dub
#+BEGIN_SRC makefile
DUB=dub
DUB_FLAGS=-v --force --compiler=
#+END_SRC

*** Project Details :project:spine:

#+NAME: make_set_var_2_project_details
#+BEGIN_SRC makefile
PRG_NAME=doc-reform
PRG_NICKAME=spine
PRG_NAME_DIR=$(shell echo `echo $(PRG_NAME) | sed -e "s/-/_/g"`)
PRG_SRC=$(PRG_NAME).d
PRG_SRCDIR=./src
PRG_BIN=$(PRG_NAME)
PRG_BINDIR=./bin
PRG_DOCDIR=./docs
#+END_SRC

*** Emacs Org settings :settings:emacs:org:tangle:

#+NAME: make_set_var_3_emacs_org
#+BEGIN_SRC makefile
EMACSLISP=/usr/share/emacs/site-lisp
ORG_VER_AVAILABLE=$(shell echo `ls -d ~/.emacs.d/elpa/org-???????? | cut -d '-' -f2`)
EMACSLISP_ORG=~/.emacs.d/elpa/org-$($(shell echo $(ORG_VER_AVAILABLE)))
ORG_CONTRIB_VER_AVAILABLE=$(shell echo `ls -d ~/.emacs.d/elpa/org-plus-contrib-???????? | cut -d '-' -f2`)
EMACSLISP_ORG_CONTRIB=~/.emacs.d/elpa/org-plus-contrib-$($(shell echo $(ORG_CONTRIB_VER_AVAILABLE)))
ORGFILELIST=$(shell echo `ls -1 org/*.org`)
ORGFILES=""
ORGDIR :=$(shell echo `pwd`)
#+END_SRC

*** Markup Samples
**** pods

#+NAME: make_set_var_4_markup_samples_pods
#+BEGIN_SRC makefile
SiSU_MARKUP_SAMPLES_FIND_PODS= \
find data/pod -maxdepth 2 -name pod.manifest | cut -f 1-3 -d / | sort

SiSU_MARKUP_SAMPLES_PODS_FOUND= \
$(SiSU_MARKUP_SAMPLES_FIND_PODS) | xargs

SiSU_MARKUP_SAMPLES_POD = \
data/pod/accelerando.charles_stross \
data/pod/alices_adventures_in_wonderland.lewis_carroll \
data/pod/content.cory_doctorow \
data/pod/democratizing_innovation.eric_von_hippel \
data/pod/down_and_out_in_the_magic_kingdom.cory_doctorow \
data/pod/for_the_win.cory_doctorow \
data/pod/free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman \
data/pod/free_culture.lawrence_lessig \
data/pod/free_for_all.peter_wayner \
data/pod/gpl2.fsf \
data/pod/gpl3.fsf \
data/pod/gullivers_travels.jonathan_swift \
data/pod/little_brother.cory_doctorow \
data/pod/live-manual \
data/pod/sisu-manual \
data/pod/the_autonomous_contract.ralph_amissah \
data/pod/the_cathedral_and_the_bazaar.eric_s_raymond \
data/pod/the_public_domain.james_boyle \
data/pod/the_wealth_of_networks.yochai_benkler \
data/pod/through_the_looking_glass.lewis_carroll \
data/pod/two_bits.christopher_kelty \
data/pod/un_contracts_international_sale_of_goods_convention_1980 \
data/pod/viral_spiral.david_bollier
#+END_SRC

**** dir

#+NAME: make_set_var_5_markup_samples_search_dirs
#+BEGIN_SRC makefile
SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND = \
find data/sisudir/media/text -name *.ss[tm] | sort | xargs

SiSU_MARKUP_SAMPLES_DIR = \
data/sisudir/media/text/accelerando.charles_stross.sst \
data/sisudir/media/text/alices_adventures_in_wonderland.lewis_carroll.sst \
data/sisudir/media/text/content.cory_doctorow.sst \
data/sisudir/media/text/democratizing_innovation.eric_von_hippel.sst \
data/sisudir/media/text/down_and_out_in_the_magic_kingdom.cory_doctorow.sst \
data/sisudir/media/text/ffa_tmp.sst \
data/sisudir/media/text/for_the_win.cory_doctorow.sst \
data/sisudir/media/text/free_as_in_freedom_2.richard_stallman_and_the_free_software_revolution.sam_williams.richard_stallman.sst \
data/sisudir/media/text/free_culture.lawrence_lessig.sst \
data/sisudir/media/text/free_for_all.peter_wayner.sst \
data/sisudir/media/text/gpl2.fsf.sst \
data/sisudir/media/text/gpl3.fsf.sst \
data/sisudir/media/text/gullivers_travels.jonathan_swift.sst \
data/sisudir/media/text/little_brother.cory_doctorow.sst \
data/sisudir/media/text/sisu_markup.sst \
data/sisudir/media/text/sisu_markup_stress_test.sst \
data/sisudir/media/text/sisu_markup_test.sst \
data/sisudir/media/text/table_special_markup.sst \
data/sisudir/media/text/the_autonomous_contract.ralph_amissah.sst \
data/sisudir/media/text/the_cathedral_and_the_bazaar.eric_s_raymond.sst \
data/sisudir/media/text/the_public_domain.james_boyle.sst \
data/sisudir/media/text/the_wealth_of_networks.yochai_benkler.sst \
data/sisudir/media/text/through_the_looking_glass.lewis_carroll.sst \
data/sisudir/media/text/two_bits.christopher_kelty.sst \
data/sisudir/media/text/un_contracts_international_sale_of_goods_convention_1980.sst \
data/sisudir/media/text/viral_spiral.david_bollier.sst
#+END_SRC

******* sample markup file list

#+NAME: make_find_markup_samples_0_pod_and_dir
#+BEGIN_SRC makefile
markup_samples:
	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort; \
find data/sisudir/media/text -name *.ss[tm] | sort
#+END_SRC

#+NAME: make_find_markup_samples_1_pod
#+BEGIN_SRC makefile
markup_pod_samples:
	find data/pod -name pod.manifest | cut -f 1-3 -d / | sort
#+END_SRC

#+NAME: make_find_markup_samples_2_dir
#+BEGIN_SRC makefile
markup_dir_samples:
	find data/sisudir/media/text -name *.ss[tm] | sort
#+END_SRC

** _make_ commands [+2] :make:commands:

- build commands
  - build
  - debug
  - release
- init, clean, distclean etc.
  - init
  - clean
  - expunge
  - distclean
  - distclean_and_init
- org babel tangle
  - tangle
- git snapshot
  - gitsnapshot

*** build commands [+1] :build:compile:
**** _dub_ build rebuild :dub:
***** all compiler builds :all:dmd:gdc:ldc:
****** all builds
******* default

#+NAME: make_dub_upgrade
#+BEGIN_SRC makefile
dub_upgrade:
	$(DUB) upgrade
#+END_SRC

#+NAME: make_compile_0_compiler_default
#+BEGIN_SRC makefile
default: ldc
#+END_SRC

******* quick :quick:
******** default :default:

#+NAME: make_compile_1_compiler_all
#+BEGIN_SRC makefile
all: dmd ldc gdc
#+END_SRC

******** version :version:

#+NAME: make_compile_2_compiler_all_versioned
#+BEGIN_SRC makefile
all_ver: dmd_ver ldc_ver gdc_ver
#+END_SRC

******** debug :debug:

#+NAME: make_compile_3_compiler_all_debug
#+BEGIN_SRC makefile
all_debug: dmd_debug gdc_debug ldc_debug
#+END_SRC

******** _meson_ build :meson:

meson using dub
- works & looks pretty clean
- but subprojects built externally & not suitable for debian packaging

#+NAME: make_meson_build
#+BEGIN_SRC makefile
meson_clean_build_dir:
	rm -r build; mkdir build
meson_build: meson_clean_build_dir
	meson --buildtype=debugoptimized build
	ninja -C build
	notify-send -t 0 'D meson build ldc compiled test release executable ready' 'spine'
meson_redo: meson_clean_build_dir meson_build
meson_project_build_clean: clean skel tangle dub_upgrade meson_build
meson: meson_clean_build_dir dub_upgrade meson_build
#+END_SRC

******* clean & tangle :clean:tangle:
******** default :default:

#+NAME: make_clean_tangle_compile_0_all_clean
#+BEGIN_SRC makefile
all_clean: clean tangle dmd ldc gdc
#+END_SRC

******** version :version:

#+NAME: make_clean_tangle_compile_1_all_clean_versioned
#+BEGIN_SRC makefile
all_ver_clean: clean tangle dmd_ver ldc_ver gdc_ver
#+END_SRC

******** debug :debug:

#+NAME: make_clean_tangle_compile_2_all_clean_debug
#+BEGIN_SRC makefile
all_debug_ver: dmd_debug_ver gdc_debug_ver ldc_debug_ver
all_debug_clean_ver: clean tangle dmd_debug_ver gdc_debug_ver ldc_debug_ver
#+END_SRC

***** individual compiler builds :each:
****** dmd :dmd:
******* quick :quick:
******** default :default:

#+NAME: make_dub_compile_dmd_0_default
#+BEGIN_SRC makefile
dmd: dub_upgrade
	$(DUB) --compiler=dmd --config=dmd --build=release-nobounds
	notify-send -t 0 'D dmd compiled test release executable ready' 'spine-dmd'
#+END_SRC

******** debug :debug:

#+NAME: make_dub_compile_dmd_1_debug
#+BEGIN_SRC makefile
dmd_debug:
	$(DUB) --compiler=dmd --config=dmd --build=debug
#+END_SRC

******** version :version:

- assumes git tags with program version

#+NAME: make_dub_compile_dmd_2_versioned
#+BEGIN_SRC makefile
dmd_ver: dub_upgrade
	$(DUB) --compiler=dmd --config=dmd-version
	mv bin/spine-dmd-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-dmd
	notify-send -t 0 'D dmd compiled test release executable ready' 'spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-dmd'
dmd_clean_ver: clean tangle dmd_ver
#+END_SRC

******* clean & tangle :clean:tangle:

#+NAME: make_dub_compile_dmd_3_release
#+BEGIN_SRC makefile
dmd_rel: expunge skel tangle
	$(DUB) --compiler=dmd --config=spine-release
dmd_rel_tangle: tangle
	$(DUB) --compiler=dmd --config=spine-dmd
dmd_rel_expunge_tangle: expunge skel tangle dmd_rel_tangle
dmd_debug_tangle: tangle
	$(DUB) --compiler=dmd --config=spine-dmd-debug
#+END_SRC

****** gdc :gdc:
******* quick :quick:
******** default :default:

#+NAME: make_dub_compile_gdc_0_default
#+BEGIN_SRC makefile
gdc: dub_upgrade
	$(DUB) --compiler=gdc --config=gdc
	notify-send -t 0 'D gdc compiled test release executable ready' 'spine-gdc'
#+END_SRC

******** debug :debug:

#+NAME: make_dub_compile_gdc_1_debug
#+BEGIN_SRC makefile
gdc_debug:
	$(DUB) --compiler=gdc --config=gdc --build=debug
#+END_SRC

******** version :version:

- assumes git tags with program version

#+NAME: make_dub_compile_gdc_2_versioned
#+BEGIN_SRC makefile
gdc_ver: dub_upgrade
	$(DUB) --compiler=gdc --config=gdc-version
	mv bin/spine-gdc-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-gdc
	notify-send -t 0 'D gdc compiled test release executable ready' 'spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-gdc'
gdc_clean_ver: clean tangle gdc_ver
#+END_SRC

******* clean & tangle :clean:tangle:

#+NAME: make_dub_compile_gdc_3_release
#+BEGIN_SRC makefile
gdc_rel: expunge skel tangle
	$(DUB) --compiler=gdc --config=spine-release
gdc_rel_tangle: tangle
	$(DUB) --compiler=gdc --config=spine-gdc
gdc_rel_expunge_tangle: expunge skel tangle gdc_rel_tangle
gdc_debug_tangle: tangle
	$(DUB) --compiler=gdc --config=spine-gdc-debug
#+END_SRC

****** ldc :ldc:
******* quick :quick:
******** default :default:

#+NAME: make_dub_compile_ldc_0_default
#+BEGIN_SRC makefile
ldc: dub_upgrade
	$(DUB) --compiler=ldc2 --config=ldc --build=release
	notify-send -t 0 'D ldc compiled test release executable ready' 'spine-ldc'
#+END_SRC

******** debug :debug:

#+NAME: make_dub_compile_ldc_1_debug
#+BEGIN_SRC makefile
ldc_debug:
	$(DUB) --compiler=ldc2 --config=ldc --build=debug
#+END_SRC

******** version :version:

- assumes git tags with program version

#+NAME: make_dub_compile_ldc_2_versioned
#+BEGIN_SRC makefile
ldc_ver: dub_upgrade
	$(DUB) --compiler=ldc2 --config=ldc-version
	mv bin/spine-ldc-ver bin-archive/spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-ldc
	notify-send -t 0 'D ldc2 compiled test release executable ready' 'spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)-ldc'
ldc_clean_ver: clean tangle ldc_ver
#+END_SRC

******* clean & tangle :clean:tangle:

#+NAME: make_dub_compile_ldc_3_release
#+BEGIN_SRC makefile
ldc_rel: expunge skel tangle
	$(DUB) --compiler=ldc2 --config=spine-release
ldc_rel_tangle: tangle
	$(DUB) --compiler=ldc2 --config=spine-ldc
ldc_rel_expunge_tangle: expunge skel tangle ldc_rel_tangle
ldc_debug_tangle: tangle
	$(DUB) --compiler=ldc2 --config=spine-ldc-debug
#+END_SRC

***** generic
****** init clean distclean etc. :clean:

#+NAME: make_initialization_operations_0_parts
#+BEGIN_SRC makefile
reinit: clean skel tangle
skel:
	mkdir -p $(PRG_BINDIR); \
	mkdir -p $(PRG_BINDIR)-archive; \
	mkdir -p build; \
	mkdir -p views; \
	mkdir -p data; \
	mkdir -p misc/util/d/cgi/search/cgi-bin/src; \
	mkdir -p misc/util/d/tools/markup_conversion; \
	mkdir -p misc/editor-syntax-etc/emacs; \
	mkdir -p misc/editor-syntax-etc/vim/syntax; \
	mkdir -p misc/editor-syntax-etc/vim/colors; \
	mkdir -p misc/editor-syntax-etc/vim/ftplugin; \
	mkdir -p misc/editor-syntax-etc/vim/rc; \
	mkdir -p misc/editor-syntax-etc/vim/templates; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/conf; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/io_in; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/io_out; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/meta; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR)/share; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR); \
	mkdir -p $(PRG_BINDIR);
init: skel
clean:
	rm -rf build; \
	rm -rf $(PRG_SRCDIR); \
	rm -rf $(PRG_DOCDIR);
clean_bin:
	rm $(PRG_BINDIR)/*
clean_src:
	rm -rf $(PRG_SRCDIR);
clean_docs:
	rm -rf $(PRG_DOCDIR)
expunge:
	rm -f dub.selections.json; \
	rm -rf build; \
	rm -rf $(PRG_SRCDIR); \
	rm -rf $(PRG_BINDIR); \
	rm -rf $(PRG_DOCDIR);
distclean: expunge
distclean_and_init: expunge
	mkdir -p views; \
	mkdir -p misc/util/d/cgi/search/cgi-bin/src; \
	mkdir -p misc/util/d/tools/markup_conversion; \
	mkdir -p misc/editor-syntax-etc/emacs; \
	mkdir -p misc/editor-syntax-etc/vim/syntax; \
	mkdir -p misc/editor-syntax-etc/vim/colors; \
	mkdir -p misc/editor-syntax-etc/vim/ftplugin; \
	mkdir -p misc/editor-syntax-etc/vim/rc; \
	mkdir -p misc/editor-syntax-etc/vim/templates; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME_DIR); \
	mkdir -p $(PRG_BINDIR);
#+END_SRC

****** version :version:

#+NAME: make_initialization_operations_1_git_version
#+BEGIN_SRC makefile
ver:
	echo spine-$(PROG_VER_DECLARED)-tag-$(PROG_VER_GIT)
#+END_SRC

****** tangle build rebuild :clean:tangle:build:

#+NAME: make_initialization_operations_2_assemble
#+BEGIN_SRC makefile
clean_tangle_build: clean tangle build
tangle_build: tangle build
build: $(PRG_SRCDIR)/$(PRG_SRC)
	$(DC) $(DC_FLAGS) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_SRC)
rebuild: $(PRG_SRCDIR)/$(PRG_SRC) $(PRG_BINDIR)/$(PRG_BIN).o clean build
makefile_new:
	make -k tangle_maker
restart: clean tangle
#+END_SRC

*** testrun (program against document markup) :markup:sample:
**** pods :pod:
****** find files

#+NAME: make_project_testrun_0_find_pods
#+BEGIN_SRC makefile
find_pods:
	$(SiSU_MARKUP_SAMPLES_FIND_PODS)
#+END_SRC

***** dmd
****** find files

#+NAME: make_project_testrun_1
#+BEGIN_SRC makefile
dmd_testrun_find:
	./bin/spine-dmd -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
data/pod/sisu-manual
dmd_testrun_find_pod_source:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-ldc -v --source --html --epub \
--output-dir=tmp/program_output_pod
dmd_testrun_find_pod_pod:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-dmd -v --pod \
--output-dir=tmp/program_output_pod
dmd_testrun_find_pod_html:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-dmd -v --html \
--output-dir=tmp/program_output_pod
dmd_testrun_find_pod_epub:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-dmd -v --epub \
--output-dir=tmp/program_output_pod
dmd_testrun_find_pod_all:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-dmd -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod
#+END_SRC

****** path list

#+NAME: make_project_testrun_2
#+BEGIN_SRC makefile
dmd_testrun_paths_pod_source:
	./bin/spine-dmd -v --source \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
dmd_testrun_paths_pod_pod:
	./bin/spine-dmd -v --pod \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
dmd_testrun_paths_pod_html:
	./bin/spine-dmd -v --html \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
dmd_testrun_paths_pod_epub:
	./bin/spine-dmd -v --epub \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
dmd_testrun_paths_pod_all:
	./bin/spine-dmd -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
#+END_SRC

***** gdc
****** find files

#+NAME: make_project_testrun_3
#+BEGIN_SRC makefile
gdc_testrun_find:
	./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
data/pod/sisu-manual
gdc_testrun_find_pod_source:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-gdc -v --source \
--output-dir=tmp/program_output_pod
gdc_testrun_find_pod_pod:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-gdc -v --pod \
--output-dir=tmp/program_output_pod
gdc_testrun_find_pod_html:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-gdc -v --html \
--output-dir=tmp/program_output_pod
gdc_testrun_find_pod_epub:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-gdc -v --epub \
--output-dir=tmp/program_output_pod
gdc_testrun_find_pod_all:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod
#+END_SRC

****** path list

#+NAME: make_project_testrun_4
#+BEGIN_SRC makefile
gdc_testrun_paths:
	./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
data/pod/sisu-manual
gdc_testrun_paths_pod_source:
	./bin/spine-gdc -v --source \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
gdc_testrun_paths_pod_pod:
	./bin/spine-gdc -v --pod \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
gdc_testrun_paths_pod_html:
	./bin/spine-gdc -v --html \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
gdc_testrun_paths_pod_epub:
	./bin/spine-gdc -v --epub \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
gdc_testrun_paths_pod_all:
	./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
#+END_SRC

***** ldc
****** find files

#+NAME: make_project_testrun_5
#+BEGIN_SRC makefile
ldc_testrun_find:
	./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
data/pod/sisu-manual
ldc_testrun_find_pod_source:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
	./bin/spine-ldc -v --source \
--output-dir=tmp/program_output_pod
ldc_testrun_find_pod_pod:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
	./bin/spine-ldc -v --pod \
--output-dir=tmp/program_output_pod
ldc_testrun_find_pod_html:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
	./bin/spine-ldc -v --html \
--output-dir=tmp/program_output_pod
ldc_testrun_find_pod_epub:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
	./bin/spine-ldc -v --epub \
--output-dir=tmp/program_output_pod
ldc_testrun_find_pod_all:
	$(SiSU_MARKUP_SAMPLES_PODS_FOUND) \
	./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod
#+END_SRC

****** path list

#+NAME: make_project_testrun_6
#+BEGIN_SRC makefile
ldc_testrun_paths:
	./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
data/pod/sisu-manual
ldc_testrun_paths_pod_source:
	./bin/spine-ldc -v --source \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
ldc_testrun_paths_pod_pod:
	./bin/spine-ldc -v --pod \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
ldc_testrun_paths_pod_html:
	./bin/spine-ldc -v --html \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
ldc_testrun_paths_pod_epub:
	./bin/spine-ldc -v --epub \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
ldc_testrun_paths_pod_all:
	./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_pod \
$(SiSU_MARKUP_SAMPLES_POD)
#+END_SRC

**** dir :dir:
***** dmd
****** find files

#+NAME: make_project_testrun_7
#+BEGIN_SRC makefile
dmd_testrun_find_dir_source:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-dmd -v --source \
--output-dir=tmp/program_output_dir
dmd_testrun_find_dir_pod:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-dmd -v --pod \
--output-dir=tmp/program_output_dir
dmd_testrun_find_dir_html:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-dmd -v --html \
--output-dir=tmp/program_output_dir
dmd_testrun_find_dir_epub:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-dmd -v --epub \
--output-dir=tmp/program_output_dir
dmd_testrun_find_dir_all:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-dmd -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_dir
#+END_SRC

****** file list

#+NAME: make_project_testrun_8
#+BEGIN_SRC makefile
dmd_testrun_filelist_dir_source:
	./bin/spine-dmd -v --source \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
dmd_testrun_filelist_dir_pod:
	./bin/spine-dmd -v --pod \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
dmd_testrun_filelist_dir_html:
	./bin/spine-dmd -v --html \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
dmd_testrun_filelist_dir_epub:
	./bin/spine-dmd -v --epub \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
dmd_testrun_filelist_dir_all:
	./bin/spine-dmd -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
#+END_SRC

***** gdc
****** find files

#+NAME: make_project_testrun_9
#+BEGIN_SRC makefile
gdc_testrun_find_dir_source:
	./bin/spine-gdc -v --source \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
gdc_testrun_find_dir_pod:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-gdc -v --pod \
--output-dir=tmp/program_output_dir
gdc_testrun_find_dir_html:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-gdc -v --html \
--output-dir=tmp/program_output_dir
gdc_testrun_find_dir_epub:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-gdc -v --epub \
--output-dir=tmp/program_output_dir
gdc_testrun_find_dir_all:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_dir
#+END_SRC

****** file list

#+NAME: make_project_testrun_10
#+BEGIN_SRC makefile
gdc_testrun_filelist_dir_source:
	./bin/spine-gdc -v --source \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
gdc_testrun_filelist_dir_pod:
	./bin/spine-gdc -v --pod \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
gdc_testrun_filelist_dir_html:
	./bin/spine-gdc -v --html \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
gdc_testrun_filelist_dir_epub:
	./bin/spine-gdc -v --epub \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
gdc_testrun_filelist_dir_all:
	./bin/spine-gdc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
#+END_SRC

***** ldc
****** find files

#+NAME: make_project_testrun_11
#+BEGIN_SRC makefile
ldc_testrun_find_dir_source:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-ldc -v --source \
--output-dir=tmp/program_output_dir
ldc_testrun_find_dir_pod:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-ldc -v --pod \
--output-dir=tmp/program_output_dir
ldc_testrun_find_dir_html:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-ldc -v --html \
--output-dir=tmp/program_output_dir
ldc_testrun_find_dir_epub:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-ldc -v --epub \
--output-dir=tmp/program_output_dir
ldc_testrun_find_dir_all:
	$(SiSU_MARKUP_SAMPLES_DIR_FILES_FOUND) \
./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_dir
#+END_SRC

****** file list

#+NAME: make_project_testrun_12
#+BEGIN_SRC makefile
ldc_testrun_filelist_dir_source:
	./bin/spine-ldc -v --source \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
ldc_testrun_filelist_dir_pod:
	./bin/spine-ldc -v --pod \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
ldc_testrun_filelist_dir_html:
	./bin/spine-ldc -v --html \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
ldc_testrun_filelist_dir_epub:
	./bin/spine-ldc -v --epub \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
ldc_testrun_filelist_dir_all:
	./bin/spine-ldc -v --source --html --epub --sqlite-discrete \
--sqlite-create --sqlite-update \
--output-dir=tmp/program_output_dir \
$(SiSU_MARKUP_SAMPLES_DIR)
#+END_SRC

*** org babel tangle batch process command :tangle:
**** tangle: org babel tangle *.org

#+NAME: make_tangle_0
#+BEGIN_SRC makefile
tangle: skel
	for f in $(ORGFILELIST); do \
		ORGFILES="$$ORGFILES \"$$f\""; \
	done; \
	emacs --batch -Q -q \
	--eval "(progn \
		(add-to-list 'load-path \
			(expand-file-name \"$(EMACSLISP)\")) \
		(add-to-list 'load-path \
			(expand-file-name \"$(EMACSLISP_ORG)\" t)) \
		(add-to-list 'load-path \
			(expand-file-name \"$(EMACSLISP_ORG_CONTRIB)\" t)) \
		(require 'org)(require 'ob)(require 'ob-tangle) \
		(mapc (lambda (file) \
			(find-file (expand-file-name file \"$(ORGDIR)\")) \
				(setq-local org-src-preserve-indentation t) \
			(org-babel-tangle) \
			(kill-buffer)) '($$ORGFILES)))" 2>&1
#+END_SRC

**** tangle maker: org babel tangle makefile new

#+NAME: make_tangle_1
#+BEGIN_SRC makefile
tangle_maker:
	for f in $(ORGFILELIST); do \
		ORGFILES="\"org/dr_build_scaffold.org\""; \
	done; \
	emacs --batch -Q -q \
	--eval "(progn \
		(add-to-list 'load-path \
			(expand-file-name \"$(EMACSLISP)\")) \
		(add-to-list 'load-path \
			(expand-file-name \"$(EMACSLISP_ORG)\" t)) \
		(add-to-list 'load-path \
			(expand-file-name \"$(EMACSLISP_ORG_CONTRIB)\" t)) \
		(require 'org)(require 'ob)(require 'ob-tangle) \
		(mapc (lambda (file) \
			(find-file (expand-file-name file \".\")) \
				(setq-local org-src-preserve-indentation t) \
			(org-babel-tangle) \
			(kill-buffer)) '($$ORGFILES)))" 2>&1
#+END_SRC

*** git snapshot

#+NAME: make_git_snapshot
#+BEGIN_SRC makefile
gitsnapshot: distclean tangle
	git commit -a
#+END_SRC

** phony :phony:

#+NAME: make_phony
#+BEGIN_SRC makefile
.PHONY : all build rebuild debug release \
	distclean init \
	tangle gitsnapshot
#+END_SRC

* dub.settings.json :dub:config:json:

#+BEGIN_SRC json  :NO-tangle ../dub.settings.json
{
  "defaultArchitecture": "x86_64",
  "defaultCompiler":     "ldc"
}
#+END_SRC

* dub.json :dub:config:json:
** dub.json

#+BEGIN_SRC json  :tangle ../dub.json
{
  "authors": [
                               "Ralph Amissah"
  ],
  "copyright":                 "Copyright © 2015 - 2020 Ralph Amissah",
  "name":                      "spine",
  "version":                   "<<version_spine>>",
  "description":               "a sisu like document parser",
  "homepage":                  "http://sisudoc.org",
  "license":                   "AGPL-3.0+",
  "targetPath":                "./bin",
  "sourcePaths":               [ "./src/doc_reform" ],
  "stringImportPaths":         [ "./views" ],
  "buildRequirements":         [ "allowWarnings" ],
  "targetType":                "executable",
  "platforms":                 [ "posix" ],
  "buildTypes": {
    "dmd": {
      "dflags":                [ "-J=views", "-I=src/doc_reform" ],
      "buildOptions":          [ "verbose", "inline" ],
      "buildRequirements":     [ "allowWarnings" ]
    },
    "ldc": {
      "dflags":                [ "-O2", "-J=views", "-I=src/doc_reform" ],
      "buildOptions":          [ "verbose", "optimize", "inline" ],
      "buildRequirements":     [ "allowWarnings" ]
    }
  },
  "dependencies": {
    "d2sqlite3":               "~><<version_d2sqlite3>>",
    "imageformats":            "~><<version_imageformats>>",
    "dyaml":                   "~><<version_dyaml>>",
    "tinyendian":              "~><<version_tinyendian>>"
  },
  "configurations": [
    {
      "name":                  "default",
      "targetName":            "spine"
    },
    {
      "name":                  "ldc",
      "targetName":            "spine-ldc"
    },
    {
      "name":                  "dmd",
      "targetName":            "spine-dmd"
    }
  ],
  "subConfigurations": {
    "d2sqlite3":               "with-lib"
  }
}
#+END_SRC

** +check dub.json+

#+BEGIN_SRC sh  :NO-tangle ../dub.json
{
  "authors": [
                               "Ralph Amissah"
  ],
  "copyright":                 "Copyright © 2015 - 2020 Ralph Amissah",
  "name":                      "spine",
  "description":               "a sisu like document parser",
  "homepage":                  "http://sisudoc.org",
  "license":                   "AGPL-3.0+",
  "targetPath":                "./bin",
  "sourcePaths":               [ "./src/doc_reform" ],
  "stringImportPaths":         [ "./views" ],
  "buildRequirements":         [ "allowWarnings" ],
  "targetType":                "executable",
  "platforms":                 [ "posix" ],
  "dependencies": {
    "d2sqlite3":               "~><<version_d2sqlite3>>",
    "imageformats":            "~><<version_imageformats>>",
    "dyaml":                   "~><<version_dyaml>>",
    "tinyendian":              "~><<version_tinyendian>>"
  },
  "subConfigurations": {
    "d2sqlite3":               "all-included"
  },
  "configurations": [
    {
      "name":                  "default",
      "targetName":            "spine"
    },
    {
      "name":                  "ldc",
      "targetName":            "spine-ldc"
    },
    {
      "name":                  "dmd",
      "targetName":            "spine-dmd"
    }
  ],
  "buildTypes": {
    "dmd": {
      "dflags":                [ "-J=views", "-I=src/doc_reform" ],
      "buildOptions":          [ "verbose", "inline" ],
      "buildRequirements":     [ "allowWarnings" ]
    },
    "ldc": {
      "dflags":                [ "-O2", "-J=views", "-I=src/doc_reform" ],
      "buildOptions":          [ "verbose", "optimize", "inline" ],
      "buildRequirements":     [ "allowWarnings" ]
    }
  }
}
#+END_SRC

* dub.sdl REFERENCE :dub:config:sdl:
Every DUB package should contain a [[http://code.dlang.org/package-format?lang=json][dub.json]] (or [[http://code.dlang.org/package-format?lang=sdl][dub.sdl]])

not configured here using dub.json for the moment

** header (including dependencies) :header:

#+BEGIN_SRC sh  :NO-tangle ../dub.sdl :tangle-mode (identity #o755) :shebang #!/usr/bin/env dub
name                "spine"
description         "sisu document parser"
homepage            "http://sisudoc.org"
authors             "Ralph Amissah"
copyright           "Copyright (C) 2016 - 2020 Ralph Amissah"
license             "AGPL-3.0+"
targetPath          "./bin"
#sourcePath          "./src/doc_reform"
stringImportPaths   "./views"
buildRequirements   "allowWarnings"
targetType          "executable"
platforms           "posix"
dependency          "d2sqlite3"      version="~><<version_d2sqlite3>>"     # https://code.dlang.org/packages/d2sqlite3     http://biozic.github.io/d2sqlite3/d2sqlite3
  subconfiguration  "d2sqlite3"      "all-included"
dependency          "imageformats"   version="~><<version_imageformats>>"  # https://code.dlang.org/packages/imageformats  https://github.com/lgvz/imageformats
dependency          "dyaml"          version="~><<version_dyaml>>"         # https://code.dlang.org/packages/dyaml         https://github.com/dlang-community/D-YAML
dependency          "tinyendian"     version="~><<version_tinyendian>>"    # http://code.dlang.org/packages/tinyendian     https://github.com/dlang-community/tinyendian // dyaml dependency
#+END_SRC

** default

time (dub --compiler=dmd --build=release)
time (dub --compiler=ldc2 --build=release)
time (dub --compiler=gdc --build=release)

#+BEGIN_SRC sh  :NO-tangle ../dub.sdl
configuration "default" {
  targetName           "spine"
  postGenerateCommands "notify-send -t 0 'D executable ready' 'spine'"
}
#+END_SRC

** dmd :dmd:

time (dub --compiler=dmd -color --config=dmd --build=dmd)
time (dub --compiler=dmd -color --config=dmd --build=dmd-release)

#+BEGIN_SRC sh  :NO-tangle ../dub.sdl
configuration "dmd" {
  targetName           "spine-dmd"
  postGenerateCommands "notify-send -t 0 'D executable ready' 'spine-dmd'"
}
buildType     "dmd" {
  dflags               "-J=views" "-I=src/doc_reform"
  buildOptions         "verbose" "inline"
  buildRequirements    "allowWarnings"
}
buildType     "dmd-release" {
  dflags               "-J=views" "-I=src/doc_reform"
  buildOptions         "verbose" "releaseMode" "optimize" "inline"
}
configuration "dmd-version" {
  dflags               "-J=views" "-I=src/doc_reform"
  buildOptions         "verbose" "optimize"
  targetName           "spine-dmd-ver"
  postGenerateCommands "notify-send -t 0 'D executable ready' 'spine-dmd-ver'"
}
#+END_SRC

  buildOptions         "verbose" "optimize"                        // ok works quick compile
  buildOptions         "verbose" "optimize" "inline"               // ok works takes ages to compile
  buildOptions         "verbose" "releaseMode" "optimize" "inline" // broken, runtime errors

** ldc :ldc:

time (dub --compiler=ldc2 -color --config=ldc --build=ldc)
time (dub --compiler=ldc2 -color --config=ldc --build=ldc-release)

#+BEGIN_SRC sh  :NO-tangle ../dub.sdl
configuration "ldc" {
  targetName           "spine-ldc"
  postGenerateCommands "notify-send -t 0 'D executable ready' 'spine-ldc'"
}
buildType     "ldc" {
  dflags            "-O2" "-J=views" "-I=src/doc_reform"
  buildOptions      "verbose" "optimize" "inline"
  buildRequirements "allowWarnings"
}
buildType     "ldc-local" {
  dflags            "-O2" "-J=views" "-I=src/doc_reform" "-mcpu=native"
  buildOptions      "verbose" "optimize" "inline"
  buildRequirements "allowWarnings"
}
buildType     "ldc-release" {
  dflags               "-O2" "-J=views" "-I=src/doc_reform"
  buildOptions         "verbose" "optimize" "inline" "releaseMode"
}
configuration "ldc-version" {
  dflags               "-O2" "-J=views" "-I=src/doc_reform"
  buildOptions         "verbose" "optimize" "inline" "releaseMode"
  targetName           "spine-ldc-ver"
  postGenerateCommands "notify-send -t 0 'D executable ready' 'spine-ldc-ver'"
}
#+END_SRC

** gdc :gdc:

time (dub --compiler=gdc --config=gdc --build=gdc)
time (dub --compiler=gdc --config=gdc --build=gdc-release)

#+BEGIN_SRC sh  :NO-tangle ../dub.sdl
configuration "gdc" {
  targetName           "spine-gdc"
  postGenerateCommands "notify-send -t 0 'D executable ready' 'spine-gdc'"
}
buildType     "gdc" {
  dflags               "-O" "-J=views" "-I=src/doc_reform"
  lflags               "-lz"
  buildOptions         "inline"
  buildRequirements    "allowWarnings"
}
buildType     "gdc-release" {
  dflags               "-O2" "-J=views" "-I=src/doc_reform"
  lflags               "-lz"
  buildOptions         "verbose" "optimize" "inline" "releaseMode"
}
configuration "gdc-version" {
  dflags               "-O2" "-J=views" "-I=src/doc_reform"
  lflags               "-lz"
  buildOptions         "verbose" "optimize" "inline" "releaseMode"
  targetName           "spine-gdc-ver"
  postGenerateCommands "notify-send -t 0 'D executable ready' 'spine-gdc-ver'"
}
#+END_SRC

*** generic :generic:
**** build (sdp) :release:

#+BEGIN_SRC sh
configuration "build" {
  name                 "build"
  targetType           "executable"
  platforms            "posix"
  targetName           "bin/spine"
  dflags               "-J=views" "-I=src/doc_reform"
  buildOptions         "verbose" "releaseMode" "optimize" "inline"
  postGenerateCommands "notify-send -t 0 'D release executable ready' 'spine'"
}
#+END_SRC

* meson REVISIT :meson:build:
** notes

http://mesonbuild.com/D.html
http://mesonbuild.com/Dependencies.html#Dub
- create and move to subdirectory
  rm -r build; mkdir build && cd build

- build

  - regular build (faster compile time):
    meson && ninja

  - optimized build (faster program run time):
    meson --buildtype=debugoptimized && ninja

  - time build
    time ( meson --buildtype=debugoptimized && ninja )

- other
  - flags
    DFLAGS= DC=ldc2 meson ..

*** projects :project:

ls -1 ./src/*/**/*.d
tree -fi ./src |rg "\.d$"
fdfind -e .d

tree -if src | rg ".+\.d$" > spine_sources.txt && \
for i in spine_sources.txt; do; \
sed -i "s/\(.\+\.d$\)/  '\1',/g" $i; done && \
cat spine_sources.txt

**** project meson.build :filelist:

#+BEGIN_SRC sh :tangle ../meson.build
project('spine', 'd',
  license: 'AGPL-3',
  version: '<<version_spine>>',
  meson_version: '>=<<version_meson>>'
)
#if meson.get_compiler('d').get_id() == 'gcc'
#    error('spine cannot be compiled with GDC at time. Sorry.')
#endif
spine_src = [
  'src/doc_reform/spine.d',
  'src/doc_reform/conf/compile_time_info.d',
  'src/doc_reform/io_in/paths_source.d',
  'src/doc_reform/io_in/read_config_files.d',
  'src/doc_reform/io_in/read_source_files.d',
  'src/doc_reform/io_out/cgi_sqlite_search_form.d',
  'src/doc_reform/io_out/create_zip_file.d',
  'src/doc_reform/io_out/defaults.d',
  'src/doc_reform/io_out/epub3.d',
  'src/doc_reform/io_out/html.d',
  'src/doc_reform/io_out/hub.d',
  'src/doc_reform/io_out/latex.d',
  'src/doc_reform/io_out/metadata.d',
  'src/doc_reform/io_out/odt.d',
  'src/doc_reform/io_out/package.d',
  'src/doc_reform/io_out/paths_output.d',
  'src/doc_reform/io_out/rgx.d',
  'src/doc_reform/io_out/source_pod.d',
  'src/doc_reform/io_out/sqlite.d',
  'src/doc_reform/io_out/xmls_css.d',
  'src/doc_reform/io_out/xmls.d',
  'src/doc_reform/meta/conf_make_meta_json.d',
  'src/doc_reform/meta/conf_make_meta_structs.d',
  'src/doc_reform/meta/conf_make_meta_yaml.d',
  'src/doc_reform/meta/defaults.d',
  'src/doc_reform/meta/doc_debugs.d',
  'src/doc_reform/meta/metadoc.d',
  'src/doc_reform/meta/metadoc_from_src.d',
  'src/doc_reform/meta/metadoc_harvest.d',
  'src/doc_reform/meta/metadoc_harvests_authors.d',
  'src/doc_reform/meta/metadoc_harvests_topics.d',
  'src/doc_reform/meta/metadoc_object_setter.d',
  'src/doc_reform/meta/metadoc_show_config.d',
  'src/doc_reform/meta/metadoc_show_make.d',
  'src/doc_reform/meta/metadoc_show_metadata.d',
  'src/doc_reform/meta/metadoc_show_summary.d',
  'src/doc_reform/meta/package.d',
  'src/doc_reform/meta/rgx.d',
  'src/doc_reform/share/defaults.d',
]
source_root = meson.source_root()
src_dir = include_directories('src/')
# Dependencies
dep_tinyendian   = dependency('tinyendian',   version: '>= <<version_tinyendian>>',  fallback: ['tinyendian',   'tinyendian_dep'],   method: 'dub')
dep_dyaml        = dependency('dyaml',        version: '>= <<version_dyaml>>',  fallback: ['dyaml',        'dyaml_dep'],        method: 'dub')
dep_d2sqlite3    = dependency('d2sqlite3',    version: '>= <<version_d2sqlite3>>', fallback: ['d2sqlite3',    'd2sqlite3_dep'],    method: 'dub')
dep_imageformats = dependency('imageformats', version: '>= <<version_imageformats>>',  fallback: ['imageformats', 'imageformats_dep'], method: 'dub')
# Executable
spine_exe = executable('spine',
  [spine_src],
  include_directories : [src_dir],
  d_import_dirs: [include_directories('views')],
  dependencies : [
    dep_tinyendian,
    dep_dyaml,
    dep_d2sqlite3,
    dep_imageformats,
  ],
  install : true
)
#+END_SRC

** meson subprojects [taken care of using dub] :subprojects:
*** README

#+BEGIN_SRC txt :tangle ../subprojects/README
- d2sqlite3
  - dub
    - https://code.dlang.org/packages/d2sqlite3
  - upstream
    - https://github.com/biozic/d2sqlite3
- dyaml
  - dub
    - https://code.dlang.org/packages/dyaml
  - upstream
    - https://github.com/dlang-community/D-YAML
  - upstream git clone
    - https://github.com/dlang-community/D-YAML.git
- imageformats
  - dub
    - https://code.dlang.org/packages/imageformats
  - upstream git clone
    - https://github.com/lgvz/imageformats
- tinyendian (dyaml dependency)
  - dub
    - http://code.dlang.org/packages/tinyendian
  - upstream git clone
    - https://github.com/dlang-community/tinyendian.git
#+END_SRC

*** d2sqlite3 :d2sqlite3:
****  wrap

#+BEGIN_SRC sh :tangle ../subprojects/d2sqlite3.wrap
[wrap-git]
directory = d2sqlite3
url       = https://github.com/biozic/d2sqlite3.git
revision  = head
#+END_SRC

****  meson.build

#+BEGIN_SRC sh :NO-tangle ../subprojects/d2sqlite3.meson.build
project('d2sqlite3', 'd',
  meson_version: '>=<<version_meson>>',
  license: 'BSL-1.0',
  version: '<<version_d2sqlite3>>'
)

project_soversion = '<<version_soversion>>'

src_dir = include_directories('source/')
pkgc = import('pkgconfig')

sqlite_dep = dependency('sqlite3')

d2sqlite3_src = [
  'source/d2sqlite3/database.d',
  'source/d2sqlite3/internal/memory.d',
  'source/d2sqlite3/internal/util.d',
  'source/d2sqlite3/library.d',
  'source/d2sqlite3/package.d',
  'source/d2sqlite3/results.d',
  'source/d2sqlite3/sqlite3.d',
  'source/d2sqlite3/statement.d',
]
install_subdir('source/d2sqlite3/', install_dir: 'include/d/d2sqlite3/')

d2sqlite3_lib = library('d2sqlite3',
  [d2sqlite3_src],
  include_directories: [src_dir],
  dependencies: [sqlite_dep],
  install: true,
  version: meson.project_version(),
  soversion: project_soversion
)

pkgc.generate(name: 'd2sqlite3',
  libraries: d2sqlite3_lib,
  subdirs: 'd/d2sqlite3/',
  version: meson.project_version(),
  requires: ['sqlite3'],
  description: 'A small wrapper around SQLite for the D programming language.'
)

# for use by others which embed this as subproject
d2sqlite3_dep = declare_dependency(
  link_with: [d2sqlite3_lib],
  dependencies: [sqlite_dep],
  include_directories: [src_dir]
)
#+END_SRC

*** dyaml :dyaml:
****  wrap

#+BEGIN_SRC sh :tangle ../subprojects/dyaml.wrap
[wrap-git]
directory = dyaml
url       = https://github.com/dlang-community/D-YAML.git
revision  = head
#+END_SRC

****  meson.build (provided by upstream)

Upstream provides meson.build

#+BEGIN_SRC sh :NO-tangle ../subprojects/D-YAML/meson.build
project('D-YAML', 'd',
    meson_version: '>=<<version_meson>>',
    subproject_dir: 'contrib',
    version: '<<version_dyaml>>'
)

project_soversion    = '<<version_soversion>>'

src_dir = include_directories('source/')
pkgc = import('pkgconfig')

dyaml_src = [
    'source/dyaml/composer.d',
    'source/dyaml/constructor.d',
    'source/dyaml/dumper.d',
    'source/dyaml/emitter.d',
    'source/dyaml/encoding.d',
    'source/dyaml/escapes.d',
    'source/dyaml/event.d',
    'source/dyaml/exception.d',
    'source/dyaml/linebreak.d',
    'source/dyaml/loader.d',
    'source/dyaml/node.d',
    'source/dyaml/package.d',
    'source/dyaml/parser.d',
    'source/dyaml/queue.d',
    'source/dyaml/reader.d',
    'source/dyaml/representer.d',
    'source/dyaml/resolver.d',
    'source/dyaml/scanner.d',
    'source/dyaml/serializer.d',
    'source/dyaml/style.d',
    'source/dyaml/tagdirective.d',
    'source/dyaml/test/common.d',
    'source/dyaml/test/compare.d',
    'source/dyaml/test/constructor.d',
    'source/dyaml/test/emitter.d',
    'source/dyaml/test/errors.d',
    'source/dyaml/test/inputoutput.d',
    'source/dyaml/test/reader.d',
    'source/dyaml/test/representer.d',
    'source/dyaml/test/resolver.d',
    'source/dyaml/test/tokens.d',
    'source/dyaml/token.d'
]
install_subdir('source/dyaml', install_dir: 'include/d/yaml/')

tinyendian_dep = dependency('tinyendian', version: '>=<<version_tinyendian>>', fallback: ['tinyendian', 'tinyendian_dep'])

dyaml_lib = library('dyaml',
        [dyaml_src],
        include_directories: [src_dir],
        dependencies: [tinyendian_dep],
        install: true,
        version: meson.project_version(),
        soversion: project_soversion
)
pkgc.generate(name: 'dyaml',
              libraries: dyaml_lib,
              subdirs: 'd/yaml/',
              version: meson.project_version(),
              description: 'YAML parser and emitter for the D programming language.'
)

# Make D-YAML easy to use as subproject
dyaml_dep = declare_dependency(
    link_with: dyaml_lib,
    include_directories: [src_dir],
    dependencies: [tinyendian_dep]
)
#+END_SRC

*** imageformats :imageformats:
****  wrap

#+BEGIN_SRC sh :tangle ../subprojects/imageformats.wrap
[wrap-git]
directory = imageformats
url       = https://github.com/lgvz/imageformats.git
revision  = head
#+END_SRC

****  meson.build

#+BEGIN_SRC sh :NO-tangle ../subprojects/imageformats.meson.build
project('imageformats', 'd',
  meson_version: '>=<<version_meson>>',
  license: 'BSL-1.0',
  version: '<<version_imageformats>>'
)

project_soversion = '<<version_soversion>>'

src_dir = include_directories('.')
pkgc = import('pkgconfig')

imageformats_src = [
  'imageformats/bmp.d',
  'imageformats/jpeg.d',
  'imageformats/package.d',
  'imageformats/png.d',
  'imageformats/tga.d'
]
install_subdir('imageformats/', install_dir: 'include/d/imageformats-d/')

imageformats_lib = library('imageformats-d',
  [imageformats_src],
  include_directories: [src_dir],
  install: true,
  version: meson.project_version(),
  soversion: project_soversion
)

pkgc.generate(name: 'imageformats-d',
  libraries: imageformats_lib,
  subdirs: 'd/imageformats-d/',
  version: meson.project_version(),
  description: 'Decoders for PNG, TGA, BMP, JPEG and encoders for PNG, TGA, BMP.'
)

# for use by others which embed this as subproject
imageformats_dep = declare_dependency(
    link_with: [imageformats_lib],
    include_directories: [src_dir]
)
#+END_SRC

*** tinyendian (dyaml dependency) :tinyendian:
****  wrap

#+BEGIN_SRC sh :tangle ../subprojects/tinyendian.wrap
[wrap-git]
directory = tinyendian
url       = https://github.com/dlang-community/tinyendian.git
revision  = head
#+END_SRC

****  meson.build (provided by upstream)

Upstream provides meson.build

#+BEGIN_SRC sh :NO-tangle ../subprojects/tinyendian/meson.build
# -*- mode: python; -*-

project(
    'tinyendian',
    'd',
    meson_version: '>=<<version_meson>>',
    version: '<<version_tinyendian>>',
    default_options: ['buildtype=release'],
)

src_dir = include_directories('source/')
pkgc = import('pkgconfig')

tinyendian_src = [
    'source/tinyendian.d'
]

install_headers(tinyendian_src, subdir: 'd/')

tinyendian_lib = library(
    meson.project_name(),
    [tinyendian_src],
    include_directories: [src_dir],
    version: meson.project_version(),
    pic: true,
    install: true,
)

pkgc.generate(
    name: meson.project_name(),
    libraries: tinyendian_lib,
    subdirs: 'd/',
    version: meson.project_version(),
    description: 'Lightweight endianness library for D.'
)

# Make Tinyendian easy to use as subproject
tinyendian_dep = declare_dependency(
    link_with: tinyendian_lib,
    include_directories: [src_dir]
)
#+END_SRC

* nix :nix:

- default.nix
- shell.nix
- dub2.nix

** dub2nix notes (from author (Lionello Lunesu) email reply, 2020-10-12) NOTE

- https://github.com/lionello/dub2nix

- see shell.nix minimal content:

- run: nix-shell

- run: dub init

- add d2sqlite3 dependency (provide as dependency during “dub init” or add it to
  the dub.json manually)

#+BEGIN_SRC json :NO-tangle ../dub.json
{
  "authors": [
    "Ralph Amissah"
  ],
  "copyright": "Copyright © 2020, Ralph Amissah",
  "description": "A minimal D application.",
  "license": "AGPL-3",
    "name": "d2sqlite3_dub2nix",
  "dependencies": {
    "d2sqlite3": "~><<version_d2sqlite3>>"
  },
  "subConfigurations": {
    "d2sqlite3": "with-lib"
  }
}
#+END_SRC

- run: dub build

- run: dub2nix save
  creates: dub.selections.nix

- Create a new file default.nix with this content:

#+BEGIN_SRC nix :NO-tangle default.nix
{ pkgs ? import <nixpkgs> {} }:
with import ./mkDub.nix { inherit pkgs; };
mkDubDerivation {
    src = ./.;
    buildInputs = [
      pkgs.sqlite
    ];
}
#+END_SRC

- Copy mkDub.nix from the dub2nix project.

#+BEGIN_SRC sh
aria2c https://raw.githubusercontent.com/lionello/dub2nix/master/mkDub.nix
#+END_SRC

make modificatons if desired

- run: nix-build
       nix-build -I nixpkgs=[path-to]/nixpkgs

** envrc :envrc:
*** .envrc

#+BEGIN_SRC nix :tangle ../.envrc
if type lorri &>/dev/null; then
  echo "direnv: using lorri from PATH ($(type -p lorri))"
  eval "$(lorri direnv)"
else
  # fall back to using direnv's builtin nix support
  # to prevent bootstrapping problems.
  use nix
  NIX_ENFORCE_PURITY=0
fi
# source an additional user-specific .envrc in ./.envrc-local
if [ -e .envrc-local ]; then
  source .envrc-local
fi
#+END_SRC

- enable flakes

#+BEGIN_SRC nix :NO-tangle ../.envrc
if [ -f flake.lock ] && [ -f flake.nix ]; then
    # reload when these files change
    watch_file flake.nix
    watch_file flake.lock
    # load the flake devShell
    if [ ! -d $(direnv_layout_dir) ]; then
        mkdir $(direnv_layout_dir)
    fi
    eval "$(nix --experimental-features 'nix-command flakes' print-dev-env --profile "$(direnv_layout_dir)/flake-profile")"
else
    # fall back to using direnv's builtin nix support
    # to prevent bootstrapping problems.
  #  use nix
  if type lorri &>/dev/null; then
      echo "direnv: using lorri from PATH ($(type -p lorri))"
      eval "$(lorri direnv)"
  else
      # fall back to using direnv's builtin nix support
      # to prevent bootstrapping problems.
      use nix
      NIX_ENFORCE_PURITY=0
  fi
  # source an additional user-specific .envrc in ./.envrc-local
  if [ -e .envrc-local ]; then
     source .envrc-local
  fi
fi
#+END_SRC

*** .envrc-local CHECK MODIFY

- bespoke modify appropriately and generate if needed

#+BEGIN_SRC nix :NO-tangle ../.envrc-local
export NIX_PATH=nixpkgs=<<nixpkgs_path>>
nix-instantiate --find-file nixpkgs
#+END_SRC

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

#+NAME: nixpkgs_path
#+BEGIN_SRC nix
<<nixpkgs_path_default>>
#+END_SRC

***** nixpkgs path options

- <nixpkgs>

#+NAME: nixpkgs_path_default
#+BEGIN_SRC nix
<nixpkgs>
#+END_SRC

- local path

#+NAME: nixpkgs_path_local
#+BEGIN_SRC nix
/nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs
#+END_SRC

** flake :flake:

- flake.nix
    /nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs
    ./shell.nix
  - shell.nix
      ./pkgs/shell-pkgs.nix
    - pkgs/shell-pkgs.nix
  - default.nix
      ./nix/mkDub.nix
    - mkdub.nix
       ./nix/dub.selections.nix
    - dub.selections.nix

nix develop

nix flake update --recreate-lock-file

#+BEGIN_SRC nix :tangle ../flake.nix
{
  description = "a sisu like document parser";
  inputs = {
    flake-utils.url = "github:numtide/flake-utils";
    nixpkgs.url = "/nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs";
    d2sqlite3 = {
      url    = "github:dlang-community/d2sqlite3";
      flake  = false;
    };
    tinyendian = {
      url    = "github:kiith-sa/tinyendian";
      flake  = false;
    };
    dyaml = {
      url    = "github:dlang-community/D-YAML";
      flake  = false;
    };
    imageformats = {
      url    = "github:lgvz/imageformats";
      flake  = false;
    };
    dub2nix-src = {
      url = "github:lionello/dub2nix";
      flake  = false;
    };
  };
  outputs = { self, d2sqlite3, tinyendian, dyaml, imageformats, dub2nix-src, nixpkgs, flake-utils }:
  let
    pkgs = nixpkgs.legacyPackages.x86_64-linux;
  in {
    packages.x86_64-linux.spine = pkgs.stdenv.mkDerivation {
      name = "spine";
      inherit self;
      src = self;
      shell = ./shell.nix;
      installPhase = ''
         install -m755 spine $out/bin/spine
      '';
    };
    defaultPackage.x86_64-linux = self.packages.x86_64-linux.spine;
  };
}
#+END_SRC

#+BEGIN_SRC nix :NO-tangle ../flake.nix
{
  description = "a sisu like document parser";
  inputs = {
    flake-utils.url = "github:numtide/flake-utils";
    nixpkgs.url = "/nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs";
    # pkgs /nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs {}
    #spine.url = "/grotto-ra/repo/git.repo/projects/project-spine/doc-reform";
    #spine.url = "./.";
  };
  outputs = { self, nixpkgs, flake-utils }:
    #flake-utils.lib.eachSystem [ "x86_64-linux" "defaultPackage.x86_64-linux" "packages.x86_64-linux.defaultPackage.x86_64-linux" ] (system:
    flake-utils.lib.eachDefaultSystem (system:
      let
        #pkgs = ${system};
        pkgs = nixpkgs.legacyPackages.${system};
        # project = pkgs.spine.project' {
        #   src = ./.;
        #   compiler-nix-name = "ldc";
        # };
      in { #project.flake {} // {
        #devShell = project.shellFor {
        #  (import ./shell.nix self { inherit pkgs; });
        #};
        devShell = import ./default.nix self { inherit pkgs; };
      }
    );
}
#+END_SRC

** shell.nix :shell:

  nix-shell

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

  nix-shell --pure -I nixpkgs=/nixpkgs-ra/nixpkgs
  nix-shell --pure -p "with import /nixpkgs-ra/nixpkgs {}; ldc"
  nix-shell --pure -p "with import /nixpkgs-ra/nixpkgs/.gitworktree/ra/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 /nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs {}; [dub ldc]"

  shell.nix -I .envrc
  shell.nix

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

  nix build
  nix build -f default.nix
  nix build -f project.nix
  nix build -f spine.nix

  nix-shell shell.nix --pure
  nix build -f default.nix
  ./result/bin/spine

#+BEGIN_SRC nix :tangle ../shell.nix :tangle-mode (identity #o755) :shebang "#!/usr/bin/env -S nix-shell"
{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = with pkgs; [
    (import ./nix/pkglst/shell-pkgs.nix { inherit pkgs; })
  ];
  buildPhase = "nix build -f default.nix";
  shellHook = ''
    echo "built spine @ ./result/bin/spine"
    #nix-instantiate | nix show-derivation | jq
  '';
}
#+END_SRC

- combining shell.nix & default.nix to build package:

#+BEGIN_SRC nix :NO-tangle ../shell.nix :tangle-mode (identity #o755) :shebang "#!/usr/bin/env -S nix-shell"
#!/usr/bin/env -S nix-shell
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
}:
with import ./nix/mkDub.nix { inherit pkgs; };
mkDubDerivation rec {
  name = "spine-${version}";
  version = "0.11.1";
  src = ./.;
  buildInputs = with pkgs; [(
    import ./nix/pkglst/shell-pkgs.nix
    { inherit pkgs; }
  )];
  meta = with stdenv.lib; {
    homepage = http://sisudoc.org;
    description = "a sisu like document parser";
    license = licenses.agpl3Plus;
    platforms = platforms.linux;
    maintainers = [ RalphAmissah ];
  };
}
#+END_SRC

- package import incorporated, all in one file

#+BEGIN_SRC nix :NO-tangle ../shell.nix :tangle-mode (identity #o755) :shebang "#!/usr/bin/env -S nix-shell"
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
}:
with import ./nix/mkDub.nix { inherit pkgs; };
mkDubDerivation rec {
  name = "spine-${version}";
  version = "0.11.1";
  src = ./.;
  buildInputs = [
    pkgs.sqlite
    (
      let
        dub2nix-src = fetchTarball {
          url = "https://github.com/lionello/dub2nix/archive/master.tar.gz";
        };
        dub2nix = (import dub2nix-src) { inherit pkgs; };
      in
      with pkgs; [
        nixFlakes
        dub
        ldc
        sqlite
        nix-prefetch-git
        validatePkgConfig
      ]
    )
  ];
  shellHook = ''
    # nix-build -I nixpkgs=<provide local nix path>
    nix-build
    echo "built spine"
  '';
  installPhase = ''
    install -m755 -D spine $out/bin/spine
    echo "built $out/bin/spine"
  '';
  meta = with stdenv.lib; {
    homepage = http://sisudoc.org;
    description = "a sisu like document parser";
    license = licenses.agpl3Plus;
    platforms = platforms.linux;
    maintainers = [ RalphAmissah ];
  };
}
#+END_SRC

** default.nix :default:

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

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

  nix-build -I nixpkgs=/nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs
  nix-build -I .envrc-local
  nix-build -I .envrc
  default.nix -I .envrc
  default.nix

  nix build
  nix build -f default.nix
  nix build -f project.nix
  nix build -f spine.nix

#+BEGIN_SRC nix :tangle ../default.nix :tangle-mode (identity #o755) :shebang "#!/usr/bin/env -S nix-build"
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
}:
with import ./nix/mkDub.nix { inherit pkgs; };
mkDubDerivation rec {
  name = "spine-${version}";
  version = "<<version_spine>>";
  src = ./.;
  buildInputs = [
    pkgs.sqlite
    (import ./nix/pkglst/shell-pkgs.nix { inherit pkgs; })
  ];
  # installPhase = ''
  #   install -m755 -D spine $out/bin/spine
  #   echo "built $out/bin/spine"
  # '';
  <<nix_project_meta>>
}
#+END_SRC

** project.nix :project:

#+BEGIN_SRC nix :tangle ../project.nix :tangle-mode (identity #o755) :shebang "#!/usr/bin/env -S nix-build"
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
}:
with import ./nix/mkDub.nix { inherit pkgs; };
mkDubDerivation rec {
  name = "spine-${version}";
  version = "<<version_spine>>";
  src = ./.;
  buildInputs = [
    pkgs.sqlite
    (
      <<nix_dub2nix_with_pkgs>>
    )
  ];
  # buildPhase = [ ];
  installPhase = ''
    install -m755 -D spine $out/bin/spine
    echo "built $out/bin/spine"
  '';
  <<nix_project_meta>>
}
#+END_SRC

** spine.nix (project.nix including import mkDub.nix) :project:

#+BEGIN_SRC nix :tangle ../spine.nix :tangle-mode (identity #o755) :shebang "#!/usr/bin/env -S nix-build"
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
  ldc ? null,
  dcompiler ? pkgs.ldc,
  dub ? pkgs.dub
}:
assert dcompiler != null;
#with import ./nix/mkDub.nix { inherit pkgs; };
with ( # mkDub.nix
  <<mkDub_nix>>
);
mkDubDerivation rec {
  name = "spine-${version}";
  version = "<<version_spine>>";
  src = ./.;
  buildInputs = [
    pkgs.sqlite
    (
      <<nix_dub2nix_with_pkgs>>
    )
  ];
  # buildPhase = [ ];
  installPhase = ''
    install -m755 -D spine $out/bin/spine
    echo "built $out/bin/spine"
  '';
  <<nix_project_meta>>
}
#+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
#+BEGIN_SRC nix
meta = with stdenv.lib; {
  homepage = http://sisudoc.org;
  description = "a sisu like document parser";
  license = licenses.agpl3Plus;
  platforms = platforms.linux;
  maintainers = [ RalphAmissah ];
};
#+END_SRC

** mkDub.nix :mkDub:

Get current mkDub.nix from the dub2nix project:

#+BEGIN_SRC sh
aria2c https://raw.githubusercontent.com/lionello/dub2nix/master/mkDub.nix ./nix/.
#+END_SRC

*** dub2nix

#+BEGIN_SRC nix :tangle ../nix/pkglst/shell-pkgs.nix
{ pkgs ? import <nixpkgs> {} }:
<<nix_dub2nix_with_pkgs>>
#+END_SRC

*** mkDub

#+BEGIN_SRC nix :tangle ../nix/mkDub.nix
{ pkgs ? import <nixpkgs> {},
  stdenv ? pkgs.stdenv,
  ldc ? null,
  dcompiler ? pkgs.ldc,
  dub ? pkgs.dub
}:
<<mkDub_nix>>
#+END_SRC

** mkDub.nix shared

#+NAME: mkDub_nix
#+BEGIN_SRC nix
assert dcompiler != null;
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 = [ dcompiler dub ];
    src = dep2src dubDep;
    buildPhase = ''
      runHook preBuild
      export HOME=$NIX_BUILD_TOP
      #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: [ dcompiler 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 + "/nix/dub.selections.nix",
    deps ? import selections,
    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
      export HOME=$PWD
      ${lib.concatMapStringsSep "\n" dub-add-local deps}
      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
      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;
  }));
}
#+END_SRC

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

#+NAME: nix_dub2nix_with_pkgs
#+BEGIN_SRC nix
let
  <<nix_shell_dub2nix>>
in
with pkgs; [
  <<nix_shell_with_pkgs_list>>
]
#+END_SRC

*** get dub2nix

#+NAME: nix_shell_dub2nix
#+BEGIN_SRC nix
dub2nix-src = fetchTarball {
  url = "https://github.com/lionello/dub2nix/archive/master.tar.gz";
};
dub2nix = (import dub2nix-src) { inherit pkgs; };
#+END_SRC

*** with pkgs list

#+NAME: nix_shell_with_pkgs_list
#+BEGIN_SRC nix
nixFlakes
dub
ldc
sqlite
nix-prefetch-git
validatePkgConfig
jq
#+END_SRC

* .gitignore :gitignore:

#+BEGIN_SRC sh :tangle ../.gitignore
# git ls-files --others --exclude-from=.git/info/exclude
*
!.gitignore
!README.md
!COPYRIGHT
!CHANGELOG
!makefile
!version.txt
!*.json
!*.sdl
!meson.build
!tangle
!*.org
!*.d
!*.rb
!conf.sdl
!doc
!doc/**
!man
!man/**
!org
!misc
!misc/**
!*.nix
!nix
!nix/**
!.envrc
!src
!src/**
!data
!data/*
!data/src/**
!data/src_yaml/**
!data/pod/**
!data/pod_yaml/**
!*.sst
!*.ssm
!**/*.sst
!**/*.ssm
!subprojects
!subprojects/*.wrap
#!subprojects/*.meson.build
#!subprojects/**
!pod.manifest
!sisu_document_make
!config_local_site
!sisudoc
!views
!docs/*.html
!notes
notes/**
!notes/*.org
!notes/sisu-description.sst
!notes/reminders
!notes/reminders/**
.dub/**
**/.dub/**
**/cgi-bin/**
tmp/**
*_.org
*_.d
*_.txt
*_
*.swp
*~
*~
\#*
*.\#*
#!*/
#\#*
#*.\#*
#.reggae/**
#+END_SRC

* misc
** sh script to batch process _emacs org babel tangle_ :shell_script:tangle:
  [[http://orgmode.org/manual/Batch-execution.html]]
creates a shell batch script called "tangle", that will tangle (emacs org
babel tangle) org files in ./org/ to create .d source files in ./src/doc_reform/
(similar functionality is contained within the "makefile" created by this
"dr_build_scaffold.org" file make tangle)

#+BEGIN_SRC sh :tangle ../tangle :tangle-mode (identity #o755) :shebang "#!/bin/sh"
# -*- mode: shell-script -*-
# tangle files with org-mode
DIR=`pwd`
ORGFILES=""
EMACSLISP=/usr/share/emacs/site-lisp
ORG_VER_AVAILABLE=$(shell echo `ls -d ~/.emacs.d/elpa/org-???????? | cut -d '-' -f2`)
EMACSLISP_ORG=~/.emacs.d/elpa/org-$($(shell echo $(ORG_VER_AVAILABLE)))
ORG_CONTRIB_VER_AVAILABLE=$(shell echo `ls -d ~/.emacs.d/elpa/org-plus-???????? | cut -d '-' -f2`)
EMACSLISP_ORG_CONTRIB=~/.emacs.d/elpa/org-plus-contrib-$($(shell echo $(ORG_CONTRIB_VER_AVAILABLE)))
# wrap each argument in the code required to call tangle on it
for i in $@; do
  ORGFILES="$ORGFILES \"$i\""
done
emacs --batch -Q -q \
--eval "(progn
(add-to-list 'load-path (expand-file-name \"$EMACSLISP\"))
(add-to-list 'load-path (expand-file-name \"$EMACSLISP_ORG\" t))
(add-to-list 'load-path (expand-file-name \"$EMACSLISP_ORG_CONTRIB\" t))
(require 'org)(require 'ob)(require 'ob-tangle)
(mapc (lambda (file)
  (find-file (expand-file-name file \"$DIR\"))
  (setq-local org-src-preserve-indentation t)
  (org-babel-tangle)
  (kill-buffer)) '($ORGFILES)))" 2>&1 #|grep tangled
#+END_SRC

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

#+BEGIN_SRC sh
nix-shell --pure
nix-build -I nixpkgs=/nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs
#+END_SRC

- project.nix

#+BEGIN_SRC sh
nix-shell --pure
nix-build -I nixpkgs=/nixpkgs-ra/nixpkgs/.gitworktree/ra/nixpkgs project.nix
#+END_SRC

#+BEGIN_SRC sh
nix build
nix build -f default.nix
nix build -f project.nix
nix build -f spine.nix
#+END_SRC

**** derivation .drv

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

*** dub

#+BEGIN_SRC sh
dub build -h
#+END_SRC

#+BEGIN_SRC sh
time dub --compiler=ldc2 -v --force
time (dub --compiler=ldc2 --config=spine-ldc --debug=steps)
time (dub --compiler=ldc2 --config=spine-ldc --debug=checkdoc --debug=summary --debug=dumpdoc)
time (dub --compiler=ldc2 --config=spine-ldc --debug=io)
time (dub --compiler=ldc2 --config=spine-ldc --debug=checkdoc --debug=summary --debug=dumpdoc --debug=io)
time (dub --compiler=ldc2 --config=spine-ldc-debug --debug=io)

time dub --compiler=dmd -v --force
time (dub --compiler=dmd --config=spine-dmd --debug=steps)
time (dub --compiler=dmd --config=spine-dmd-debug --debug=io)

time dub --compiler=gdc -v --force
time (dub --compiler=gdc --config=spine-gdc --debug=steps)
time (dub --compiler=gdc --config=spine-gdc-debug --debug=io)
#+END_SRC

*** make

#+BEGIN_SRC sh
time make dmd
time make gdc
time make ldc
time make gdc ldc
time make all
time make all_ver
time make dmd_ver ldc_ver gdc_ver

time make restart
time make restart ldc
time make tangle ldc

time make ldc_testrun_find_pod_epub
#+END_SRC

** git
*** project version

#+BEGIN_SRC sh
echo $(git describe --long --tags | sed 's/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g')
#+END_SRC

*** what files changed

#+BEGIN_SRC sh
git whatchanged --since="1 day ago" --oneline --name-only --pretty=format: | sort -u
git log --since="1 day ago" --name-only --pretty=format: | sort -u
#+END_SRC

** test run
*** e.g.

#+BEGIN_SRC sh
time (./result/bin/spine --source --html -v --output-dir=tmp/program-output data/pod/sisu-manual/media/text/en/sisu_markup.sst )

time (./bin/spine-ldc --source --html -v --output-dir=tmp/program-output data/pod/sisu-manual/media/text/en/sisu_markup.sst )

time (./bin/spine-ldc --source --html -v --output-dir=tmp/program-output data/pod/sisu-manual )
time (./bin/spine-ldc --source --html -v --output-dir=tmp/program-output data/pod/the_wealth_of_networks.yochai_benkler )
time (./bin/spine-ldc --source --html -v --output-dir=tmp/program-output data/pod/live-manual )

time (~sdp2/bin/spine-ldc --pod --source --html --epub --sqlite-create --sqlite-update -v sisudoc/media/text/en/sisu_markup_stress_test.sst sisudoc/media/text/en/the_wealth_of_networks.yochai_benkler.sst )

can point to directory containing sisudoc.txt file (listing which files to process)

time (~sdp2/bin/spine-ldc --html -v sisudoc)
# will process source files listed in sisudoc.txt for appropriate files and dir structure

e.g. live-manual a multilingual document (with source file inserts .ssi)

time (~sdp2/bin/spine-ldc --html --lang=en,es -v sisudoc)

time ( find data/pod -name pod.manifest | sort | xargs ./bin/spine-ldc --source --html --epub -v --output-dir=tmp/program-output )

time ( find data/pod -maxdepth 2 -name pod.manifest | sort | xargs ./bin/spine-ldc --source --html --epub -v --output-dir=tmp/program-output )
time ( find data/sisudir/media/text -name *.ss[tm] | sort | xargs ./bin/spine-ldc --source --html --epub -v --output-dir=tmp/program-output )

find data/pod -maxdepth 2 -name pod.manifest | sort | xargs

find data/sisudir/media/text -name *.ss[tm] | sort | xargs
#+END_SRC

*** sort

#+BEGIN_SRC sh
~dr/bin/spine-ldc -v  --sqlite-db-create --sqlite-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=/var/www/html \
  ~grotto/repo/git.repo/code/project-spine/doc-reform-markup/markup_samples/markup/pod/*

~dr/bin/spine-ldc -v  --sqlite-update --sqlite-filename="spine.search.db"   --output=/var/www/html \
  ~grotto/repo/git.repo/code/project-spine/doc-reform-markup/markup_samples/markup/pod/*

~dr/bin/spine-ldc -v --html --harvest-link  --output=/var/www/html \
   ~grotto/repo/git.repo/code/project-spine/doc-reform-markup/markup_samples/markup/pod/*

~dr/bin/spine-ldc -q --show-config --html --output=/var/www/html ~grotto/repo/git.repo/code/project-spine/doc-reform-markup/markup_samples/markup/pod

~dr/bin/spine-ldc -q --show-config ~grotto/repo/git.repo/code/project-spine/doc-reform-markup/markup_samples/markup/pod

~dr/result/bin/spine --html --output=/var/www/html /grotto-ra/repo/git.repo/projects/project-spine/doc-reform-markup/markup_samples/markup/pod/*

~dr/result/bin/spine --very-verbose --sqlite-db-create --sqlite-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=/var/www /grotto-ra/repo/git.repo/projects/project-spine/doc-reform-markup/markup_samples/markup/pod/*

~dr/result/bin/spine --very-verbose --sqlite-update --sqlite-filename="spine.search.db" --cgi-sqlite-search-filename="spine-search" --output=/var/www /grotto-ra/repo/git.repo/projects/project-spine/doc-reform-markup/markup_samples/markup/pod/*
#+END_SRC

- produces:
  - sqlite db @:           /var/www/html/sqlite/spine.search.db
  - search script in D @:  /var/www/html/cgi/src/spine_search.d
  - html output *          /var/www/html/en/html/[filename]

#+BEGIN_SRC sh
cd /var/www/html/cgi

cp arsd/cgi.d /var/www/html/cgi/.          *-[needs to be implemented as part of code]

dub --force --compiler=ldc2 && sudo cp -v cgi-bin/spine-search /usr/lib/cgi-bin/.
#+END_SRC

*** list markup files
find data/pod -name pod.manifest | sort
find data/sisudir/media/text -name *.ss[tm] | sort

time make ldc_testrun_paths_pod_pod
time make ldc_testrun_paths_pod_pod | ag "^\".+\"|NOT found"
time make ldc_testrun_find_pod_pod
time make ldc_testrun_find_dir_pod
time make ldc_testrun_filelist_dir_pod

** compilers

- [X] Set D_COMPILER (one of DMD LDC or GDC)
- [X] Set debug flags (using DMD standard flag -deb

[[http://wiki.dlang.org/Compilers][D Compilers wiki https://wiki.dlang.org/Compilers]]
[[http://dlang.org/download.html][D Compilers download http://dlang.org/download.html]]

** version info REVIEW :version:

- https://dlang.org/download.html

*** compilers (set latest versions) :compiler:version:
**** ldc VERSION :version:set:ldc:

- https://github.com/ldc-developers/ldc/releases

***** 1.24.0 HACK

- https://github.com/ldc-developers/ldc/releases/tag/v1.24.0
  - nix-prefetch-url https://github.com/ldc-developers/ldc/releases/download/v1.24.0/ldc-1.24.0-src.tar.gz

#+NAME: ldc_version_info
#+BEGIN_SRC nix
version = "1.24.0";
sha256  = "0g5svf55i0kq55q49awmwqj9qi1n907cyrn1vjdjgs8nx6nn35gx";
#+END_SRC

- ldc-1.24.0 overlay does not build with latest nixos version, nixos-20.09
  nixos at ldc-1.20.0

**** dmd :dmd:

- https://dlang.org/changelog/index.html
- https://dlang.org/changelog/pending.html
- http://downloads.dlang.org/releases/
- http://downloads.dlang.org/releases/2.x/

** dub :dub:

https://github.com/dlang/dub/
http://code.dlang.org/getting_started
http://code.dlang.org/docs/commandline

*** setup
**** dub json or sdlang

Every DUB package should contain a [[http://code.dlang.org/package-format?lang=json][dub.json]] or [[http://code.dlang.org/package-format?lang=sdl][dub.sdl]]
https://code.dlang.org/package-format?lang=sdl
https://code.dlang.org/packages/sdlang-d
https://github.com/Abscissa/SDLang-D/blob/master/HOWTO.md

https://code.dlang.org/docs/commandline

**** dub dependencies

dub list
dub upgrade
dub fetch taggedalgebraic
dub fetch libinputvisitor
dub fetch unit-threaded ?

sdp ~master: /home/ralph/grotto/repo/git.repo/utils/spine-x/
/home/ralph/.dub/packages/*

*** build
**** debug flags

#+BEGIN_SRC sh
biblio
biblio_sorted
bibliosorted
block
bookindex
bookindexmatch
bookindexraw
check
checkdoc
code
comment
dumpdoc                    write out document contents, with object type and ocn
endnotes
endnotes_build
footnotes
footnotesdone
group
header
header_and_content
header1
headerjson
headermakejson
headermetadatajson
heading
headings
headingsfound
insert
io
munge
node
objectrelated1
objectrelated2
objects
ocnoff
para
parabullet
parabulletindent
paraindent
paraindenthang
parent
poem
quote
raw
source
srclines
structattrib
summary
table
toc
#+END_SRC

*** dub (using ldc rather than dmd) overlay REFERENCE :overlay:

#+BEGIN_SRC nix :NO-tangle ~/nixpkgs/pkgs/development/tools/build-managers/dub/default.nix
{ lib, stdenv, fetchFromGitHub, curl, libevent, rsync, ldc ? null, dcompiler ? ldc }:

assert dcompiler != null;

stdenv.mkDerivation rec {
  pname = "dub";
  version = "1.23.0";

  enableParallelBuilding = true;

  src = fetchFromGitHub {
    owner = "dlang";
    repo = "dub";
    rev = "v${version}";
    sha256 = "06a4whsl1m600k096nwif83n7za3vr7pj1xwapncy5fcad1gmady";
    # nix-prefetch-url https://github.com/dlang/dub/archive/v1.23.0.tar.gz
  };

  postUnpack = ''
      patchShebangs .
  '';

  # Can be removed with https://github.com/dlang/dub/pull/1368
  dubvar = "\\$DUB";
  postPatch = ''
      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_"
      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"
    $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/${dcompiler.pname}
    echo "DC out --> $DC"
    export HOME=$TMP
    #rm -rf test/*
    rm -rf test/issue502-root-import
    rm test/issue674-concurrent-dub.sh
    rm test/issue672-upgrade-optional.sh
    rm test/issue990-download-optional-selected.sh
    rm test/issue877-auto-fetch-package-on-run.sh
    rm test/issue1037-better-dependency-messages.sh
    # rm test/issue1040-run-with-ver.sh
    rm test/issue1416-maven-repo-pkg-supplier.sh
    rm test/issue1180-local-cache-broken.sh
    rm test/issue1574-addcommand.sh
    rm test/issue1524-maven-upgrade-dependency-tree.sh
    rm test/issue1773-lint.sh
    rm test/ddox.sh
    rm test/fetchzip.sh
    rm test/feat663-search.sh
    rm -rf test/git-dependency
    rm test/interactive-remove.sh
    rm test/timeout.sh
    rm test/version-spec.sh
    rm test/0-init-multi.sh
    rm test/4-describe-data-1-list.sh
    rm test/4-describe-data-3-zero-delim.sh
    rm test/4-describe-import-paths.sh
    rm test/4-describe-string-import-paths.sh
    rm test/4-describe-json.sh
    rm test/5-convert-stdout.sh
    rm test/0-init-multi-json.sh
    rm test/issue1003-check-empty-ld-flags.sh
    rm test/issue103-single-file-package.sh
    rm test/issue1040-run-with-ver.sh
    rm test/issue1091-bogus-rebuild.sh
    # rm test/issue1180-local-cache-broken.sh
    rm test/issue1194-warn-wrong-subconfig.sh
    rm test/issue1277.sh
    rm test/issue1372-ignore-files-in-hidden-dirs.sh
    rm test/issue1447-build-settings-vars.sh
    rm test/issue1531-toolchain-requirements.sh
    # rm test/issue1773-lint.sh
    rm test/issue346-redundant-flags.sh
    rm test/issue361-optional-deps.sh
    rm test/issue564-invalid-upgrade-dependency.sh
    rm test/issue586-subpack-dep.sh
    rm test/issue616-describe-vs-generate-commands.sh
    rm test/issue686-multiple-march.sh
    rm test/issue813-fixed-dependency.sh
    rm test/issue813-pure-sub-dependency.sh
    rm test/issue820-extra-fields-after-convert.sh
    # rm test/issue877-auto-fetch-package-on-run.sh
    rm test/issue923-subpackage-deps.sh
    rm test/single-file-sdl-default-name.sh
    rm test/subpackage-common-with-sourcefile-globbing.sh
    rm test/issue934-path-dep.sh
    # rm test/version-spec.sh
    rm -rf test/1-dynLib-simple
    rm -rf test/1-exec-simple-package-json
    rm -rf test/1-exec-simple
    rm -rf test/1-staticLib-simple
    rm -rf test/2-dynLib-dep
    rm -rf test/2-staticLib-dep
    rm -rf test/2-dynLib-with-staticLib-dep
    rm -rf test/2-sourceLib-dep/
    rm -rf test/3-copyFiles
    rm -rf test/custom-source-main-bug487
    rm -rf test/custom-unittest
    rm -rf test/issue1262-version-inheritance-diamond
    rm -rf test/git-dependency
    rm -rf test/issue1003-check-empty-ld-flags
    rm -rf test/ignore-hidden-1
    rm -rf test/ignore-hidden-2
    rm -rf test/issue1427-betterC
    rm -rf test/issue130-unicode-*
    rm -rf test/issue1262-version-inheritance
    rm -rf test/issue1372-ignore-files-in-hidden-dirs
    rm -rf test/issue1350-transitive-none-deps
    rm -rf test/issue1775
    rm -rf test/issue1447-build-settings-vars
    rm -rf test/issue1408-inherit-linker-files
    rm -rf test/issue1551-var-escaping
    rm -rf test/issue754-path-selection-fail
    rm -rf test/issue1788-incomplete-string-import-override
    rm -rf test/subpackage-ref
    rm -rf test/issue777-bogus-path-dependency
    rm -rf test/issue959-path-based-subpack-dep
    rm -rf test/issue97-targettype-none-nodeps
    rm -rf test/issue97-targettype-none-onerecipe
    rm -rf test/path-subpackage-ref
    rm -rf test/sdl-package-simple
    ./test/run-unittest.sh
  '';

  installPhase = ''
    mkdir -p $out/bin
    cp bin/dub $out/bin
    #cp $NIX_BUILD_TOP/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" "x86_64-darwin" ];
  };
}
#+END_SRC