PROJECT_VERSION :=$(shell echo `git describe --long --tags | sed -e "s/^[ a-z_-]\+\([0-9.]\+\)/\1/;s/\([^-]*-g\)/r\1/;s/-/./g"`)
DUB=dub
DUB_FLAGS=-v --force --compiler=
PRG_NAME=sdp
PRG_SRC=$(PRG_NAME).d
PRG_SRCDIR=./src
PRG_BIN=$(PRG_NAME)
PRG_BINDIR=./bin
PRG_DOCDIR=./docs
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)))
ORGFILELIST=$(shell echo `ls -1 maker.org org/*.org`)
ORGFILES=""
ORGDIR=$(shell echo `pwd`)
all: dmd ldc gdc
all_ver: dmd_ver ldc_ver gdc_ver
all_debug: dmd_debug gdc_debug ldc_debug
all_clean: clean tangle dmd ldc gdc
all_ver_clean: clean tangle dmd_ver ldc_ver gdc_ver
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
dmd:
	$(DUB) --compiler=dmd --config=sdp-dmd
dmd_ver:
	$(DUB) --compiler=dmd --config=sdp-dmd-version
	mv bin/sdp-dmd-ver bin/sdp-dmd-$(PROJECT_VERSION)
	notify-send -t 0 'D dmd compiled test release executable ready' 'sdp-dmd-$(PROJECT_VERSION)'
dmd_debug:
	$(DUB) --compiler=dmd --config=sdp-dmd-debug
dmd_rel: expunge skel tangle
	$(DUB) --compiler=dmd --config=sdp-release
dmd_rel_tangle: tangle
	$(DUB) --compiler=dmd --config=sdp-dmd
dmd_rel_expunge_tangle: expunge skel tangle dmd_rel_tangle
dmd_debug_tangle: tangle
	$(DUB) --compiler=dmd --config=sdp-dmd-debug
dmd_debug_docs: clean_docs tangle
	$(DUB) --compiler=dmd --config=sdp-dmd-debug-docs
dmd_debug_unittest: tangle
	$(DUB) --compiler=dmd --config=sdp-dmd-debug-unittest
dmd_debug_clean: tangle
	$(DUB) --compiler=dmd --config=sdp-debug-clean
dmd_debug_ver:
	$(DUB) --compiler=dmd --config=sdp-dmd-debug-version
	mv bin/sdp-dmd-debug-ver bin/sdp-dmd-debug-$(PROJECT_VERSION)
	notify-send -t 0 'D dmd compiled test release executable ready' 'sdp-dmd-debug-$(PROJECT_VERSION)'
dmd_debug_clean_ver: clean tangle dmd_debug_clean_ver
gdc:
	$(DUB) --compiler=gdc --config=sdp-gdc
gdc_ver:
	$(DUB) --compiler=gdc --config=sdp-gdc-version
	mv bin/sdp-gdc-ver bin/sdp-gdc-$(PROJECT_VERSION)
	notify-send -t 0 'D gdc compiled test release executable ready' 'sdp-gdc-$(PROJECT_VERSION)'
gdc_debug:
	$(DUB) --compiler=gdc --config=sdp-gdc-debug
gdc_rel: expunge skel tangle
	$(DUB) --compiler=gdc --config=sdp-release
gdc_rel_tangle: tangle
	$(DUB) --compiler=gdc --config=sdp-gdc
gdc_rel_expunge_tangle: expunge skel tangle gdc_rel_tangle
gdc_debug_tangle: tangle
	$(DUB) --compiler=gdc --config=sdp-gdc-debug
gdc_debug_docs: clean_docs tangle
	$(DUB) --compiler=gdc --config=sdp-gdc-debug-docs
gdc_debug_unittest: tangle
	$(DUB) --compiler=gdc --config=sdp-gdc-debug-unittest
gdc_debug_clean: tangle
	$(DUB) --compiler=gdc --config=sdp-debug-clean
gdc_debug_ver:
	$(DUB) --compiler=gdc --config=sdp-dmd-debug-version
	mv bin/sdp-gdc-debug-ver bin/sdp-gdc-debug-$(PROJECT_VERSION)
	notify-send -t 0 'D gdc compiled test release executable ready' 'sdp-gdc-debug-$(PROJECT_VERSION)'
gdc_debug_clean_ver: clean tangle gdc_debug_ver
ldc:
	$(DUB) --compiler=ldc2 --config=sdp-ldc
ldc_ver:
	$(DUB) --compiler=ldc2 --config=sdp-ldc-version
	mv bin/sdp-ldc-ver bin/sdp-ldc-$(PROJECT_VERSION)
	notify-send -t 0 'D ldc2 compiled test release executable ready' 'sdp-ldc-$(PROJECT_VERSION)'
ldc_debug:
	$(DUB) --compiler=ldc2 --config=sdp-ldc-debug
ldc_rel: expunge skel tangle
	$(DUB) --compiler=ldc2 --config=sdp-release
ldc_rel_tangle: tangle
	$(DUB) --compiler=ldc2 --config=sdp-ldc
ldc_rel_expunge_tangle: expunge skel tangle ldc_rel_tangle
ldc_debug_tangle: tangle
	$(DUB) --compiler=ldc2 --config=sdp-ldc-debug
ldc_debug_docs: clean_docs tangle
	$(DUB) --compiler=ldc2 --config=sdp-ldc-debug-docs
ldc_debug_unittest: tangle
	$(DUB) --compiler=ldc2 --config=sdp-ldc-debug-unittest
ldc_debug_clean: tangle
	$(DUB) --compiler=ldc2 --config=sdp-debug-clean
ldc_debug_ver:
	$(DUB) --compiler=ldc2 --config=sdp-ldc-debug-version
	mv bin/sdp-ldc-debug-ver bin/sdp-ldc-debug-$(PROJECT_VERSION)
	notify-send -t 0 'D ldc2 compiled test release executable ready' 'sdp-ldc-debug-$(PROJECT_VERSION)'
ldc_debug_clean_ver: clean tangle ldc_debug_ver
skel:
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/meta; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/conf; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME)/output; \
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME); \
	mkdir -p $(PRG_BINDIR);
init: skel
clean:
	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 $(PRG_SRCDIR); \
	rm -rf $(PRG_BINDIR); \
	rm -rf $(PRG_DOCDIR);
distclean: expunge
distclean_and_init: expunge
	mkdir -p $(PRG_SRCDIR)/$(PRG_NAME); \
	mkdir -p $(PRG_BINDIR);
ver:
	echo sdp-$(PROJECT_VERSION)
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
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
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
gitsnapshot: distclean tangle
	git commit -a
.PHONY : all build rebuild debug release \
	distclean init \
	tangle gitsnapshot