TARGET_SERVER ?= midiminder
TARGET_USER ?= midiwala
TARGET_TEST ?= testmidiminder

PROJECT_VERSION ?= 1.0.2
DEBIAN_VERSION ?= 1

PREFIX ?= /usr/local
BINARY_DIR ?= $(PREFIX)/bin
CONF_DIR ?= /etc
INSTALL ?= install
INSTALL_PROGRAM ?= $(INSTALL) -s
INSTALL_DATA ?= $(INSTALL) -m 644
MKDIR_P ?= mkdir -p

BUILD_DIR ?= ./build

all: bin
bin: $(BUILD_DIR)/$(TARGET_SERVER) $(BUILD_DIR)/$(TARGET_USER)
doc: text-pages web-pages

deb:
	dpkg-buildpackage -b --no-sign
deb-nc:
	dpkg-buildpackage -nc -b --no-sign

install:
	$(MKDIR_P) $(DESTDIR)$(BINARY_DIR)
	$(INSTALL_PROGRAM) $(BUILD_DIR)/$(TARGET_SERVER) $(DESTDIR)$(BINARY_DIR)/
	$(INSTALL_PROGRAM) $(BUILD_DIR)/$(TARGET_USER) $(DESTDIR)$(BINARY_DIR)/

SRCS_COMMON := msg.cpp rule.cpp seq.cpp

SRCS_SERVER := service.cpp service-commands.cpp
SRCS_SERVER += args-service.cpp main-service.cpp
SRCS_SERVER += logic.cpp files.cpp ipc.cpp
SRCS_SERVER += $(SRCS_COMMON)

SRCS_USER += user-connect.cpp user-list.cpp user-view.cpp
SRCS_USER += args-user.cpp main-user.cpp
SRCS_USER += seqsnapshot.cpp term.cpp
SRCS_USER += $(SRCS_COMMON)

SRCS_TEST += test-parse.cpp test-observing.cpp test-match.cpp
SRCS_TEST += logic.cpp
SRCS_TEST += $(SRCS_COMMON)

INCS := .
LIBS := stdc++ asound fmt icuuc
LIBS += m  # for older GCC systems
LIBS_TEST := Catch2Main Catch2

OBJS_SERVER := $(SRCS_SERVER:%=$(BUILD_DIR)/%.o)
OBJS_USER := $(SRCS_USER:%=$(BUILD_DIR)/%.o)
OBJS_TEST := $(SRCS_TEST:%=$(BUILD_DIR)/%.o)

INC_FLAGS := $(addprefix -I,$(INCS))
CPPFLAGS += $(INC_FLAGS)
CPPFLAGS += -DAPP_VERSION=\"$(PROJECT_VERSION)\"
CPPFLAGS += -Wdate-time -D_FORTIFY_SOURCE=2
CPPFLAGS += -std=c++17
CPPFLAGS += -MMD -MP
CPPFLAGS += -O2
CPPFLAGS += -fstack-protector-strong -Wformat -Werror=format-security
CPPFLAGS += -Wall -Wextra -pedantic

LDFLAGS += $(addprefix -l,$(LIBS))
LDFLAGS_TEST += $(addprefix -l,$(LIBS_TEST))

# c++ source

$(BUILD_DIR)/%.cpp.o: src/%.cpp
	@$(MKDIR_P) $(BUILD_DIR)
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@

$(BUILD_DIR)/$(TARGET_SERVER): $(OBJS_SERVER)
	$(CC) $^ -o $@ $(LDFLAGS)

$(BUILD_DIR)/$(TARGET_USER): $(OBJS_USER)
	$(CC) $^ -o $@ $(LDFLAGS)

$(BUILD_DIR)/$(TARGET_TEST): $(OBJS_TEST)
	$(CC) $^ -o $@ $(LDFLAGS_TEST) $(LDFLAGS)

.PHONY: clean test deb deb-clean tars

clean:
	$(RM) -r $(BUILD_DIR)

deb-clean:
	dh clean

test: $(BUILD_DIR)/$(TARGET_TEST)
	$(BUILD_DIR)/$(TARGET_TEST)

test-old: $(BUILD_DIR)/$(TARGET_SERVER)
	$(BUILD_DIR)/$(TARGET_SERVER) check rules/test.rules && echo PASS || echo FAIL


# test shell with runtime and state directories in /tmp

TEST_DIR=/tmp/midiminder-test
TEST_RUNTIME_DIR=$(TEST_DIR)/runtime
TEST_STATE_DIR=$(TEST_DIR)/state

$(BUILD_DIR)/test-env:
	echo PS1="'(midiminder test): '" > $@
	echo export STATE_DIRECTORY=$(TEST_STATE_DIR) >> $@
	echo export RUNTIME_DIRECTORY=$(TEST_RUNTIME_DIR) >> $@

test-shell: $(BUILD_DIR)/test-env
	$(MKDIR_P) $(TEST_RUNTIME_DIR)
	$(MKDIR_P) $(TEST_STATE_DIR)
	$$SHELL --rcfile $(BUILD_DIR)/test-env || true


# man files

MANDIR ?= man
MANPAGES ?= midiminder.1 midiminder-profile.5 midiminder-daemon.8 midiwala.1

TEXTDIR ?= $(BUILD_DIR)/text
TEXTMANPAGES ?= $(foreach page,$(MANPAGES),$(TEXTDIR)/$(page).txt)

$(TEXTMANPAGES): $(TEXTDIR)/%.txt : $(MANDIR)/%
	@$(MKDIR_P) $(TEXTDIR)
	mandoc -Kutf-8 -Tutf8 $< | col -b -x > $@

text-pages: $(TEXTMANPAGES)

# web site

WEBDIR ?= $(BUILD_DIR)/website
WEBMANPAGES ?= $(foreach page,$(MANPAGES),$(WEBDIR)/$(page).html)
INFOPAGES ?= BUILDING CHANGES USER-GUIDE
WEBINFOPAGES ?= $(foreach page,$(INFOPAGES),$(WEBDIR)/$(page).html)
WEBEXTRA ?= $(WEBDIR)/site.css $(WEBDIR)/index.html

TO_HTML ?= --to html --standalone --variable=css=site.css
FROM_MAN ?= --from man
FROM_MARKDOWN ?= --from markdown+lists_without_preceding_blankline

$(WEBMANPAGES): $(WEBDIR)/%.html : $(MANDIR)/%
	@$(MKDIR_P) $(WEBDIR)
	pandoc $(TO_HTML) $(FROM_MAN) -o $@ $<

$(WEBINFOPAGES): $(WEBDIR)/%.html : %.md
	@$(MKDIR_P) $(WEBDIR)
	pandoc $(TO_HTML) $(FROM_MARKDOWN) -o $@ $<

$(WEBDIR)/site.css : site.css
	@$(MKDIR_P) $(WEBDIR)
	ln -f $< $@

$(WEBDIR)/index.html : README.md
	@$(MKDIR_P) $(WEBDIR)
	pandoc $(TO_HTML) $(FROM_MARKDOWN) -o $@ $<


web-pages: $(WEBMANPAGES) $(WEBINFOPAGES) $(WEBEXTRA)




# tar files for Debian package

PROJECT_DIR = midiminder-$(PROJECT_VERSION)
TAR_NAME = midiminder_$(PROJECT_VERSION)

tars: deb-clean
	tar -cJvf ../$(TAR_NAME).orig.tar.xz --exclude=debian \
		--transform "s,^,$(PROJECT_DIR)/,S" *
	tar -cJvf ../$(TAR_NAME)-$(DEBIAN_VERSION).debian.tar.xz debian/

# dependencies

DEPS := $(OBJS_SERVER:.o=.d) $(OBJS_USER:.o=.d)

-include $(DEPS)
