#!/usr/bin/make -f
# Makefile for carla tests #
# ------------------------ #
# Created by falkTX
#

# ---------------------------------------------------------------------------------------------------------------------

CLANG   ?= clang
CXXLANG ?= clang++

MODULEDIR=../../build/modules/Debug
MODULEDIR=../../build/modules/Release

WINECXX ?= wineg++

# ---------------------------------------------------------------------------------------------------------------------

BASE_FLAGS  = -Wall -Wextra -Werror -pipe -DBUILDING_CARLA -DREAL_BUILD
BASE_FLAGS += -I. -I../backend -I../includes -I../modules -I../utils
BASE_FLAGS += -Wcast-align -Wmissing-declarations
# BASE_FLAGS += -Wcast-qual -Wconversion -Wsign-conversion -Wundef
BASE_FLAGS += -Wformat -Wformat-security -Wredundant-decls -Wshadow -Wstrict-overflow -fstrict-overflow -Wwrite-strings
BASE_FLAGS += -Wpointer-arith -Wabi -Winit-self -Wuninitialized -Wunused-parameter
# -Wfloat-equal

LINK_FLAGS =

ifneq ($(CC),clang)
BASE_FLAGS += -Wlogical-op -Wunsafe-loop-optimizations
endif

ifeq ($(DEBUG),true)
BASE_FLAGS += -DDEBUG -O0 -g
else
BASE_FLAGS += -O3 -ffast-math -mtune=generic -msse -msse2 -mfpmath=sse -fdata-sections -ffunction-sections
LINK_FLAGS += -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,-O1 -Wl,--as-needed -Wl,--strip-all
endif

# ---------------------------------------------------------------------------------------------------------------------

ANSI_FLAGS  = $(BASE_FLAGS) -DBUILD_ANSI_TEST
# ANSI_FLAGS += -ansi -pedantic -pedantic-errors -Waggregate-return
# ANSI_FLAGS += -L../backend -lcarla_standalone2

# ---------------------------------------------------------------------------------------------------------------------

GNU_CXX_FLAGS  = $(BASE_FLAGS)
GNU_CXX_FLAGS += -std=c++11 -std=gnu++11 -Weffc++ -Wnon-virtual-dtor -Woverloaded-virtual
ifneq ($(CC),clang-3.4)
GNU_CXX_FLAGS += -Wzero-as-null-pointer-constant
endif

# ---------------------------------------------------------------------------------------------------------------------

PEDANTIC_CXX_FLAGS  = $(BASE_FLAGS)
PEDANTIC_CXX_FLAGS += -std=c++11 -pedantic -pedantic-errors
PEDANTIC_CXX_FLAGS += -isystem /opt/kxstudio/include
# PEDANTIC_CXX_FLAGS += -Weffc++
PEDANTIC_CXX_FLAGS += -Wnon-virtual-dtor -Woverloaded-virtual -Wno-vla
ifeq ($(CC),clang-3.4)
PEDANTIC_CXX_FLAGS += -Wno-vla-extension
else
PEDANTIC_CXX_FLAGS += -Wzero-as-null-pointer-constant
endif

# ---------------------------------------------------------------------------------------------------------------------

# TARGETS  = ansi-pedantic-test_c_ansi
# TARGETS += ansi-pedantic-test_c89
# TARGETS += ansi-pedantic-test_c99
# TARGETS += ansi-pedantic-test_c11
# TARGETS += ansi-pedantic-test_clang
# TARGETS += ansi-pedantic-test_cxx_ansi
# TARGETS += ansi-pedantic-test_cxx03
# TARGETS += ansi-pedantic-test_cxx11
# TARGETS += ansi-pedantic-test_cxxlang
# TARGETS += CarlaPipeUtils
# TARGETS += CarlaRingBuffer
# TARGETS += CarlaString
TARGETS += CarlaUtils1
# ifneq ($(WIN32),true)
# TARGETS += CarlaUtils2
# endif
# TARGETS += CarlaUtils3
# TARGETS += CarlaUtils4
# TARGETS += Exceptions
# TARGETS += Print
# TARGETS += RDF

all: $(TARGETS)

# ---------------------------------------------------------------------------------------------------------------------

ansi-pedantic-test_c_ansi: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h
	$(CC) $< $(ANSI_FLAGS) -ansi -pedantic -pedantic-errors -Wc++-compat -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_c89: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h
	$(CC) $< $(ANSI_FLAGS) -std=c89 -pedantic -pedantic-errors -Wc++-compat -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_c99: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h
	$(CC) $< $(ANSI_FLAGS) -std=c99 -pedantic -pedantic-errors -Wc++-compat -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_c11: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h
	$(CC) $< $(ANSI_FLAGS) -std=c11 -pedantic -pedantic-errors -Wc++-compat -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_clang: ansi-pedantic-test.c ../backend/Carla*.h ../includes/*.h
	$(CLANG) $< $(ANSI_FLAGS) -ansi -pedantic -pedantic-errors -Wc++-compat -Weverything -Wno-padded -Wno-unknown-warning-option -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_cxx_ansi: ansi-pedantic-test.cpp ../backend/Carla*.h ../includes/*.h
	$(CXX) $< $(ANSI_FLAGS) -ansi -pedantic -pedantic-errors -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_cxx03: ansi-pedantic-test.cpp ../backend/Carla*.h ../includes/*.h
	$(CXX) $< $(ANSI_FLAGS) -std=c++03 -pedantic -pedantic-errors -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_cxx11: ansi-pedantic-test.cpp ../backend/Carla*.h ../includes/*.h
	$(CXX) $< $(ANSI_FLAGS) -std=c++11 -pedantic -pedantic-errors -L../../bin -lcarla_standalone2 -o $@

ansi-pedantic-test_cxxlang: ansi-pedantic-test.cpp ../backend/Carla*.h ../includes/*.h
	$(CXXLANG) $< $(ANSI_FLAGS) -ansi -pedantic -pedantic-errors -Weverything -Wno-padded -Wno-unknown-warning-option -L../../bin -lcarla_standalone2 -o $@

# ---------------------------------------------------------------------------------------------------------------------

ctypes-test.so: ctypes-test.c .FORCED
	$(CC) $< $(BASE_FLAGS) -fPIC -shared -o $@
	set -e; ./ctypes-test.py

# ---------------------------------------------------------------------------------------------------------------------

CachedPlugins: CachedPlugins.cpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@ $(MODULEDIR)/juce_core.a $(MODULEDIR)/lilv.a -ldl -lpthread
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

CarlaRingBuffer: CarlaRingBuffer.cpp ../utils/CarlaRingBuffer.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

CarlaString: CarlaString.cpp ../utils/CarlaString.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

CarlaPipeUtils: CarlaPipeUtils.cpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@ $(MODULEDIR)/juce_core.a -ldl -lpthread
ifneq ($(WIN32),true)
	set -e;  valgrind --leak-check=full ./$@
# 	./$@ &&
endif

CarlaPipeUtils.exe: CarlaPipeUtils.cpp ../utils/CarlaPipeUtils.cpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@ $(MODULEDIR)/water.a -lole32 -lshlwapi -lversion -lwsock32 -lwininet -lwinmm -lws2_32 -lpthread -static

CarlaUtils1: CarlaUtils1.cpp ../utils/*.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

CarlaUtils2: CarlaUtils2.cpp ../utils/*.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@ \
		 $(MODULEDIR)/juce_core.a $(MODULEDIR)/lilv.a -ldl -lpthread -lrt
	set -e; ./$@ && valgrind --leak-check=full ./$@

CarlaUtils3: CarlaUtils3.cpp ../utils/*.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@ -ldl -lrt
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

CarlaUtils4: CarlaUtils4.cpp ../utils/CarlaStateUtils.cpp ../utils/*.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@ \
		$(MODULEDIR)/juce_core.a -ldl -lpthread -lrt
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

Exceptions: Exceptions.cpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

Print: Print.cpp ../utils/CarlaUtils.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

RDF: RDF.cpp ../modules/ladspa_rdf.hpp ../modules/lv2_rdf.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -o $@
ifneq ($(WIN32),true)
	set -e; ./$@ && valgrind --leak-check=full ./$@
endif

WineJack: WineJack.cpp
	$(WINECXX) $< $(BASE_FLAGS) -m32 -ljack -lpthread -o $@
	set -e; ./$@.exe

# ---------------------------------------------------------------------------------------------------------------------

carla-uhe-test: carla-uhe-test.c
	$(CC) $< -Wall -Wextra -O0 -g -I../backend -I../includes -DREAL_BUILD -ldl -o $@
	./$@

sem: sem.cpp $(MODULEDIR)/jackbridge/*
	$(CXX) $< -Wall -Wextra -O0 -g -I../utils -I../includes -DREAL_BUILD -o $@
	./$@

# ---------------------------------------------------------------------------------------------------------------------

ChildProcess: ChildProcess.cpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) $(MODULEDIR)/juce_core.a -ldl -lpthread -lrt -o $@
	valgrind --leak-check=full ./$@

CarlaMutex: CarlaMutex.cpp ../utils/CarlaMutex.hpp
	$(CXX) $< -lpthread -o $@
	valgrind --leak-check=full ./$@

# ifneq ($(MACOS_OR_WIN32),true)
# 	 $(MODULEDIR)/rtaudio.a $(MODULEDIR)/rtmidi.a \
# endif

Engine: Engine.cpp
	$(CXX) $< \
	../backend/standalone/CarlaStandalone.cpp.o \
	-Wl,--start-group \
	../backend/carla_engine.a ../backend/carla_plugin.a $(MODULEDIR)/native-plugins.a \
	$(MODULEDIR)/dgl.a $(MODULEDIR)/jackbridge.a $(MODULEDIR)/lilv.a $(MODULEDIR)/rtmempool.a \
	-Wl,--end-group \
	$(PEDANTIC_CXX_FLAGS) $(shell pkg-config --libs alsa libpulse-simple liblo QtCore QtXml fluidsynth x11 gl smf fftw3 mxml zlib ntk_images ntk) -o $@
	env LD_LIBRARY_PATH=../backend valgrind --leak-check=full ./$@
# 	$(MODULEDIR)/juce_audio_basics.a $(MODULEDIR)/juce_core.a \

EngineEvents: EngineEvents.cpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -L../backend -lcarla_standalone2 -o $@
	env LD_LIBRARY_PATH=../backend valgrind ./$@

PipeServer: PipeServer.cpp ../utils/CarlaPipeUtils.hpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) -lpthread -o $@
	valgrind --leak-check=full ./$@

RtLinkedList: RtLinkedList.cpp ../utils/LinkedList.hpp ../utils/RtLinkedList.hpp $(MODULEDIR)/rtmempool.a
	$(CXX) $< $(MODULEDIR)/rtmempool.a $(PEDANTIC_CXX_FLAGS) -lpthread -o $@
	valgrind --leak-check=full ./$@

RtLinkedListGnu: RtLinkedList.cpp ../utils/LinkedList.hpp ../utils/RtLinkedList.hpp $(MODULEDIR)/rtmempool.a
	$(CXX) $< $(MODULEDIR)/rtmempool.a $(GNU_CXX_FLAGS) -lpthread -o $@
	valgrind --leak-check=full ./$@

# ---------------------------------------------------------------------------------------------------------------------

clean:
	rm -f *.o $(TARGETS)

debug:
	$(MAKE) DEBUG=true

# ---------------------------------------------------------------------------------------------------------------------

DISTRHO: DISTRHO.cpp ../modules/distrho/*.hpp ../modules/distrho/src/*.cpp
	$(CXX) $< ../modules/dgl.a $(PEDANTIC_CXX_FLAGS) -I../modules/distrho -I../modules/native-plugins/nekobi $(LINK_FLAGS) $(DGL_LIBS) -lpthread -o $@
	./DISTRHO

DISTRHO.so: DISTRHO.cpp ../modules/distrho/*.hpp ../modules/distrho/src/*.cpp
	$(CXX) $< ../modules/dgl.a $(PEDANTIC_CXX_FLAGS) -I../modules/distrho -I../modules/native-plugins/nekobi -DSHARED_DLL $(LINK_FLAGS) $(DGL_LIBS) -lpthread -shared -Wl,--no-undefined -o $@

DGL: DGL.cpp ../modules/distrho/dgl/src/Window.cpp
	$(CXX) $< $(PEDANTIC_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) -o $@
# 	./DGL
# 	valgrind ./DGL

# ---------------------------------------------------------------------------------------------------------------------

.PHONY: .FORCED
