#+TITLE: sdp (project) makefile
#+AUTHOR: Ralph Amissah
#+EMAIL: ralph.amissah@gmail.com
#+STARTUP: indent content
#+LANGUAGE: en
#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil _:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+OPTIONS: author:nil email:nil creator:nil timestamp:nil
#+PROPERTY: header-args :padline no :exports code :noweb yes
#+EXPORT_SELECT_TAGS: export
#+EXPORT_EXCLUDE_TAGS: noexport
#+FILETAGS: :sdp:rel:makefile:
#+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n)

[[./org/sdp.org][sdp.org]]  [[./org/][org/]]

* sdp makefile                                                     :makefile:
** TODO settings [+2]                                              :settings:
*** alternative D compilers (dmd/ldc2/gdc) [+1]                    :compiler:

http://dlang.org/download.html
https://wiki.dlang.org/Compilers

**** dmd [#A]                                                           :dmd:

http://dlang.org/

#+BEGIN_SRC makefile :tangle makefile
DMD=dmd
DMD_FLAGS=-de -w -J./views -I./src/sdp -linker=ld.gold
DMD_FLAGS_RELEASE=-O -release
DMD_FLAG_BINOF=-of
#+END_SRC

**** ldc2 [#A]                                                          :ldc:

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

#+BEGIN_SRC makefile :tangle makefile
LDC=ldc2
LDC_FLAGS=-w -J=views -I=src/sdp -linker=ld.gold
LDC_FLAGS_RELEASE=-O4 -release
LDC_FLAG_BINOF=-of=
#+END_SRC

**** TODO gdc                                                           :gdc:

#+BEGIN_SRC makefile :tangle makefile
GDC=gdc
#GDC=gdc-5
GDC_FLAGS=
GDC_FLAGS_RELEASE=-march=native -O3 -pipe -frelease
GDC_FLAG_BINOF=-o
#+END_SRC

*** build tools (dub/rdmd) [+1]                                  :build:tool:
**** rdmd                                                              :rdmd:

#+BEGIN_SRC makefile :tangle makefile
RDMD=rdmd
RDMD_FLAGS=--build-only --compiler=
#+END_SRC

**** dub [#A]                                                           :dub:

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

*** TODO [#A] set/select: ~D compiler~ & ~debug flags~ [+1] [2/2]        :select:
- [X] Set D_COMPILER (one of DMD LDC or GDC)
- [X] Set debug flags (using DMD standard flag -debug=)

**** TODO SET compiler: "SET_D_COMPILER=":                  :compiler:select:
[[http://wiki.dlang.org/Compilers][D Compilers wiki]]
[[http://dlang.org/download.html][D Compilers download]]
Set D_COMPILER one of DMD, LDC or GDC e.g.: SET_D_COMPILER=DMD

#+BEGIN_SRC makefile :tangle makefile
# SET_D_COMPILER=(one of: DMD LDC or GDC):
SET_D_COMPILER=LDC
#+END_SRC

**** TODO SET debug flags: "SET_DC_FLAGS_DEBUG_EXTRA=-debug=": :compiler:flags:debug:
Set debug flags using DMD standard flag -debug= e.g.:
  SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=bookindex
  SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=footnotes -debug=endnotes
  SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=biblio

#+BEGIN_SRC makefile :tangle makefile
SET_DC_FLAGS_DEBUG_EXTRA=-debug=dumpdoc
#+END_SRC

***** debug flags

Set debug flags using DMD standard flag -debug= e.g.:
  SET_DC_FLAGS_DEBUG_EXTRA=-debug=dumpdoc
  SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=bookindex
  SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=biblio
  SET_DC_FLAGS_DEBUG_EXTRA=-debug=code

  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
  munge
  node
  objectrelated1
  objectrelated2
  objects
  ocnoff
  para
  parabullet
  parabulletindent
  paraindent
  paraindenthang
  parent
  poem
  quote
  raw
  sdlang
  source
  srclines
  structattrib
  summary
  table

*** D compiler settings [+1]                              :settings:compiler:
**** compiler settings

#+BEGIN_SRC makefile :tangle makefile
DC=$($(SET_D_COMPILER))
DC_FLAGS=$($(shell echo $(SET_D_COMPILER)_FLAGS))
DC_FLAGS_RELEASE=$($(shell echo $(SET_D_COMPILER)_FLAGS_RELEASE))
DC_FLAG_BINOF=$($(shell echo $(SET_D_COMPILER)_FLAG_BINOF))
DC_FLAGS_DEBUG_DEFAULT_SET=-unittest -debug=checkdoc -debug=summary
DC_FLAGS_DEBUG_SET=\
	$(shell echo $(DC_FLAGS_DEBUG_DEFAULT_SET) $(SET_DC_FLAGS_DEBUG_EXTRA))
#+END_SRC

**** compiler conditional settings (depending on selected D compiler)

#+BEGIN_SRC makefile :tangle makefile
ifeq ($(DC), $(DMD))
	DC_FLAGS_DEBUG :=$(shell echo $(DC_FLAGS_DEBUG_SET))
endif
ifeq ($(DC) ,$(LDC))
	DC_FLAGS_DEBUG :=$(shell echo $(DC_FLAGS_DEBUG_SET)| sed -e "s/-debug=/-d-debug=/g")
endif
ifeq ($(DC), $(GDC))
	DC_FLAGS_DEBUG :=$(shell echo $(DC_FLAGS_DEBUG_SET)| sed -e "s/-debug/-fdebug/g")
endif
DUB_FLAGS_DEBUG :=$(shell echo $(DC_FLAGS_DEBUG_SET)| sed -e "s/-debug/--debug/g"| sed -e "s/-unittest//g")
#+END_SRC

*** Project Details                                             :project:sdp:

#+BEGIN_SRC makefile :tangle makefile
PRG_NAME=sdp
PRG_SRC=$(PRG_NAME).d
PRG_SRCDIR=./src
PRG_BIN=$(PRG_NAME)
PRG_BINDIR=./bin
#+END_SRC

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

#+BEGIN_SRC makefile :tangle makefile
# ORG
ORG_VERSION=20160530
EMACSLISP=/usr/share/emacs/site-lisp
EMACSLISP_ORG=~/.emacs.d/elpa/org-$($(shell echo $(ORG_VERSION)))
EMACSLISP_ORG_CONTRIB=~/.emacs.d/elpa/org-plus-contrib-$($(shell echo $(ORG_VERSION)))
ORGFILELIST=$(shell echo `ls -1 maker.org org/*.org`)
ORGFILES=""
ORGDIR=$(shell echo `pwd`)
#+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:
**** build rebuild                                            :build:rebuild:

***** compilers
#+BEGIN_SRC makefile :tangle makefile
all: 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
#+END_SRC

***** TODO dub build rebuild [#A]                                       :dub:

#+BEGIN_SRC makefile :tangle makefile
dub: $(PRG_SRCDIR)/$(PRG_SRC)
	$(DUB) $(DUB_FLAGS)$(DC)
debug_dub: $(PRG_SRCDIR)/$(PRG_SRC)
	$(DUB) $(DUB_FLAGS)$(DC) $(DUB_FLAGS_DEBUG)
# dmd
dub_dmd_release: expunge skel tangle
	$(DUB) $(DUB_FLAGS)dmd --config=sdp-release
dub_dmd_stamp: tangle
	$(DUB) $(DUB_FLAGS)dmd --config=sdp-dmd
dub_dmd_release_test: tangle
	$(DUB) $(DUB_FLAGS)dmd --config=sdp-dmd
dub_dmd_debug: tangle
	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug
dub_dmd_debug_clean: tangle
	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug-clean
dub_dmd_tmp: tangle
	$(DUB) $(DUB_FLAGS)dmd --config=sdp-tmp
dub_dmd_debug_src:
	$(DUB) $(DUB_FLAGS)dmd --config=sdp-debug
# ldc2
dub_ldc_release: expunge skel tangle
	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-release
dub_ldc_stamp: tangle
	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-ldc
dub_ldc_release_test: tangle
	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-ldc
dub_ldc_debug: tangle
	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug
dub_ldc_debug_clean: tangle
	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug-clean
dub_ldc_tmp: tangle
	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-tmp
dub_ldc_debug_src:
	$(DUB) $(DUB_FLAGS)ldc2 --config=sdp-debug
# test releases
dub_release_test_dmd: tangle dub_dmd_release_test
dub_release_test_ldc: tangle dub_ldc_release_test
#+END_SRC

***** rdmd build rebuild                                               :rdmd:

#+BEGIN_SRC makefile :tangle makefile
rdmd: $(PRG_SRCDIR)/$(PRG_SRC)
	$(RDMD) $(RDMD_FLAGS)$(DC) $(DC_FLAGS) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_NAME)/$(PRG_SRC)
#+END_SRC

**** debug                                                            :debug:

***** debug

#+BEGIN_SRC makefile :tangle makefile
debug: $(PRG_SRCDIR)/$(PRG_SRC)
	$(DC) $(DC_FLAGS) $(DC_FLAGS_DEBUG) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_SRC)

debug_dmd: $(PRG_SRCDIR)/$(PRG_SRC)
	$(DMD) $(DMD_FLAGS) $(DMD_FLAGS_DEBUG) \
	$(DMD_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_SRC)

debug_ldc: $(PRG_SRCDIR)/$(PRG_SRC)
	$(LDC) $(LDC_FLAGS) $(LDC_FLAGS_DEBUG) \
	$(LDC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_SRC)

debug_gdc: $(PRG_SRCDIR)/$(PRG_SRC)
	$(GDC) $(GDC_FLAGS) $(GDC_FLAGS_DEBUG) \
	$(GDC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_SRC)
#+END_SRC

***** debug rdmd

#+BEGIN_SRC makefile :tangle makefile
debug_rdmd: $(PRG_SRCDIR)/$(PRG_SRC)
	$(RDMD) $(RDMD_FLAGS)$(DC) $(DC_FLAGS) $(DC_FLAGS_DEBUG) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_NAME)/$(PRG_SRC)

debug_rdmd_dmd: $(PRG_SRCDIR)/$(PRG_SRC)
	$(RDMD) $(RDMD_FLAGS)$(DMD) $(DC_FLAGS) $(DC_FLAGS_DEBUG) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_NAME)/$(PRG_SRC)

debug_rdmd_ldc: $(PRG_SRCDIR)/$(PRG_SRC)
	$(RDMD) $(RDMD_FLAGS)$(LDC) $(DC_FLAGS) $(LDC_FLAGS_DEBUG) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_NAME)/$(PRG_SRC)

debug_rdmd_gdc: $(PRG_SRCDIR)/$(PRG_SRC)
	$(RDMD) $(RDMD_FLAGS)$(GDC) $(DC_FLAGS) $(GDC_FLAGS_DEBUG) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_NAME)/$(PRG_SRC)
#+END_SRC

**** release                                                        :release:

***** release

#+BEGIN_SRC makefile :tangle makefile
release: distclean tangle $(PRG_SRCDIR)/$(PRG_SRC)
	$(DC) $(DC_FLAGS) $(DC_FLAGS_RELEASE) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_SRC)
#+END_SRC

***** release rdmd

#+BEGIN_SRC makefile :tangle makefile
release_rdmd: distclean tangle $(PRG_SRCDIR)/$(PRG_SRC)
	$(RDMD) $(RDMD_FLAGS)$(DC) $(DC_FLAGS) $(DC_FLAGS_RELEASE) \
	$(DC_FLAG_BINOF)$(PRG_BINDIR)/$(PRG_BIN) \
	$(PRG_SRCDIR)/$(PRG_SRC)
#+END_SRC

*** init clean distclean etc.                                         :clean:

#+BEGIN_SRC makefile :tangle makefile
skel:
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME); \
	mkdir -p $(PRG_BINDIR);

init: skel

clean:
	rm $(PRG_BINDIR)/*

expunge:
	rm -f $(PRG_SRCDIR)/*; \
	rm -rf $(PRG_SRCDIR)/$(PRG_NAME); \
	rm -rf $(PRG_BINDIR);

distclean: expunge

distclean_and_init: expunge
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME); \
	mkdir -p $(PRG_BINDIR);
#+END_SRC

*** Org Babel Tangle batch process command                           :tangle:
**** tangle: org babel tangle *.org
#+BEGIN_SRC makefile :tangle 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 maker.org, makefile new
#+BEGIN_SRC makefile :tangle makefile
tangle_maker:
	for f in $(ORGFILELIST); do \
		ORGFILES="\"maker.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

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

** phony                                                              :phony:

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

* conf misc
** dub                                                      :dub:description:
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]])

*** dub.sdl [#A]                                                        :sdl:

#+BEGIN_SRC sh  :tangle dub.sdl
name              "sdp"
description       "sisu document parser."
homepage          "http://sisudoc.org"
authors           "Ralph Amissah"
copyright         "©2016 Ralph Amissah"
license           "AGPL-3+"
targetPath        "./bin"
sourcePath        "./src"
stringImportPaths "./views"
buildRequirements "disallowDeprecations" "allowWarnings"
configuration     "sdp-release" {
  name            "release"
  targetType      "executable"
  platforms       "posix"
  targetName      "sdp"
  buildOptions    "releaseMode" "optimize" "inline"
  postGenerateCommands "/usr/bin/notify-send -t 0 'D release executable ready' 'sdp'"
}
configuration     "sdp-dmd" {
  name            "dmd"
  targetType      "executable"
  platforms       "posix"
  #compiler        "dmd"
  targetName      "sdp-dmd"
  buildOptions    "releaseMode" "optimize" "inline"
  postGenerateCommands "/usr/bin/notify-send -t 0 'D dmd compiled test release executable ready' 'sdp-dmd'"
}
configuration     "sdp-ldc" {
  name            "ldc"
  targetType      "executable"
  platforms       "posix"
  #compiler        "ldc2"
  targetName      "sdp-ldc"
  buildOptions    "releaseMode" "optimize" "inline"
  postGenerateCommands "/usr/bin/notify-send -t 0 'D ldc2 compiled test release executable ready' 'sdp-ldc'"
}
configuration     "sdp-debug" {
  name            "debuging"
  targetType      "executable"
  platforms       "posix"
  targetName      "sdp-debug"
  debugVersions   "checkdoc"
  debugVersions   "summary"
  debugVersions   "dumpdoc"
  buildOptions    "debugMode" "debugInfo" "optimize"
  postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-debug'"
}
configuration     "sdp-tmp" {
  name            "tmp"
  targetType      "executable"
  platforms       "posix"
  targetName      "sdp-tmp"
  debugVersions   "tmp"
  debugVersions   "crap"
  debugVersions   "header"
  debugVersions   "header1"
  buildOptions    "debugMode" "debugInfo" "optimize"
  postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-tmp'"
}
configuration     "sdp-debug-clean" {
  name            "debug-clean"
  targetType      "executable"
  platforms       "posix"
  targetName      "sdp-debug-clean"
  buildOptions    "debugMode" "debugInfo" "optimize"
  postGenerateCommands "/usr/bin/notify-send -t 0 'D (debug) executable ready' 'sdp-debug-clean'"
}
#+END_SRC

dflags        platform="dmd" "-v --force -de -w -J./views -I./src/sdp -of./bin/sdp"
dflags        platform="dmd" "-O -release"
#buildOptions      "-O -release"

*** +dub.json+                                                         :json:

**** +sdp+
#+BEGIN_SRC json  :tangle no
#+BEGIN_SRC json  :tangle dub.json
{
  "name"        : "sdp",
  "targetType"  : "executable",
  "targetName"  : "sdp",
  "targetPath"  : "bin",
  "description" : "sisu document parser.",
  "authors"     : ["Ralph Amissah"],
  "homepage"    : "http://sisudoc.org",
  "license"     : "AGPL-3+",
  "add-path"    : "./src/sdp",
  "dependencies": {
  }
}
#+END_SRC

**** +sdlang+                                                        :sdlang:
#+BEGIN_SRC json  :tangle ./src/sdlang/dub.json
{
	"name":        "sdlang-d",
	"description": "An SDL (Simple Declarative Language) library for D.",
	"homepage":    "http://github.com/Abscissa/SDLang-D",
	"authors":     ["Nick Sabalausky"],
	"license":     "zlib/libpng",
	"copyright":   "©2012-2015 Nick Sabalausky",
	"sourcePaths": ["."],
	"importPaths": ["."],
	"buildRequirements": ["allowWarnings"],
	"dependencies": {
		"libinputvisitor": "~>1.2.0"
	},
	"subPackages": [
		"./libinputvisitor"
	],
	"configurations": [
		{
			"name": "test",
			"targetType": "executable",
			"versions": ["SDLang_TestApp"],
			"targetPath": "../../bin/",
			"targetName": "sdlang"
		},
		{
			"name": "library",
			"targetType": "library"
		},
		{
			"name": "unittest",
			"targetType": "executable",
			"targetPath": "../../bin/",
			"targetName": "sdlang-unittest",

			"versions": ["sdlangUnittest", "sdlangTrace"]
		}
	]
}
#+END_SRC

**** +libinputvisitor+                                      :libinputvisitor:
#+BEGIN_SRC json  :tangle ./src/sdlang/libinputvisitor/dub.json
{
	"name": "libinputvisitor",
	"description": "Write D input range generators in a straightforward coroutine style",
	"authors": ["Nick Sabalausky"],
	"homepage": "https://github.com/abscissa/libInputVisitor",
	"license": "WTFPL",
	"sourcePaths": ["."],
	"importPaths": ["."],
	"excludedSourceFiles": ["libInputVisitorExample.d"]
}
#+END_SRC

** .gitignore                                                     :gitignore:

#+BEGIN_SRC sh :tangle .gitignore
# git ls-files --others --exclude-from=.git/info/exclude
#./.dub/**
*
!.gitignore
!makefile
!version.txt
!dub.json
!dub.sdl
.dub/**
!tangle
!*.org
!*.d
!*.txt
!org
!src
!views
!**/
**/.#*
#!*/
#*~
#\#*
#*.\#*
#+END_SRC

** 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/sdp/
(similar functionality is contained within the "makefile" created by this
"maker.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_VERSION=20160530
EMACSLISP_ORG=~/.emacs.d/elpa/org-$($(shell echo $(ORG_VERSION)))
EMACSLISP_ORG_CONTRIB=~/.emacs.d/elpa/org-plus-contrib-$($(shell echo $(ORG_VERSION)))
# 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

* dub zfunc                                                           :zfunc:
** ,dubdmd                                                              :dmd:
#+BEGIN_SRC sh  :tangle no
time dub --compiler=dmd -v --force
#+END_SRC

** ,dubldc                                                              :ldc:
#+BEGIN_SRC sh  :tangle no
time dub --compiler=ldc2 -v --force
#+END_SRC
* D build notes                                                       :notes:
** compilers                                                       :compiler:
*** dmd [#A]                                                            :dmd:

#+BEGIN_SRC sh
dmd -de -w -J./views -I./src/sdp -unittest -debug=checkdoc -debug=summary -debug=dumpdoc -of./bin/sdp ./src/sdp.d
dmd -de -w -J./views -I./src/sdp -of./bin/sdp ./src/sdp.d
dmd -de -w -J./views -I./src/sdp -O -release -of./bin/sdp ./src/sdp.d
#+END_SRC

*** ldc2 [#A]                                                          :ldc2:

#+BEGIN_SRC sh
ldc2 -de -w -J./views -I./src/sdp -unittest -d-debug=checkdoc -d-debug=summary -d-debug=dumpdoc -of=./bin/sdp ./src/sdp.d
ldc2 -de -w -J./views -I./src/sdp -of=./bin/sdp ./src/sdp.d
ldc2 -de -w -J./views -I./src/sdp -O4 -release -of=./bin/sdp ./src/sdp.d
#+END_SRC

*** TODO gdc                                                            :gdc:

not done

#+BEGIN_SRC sh
#+END_SRC

**** +note+

"nice how you can get 2x speedup without a single line of asm just by using ldc", p0nce
"gdc might be worth a shot if your code is compatible", profan
re: dmd "one can easily get 2x (and even more) speedup by simply switching to gdc -O2", ketmar

** build tools                                                   :build:tool:
*** rdmd [#B]                                                          :rdmd:

flags similar to dmd

#+BEGIN_SRC sh
rdmd -de -w -J./views -I./src/sdp -unittest -debug=checkdoc -debug=summary -debug=dumpdoc -of./bin/sdp ./src/sdp.d
rdmd -de -w -J./views -I./src/sdp -of./bin/sdp ./src/sdp.d
rdmd -de -w -J./views -I./src/sdp -O -release -of./bin/sdp ./src/sdp.d

#dmd
rdmd -de -w -J./views -I./src/sdp -unittest -debug=checkdoc -debug=summary -debug=dumpdoc --compiler=ldc2 -of./bin/sdp ./src/sdp.d

#ldc
rdmd -de -w -J./views -I./src/sdp -unittest -d-debug=checkdoc -d-debug=summary -d-debug=dumpdoc --compiler=ldc2 -of./bin/sdp ./src/sdp.d
#+END_SRC

*** dub [#A]                                                            :dub:
https://github.com/dlang/dub/
http://code.dlang.org/getting_started
http://code.dlang.org/docs/commandline
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]]

#+BEGIN_SRC sh
--compiler=dmd
--compiler=ldc2

--compiler=dmd -v --force
--compiler=ldc2 -v --force
#+END_SRC

#+BEGIN_SRC sh
dub -v --force --debug=checkdoc --debug=summary --debug=dumpdoc
dub -v --force --build=release

dub -v --combined --build-mode allAtOnce --build release # --annotate
dub build sdp -v --combined --build-mode allAtOnce
dub describe
dub build sdp -v --force --debug=checkdoc --debug=dumpdoc

dub -v --force --build=release

dub -v --force --config=sdp-debug
dub -v --force --config=sdp-release
dub -v --force --config=sdp-release --build=release

dub --compiler=dmd --force -v --config=sdp-debug
dub --compiler=dmd --force -v --config=sdp-release

# dmd
,dubdmd --config=sdp-debug-clean
# time ~sdp3/bin/sdp-debug-clean -v --html --no-assert en/autonomy_markup0.sst

# ldc
# flags
,dubldc --config=sdp-release      # sdp
# time ~sdp3/bin/sdp -v --html --no-assert en/autonomy_markup0.sst
,dubldc --config=sdp-debug        # sdp-debug
# time ~sdp3/bin/sdp-debug -v --html --no-assert en/autonomy_markup0.sst
,dubldc --config=sdp-tmp          # sdp-tmp
# time ~sdp3/bin/sdp-tmp -v --html --no-assert en/autonomy_markup0.sst
,dubldc --config=sdp-debug-clean  # sdp-debug-clean
# time ~sdp3/bin/sdp-debug-clean -v --html --no-assert en/autonomy_markup0.sst

#+END_SRC

** make (emacs)

#+BEGIN_SRC sh
make -k dub_dmd_release
make -k dub_dmd_debug
make -k dub_dmd_debug_clean
make -k dub_dmd_tmp

make -k dub_ldc_release
make -k dub_ldc_debug
make -k dub_ldc_debug_clean
make -k dub_ldc_tmp
#+END_SRC