#+TITLE: sdp (project) makefile
#+AUTHOR: Ralph Amissah
#+EMAIL: ralph.amissah@gmail.com
#+STARTUP: indent
#+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
#+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)

* sdp makefile
[[./org/sdp.org][sdp.org]]  [[./org/][org/]]
** settings [+2]                                                   :settings:
*** alternative D compilers [+1]                                   :compiler:
**** dmd                                                                 :dmd:

#+BEGIN_SRC makefile   :padline no                              :tangle makefile
DMD=dmd
DMD_FLAGS=-de -w
DMD_FLAGS_RELEASE=-release
DMD_FLAG_BINOF=-of
#+END_SRC

**** ldc2                                                                :ldc:

#+BEGIN_SRC makefile                                            :tangle makefile
LDC=ldc2
LDC_FLAGS=-w
LDC_FLAGS_RELEASE=-release
LDC_FLAG_BINOF=-of=
#+END_SRC

**** gdc                                                                 :gdc:

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

*** TODO 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=)

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

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

#+BEGIN_SRC makefile                                            :tangle makefile
SET_DC_FLAGS_DEBUG_EXTRA=-debug=headings -debug=footnotes -debug=endnotes
#+END_SRC

*** 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
#+END_SRC

*** Project Details                                             :project:sdp:

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

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

#+BEGIN_SRC makefile                                            :tangle makefile
# ORG
EMACSLISP=/usr/share/emacs/site-lisp
EMACSLISP_ORG=~/.emacs.d/elpa/org-20151005
EMACSLISP_ORG_CONTRIB=~/.emacs.d/elpa/org-plus-contrib-20151005
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

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

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

**** release

#+BEGIN_SRC makefile                                            :tangle makefile
release: distclean_and_init tangle $(PRG_SRCDIR)/$(PRG_SRC)
	$(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
init:
	mkdir -p $(PRG_SRCDIR); \
	mkdir -p $(PRG_BINDIR);

clean: $(PRG_BINDIR)/$(PRG_BIN).o
	rm $(PRG_BINDIR)/$(PRG_NAME).o

expunge: init $(PRG_BINDIR)
	rm -rf $(PRG_BINDIR); \
	rm -rf $(PRG_SRCDIR);

distclean: init $(PRG_BINDIR) expunge

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

*** Org Babel Tangle batch process command                           :tangle:

#+BEGIN_SRC makefile                                            :tangle makefile
tangle:
	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

*** Git snapshot

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

** phony

#+BEGIN_SRC makefile                                            :tangle makefile
.PHONY : all build rebuild debug release \
	clean distclean init \
	tangle
#+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 ./lib/sdp/
(similar functionality is contained within the "makefile" created by this
"maker.org" file make tangle)

#+BEGIN_SRC sh :tangle tangle :padline no :tangle-mode (identity #o755) :shebang #!/bin/sh
# -*- mode: shell-script -*-
# tangle files with org-mode
DIR=`pwd`
ORGFILES=""
EMACSLISP=/usr/share/emacs/site-lisp
EMACSLISP_ORG=~/.emacs.d/elpa/org-20151005
EMACSLISP_ORG_CONTRIB=~/.emacs.d/elpa/org-plus-contrib-20151005
# 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