From 4453a5cd535636a440e2cf1085db27f22e4a3d46 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 11 May 2015 08:17:44 +0200
Subject: [PATCH] +feature compile by llvm

---
 .gitignore             |  30 +++-
 acompaction2/makefile  |  98 ++++++++---
 acompare2/makefile     |  98 ++++++++---
 aconversions2/makefile |  98 ++++++++---
 aconvert2/makefile     |  98 ++++++++---
 aderivation2/makefile  | 102 ++++++++---
 adeterminize2/makefile |  98 ++++++++---
 aecho2/makefile        |  98 ++++++++---
 aepsilon2/makefile     |  98 ++++++++---
 agenerate2/makefile    |  98 ++++++++---
 aintegral2/makefile    |  98 ++++++++---
 alangop2/makefile      |  98 ++++++++---
 alib2algo/makefile     | 186 ++++++++++++++------
 alib2data/makefile     | 182 +++++++++++++++-----
 alib2elgo/makefile     | 187 +++++++++++++++------
 alib2std/makefile      | 183 +++++++++++++++-----
 aminimize2/makefile    |  98 ++++++++---
 anormalize2/makefile   |  98 ++++++++---
 arand2/makefile        |  98 ++++++++---
 arename2/makefile      |  98 ++++++++---
 areverse2/makefile     |  98 ++++++++---
 arun2/makefile         |  98 ++++++++---
 astat2/makefile        |  98 ++++++++---
 astringology2/makefile |  98 ++++++++---
 atrim2/makefile        |  98 ++++++++---
 makefile               | 373 +++++++++++++++++++++++++++++------------
 tniceprint/makefile    |  98 ++++++++---
 27 files changed, 2405 insertions(+), 798 deletions(-)

diff --git a/.gitignore b/.gitignore
index 4e1c2ee140..dc20a3b598 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,25 +33,53 @@
 bin/*
 bin-release/*
 bin-debug/*
+bin-gcc-release/*
+bin-gcc-debug/*
+bin-llvm-release/*
+bin-llvm-debug/*
 lib/*
 lib-release/*
 lib-debug/*
+lib-gcc-release/*
+lib-gcc-debug/*
+lib-llvm-release/*
+lib-llvm-debug/*
 doc/*
 **/bin
 **/bin-release
 **/bin-debug
+**/bin-gcc-release
+**/bin-gcc-debug
+**/bin-llvm-release
+**/bin-llvm-debug
 **/doc
 **/obj
 **/obj-release
 **/obj-debug
+**/obj-gcc-release
+**/obj-gcc-debug
+**/obj-llvm-release
+**/obj-llvm-debug
 **/lib
 **/lib-release
 **/lib-debug
+**/lib-gcc-release
+**/lib-gcc-debug
+**/lib-llvm-release
+**/lib-llvm-debug
 **/test-bin
 **/test-bin-release
 **/test-bin-debug
+**/test-bin-gcc-release
+**/test-bin-gcc-debug
+**/test-bin-llvm-release
+**/test-bin-llvm-debug
 **/test-obj
-**/test-obj-release
+**/test-obV-release
 **/test-obj-debug
+**/test-obj-gcc-release
+**/test-obj-gcc-debug
+**/test-obj-llvm-release
+**/test-obj-llvm-debug
 
 **/CppUnitTestResults.xml
diff --git a/acompaction2/makefile b/acompaction2/makefile
index 315605dc16..df7b77b30b 100644
--- a/acompaction2/makefile
+++ b/acompaction2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/acompare2/makefile b/acompare2/makefile
index 8fc31a2adc..c38fa2975e 100644
--- a/acompare2/makefile
+++ b/acompare2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/aconversions2/makefile b/aconversions2/makefile
index 2ce98f605a..aa216567de 100644
--- a/aconversions2/makefile
+++ b/aconversions2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/aconvert2/makefile b/aconvert2/makefile
index ed1f3be065..6fd37b70af 100644
--- a/aconvert2/makefile
+++ b/aconvert2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/aderivation2/makefile b/aderivation2/makefile
index 5c81cf99d6..bb51940d14 100644
--- a/aderivation2/makefile
+++ b/aderivation2/makefile
@@ -1,5 +1,5 @@
 SHELL:=/bin/bash
-EXECUTABLE:=aderivations2
+EXECUTABLE:=aderivation2
 
 define NEW_LINE
 
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -52,7 +66,7 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	%.d: makefile$${NEW_LINE}\
 		@echo \"\\$${NEW_LINE}\
-		\$$(shell sha1sum <<< \"\$$@\" | sed \"s/  -//g\") = \\$$\$$(shell (\\$$\$$(CXX) - \\$$\$$(CXXFLAGS) \$$(patsubst ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) 2>/dev/null || echo \\\"\$$(patsubst ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) FORCE\\\") | sed \\\"s/.*://g;s/\\\\\\\\\\\\\\\\//g\\\")\$$\$${NEW_LINE}\\$${NEW_LINE}\
+		\$$(shell sha1sum <<< \"\$$@\" | sed \"s/  -//g\") = \\$$\$$(shell (\\$$\$$(CXX) -M \\$$\$$(CXXFLAGS) \$$(patsubst ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) 2>/dev/null || echo \\\"\$$(patsubst ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) FORCE\\\") | sed \\\"s/.*://g;s/\\\\\\\\\\\\\\\\//g\\\")\$$\$${NEW_LINE}\\$${NEW_LINE}\
 		\$$(patsubst %.d,%.o, \$$@): \\$$\$$(\$$(shell sha1sum <<< \"\$$@\" | sed \"s/  -//g\")) makefile\$$\$${NEW_LINE}\\$${NEW_LINE}\
 			\\$$\$$(CXX) \\$$\$$(CXXFLAGS) \\$$\$$< -o \$$(patsubst %.d,%.o, \$$@)\$$\$${NEW_LINE}\\$${NEW_LINE}\
 		\" > \$$@$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/adeterminize2/makefile b/adeterminize2/makefile
index f149733ccb..0e7938c28e 100644
--- a/adeterminize2/makefile
+++ b/adeterminize2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/aecho2/makefile b/aecho2/makefile
index 3276d52e88..24f166d2bd 100644
--- a/aecho2/makefile
+++ b/aecho2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/aepsilon2/makefile b/aepsilon2/makefile
index 7e0647cb06..972737fed5 100644
--- a/aepsilon2/makefile
+++ b/aepsilon2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/agenerate2/makefile b/agenerate2/makefile
index 22d8da9402..93c161f1f9 100644
--- a/agenerate2/makefile
+++ b/agenerate2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/aintegral2/makefile b/aintegral2/makefile
index 6a47f8921e..c10f5bdf45 100644
--- a/aintegral2/makefile
+++ b/aintegral2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/alangop2/makefile b/alangop2/makefile
index 81e29f0025..56e8d06dcb 100644
--- a/alangop2/makefile
+++ b/alangop2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/alib2algo/makefile b/alib2algo/makefile
index 4022bc7002..844c8863c0 100644
--- a/alib2algo/makefile
+++ b/alib2algo/makefile
@@ -9,21 +9,27 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -rdynamic -shared -lxml2
-TEST_LDFLAGS_DEBUG:= -Llib-debug -L../alib2std/lib-debug -L../alib2data/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -rdynamic -shared -lxml2
+LLVM_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_DEBUG:= -Llib-gcc-debug -L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_DEBUG:= -Llib-llvm-debug -L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lcppunit -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -rdynamic -shared -lxml2
-TEST_LDFLAGS_RELEASE:= -Llib-release -L../alib2std/lib-release -L../alib2data/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -rdynamic -shared -lxml2
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_RELEASE:= -Llib-gcc-release -L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_RELEASE:= -Llib-llvm-release -L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lcppunit -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
-TEST_OBJECTS_DEBUG:=$(patsubst test-src/%.cpp, test-obj-debug/%.o, $(shell find test-src/ -name *cpp))
-
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
-TEST_OBJECTS_RELEASE:=$(patsubst test-src/%.cpp, test-obj-release/%.o, $(shell find test-src/ -name *cpp))
-
-.PHONY: all build-debug build-tests-debug clean-debug doc
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
+TEST_OBJECTS_GCC_DEBUG:=$(patsubst test-src/%.cpp, test-obj-gcc-debug/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_DEBUG:=$(patsubst test-src/%.cpp, test-obj-llvm-debug/%.o, $(shell find test-src/ -name *cpp))
 
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+TEST_OBJECTS_GCC_RELEASE:=$(patsubst test-src/%.cpp, test-obj-gcc-release/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_RELEASE:=$(patsubst test-src/%.cpp, test-obj-llvm-release/%.o, $(shell find test-src/ -name *cpp))
 
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release build-tests-gcc-debug build-tests-llvm-debug build-tests-gcc-release build-tests-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -32,6 +38,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -84,6 +100,16 @@ test-obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst test-obj-%-release/,%,$(patsubst test-obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -95,7 +121,7 @@ test-obj%/makefile: makefile
 	$${NEW_LINE}\
 	export NEW_LINE$${NEW_LINE}\
 	$${NEW_LINE}\
-	CXXFLAGS:= -std=c++11 \$$(CXX_OTHER_FLAGS) -c -Wall -pedantic -Wextra -Werror -fPIC -I/usr/include/libxml2/ -I../\$$(DEPTH)src/ -I../../\$$(DEPTH)alib2std/src/ -I../../\$$(DEPTH)alib2data/src/$${NEW_LINE}\
+	CXXFLAGS:= -std=c++11 \$$(CXX_OTHER_FLAGS) -c -Wall -pedantic -Wextra -Werror -fPIC -I/usr/include/libxml2/ -I../../\$$(DEPTH)alib2std/src/ -I../../\$$(DEPTH)alib2data/src/ -I../../\$$(DEPTH)alib2algo/src/$${NEW_LINE}\
 	$${NEW_LINE}\
 	SOURCES:= \$$(shell find ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR) -maxdepth 1 -type f -name \"*.cpp\")$${NEW_LINE}\
 	DEPENDENCIES:= \$$(patsubst ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d, \$$(SOURCES))$${NEW_LINE}\
@@ -132,89 +158,153 @@ test-obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: unit-test-debug
+gcc-debug: unit-test-gcc-debug
+
+llvm-debug: unit-test-llvm-debug
+
+gcc-release: unit-test-gcc-release
 
-release: unit-test-release
+llvm-release: unit-test-llvm-release
 
-clean: clean-debug clean-release
+gcc-clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
-test: unit-test-debug unit-test-release
+llvm-clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
+
+gcc-test: unit-test-gcc-debug unit-test-gcc-release
 
+llvm-test: unit-test-llvm-debug unit-test-llvm-release
 
 
-lib-debug/$(LIBRARY): $(OBJECTS_DEBUG) obj-debug/
+
+lib-gcc-debug/$(LIBRARY): $(OBJECTS_GCC_DEBUG) obj-gcc-debug/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-lib-release/$(LIBRARY): $(OBJECTS_RELEASE) obj-release/
+lib-llvm-debug/$(LIBRARY): $(OBJECTS_LLVM_DEBUG) obj-llvm-debug/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clang++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+lib-gcc-release/$(LIBRARY): $(OBJECTS_GCC_RELEASE) obj-gcc-release/
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+lib-llvm-release/$(LIBRARY): $(OBJECTS_LLVM_RELEASE) obj-llvm-release/
+	mkdir -p $(dir $@)
+	clang++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+obj-llvm-debug/: FORCE obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
 
+obj-gcc-release/: FORCE obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
+obj-llvm-release/: FORCE obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
-$(OBJECTS_DEBUG): obj-debug/
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-$(OBJECTS_RELEASE): obj-release/
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
 
-build-debug: lib-debug/$(LIBRARY)
+build-gcc-debug: lib-gcc-debug/$(LIBRARY)
 
-build-release: lib-release/$(LIBRARY)
+build-llvm-debug: lib-llvm-debug/$(LIBRARY)
 
+build-gcc-release: lib-gcc-release/$(LIBRARY)
 
+build-llvm-release: lib-llvm-release/$(LIBRARY)
 
-test-bin-debug/$(TESTBIN): lib-debug/$(LIBRARY) $(TEST_OBJECTS_DEBUG) test-obj-debug/
+
+
+test-bin-gcc-debug/$(TESTBIN): lib-gcc-debug/$(LIBRARY) $(TEST_OBJECTS_GCC_DEBUG) test-obj-gcc-debug/
+	mkdir -p $(dir $@)
+	g++ $(TEST_OBJECTS_GCC_DEBUG) -o $@ $(TEST_GCC_LDFLAGS_DEBUG)
+
+test-bin-llvm-debug/$(TESTBIN): lib-llvm-debug/$(LIBRARY) $(TEST_OBJECTS_LLVM_DEBUG) test-obj-llvm-debug/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_DEBUG) -o $@ $(TEST_LDFLAGS_DEBUG)
+	g++ $(TEST_OBJECTS_LLVM_DEBUG) -o $@ $(TEST_LLVM_LDFLAGS_DEBUG)
 
-test-bin-release/$(TESTBIN): lib-release/$(LIBRARY) $(TEST_OBJECTS_RELEASE) test-obj-release/
+test-bin-gcc-release/$(TESTBIN): lib-gcc-release/$(LIBRARY) $(TEST_OBJECTS_GCC_RELEASE) test-obj-gcc-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_RELEASE) -o $@ $(TEST_LDFLAGS_RELEASE)
+	g++ $(TEST_OBJECTS_GCC_RELEASE) -o $@ $(TEST_GCC_LDFLAGS_RELEASE)
+
+test-bin-llvm-release/$(TESTBIN): lib-llvm-release/$(LIBRARY) $(TEST_OBJECTS_LLVM_RELEASE) test-obj-llvm-release/
+	mkdir -p $(dir $@)
+	g++ $(TEST_OBJECTS_LLVM_RELEASE) -o $@ $(TEST_LLVM_LDFLAGS_RELEASE)
+
+
+
+test-obj-gcc-debug/: FORCE test-obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-llvm-debug/: FORCE test-obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-gcc-release/: FORCE test-obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+test-obj-llvm-release/: FORCE test-obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+
+$(TEST_OBJECTS_GCC_DEBUG): test-obj-gcc-debug/
+
+$(TEST_OBJECTS_LLVM_DEBUG): test-obj-llvm-debug/
 
+$(TEST_OBJECTS_GCC_RELEASE): test-obj-gcc-release/
 
+$(TEST_OBJECTS_LLVM_RELEASE): test-obj-llvm-release/
 
-test-obj-debug/: FORCE | test-obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
 
-test-obj-release/: FORCE | test-obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
+build-tests-gcc-debug: test-bin-gcc-debug/$(TESTBIN)
 
+build-tests-llvm-debug: test-bin-llvm-debug/$(TESTBIN)
 
-$(TEST_OBJECTS_DEBUG): test-obj-debug/
+build-tests-gcc-release: test-bin-gcc-release/$(TESTBIN)
 
-$(TEST_OBJECTS_RELEASE): test-obj-release/
+build-tests-llvm-release: test-bin-llvm-release/$(TESTBIN)
 
 
 
-build-tests-debug: test-bin-debug/$(TESTBIN)
+unit-test-gcc-debug: build-tests-gcc-debug
+	LD_LIBRARY_PATH="../alib2std/lib-gcc-debug;../alib2data/lib-gcc-debug;lib-gcc-debug" test-bin-gcc-debug/$(TESTBIN)
 
-build-tests-release: test-bin-release/$(TESTBIN)
+unit-test-llvm-debug: build-tests-llvm-debug
+	LD_LIBRARY_PATH="../alib2std/lib-llvm-debug;../alib2data/lib-llvm-debug;lib-llvm-debug" test-bin-llvm-debug/$(TESTBIN)
 
+unit-test-gcc-release: build-tests-gcc-release
+	LD_LIBRARY_PATH="../alib2std/lib-gcc-release;../alib2data/lib-gcc-release;lib-gcc-release" test-bin-gcc-release/$(TESTBIN)
 
+unit-test-llvm-release: build-tests-llvm-release
+	LD_LIBRARY_PATH="../alib2std/lib-llvm-release;../alib2data/lib-llvm-release;lib-llvm-release" test-bin-llvm-release/$(TESTBIN)
 
-unit-test-debug: build-tests-debug
-	LD_LIBRARY_PATH="../alib2std/lib-debug;../alib2data/lib-debug;lib-debug" test-bin-debug/$(TESTBIN)
 
-unit-test-release: build-tests-release
-	LD_LIBRARY_PATH="../alib2std/lib-release;../alib2data/lib-release;lib-release" test-bin-release/$(TESTBIN)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d lib-gcc-debug obj-gcc-debug test-bin-gcc-debug test-obj-gcc-debug CppUnitTestResults.xml
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d lib-llvm-debug obj-llvm-debug test-bin-llvm-debug test-obj-llvm-debug CppUnitTestResults.xml
 
-clean-debug:
-	$(RM) -r *.o *.d lib-debug obj-debug test-bin-debug test-obj-debug CppUnitTestResults.xml
+clean-gcc-release:
+	$(RM) -r *.o *.d lib-gcc-release obj-gcc-release test-bin-gcc-release test-obj-gcc-release CppUnitTestResults.xml
 
-clean-release:
-	$(RM) -r *.o *.d lib-release obj-release test-bin-release test-obj-release CppUnitTestResults.xml
+clean-llvm-release:
+	$(RM) -r *.o *.d lib-llvm-release obj-llvm-release test-bin-llvm-release test-obj-llvm-release CppUnitTestResults.xml
 
 
 
diff --git a/alib2data/makefile b/alib2data/makefile
index 840b6ee040..d2b0ee7fbd 100644
--- a/alib2data/makefile
+++ b/alib2data/makefile
@@ -9,19 +9,27 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -L../alib2std/lib-debug -rdynamic -shared -lxml2
-TEST_LDFLAGS_DEBUG:= -Llib-debug -L../alib2std/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -L../alib2std/lib-gcc-debug -rdynamic -shared -lxml2
+LLVM_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -L../alib2std/lib-llvm-debug -rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_DEBUG:= -Llib-gcc-debug -L../alib2std/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_DEBUG:= -Llib-llvm-debug -L../alib2std/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lcppunit -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -rdynamic -shared -lxml2
-TEST_LDFLAGS_RELEASE:= -Llib-release -L../alib2std/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -rdynamic -shared -lxml2
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_RELEASE:= -Llib-gcc-release -L../alib2std/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_RELEASE:= -Llib-llvm-release -L../alib2std/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lcppunit -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
-TEST_OBJECTS_DEBUG:=$(patsubst test-src/%.cpp, test-obj-debug/%.o, $(shell find test-src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
+TEST_OBJECTS_GCC_DEBUG:=$(patsubst test-src/%.cpp, test-obj-gcc-debug/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_DEBUG:=$(patsubst test-src/%.cpp, test-obj-llvm-debug/%.o, $(shell find test-src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
-TEST_OBJECTS_RELEASE:=$(patsubst test-src/%.cpp, test-obj-release/%.o, $(shell find test-src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+TEST_OBJECTS_GCC_RELEASE:=$(patsubst test-src/%.cpp, test-obj-gcc-release/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_RELEASE:=$(patsubst test-src/%.cpp, test-obj-llvm-release/%.o, $(shell find test-src/ -name *cpp))
 
-.PHONY: all build-debug build-tests-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release build-tests-gcc-debug build-tests-llvm-debug build-tests-gcc-release build-tests-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -30,6 +38,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -82,6 +100,16 @@ test-obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst test-obj-%-release/,%,$(patsubst test-obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -130,90 +158,154 @@ test-obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: unit-test-debug
+gcc-debug: unit-test-gcc-debug
 
-release: unit-test-release
+llvm-debug: unit-test-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: unit-test-gcc-release
+
+llvm-release: unit-test-llvm-release
+
+gcc-clean: clean-gcc-debug clean-gcc-release
+	$(RM) -r doc
+
+llvm-clean: clean-llvm-debug clean-llvm-release
 	$(RM) -r doc
 
-test: unit-test-debug unit-test-release
+gcc-test: unit-test-gcc-debug unit-test-gcc-release
+
+llvm-test: unit-test-llvm-debug unit-test-llvm-release
+
+
 
+lib-gcc-debug/$(LIBRARY): $(OBJECTS_GCC_DEBUG) obj-gcc-debug/
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
+lib-llvm-debug/$(LIBRARY): $(OBJECTS_LLVM_DEBUG) obj-llvm-debug/
+	mkdir -p $(dir $@)
+	clang++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
 
-lib-debug/$(LIBRARY): $(OBJECTS_DEBUG) obj-debug/
+lib-gcc-release/$(LIBRARY): $(OBJECTS_GCC_RELEASE) obj-gcc-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
 
-lib-release/$(LIBRARY): $(OBJECTS_RELEASE) obj-release/
+lib-llvm-release/$(LIBRARY): $(OBJECTS_LLVM_RELEASE) obj-llvm-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+obj-llvm-debug/: FORCE obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+obj-gcc-release/: FORCE obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
+obj-llvm-release/: FORCE obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
 
-obj-debug/: FORCE obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
 
-obj-release/: FORCE obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-$(OBJECTS_DEBUG): obj-debug/
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-$(OBJECTS_RELEASE): obj-release/
 
+build-gcc-debug: lib-gcc-debug/$(LIBRARY)
 
-build-debug: lib-debug/$(LIBRARY)
+build-llvm-debug: lib-llvm-debug/$(LIBRARY)
 
-build-release: lib-release/$(LIBRARY)
+build-gcc-release: lib-gcc-release/$(LIBRARY)
 
+build-llvm-release: lib-llvm-release/$(LIBRARY)
 
 
-test-bin-debug/$(TESTBIN): lib-debug/$(LIBRARY) $(TEST_OBJECTS_DEBUG) test-obj-debug/
+
+test-bin-gcc-debug/$(TESTBIN): lib-gcc-debug/$(LIBRARY) $(TEST_OBJECTS_GCC_DEBUG) test-obj-gcc-debug/
+	mkdir -p $(dir $@)
+	g++ $(TEST_OBJECTS_GCC_DEBUG) -o $@ $(TEST_GCC_LDFLAGS_DEBUG)
+
+test-bin-llvm-debug/$(TESTBIN): lib-llvm-debug/$(LIBRARY) $(TEST_OBJECTS_LLVM_DEBUG) test-obj-llvm-debug/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_DEBUG) -o $@ $(TEST_LDFLAGS_DEBUG)
+	clang++ $(TEST_OBJECTS_LLVM_DEBUG) -o $@ $(TEST_LLVM_LDFLAGS_DEBUG)
 
-test-bin-release/$(TESTBIN): lib-release/$(LIBRARY) $(TEST_OBJECTS_RELEASE) test-obj-release/
+test-bin-gcc-release/$(TESTBIN): lib-gcc-release/$(LIBRARY) $(TEST_OBJECTS_GCC_RELEASE) test-obj-gcc-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_RELEASE) -o $@ $(TEST_LDFLAGS_RELEASE)
+	g++ $(TEST_OBJECTS_GCC_RELEASE) -o $@ $(TEST_GCC_LDFLAGS_RELEASE)
+
+test-bin-llvm-release/$(TESTBIN): lib-llvm-release/$(LIBRARY) $(TEST_OBJECTS_LLVM_RELEASE) test-obj-llvm-release/
+	mkdir -p $(dir $@)
+	clang++ $(TEST_OBJECTS_LLVM_RELEASE) -o $@ $(TEST_LLVM_LDFLAGS_RELEASE)
+
+
+
+test-obj-gcc-debug/: FORCE test-obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-llvm-debug/: FORCE test-obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-gcc-release/: FORCE test-obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+test-obj-llvm-release/: FORCE test-obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+
+
+$(TEST_OBJECTS_GCC_DEBUG): test-obj-gcc-debug/
 
+$(TEST_OBJECTS_LLVM_DEBUG): test-obj-llvm-debug/
 
+$(TEST_OBJECTS_GCC_RELEASE): test-obj-gcc-release/
 
-test-obj-debug/: FORCE test-obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+$(TEST_OBJECTS_LLVM_RELEASE): test-obj-llvm-release/
 
-test-obj-release/: FORCE test-obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
 
+build-tests-gcc-debug: test-bin-gcc-debug/$(TESTBIN)
 
-$(TEST_OBJECTS_DEBUG): test-obj-debug/
+build-tests-llvm-debug: test-bin-llvm-debug/$(TESTBIN)
 
-$(TEST_OBJECTS_RELEASE): test-obj-release/
+build-tests-gcc-release: test-bin-gcc-release/$(TESTBIN)
 
+build-tests-llvm-release: test-bin-llvm-release/$(TESTBIN)
 
 
-build-tests-debug: test-bin-debug/$(TESTBIN)
 
-build-tests-release: test-bin-release/$(TESTBIN)
+unit-test-gcc-debug: build-tests-gcc-debug
+	LD_LIBRARY_PATH="../alib2std/lib-gcc-debug;lib-gcc-debug" test-bin-gcc-debug/$(TESTBIN)
 
+unit-test-llvm-debug: build-tests-llvm-debug
+	LD_LIBRARY_PATH="../alib2std/lib-llvm-debug;lib-llvm-debug" test-bin-llvm-debug/$(TESTBIN)
 
+unit-test-gcc-release: build-tests-gcc-release
+	LD_LIBRARY_PATH="../alib2std/lib-gcc-release;lib-gcc-release" test-bin-gcc-release/$(TESTBIN)
 
-unit-test-debug: build-tests-debug
-	LD_LIBRARY_PATH="../alib2std/lib-debug;lib-debug" test-bin-debug/$(TESTBIN)
+unit-test-llvm-release: build-tests-llvm-release
+	LD_LIBRARY_PATH="../alib2std/lib-llvm-release;lib-llvm-release" test-bin-llvm-release/$(TESTBIN)
 
-unit-test-release: build-tests-release
-	LD_LIBRARY_PATH="../alib2std/lib-release;lib-release" test-bin-release/$(TESTBIN)
 
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d lib-gcc-debug obj-gcc-debug test-bin-gcc-debug test-obj-gcc-debug CppUnitTestResults.xml
 
-clean-debug:
-	$(RM) -r *.o *.d lib-debug obj-debug test-bin-debug test-obj-debug CppUnitTestResults.xml
+clean-llvm-debug:
+	$(RM) -r *.o *.d lib-llvm-debug obj-llvm-debug test-bin-llvm-debug test-obj-llvm-debug CppUnitTestResults.xml
 
-clean-release:
-	$(RM) -r *.o *.d lib-release obj-release test-bin-release test-obj-release CppUnitTestResults.xml
+clean-gcc-release:
+	$(RM) -r *.o *.d lib-gcc-release obj-gcc-release test-bin-gcc-release test-obj-gcc-release CppUnitTestResults.xml
 
+clean-llvm-release:
+	$(RM) -r *.o *.d lib-llvm-release obj-llvm-release test-bin-llvm-release test-obj-llvm-release CppUnitTestResults.xml
 
 
 FORCE:
diff --git a/alib2elgo/makefile b/alib2elgo/makefile
index ea4fe4686d..ab6087cd90 100644
--- a/alib2elgo/makefile
+++ b/alib2elgo/makefile
@@ -9,21 +9,27 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -rdynamic -shared -lxml2
-TEST_LDFLAGS_DEBUG:= -Llib-debug -L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -rdynamic -shared -lxml2
+LLVM_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_DEBUG:= -Llib-gcc-debug -L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_DEBUG:= -Llib-llvm-debug -L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -lcppunit -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-debug -rdynamic -shared -lxml2
-TEST_LDFLAGS_RELEASE:= -Llib-release -L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -rdynamic -shared -lxml2
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_RELEASE:= -Llib-gcc-release -L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_RELEASE:= -Llib-llvm-release -L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -lcppunit -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
-TEST_OBJECTS_DEBUG:=$(patsubst test-src/%.cpp, test-obj-debug/%.o, $(shell find test-src/ -name *cpp))
-
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
-TEST_OBJECTS_RELEASE:=$(patsubst test-src/%.cpp, test-obj-release/%.o, $(shell find test-src/ -name *cpp))
-
-.PHONY: all build-debug build-tests-debug clean-debug doc
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
+TEST_OBJECTS_GCC_DEBUG:=$(patsubst test-src/%.cpp, test-obj-gcc-debug/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_DEBUG:=$(patsubst test-src/%.cpp, test-obj-llvm-debug/%.o, $(shell find test-src/ -name *cpp))
 
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+TEST_OBJECTS_GCC_RELEASE:=$(patsubst test-src/%.cpp, test-obj-gcc-release/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_RELEASE:=$(patsubst test-src/%.cpp, test-obj-llvm-release/%.o, $(shell find test-src/ -name *cpp))
 
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release build-tests-gcc-debug build-tests-llvm-debug build-tests-gcc-release build-tests-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -32,6 +38,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -84,6 +100,16 @@ test-obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst test-obj-%-release/,%,$(patsubst test-obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -95,7 +121,7 @@ test-obj%/makefile: makefile
 	$${NEW_LINE}\
 	export NEW_LINE$${NEW_LINE}\
 	$${NEW_LINE}\
-	CXXFLAGS:= -std=c++11 \$$(CXX_OTHER_FLAGS) -c -Wall -pedantic -Wextra -Werror -fPIC -I/usr/include/libxml2/ -I../\$$(DEPTH)src/ -I../../\$$(DEPTH)alib2std/src/ -I../../\$$(DEPTH)alib2data/src/ -I../../\$$(DEPTH)alib2algo/src/$${NEW_LINE}\
+	CXXFLAGS:= -std=c++11 \$$(CXX_OTHER_FLAGS) -c -Wall -pedantic -Wextra -Werror -fPIC -I/usr/include/libxml2/ -I../../\$$(DEPTH)alib2std/src/ -I../../\$$(DEPTH)alib2data/src/ -I../../\$$(DEPTH)alib2algo/src/ -I../../\$$(DEPTH)alib2elgo/src/$${NEW_LINE}\
 	$${NEW_LINE}\
 	SOURCES:= \$$(shell find ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR) -maxdepth 1 -type f -name \"*.cpp\")$${NEW_LINE}\
 	DEPENDENCIES:= \$$(patsubst ../\$$(DEPTH)\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, ../\$$(DEPTH)\$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d, \$$(SOURCES))$${NEW_LINE}\
@@ -132,89 +158,154 @@ test-obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: unit-test-debug
+gcc-debug: unit-test-gcc-debug
+
+llvm-debug: unit-test-llvm-debug
+
+gcc-release: unit-test-gcc-release
 
-release: unit-test-release
+llvm-release: unit-test-llvm-release
 
-clean: clean-debug clean-release
+gcc-clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
-test: unit-test-debug unit-test-release
+llvm-clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
+
+gcc-test: unit-test-gcc-debug unit-test-gcc-release
+
+llvm-test: unit-test-llvm-debug unit-test-llvm-release
+
 
 
+lib-gcc-debug/$(LIBRARY): $(OBJECTS_GCC_DEBUG) obj-gcc-debug/
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
+
+lib-llvm-debug/$(LIBRARY): $(OBJECTS_LLVM_DEBUG) obj-llvm-debug/
+	mkdir -p $(dir $@)
+	clang++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
 
-lib-debug/$(LIBRARY): $(OBJECTS_DEBUG) obj-debug/
+lib-gcc-release/$(LIBRARY): $(OBJECTS_GCC_RELEASE) obj-gcc-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
 
-lib-release/$(LIBRARY): $(OBJECTS_RELEASE) obj-release/
+lib-llvm-release/$(LIBRARY): $(OBJECTS_LLVM_RELEASE) obj-llvm-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clang++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+obj-llvm-debug/: FORCE obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+obj-gcc-release/: FORCE obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
+obj-llvm-release/: FORCE obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-$(OBJECTS_DEBUG): obj-debug/
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-$(OBJECTS_RELEASE): obj-release/
 
+build-gcc-debug: lib-gcc-debug/$(LIBRARY)
 
-build-debug: lib-debug/$(LIBRARY)
+build-llvm-debug: lib-llvm-debug/$(LIBRARY)
 
-build-release: lib-release/$(LIBRARY)
+build-gcc-release: lib-gcc-release/$(LIBRARY)
 
+build-llvm-release: lib-llvm-release/$(LIBRARY)
 
 
-test-bin-debug/$(TESTBIN): lib-debug/$(LIBRARY) $(TEST_OBJECTS_DEBUG) test-obj-debug/
+
+test-bin-gcc-debug/$(TESTBIN): lib-gcc-debug/$(LIBRARY) $(TEST_OBJECTS_GCC_DEBUG) test-obj-gcc-debug/
+	mkdir -p $(dir $@)
+	g++ $(TEST_OBJECTS_GCC_DEBUG) -o $@ $(TEST_GCC_LDFLAGS_DEBUG)
+
+test-bin-llvm-debug/$(TESTBIN): lib-llvm-debug/$(LIBRARY) $(TEST_OBJECTS_LLVM_DEBUG) test-obj-llvm-debug/
+	mkdir -p $(dir $@)
+	clang++ $(TEST_OBJECTS_LLVM_DEBUG) -o $@ $(TEST_LLVM_LDFLAGS_DEBUG)
+
+test-bin-gcc-release/$(TESTBIN): lib-gcc-release/$(LIBRARY) $(TEST_OBJECTS_GCC_RELEASE) test-obj-gcc-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_DEBUG) -o $@ $(TEST_LDFLAGS_DEBUG)
+	g++ $(TEST_OBJECTS_GCC_RELEASE) -o $@ $(TEST_GCC_LDFLAGS_RELEASE)
 
-test-bin-release/$(TESTBIN): lib-release/$(LIBRARY) $(TEST_OBJECTS_RELEASE) test-obj-release/
+test-bin-llvm-release/$(TESTBIN): lib-llvm-release/$(LIBRARY) $(TEST_OBJECTS_LLVM_RELEASE) test-obj-llvm-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_RELEASE) -o $@ $(TEST_LDFLAGS_RELEASE)
+	clang++ $(TEST_OBJECTS_LLVM_RELEASE) -o $@ $(TEST_LLVM_LDFLAGS_RELEASE)
+
+
+
+test-obj-gcc-debug/: FORCE test-obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-llvm-debug/: FORCE test-obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-gcc-release/: FORCE test-obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+test-obj-llvm-release/: FORCE test-obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+
+
+$(TEST_OBJECTS_GCC_DEBUG): test-obj-gcc-debug/
+
+$(TEST_OBJECTS_LLVM_DEBUG): test-obj-llvm-debug/
 
+$(TEST_OBJECTS_GCC_RELEASE): test-obj-gcc-release/
 
+$(TEST_OBJECTS_LLVM_RELEASE): test-obj-llvm-release/
 
-test-obj-debug/: FORCE | test-obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
 
-test-obj-release/: FORCE | test-obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
+build-tests-gcc-debug: test-bin-gcc-debug/$(TESTBIN)
 
+build-tests-llvm-debug: test-bin-llvm-debug/$(TESTBIN)
 
-$(TEST_OBJECTS_DEBUG): test-obj-debug/
+build-tests-gcc-release: test-bin-gcc-release/$(TESTBIN)
 
-$(TEST_OBJECTS_RELEASE): test-obj-release/
+build-tests-llvm-release: test-bin-llvm-release/$(TESTBIN)
 
 
 
-build-tests-debug: test-bin-debug/$(TESTBIN)
+unit-test-gcc-debug: build-tests-gcc-debug
+	LD_LIBRARY_PATH="../alib2std/lib-gcc-debug;../alib2data/lib-gcc-debug;../alib2algo/lib-gcc-debug;lib-gcc-debug" test-bin-gcc-debug/$(TESTBIN)
 
-build-tests-release: test-bin-release/$(TESTBIN)
+unit-test-llvm-debug: build-tests-llvm-debug
+	LD_LIBRARY_PATH="../alib2std/lib-llvm-debug;../alib2data/lib-llvm-debug;../alib2algo/lib-llvm-debug;lib-llvm-debug" test-bin-llvm-debug/$(TESTBIN)
 
+unit-test-gcc-release: build-tests-gcc-release
+	LD_LIBRARY_PATH="../alib2std/lib-gcc-release;../alib2data/lib-gcc-release;../alib2algo/lib-gcc-release;lib-gcc-release" test-bin-gcc-release/$(TESTBIN)
 
+unit-test-llvm-release: build-tests-llvm-release
+	LD_LIBRARY_PATH="../alib2std/lib-llvm-release;../alib2data/lib-llvm-release;../alib2algo/lib-llvm-release;lib-llvm-release" test-bin-llvm-release/$(TESTBIN)
 
-unit-test-debug: build-tests-debug
-	LD_LIBRARY_PATH="../alib2std/lib-debug;../alib2data/lib-debug;../alib2algo/lib-debug;lib-debug" test-bin-debug/$(TESTBIN)
 
-unit-test-release: build-tests-release
-	LD_LIBRARY_PATH="../alib2std/lib-release;../alib2data/lib-release;../alib2algo/lib-release;lib-release" test-bin-release/$(TESTBIN)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d lib-gcc-debug obj-gcc-debug test-bin-gcc-debug test-obj-gcc-debug CppUnitTestResults.xml
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d lib-llvm-debug obj-llvm-debug test-bin-llvm-debug test-obj-llvm-debug CppUnitTestResults.xml
 
-clean-debug:
-	$(RM) -r *.o *.d lib-debug obj-debug test-bin-debug test-obj-debug CppUnitTestResults.xml
+clean-gcc-release:
+	$(RM) -r *.o *.d lib-gcc-release obj-gcc-release test-bin-gcc-release test-obj-gcc-release CppUnitTestResults.xml
 
-clean-release:
-	$(RM) -r *.o *.d lib-release obj-release test-bin-release test-obj-release CppUnitTestResults.xml
+clean-llvm-release:
+	$(RM) -r *.o *.d lib-llvm-release obj-llvm-release test-bin-llvm-release test-obj-llvm-release CppUnitTestResults.xml
 
 
 
diff --git a/alib2std/makefile b/alib2std/makefile
index 7e3d50ef41..f8dce3f3c6 100644
--- a/alib2std/makefile
+++ b/alib2std/makefile
@@ -9,19 +9,27 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -rdynamic -shared -lxml2
-TEST_LDFLAGS_DEBUG:= -Llib-debug -rdynamic -lxml2 -lalib2std -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -rdynamic -shared -lxml2
+LLVM_LDFLAGS_DEBUG:=-lbfd -liberty -lz -ldl -rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_DEBUG:= -Llib-gcc-debug -rdynamic -lxml2 -lalib2std -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_DEBUG:= -Llib-gcc-debug -rdynamic -lxml2 -lalib2std -lcppunit -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-rdynamic -shared -lxml2
-TEST_LDFLAGS_RELEASE:= -Llib-release -rdynamic -lxml2 -lalib2std -lcppunit -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-rdynamic -shared -lxml2
+LLVM_LDFLAGS_RELEASE:=-rdynamic -shared -lxml2
+TEST_GCC_LDFLAGS_RELEASE:= -Llib-gcc-release -rdynamic -lxml2 -lalib2std -lcppunit -Wl,-rpath,.
+TEST_LLVM_LDFLAGS_RELEASE:= -Llib-gcc-release -rdynamic -lxml2 -lalib2std -lcppunit -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
-TEST_OBJECTS_DEBUG:=$(patsubst test-src/%.cpp, test-obj-debug/%.o, $(shell find test-src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
+TEST_OBJECTS_GCC_DEBUG:=$(patsubst test-src/%.cpp, test-obj-gcc-debug/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_DEBUG:=$(patsubst test-src/%.cpp, test-obj-llvm-debug/%.o, $(shell find test-src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
-TEST_OBJECTS_RELEASE:=$(patsubst test-src/%.cpp, test-obj-release/%.o, $(shell find test-src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(filter-out $(wildcard src/debug/*), $(shell find src/ -name *cpp)))
+TEST_OBJECTS_GCC_RELEASE:=$(patsubst test-src/%.cpp, test-obj-gcc-release/%.o, $(shell find test-src/ -name *cpp))
+TEST_OBJECTS_LLVM_RELEASE:=$(patsubst test-src/%.cpp, test-obj-llvm-release/%.o, $(shell find test-src/ -name *cpp))
 
-.PHONY: all build-debug build-tests-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release build-tests-gcc-debug build-tests-llvm-debug build-tests-gcc-release build-tests-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -30,6 +38,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -82,6 +100,16 @@ test-obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst test-obj-%-release/,%,$(patsubst test-obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -130,89 +158,154 @@ test-obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: unit-test-debug
+gcc-debug: unit-test-gcc-debug
 
-release: unit-test-release
+llvm-debug: unit-test-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: unit-test-gcc-release
+
+llvm-release: unit-test-llvm-release
+
+gcc-clean: clean-gcc-debug clean-gcc-release
+	$(RM) -r doc
+
+llvm-clean: clean-llvm-debug clean-llvm-release
 	$(RM) -r doc
 
-test: unit-test-debug unit-test-release
+gcc-test: unit-test-gcc-debug unit-test-gcc-release
 
+llvm-test: unit-test-llvm-debug unit-test-llvm-release
 
 
-lib-debug/$(LIBRARY): $(OBJECTS_DEBUG) obj-debug/
+
+lib-gcc-debug/$(LIBRARY): $(OBJECTS_GCC_DEBUG) obj-gcc-debug/
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
+
+lib-llvm-debug/$(LIBRARY): $(OBJECTS_LLVM_DEBUG) obj-llvm-debug/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	clang++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
 
-lib-release/$(LIBRARY): $(OBJECTS_RELEASE) obj-release/
+lib-gcc-release/$(LIBRARY): $(OBJECTS_GCC_RELEASE) obj-gcc-release/
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+lib-llvm-release/$(LIBRARY): $(OBJECTS_LLVM_RELEASE) obj-llvm-release/
+	mkdir -p $(dir $@)
+	clang++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+obj-llvm-debug/: FORCE obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+obj-gcc-release/: FORCE obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+obj-llvm-release/: FORCE obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
 
 
-obj-debug/: FORCE obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
-obj-release/: FORCE obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-$(OBJECTS_DEBUG): obj-debug/
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-debug: lib-gcc-debug/$(LIBRARY)
 
+build-llvm-debug: lib-llvm-debug/$(LIBRARY)
 
-build-debug: lib-debug/$(LIBRARY)
+build-gcc-release: lib-gcc-release/$(LIBRARY)
 
-build-release: lib-release/$(LIBRARY)
+build-llvm-release: lib-llvm-release/$(LIBRARY)
 
 
 
-test-bin-debug/$(TESTBIN): lib-debug/$(LIBRARY) $(TEST_OBJECTS_DEBUG) test-obj-debug/
+test-bin-gcc-debug/$(TESTBIN): lib-gcc-debug/$(LIBRARY) $(TEST_OBJECTS_GCC_DEBUG) test-obj-gcc-debug/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_DEBUG) -o $@ $(TEST_LDFLAGS_DEBUG)
+	g++ $(TEST_OBJECTS_GCC_DEBUG) -o $@ $(TEST_GCC_LDFLAGS_DEBUG)
 
-test-bin-release/$(TESTBIN): lib-release/$(LIBRARY) $(TEST_OBJECTS_RELEASE) test-obj-release/
+test-bin-llvm-debug/$(TESTBIN): lib-llvm-debug/$(LIBRARY) $(TEST_OBJECTS_LLVM_DEBUG) test-obj-llvm-debug/
 	mkdir -p $(dir $@)
-	$(CXX) $(TEST_OBJECTS_RELEASE) -o $@ $(TEST_LDFLAGS_RELEASE)
+	clang++ $(TEST_OBJECTS_LLVM_DEBUG) -o $@ $(TEST_LLVM_LDFLAGS_DEBUG)
+
+test-bin-gcc-release/$(TESTBIN): lib-gcc-release/$(LIBRARY) $(TEST_OBJECTS_GCC_RELEASE) test-obj-gcc-release/
+	mkdir -p $(dir $@)
+	g++ $(TEST_OBJECTS_GCC_RELEASE) -o $@ $(TEST_GCC_LDFLAGS_RELEASE)
+
+test-bin-llvm-release/$(TESTBIN): lib-llvm-release/$(LIBRARY) $(TEST_OBJECTS_LLVM_RELEASE) test-obj-llvm-release/
+	mkdir -p $(dir $@)
+	clang++ $(TEST_OBJECTS_LLVM_RELEASE) -o $@ $(TEST_LLVM_LDFLAGS_RELEASE)
+
+
+
+test-obj-gcc-debug/: FORCE test-obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-llvm-debug/: FORCE test-obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
+
+test-obj-gcc-release/: FORCE test-obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-gcc-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+test-obj-llvm-release/: FORCE test-obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-llvm-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
+
+
+
+$(TEST_OBJECTS_GCC_DEBUG): test-obj-gcc-debug/
+
+$(TEST_OBJECTS_LLVM_DEBUG): test-obj-llvm-debug/
 
+$(TEST_OBJECTS_GCC_RELEASE): test-obj-gcc-release/
 
+$(TEST_OBJECTS_LLVM_RELEASE): test-obj-llvm-release/
 
-test-obj-debug/: FORCE test-obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-debug SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-g -O0 -DDEBUG"
 
-test-obj-release/: FORCE test-obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=test-obj-release SOURCES_BASE_DIR=test-src CXX_OTHER_FLAGS="-O3 -DRELEASE"
 
+build-tests-gcc-debug: test-bin-gcc-debug/$(TESTBIN)
 
+build-tests-llvm-debug: test-bin-llvm-debug/$(TESTBIN)
 
-$(TEST_OBJECTS_DEBUG): test-obj-debug/
+build-tests-gcc-release: test-bin-gcc-release/$(TESTBIN)
 
-$(TEST_OBJECTS_RELEASE): test-obj-release/
+build-tests-llvm-release: test-bin-llvm-release/$(TESTBIN)
 
 
 
-build-tests-debug: test-bin-debug/$(TESTBIN)
+unit-test-gcc-debug: build-tests-gcc-debug
+	LD_LIBRARY_PATH="lib-gcc-debug" test-bin-gcc-debug/$(TESTBIN)
 
-build-tests-release: test-bin-release/$(TESTBIN)
+unit-test-llvm-debug: build-tests-llvm-debug
+	LD_LIBRARY_PATH="lib-llvm-debug" test-bin-llvm-debug/$(TESTBIN)
 
+unit-test-gcc-release: build-tests-gcc-release
+	LD_LIBRARY_PATH="lib-gcc-release" test-bin-gcc-release/$(TESTBIN)
 
+unit-test-llvm-release: build-tests-llvm-release
+	LD_LIBRARY_PATH="lib-llvm-release" test-bin-llvm-release/$(TESTBIN)
 
-unit-test-debug: build-tests-debug
-	LD_LIBRARY_PATH="lib-debug" test-bin-debug/$(TESTBIN)
 
-unit-test-release: build-tests-release
-	LD_LIBRARY_PATH="lib-release" test-bin-release/$(TESTBIN)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d lib-gcc-debug obj-gcc-debug test-bin-gcc-debug test-obj-gcc-debug CppUnitTestResults.xml
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d lib-llvm-debug obj-llvm-debug test-bin-llvm-debug test-obj-llvm-debug CppUnitTestResults.xml
 
-clean-debug:
-	$(RM) -r *.o *.d lib-debug obj-debug test-bin-debug test-obj-debug CppUnitTestResults.xml
+clean-gcc-release:
+	$(RM) -r *.o *.d lib-gcc-release obj-gcc-release test-bin-gcc-release test-obj-gcc-release CppUnitTestResults.xml
 
-clean-release:
-	$(RM) -r *.o *.d lib-release obj-release test-bin-release test-obj-release CppUnitTestResults.xml
+clean-llvm-release:
+	$(RM) -r *.o *.d lib-llvm-release obj-llvm-release test-bin-llvm-release test-obj-llvm-release CppUnitTestResults.xml
 
 
 
diff --git a/aminimize2/makefile b/aminimize2/makefile
index 4a183bfd5d..b3ae8123e9 100644
--- a/aminimize2/makefile
+++ b/aminimize2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/anormalize2/makefile b/anormalize2/makefile
index b556a14005..7a40886a1d 100644
--- a/anormalize2/makefile
+++ b/anormalize2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/arand2/makefile b/arand2/makefile
index 46bf63d29a..be09083037 100644
--- a/arand2/makefile
+++ b/arand2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/arename2/makefile b/arename2/makefile
index c4f7d254db..d919438feb 100644
--- a/arename2/makefile
+++ b/arename2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/areverse2/makefile b/areverse2/makefile
index d53a86671c..9a1fed50ba 100644
--- a/areverse2/makefile
+++ b/areverse2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/arun2/makefile b/arun2/makefile
index 2792bacaa8..5b6fad53a4 100644
--- a/arun2/makefile
+++ b/arun2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/astat2/makefile b/astat2/makefile
index 625440458a..ffb05e6845 100644
--- a/astat2/makefile
+++ b/astat2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/astringology2/makefile b/astringology2/makefile
index cebf60b4ec..fbfd38d0c3 100644
--- a/astringology2/makefile
+++ b/astringology2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/atrim2/makefile b/atrim2/makefile
index e3827ed2f4..ba1981de90 100644
--- a/atrim2/makefile
+++ b/atrim2/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
diff --git a/makefile b/makefile
index 43a811f4da..7423b9e15e 100644
--- a/makefile
+++ b/makefile
@@ -53,196 +53,359 @@ endif
 
 SUBDIRS_WITH_MAKE = $(dir $(wildcard */makefile))
 
-.PHONY: $(addsuffix .all-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
-	$(addsuffix .all-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
-	$(addsuffix .build-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
-	$(addsuffix .build-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
-	$(addsuffix .build-debug-tests  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
-	$(addsuffix .build-release-tests, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
-	all-debug   build-debug   build-test-debug   unit-test-debug   clean-debug   \
-	all-release build-release build-test-release unit-test-release clean-release \
-	debug release clean doc all
+.PHONY: $(addsuffix .all-gcc-debug , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
+	$(addsuffix .all-llvm-debug, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
+	$(addsuffix .all-gcc-release , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
+	$(addsuffix .all-llvm-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
+	$(addsuffix .build-gcc-debug , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
+	$(addsuffix .build-llvm-debug, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
+	$(addsuffix .build-gcc-release , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
+	$(addsuffix .build-llvm-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
+	$(addsuffix .build-gcc-debug-tests , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
+	$(addsuffix .build-llvm-debug-tests, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))  \
+	$(addsuffix .build-gcc-release-tests , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
+	$(addsuffix .build-llvm-release-tests, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))\
+	all-gcc-debug   build-gcc-debug   build-test-gcc-debug   unit-test-gcc-debug   clean-gcc-debug   \
+	all-llvm-debug   build-llvm-debug   build-test-llvm-debug   unit-test-llvm-debug   clean-llvm-debug   \
+	all-gcc-release build-gcc-release build-test-gcc-release unit-test-gcc-release clean-gcc-release \
+	all-llvm-release build-llvm-release build-test-llvm-release unit-test-llvm-release clean-llvm-release \
+	gcc-debug gcc-release llvm-debug llvm-release clean doc all
 
 all:
 	@echo "What to do master?"
 
 
+debug: gcc-debug FORCE
 
-debug: all-debug
-	mkdir -p $(addsuffix -debug, $(BINFOLDER))
-	rm -rf $(addsuffix -debug, $(BINFOLDER))/*
+gcc-debug: all-gcc-debug
+	mkdir -p $(addsuffix -gcc-debug, $(BINFOLDER))
+	rm -rf $(addsuffix -gcc-debug, $(BINFOLDER))/*
 	for dir in $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB); do \
-	    cp $$dir/lib-debug/* $(addsuffix -debug, $(BINFOLDER)); \
+	    cp $$dir/lib-gcc-debug/* $(addsuffix -gcc-debug, $(BINFOLDER)); \
 	done
 	for dir in $(SUBDIRS_BINS); do \
-	    cp $$dir/bin-debug/* $(addsuffix -debug, $(BINFOLDER)); \
-	done
-	./tests.examples.sh debug
-	./tests.adeterminize.sh debug
-	./tests.aconversion.sh debug
-	./tests.aderivation.aintegral.sh debug
-	./tests.astringology.sh debug
-	./tests.anormalize.sh debug
-
-release: all-release
-	mkdir -p $(addsuffix -release, $(BINFOLDER))
-	rm -rf $(addsuffix -release, $(BINFOLDER))/*
+	    cp $$dir/bin-gcc-debug/* $(addsuffix -gcc-debug, $(BINFOLDER)); \
+	done
+	./tests.examples.sh gcc-debug
+	./tests.adeterminize.sh gcc-debug
+	./tests.aconversion.sh gcc-debug
+	./tests.aderivation.aintegral.sh gcc-debug
+	./tests.astringology.sh gcc-debug
+	./tests.anormalize.sh gcc-debug
+
+llvm-debug: all-llvm-debug
+	mkdir -p $(addsuffix -llvm-debug, $(BINFOLDER))
+	rm -rf $(addsuffix -llvm-debug, $(BINFOLDER))/*
+	for dir in $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB); do \
+	    cp $$dir/lib-llvm-debug/* $(addsuffix -llvm-debug, $(BINFOLDER)); \
+	done
+	for dir in $(SUBDIRS_BINS); do \
+	    cp $$dir/bin-llvm-debug/* $(addsuffix -llvm-debug, $(BINFOLDER)); \
+	done
+	./tests.examples.sh llvm-debug
+	./tests.adeterminize.sh llvm-debug
+	./tests.aconversion.sh llvm-debug
+	./tests.aderivation.aintegral.sh llvm-debug
+	./tests.astringology.sh llvm-debug
+	./tests.anormalize.sh llvm-debug
+
+release: gcc-release FORCE
+
+gcc-release: all-gcc-release
+	mkdir -p $(addsuffix -gcc-release, $(BINFOLDER))
+	rm -rf $(addsuffix -gcc-release, $(BINFOLDER))/*
 	for dir in $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB); do \
-	    cp $$dir/lib-release/* $(addsuffix -release, $(BINFOLDER)); \
+	    cp $$dir/lib-gcc-release/* $(addsuffix -gcc-release, $(BINFOLDER)); \
 	done
 	for dir in $(SUBDIRS_BINS); do \
-	    cp $$dir/bin-release/* $(addsuffix -release, $(BINFOLDER)); \
+	    cp $$dir/bin-gcc-release/* $(addsuffix -gcc-release, $(BINFOLDER)); \
+	done
+	./tests.examples.sh gcc-release
+	./tests.adeterminize.sh gcc-release
+	./tests.aconversion.sh gcc-release
+	./tests.aderivation.aintegral.sh gcc-release
+	./tests.astringology.sh gcc-release
+	./tests.anormalize.sh gcc-release
+
+llvm-release: all-llvm-release
+	mkdir -p $(addsuffix -llvm-release, $(BINFOLDER))
+	rm -rf $(addsuffix -llvm-release, $(BINFOLDER))/*
+	for dir in $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB); do \
+	    cp $$dir/lib-llvm-release/* $(addsuffix -llvm-release, $(BINFOLDER)); \
 	done
-	./tests.examples.sh release
-	./tests.adeterminize.sh release
-	./tests.aconversion.sh release
-	./tests.aderivation.aintegral.sh release
-	./tests.astringology.sh release
-	./tests.anormalize.sh release
+	for dir in $(SUBDIRS_BINS); do \
+	    cp $$dir/bin-llvm-release/* $(addsuffix -llvm-release, $(BINFOLDER)); \
+	done
+	./tests.examples.sh llvm-release
+	./tests.adeterminize.sh llvm-release
+	./tests.aconversion.sh llvm-release
+	./tests.aderivation.aintegral.sh llvm-release
+	./tests.astringology.sh llvm-release
+	./tests.anormalize.sh llvm-release
+
+clean  : clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release
+	$(RM) -r bin-gcc-debug bin-llvm-debug bin-gcc-release bin-llvm-release
+
+
+
+all-gcc-debug   : $(addsuffix .all-gcc-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+all-llvm-debug   : $(addsuffix .all-llvm-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+all-gcc-release : $(addsuffix .all-gcc-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+all-llvm-release : $(addsuffix .all-llvm-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+
+
+build-gcc-debug  : $(addsuffix .build-gcc-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+build-llvm-debug  : $(addsuffix .build-llvm-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+build-gcc-release: $(addsuffix .build-gcc-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+build-llvm-release: $(addsuffix .build-llvm-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+
+
+
+build-tests-gcc-debug  : $(addsuffix .build-tests-gcc-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB))
+
+build-tests-llvm-debug  : $(addsuffix .build-tests-llvm-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB))
+
+build-tests-gcc-release: $(addsuffix .build-tests-gcc-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB))
+
+build-tests-llvm-release: $(addsuffix .build-tests-llvm-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB))
+
 
-clean  : clean-debug   clean-release
-	$(RM) -r bin-debug bin-release
 
+$(addsuffix .all-gcc-debug, $(STD_LIB)):
+	$(MAKE) gcc-debug -C $(basename $@)
 
+$(addsuffix .all-gcc-debug, $(CORE_LIB)): $(addsuffix .all-gcc-debug, $(STD_LIB))
+	$(MAKE) gcc-debug -C $(basename $@)
 
-all-debug   : $(addsuffix .all-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+$(addsuffix .all-gcc-debug, $(ALGO_LIB)): $(addsuffix .all-gcc-debug, $(CORE_LIB))
+	$(MAKE) gcc-debug -C $(basename $@)
 
-all-release : $(addsuffix .all-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+$(addsuffix .all-gcc-debug, $(ELGO_LIB)): $(addsuffix .all-gcc-debug, $(ALGO_LIB))
+	$(MAKE) gcc-debug -C $(basename $@)
 
+$(addsuffix .all-gcc-debug, $(SUBDIRS_BINS)): $(addsuffix .all-gcc-debug, $(ELGO_LIB))
+	$(MAKE) gcc-debug -C $(basename $@)
 
+$(addsuffix .all-llvm-debug, $(STD_LIB)):
+	$(MAKE) llvm-debug -C $(basename $@)
 
-build-debug  : $(addsuffix .build-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+$(addsuffix .all-llvm-debug, $(CORE_LIB)): $(addsuffix .all-llvm-debug, $(STD_LIB))
+	$(MAKE) llvm-debug -C $(basename $@)
 
-build-release: $(addsuffix .build-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB) $(SUBDIRS_BINS))
+$(addsuffix .all-llvm-debug, $(ALGO_LIB)): $(addsuffix .all-llvm-debug, $(CORE_LIB))
+	$(MAKE) llvm-debug -C $(basename $@)
 
+$(addsuffix .all-llvm-debug, $(ELGO_LIB)): $(addsuffix .all-llvm-debug, $(ALGO_LIB))
+	$(MAKE) llvm-debug -C $(basename $@)
 
+$(addsuffix .all-llvm-debug, $(SUBDIRS_BINS)): $(addsuffix .all-llvm-debug, $(ELGO_LIB))
+	$(MAKE) llvm-debug -C $(basename $@)
 
-build-tests-debug  : $(addsuffix .build-tests-debug  , $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB))
 
-build-tests-release: $(addsuffix .build-tests-release, $(STD_LIB) $(CORE_LIB) $(ALGO_LIB) $(ELGO_LIB))
 
+$(addsuffix .all-gcc-release, $(STD_LIB)):
+	$(MAKE) gcc-release -C $(basename $@)
 
+$(addsuffix .all-gcc-release, $(CORE_LIB)): $(addsuffix .all-gcc-release, $(STD_LIB))
+	$(MAKE) gcc-release -C $(basename $@)
 
-$(addsuffix .all-debug, $(STD_LIB)):
-	$(MAKE) debug -C $(basename $@)
+$(addsuffix .all-gcc-release, $(ALGO_LIB)): $(addsuffix .all-gcc-release, $(CORE_LIB))
+	$(MAKE) gcc-release -C $(basename $@)
 
-$(addsuffix .all-debug, $(CORE_LIB)): $(addsuffix .all-debug, $(STD_LIB))
-	$(MAKE) debug -C $(basename $@)
+$(addsuffix .all-gcc-release, $(ELGO_LIB)): $(addsuffix .all-gcc-release, $(ALGO_LIB))
+	$(MAKE) gcc-release -C $(basename $@)
 
-$(addsuffix .all-debug, $(ALGO_LIB)): $(addsuffix .all-debug, $(CORE_LIB))
-	$(MAKE) debug -C $(basename $@)
+$(addsuffix .all-gcc-release, $(SUBDIRS_BINS)): $(addsuffix .all-gcc-release, $(ELGO_LIB))
+	$(MAKE) gcc-release -C $(basename $@)
 
-$(addsuffix .all-debug, $(ELGO_LIB)): $(addsuffix .all-debug, $(ALGO_LIB))
-	$(MAKE) debug -C $(basename $@)
+$(addsuffix .all-llvm-release, $(STD_LIB)):
+	$(MAKE) llvm-release -C $(basename $@)
 
-$(addsuffix .all-debug, $(SUBDIRS_BINS)): $(addsuffix .all-debug, $(ELGO_LIB))
-	$(MAKE) debug -C $(basename $@)
+$(addsuffix .all-llvm-release, $(CORE_LIB)): $(addsuffix .all-llvm-release, $(STD_LIB))
+	$(MAKE) llvm-release -C $(basename $@)
 
+$(addsuffix .all-llvm-release, $(ALGO_LIB)): $(addsuffix .all-llvm-release, $(CORE_LIB))
+	$(MAKE) llvm-release -C $(basename $@)
 
+$(addsuffix .all-llvm-release, $(ELGO_LIB)): $(addsuffix .all-llvm-release, $(ALGO_LIB))
+	$(MAKE) llvm-release -C $(basename $@)
 
-$(addsuffix .all-release, $(STD_LIB)):
-	$(MAKE) release -C $(basename $@)
+$(addsuffix .all-llvm-release, $(SUBDIRS_BINS)): $(addsuffix .all-llvm-release, $(ELGO_LIB))
+	$(MAKE) llvm-release -C $(basename $@)
 
-$(addsuffix .all-release, $(CORE_LIB)): $(addsuffix .all-release, $(STD_LIB))
-	$(MAKE) release -C $(basename $@)
 
-$(addsuffix .all-release, $(ALGO_LIB)): $(addsuffix .all-release, $(CORE_LIB))
-	$(MAKE) release -C $(basename $@)
 
-$(addsuffix .all-release, $(ELGO_LIB)): $(addsuffix .all-release, $(ALGO_LIB))
-	$(MAKE) release -C $(basename $@)
+$(addsuffix .build-gcc-debug, $(STD_LIB)):
+	$(MAKE) build-gcc-debug -C $(basename $@)
 
-$(addsuffix .all-release, $(SUBDIRS_BINS)): $(addsuffix .all-release, $(ELGO_LIB))
-	$(MAKE) release -C $(basename $@)
+$(addsuffix .build-gcc-debug, $(CORE_LIB)): $(addsuffix .build-gcc-debug, $(STD_LIB))
+	$(MAKE) build-gcc-debug -C $(basename $@)
 
+$(addsuffix .build-gcc-debug, $(ALGO_LIB)): $(addsuffix .build-gcc-debug, $(CORE_LIB))
+	$(MAKE) build-gcc-debug -C $(basename $@)
 
+$(addsuffix .build-gcc-debug, $(ELGO_LIB)): $(addsuffix .build-gcc-debug, $(ALGO_LIB))
+	$(MAKE) build-gcc-debug -C $(basename $@)
 
-$(addsuffix .build-debug, $(STD_LIB)):
-	$(MAKE) build-debug -C $(basename $@)
+$(addsuffix .build-gcc-debug, $(SUBDIRS_BINS)): $(addsuffix .build-gcc-debug, $(ELGO_LIB))
+	$(MAKE) build-gcc-debug -C $(basename $@)
 
-$(addsuffix .build-debug, $(CORE_LIB)): $(addsuffix .build-debug, $(STD_LIB))
-	$(MAKE) build-debug -C $(basename $@)
+$(addsuffix .build-llvm-debug, $(STD_LIB)):
+	$(MAKE) build-llvm-debug -C $(basename $@)
 
-$(addsuffix .build-debug, $(ALGO_LIB)): $(addsuffix .build-debug, $(CORE_LIB))
-	$(MAKE) build-debug -C $(basename $@)
+$(addsuffix .build-llvm-debug, $(CORE_LIB)): $(addsuffix .build-llvm-debug, $(STD_LIB))
+	$(MAKE) build-llvm-debug -C $(basename $@)
 
-$(addsuffix .build-debug, $(ELGO_LIB)): $(addsuffix .build-debug, $(ALGO_LIB))
-	$(MAKE) build-debug -C $(basename $@)
+$(addsuffix .build-llvm-debug, $(ALGO_LIB)): $(addsuffix .build-llvm-debug, $(CORE_LIB))
+	$(MAKE) build-llvm-debug -C $(basename $@)
 
-$(addsuffix .build-debug, $(SUBDIRS_BINS)): $(addsuffix .build-debug, $(ELGO_LIB))
-	$(MAKE) build-debug -C $(basename $@)
+$(addsuffix .build-llvm-debug, $(ELGO_LIB)): $(addsuffix .build-llvm-debug, $(ALGO_LIB))
+	$(MAKE) build-llvm-debug -C $(basename $@)
 
+$(addsuffix .build-llvm-debug, $(SUBDIRS_BINS)): $(addsuffix .build-llvm-debug, $(ELGO_LIB))
+	$(MAKE) build-llvm-debug -C $(basename $@)
 
 
-$(addsuffix .build-release, $(STD_LIB)):
-	$(MAKE) build-release -C $(basename $@)
 
-$(addsuffix .build-release, $(CORE_LIB)): $(addsuffix .build-release, $(STD_LIB))
-	$(MAKE) build-release -C $(basename $@)
+$(addsuffix .build-gcc-release, $(STD_LIB)):
+	$(MAKE) build-gcc-release -C $(basename $@)
 
-$(addsuffix .build-release, $(ALGO_LIB)): $(addsuffix .build-release, $(CORE_LIB))
-	$(MAKE) build-release -C $(basename $@)
+$(addsuffix .build-gcc-release, $(CORE_LIB)): $(addsuffix .build-gcc-release, $(STD_LIB))
+	$(MAKE) build-gcc-release -C $(basename $@)
 
-$(addsuffix .build-release, $(ELGO_LIB)): $(addsuffix .build-release, $(ALGO_LIB))
-	$(MAKE) build-release -C $(basename $@)
+$(addsuffix .build-gcc-release, $(ALGO_LIB)): $(addsuffix .build-gcc-release, $(CORE_LIB))
+	$(MAKE) build-gcc-release -C $(basename $@)
 
-$(addsuffix .build-release, $(SUBDIRS_BINS)): $(addsuffix .build-release, $(ELGO_LIB))
-	$(MAKE) build-release -C $(basename $@)
+$(addsuffix .build-gcc-release, $(ELGO_LIB)): $(addsuffix .build-gcc-release, $(ALGO_LIB))
+	$(MAKE) build-gcc-release -C $(basename $@)
 
+$(addsuffix .build-gcc-release, $(SUBDIRS_BINS)): $(addsuffix .build-gcc-release, $(ELGO_LIB))
+	$(MAKE) build-gcc-release -C $(basename $@)
 
+$(addsuffix .build-llvm-release, $(STD_LIB)):
+	$(MAKE) build-llvm-release -C $(basename $@)
 
-$(addsuffix .build-tests-debug, $(STD_LIB)): $(addsuffix .build-debug, $(STD_LIB))
-	$(MAKE) build-tests-debug -C $(basename $@)
+$(addsuffix .build-llvm-release, $(CORE_LIB)): $(addsuffix .build-llvm-release, $(STD_LIB))
+	$(MAKE) build-llvm-release -C $(basename $@)
 
-$(addsuffix .build-tests-debug, $(CORE_LIB)): $(addsuffix .build-tests-debug, $(STD_LIB)) $(addsuffix .build-debug, $(CORE_LIB))
-	$(MAKE) build-tests-debug -C $(basename $@)
+$(addsuffix .build-llvm-release, $(ALGO_LIB)): $(addsuffix .build-llvm-release, $(CORE_LIB))
+	$(MAKE) build-llvm-release -C $(basename $@)
 
-$(addsuffix .build-tests-debug, $(ALGO_LIB)): $(addsuffix .build-tests-debug, $(CORE_LIB)) $(addsuffix .build-debug, $(ALGO_LIB))
-	$(MAKE) build-tests-debug -C $(basename $@)
+$(addsuffix .build-llvm-release, $(ELGO_LIB)): $(addsuffix .build-llvm-release, $(ALGO_LIB))
+	$(MAKE) build-llvm-release -C $(basename $@)
 
-$(addsuffix .build-tests-debug, $(ELGO_LIB)): $(addsuffix .build-tests-debug, $(ALGO_LIB)) $(addsuffix .build-debug, $(ELGO_LIB))
-	$(MAKE) build-tests-debug -C $(basename $@)
+$(addsuffix .build-llvm-release, $(SUBDIRS_BINS)): $(addsuffix .build-llvm-release, $(ELGO_LIB))
+	$(MAKE) build-llvm-release -C $(basename $@)
 
 
 
-$(addsuffix .build-tests-release, $(STD_LIB)): $(addsuffix .build-release, $(STD_LIB))
-	$(MAKE) build-tests-release -C $(basename $@)
+$(addsuffix .build-tests-gcc-debug, $(STD_LIB)): $(addsuffix .build-gcc-debug, $(STD_LIB))
+	$(MAKE) build-tests-gcc-debug -C $(basename $@)
 
-$(addsuffix .build-tests-release, $(CORE_LIB)): $(addsuffix .build-tests-release, $(STD_LIB)) $(addsuffix .build-release, $(CORE_LIB))
-	$(MAKE) build-tests-release -C $(basename $@)
+$(addsuffix .build-tests-gcc-debug, $(CORE_LIB)): $(addsuffix .build-tests-gcc-debug, $(STD_LIB)) $(addsuffix .build-gcc-debug, $(CORE_LIB))
+	$(MAKE) build-tests-gcc-debug -C $(basename $@)
 
-$(addsuffix .build-tests-release, $(ALGO_LIB)): $(addsuffix .build-tests-release, $(CORE_LIB)) $(addsuffix .build-release, $(ALGO_LIB))
-	$(MAKE) build-tests-release -C $(basename $@)
+$(addsuffix .build-tests-gcc-debug, $(ALGO_LIB)): $(addsuffix .build-tests-gcc-debug, $(CORE_LIB)) $(addsuffix .build-gcc-debug, $(ALGO_LIB))
+	$(MAKE) build-tests-gcc-debug -C $(basename $@)
 
-$(addsuffix .build-tests-release, $(ELGO_LIB)): $(addsuffix .build-tests-release, $(ALGO_LIB)) $(addsuffix .build-release, $(ELGO_LIB))
-	$(MAKE) build-tests-release -C $(basename $@)
+$(addsuffix .build-tests-gcc-debug, $(ELGO_LIB)): $(addsuffix .build-tests-gcc-debug, $(ALGO_LIB)) $(addsuffix .build-gcc-debug, $(ELGO_LIB))
+	$(MAKE) build-tests-gcc-debug -C $(basename $@)
 
+$(addsuffix .build-tests-llvm-debug, $(STD_LIB)): $(addsuffix .build-llvm-debug, $(STD_LIB))
+	$(MAKE) build-tests-llvm-debug -C $(basename $@)
 
+$(addsuffix .build-tests-llvm-debug, $(CORE_LIB)): $(addsuffix .build-tests-llvm-debug, $(STD_LIB)) $(addsuffix .build-llvm-debug, $(CORE_LIB))
+	$(MAKE) build-tests-llvm-debug -C $(basename $@)
 
-clean-debug:
+$(addsuffix .build-tests-llvm-debug, $(ALGO_LIB)): $(addsuffix .build-tests-llvm-debug, $(CORE_LIB)) $(addsuffix .build-llvm-debug, $(ALGO_LIB))
+	$(MAKE) build-tests-llvm-debug -C $(basename $@)
+
+$(addsuffix .build-tests-llvm-debug, $(ELGO_LIB)): $(addsuffix .build-tests-llvm-debug, $(ALGO_LIB)) $(addsuffix .build-llvm-debug, $(ELGO_LIB))
+	$(MAKE) build-tests-llvm-debug -C $(basename $@)
+
+
+
+$(addsuffix .build-tests-gcc-release, $(STD_LIB)): $(addsuffix .build-gcc-release, $(STD_LIB))
+	$(MAKE) build-tests-gcc-release -C $(basename $@)
+
+$(addsuffix .build-tests-gcc-release, $(CORE_LIB)): $(addsuffix .build-tests-gcc-release, $(STD_LIB)) $(addsuffix .build-gcc-release, $(CORE_LIB))
+	$(MAKE) build-tests-gcc-release -C $(basename $@)
+
+$(addsuffix .build-tests-gcc-release, $(ALGO_LIB)): $(addsuffix .build-tests-gcc-release, $(CORE_LIB)) $(addsuffix .build-gcc-release, $(ALGO_LIB))
+	$(MAKE) build-tests-gcc-release -C $(basename $@)
+
+$(addsuffix .build-tests-gcc-release, $(ELGO_LIB)): $(addsuffix .build-tests-gcc-release, $(ALGO_LIB)) $(addsuffix .build-gcc-release, $(ELGO_LIB))
+	$(MAKE) build-tests-gcc-release -C $(basename $@)
+
+$(addsuffix .build-tests-llvm-release, $(STD_LIB)): $(addsuffix .build-llvm-release, $(STD_LIB))
+	$(MAKE) build-tests-llvm-release -C $(basename $@)
+
+$(addsuffix .build-tests-llvm-release, $(CORE_LIB)): $(addsuffix .build-tests-llvm-release, $(STD_LIB)) $(addsuffix .build-llvm-release, $(CORE_LIB))
+	$(MAKE) build-tests-llvm-release -C $(basename $@)
+
+$(addsuffix .build-tests-llvm-release, $(ALGO_LIB)): $(addsuffix .build-tests-llvm-release, $(CORE_LIB)) $(addsuffix .build-llvm-release, $(ALGO_LIB))
+	$(MAKE) build-tests-llvm-release -C $(basename $@)
+
+$(addsuffix .build-tests-llvm-release, $(ELGO_LIB)): $(addsuffix .build-tests-llvm-release, $(ALGO_LIB)) $(addsuffix .build-llvm-release, $(ELGO_LIB))
+	$(MAKE) build-tests-llvm-release -C $(basename $@)
+
+
+
+clean-gcc-debug:
 	for dir in $(SUBDIRS_WITH_MAKE); do \
-	    $(MAKE) clean-debug -C $$dir; \
+	    $(MAKE) clean-gcc-debug -C $$dir; \
 	done
 
-clean-release:
+clean-llvm-debug:
 	for dir in $(SUBDIRS_WITH_MAKE); do \
-	    $(MAKE) clean-release -C $$dir; \
+	    $(MAKE) clean-llvm-debug -C $$dir; \
 	done
 
+clean-gcc-release:
+	for dir in $(SUBDIRS_WITH_MAKE); do \
+	    $(MAKE) clean-gcc-release -C $$dir; \
+	done
+
+clean-llvm-release:
+	for dir in $(SUBDIRS_WITH_MAKE); do \
+	    $(MAKE) clean-llvm-release -C $$dir; \
+	done
+
+
+
+unit-test-gcc-debug:
+	for dir in $(CORE_LIB) $(ALGO_LIB); do \
+	    $(MAKE) unit-test-gcc-debug -C $$dir; \
+	done
 
+unit-test-llvm-debug:
+	for dir in $(CORE_LIB) $(ALGO_LIB); do \
+	    $(MAKE) unit-test-llvm-debug -C $$dir; \
+	done
 
-unit-test-debug:
+unit-test-gcc-release:
 	for dir in $(CORE_LIB) $(ALGO_LIB); do \
-	    $(MAKE) unit-test-debug -C $$dir; \
+	    $(MAKE) unit-test-gcc-release -C $$dir; \
 	done
 
-unit-test-verbose:
+unit-test-llvm-release:
 	for dir in $(CORE_LIB) $(ALGO_LIB); do \
-	    $(MAKE) unit-test-release -C $$dir; \
+	    $(MAKE) unit-test-llvm-release -C $$dir; \
 	done
 
 
 
+FORCE:
+
+
+
 doc:
 	$(MAKE) doc -C alib2data
 	$(MAKE) doc -C alib2algo
diff --git a/tniceprint/makefile b/tniceprint/makefile
index a3069467e1..a880042677 100644
--- a/tniceprint/makefile
+++ b/tniceprint/makefile
@@ -8,15 +8,19 @@ endef
 
 export NEW_LINE
 
-LDFLAGS_DEBUG:=-L../alib2std/lib-debug -L../alib2data/lib-debug -L../alib2algo/lib-debug -L../alib2elgo/lib-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_DEBUG:=-L../alib2std/lib-gcc-debug -L../alib2data/lib-gcc-debug -L../alib2algo/lib-gcc-debug -L../alib2elgo/lib-gcc-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_DEBUG:=-L../alib2std/lib-llvm-debug -L../alib2data/lib-llvm-debug -L../alib2algo/lib-llvm-debug -L../alib2elgo/lib-llvm-debug -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-LDFLAGS_RELEASE:=-L../alib2std/lib-release -L../alib2data/lib-release -L../alib2algo/lib-release -L../alib2elgo/lib-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+GCC_LDFLAGS_RELEASE:=-L../alib2std/lib-gcc-release -L../alib2data/lib-gcc-release -L../alib2algo/lib-gcc-release -L../alib2elgo/lib-gcc-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
+LLVM_LDFLAGS_RELEASE:=-L../alib2std/lib-llvm-release -L../alib2data/lib-llvm-release -L../alib2algo/lib-llvm-release -L../alib2elgo/lib-llvm-release -rdynamic -lxml2 -lalib2std -lalib2data -lalib2algo -lalib2elgo -Wl,-rpath,.
 
-OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_DEBUG:=$(patsubst src/%.cpp, obj-gcc-debug/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_DEBUG:=$(patsubst src/%.cpp, obj-llvm-debug/%.o, $(shell find src/ -name *cpp))
 
-OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_GCC_RELEASE:=$(patsubst src/%.cpp, obj-gcc-release/%.o, $(shell find src/ -name *cpp))
+OBJECTS_LLVM_RELEASE:=$(patsubst src/%.cpp, obj-llvm-release/%.o, $(shell find src/ -name *cpp))
 
-.PHONY: all build-debug clean-debug doc
+.PHONY: all build-gcc-debug build-llvm-debug build-gcc-release build-llvm-release clean-gcc-debug clean-llvm-debug clean-gcc-release clean-llvm-release doc
 
 all:
 	@echo "What to do master?"
@@ -25,6 +29,16 @@ obj%/makefile: makefile
 	mkdir -p $(dir $@)
 	echo "\
 	SHELL:=/bin/bash$${NEW_LINE}\
+	CXXX:=$(patsubst obj-%-release/,%,$(patsubst obj-%-debug/,%,$(dir $@)))$${NEW_LINE}\
+	ifeq (gcc, \$$(CXXX))$${NEW_LINE}\
+	CXX:=g++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	ifeq (llvm, \$$(CXXX))$${NEW_LINE}\
+	CXX:=clang++$${NEW_LINE}\
+	else$${NEW_LINE}\
+	\$$(error \"invalid compiler\")$${NEW_LINE}\
+	endif$${NEW_LINE}\
+	endif$${NEW_LINE}\
 	SRCDIR:=$${NEW_LINE}\
 	DEPTH:=$${NEW_LINE}\
 	OBJECTS_BASE_DIR:=$${NEW_LINE}\
@@ -73,49 +87,85 @@ obj%/makefile: makefile
 	$${NEW_LINE}\
 	-include \$$(DEPENDENCIES)" > $@
 
-debug: build-debug
+gcc-debug: build-gcc-debug
 
-release: build-release
+llvm-debug: build-llvm-debug
 
-clean: clean-debug clean-release
+gcc-release: build-gcc-release
+
+llvm-release: build-llvm-release
+
+clean: clean-gcc-debug clean-gcc-release
 	$(RM) -r doc
 
+clean: clean-llvm-debug clean-llvm-release
+	$(RM) -r doc
 
 
-bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+
+bin-gcc-debug/$(EXECUTABLE): obj-gcc-debug/ $(OBJECTS_GCC_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+	g++ $(OBJECTS_GCC_DEBUG) -o $@ $(GCC_LDFLAGS_DEBUG)
 
-bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+bin-llvm-debug/$(EXECUTABLE): obj-llvm-debug/ $(OBJECTS_LLVM_DEBUG)
 	mkdir -p $(dir $@)
-	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+	clangg++ $(OBJECTS_LLVM_DEBUG) -o $@ $(LLVM_LDFLAGS_DEBUG)
+
+bin-gcc-release/$(EXECUTABLE): obj-gcc-release/ $(OBJECTS_GCC_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_GCC_RELEASE) -o $@ $(GCC_LDFLAGS_RELEASE)
+
+bin-llvm-release/$(EXECUTABLE): obj-llvm-release/ $(OBJECTS_LLVM_RELEASE)
+	mkdir -p $(dir $@)
+	g++ $(OBJECTS_LLVM_RELEASE) -o $@ $(LLVM_LDFLAGS_RELEASE)
+
+
+
+obj-gcc-debug/: FORCE | obj-gcc-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-llvm-debug/: FORCE | obj-llvm-debug/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+
+obj-gcc-release/: FORCE | obj-gcc-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-gcc-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+obj-llvm-release/: FORCE | obj-llvm-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-llvm-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_GCC_DEBUG): obj-gcc-debug/
 
+$(OBJECTS_LLVM_DEBUG): obj-llvm-debug/
 
+$(OBJECTS_GCC_RELEASE): obj-gcc-release/
 
-obj-debug/: FORCE | obj-debug/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-debug SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-g -O0"
+$(OBJECTS_LLVM_RELEASE): obj-llvm-release/
 
-obj-release/: FORCE | obj-release/makefile
-	$(MAKE) -C $@ OBJECTS_BASE_DIR=obj-release SOURCES_BASE_DIR=src CXX_OTHER_FLAGS="-O3"
 
 
+build-gcc-debug: bin-gcc-debug/$(EXECUTABLE)
 
-$(OBJECTS_DEBUG): obj-debug/
+build-llvm-debug: bin-llvm-debug/$(EXECUTABLE)
 
-$(OBJECTS_RELEASE): obj-release/
+build-gcc-release: bin-gcc-release/$(EXECUTABLE)
 
+build-llvm-release: bin-llvm-release/$(EXECUTABLE)
 
-build-debug: bin-debug/$(EXECUTABLE)
 
-build-release: bin-release/$(EXECUTABLE)
 
+clean-gcc-debug:
+	$(RM) -r *.o *.d bin-gcc-debug obj-gcc-debug
 
+clean-llvm-debug:
+	$(RM) -r *.o *.d bin-llvm-debug obj-llvm-debug
 
-clean-debug:
-	$(RM) -r *.o *.d bin-debug obj-debug
+clean-gcc-release:
+	$(RM) -r *.o *.d bin-gcc-release obj-gcc-release
 
-clean-release:
-	$(RM) -r *.o *.d bin-release obj-release
+clean-llvm-release:
+	$(RM) -r *.o *.d bin-llvm-release obj-llvm-release
 
 
 
-- 
GitLab