# Makefile for qosmngr
include common.mk

-include Makefile.diag.inc

QOSMNGR_LIB=libqosmngr.so

GCOV=gcov
SRC_DIR = src

CODECOVERAGE_SRC = $(addprefix $(SRC_DIR)/, qosmngr.c )
PROG = $(PROJECT_TOPLEVEL)/qosmngr
SHARED_LIB = $(PROJECT_TOPLEVEL)/libqosmngr.so
OBJS = $(addprefix $(SRC_DIR)/, main.o qosmngr.o )

PROG_CFLAGS = $(CFLAGS) -I$(INCLUDE_DIR) $(DIAG_CFLAGS) -Werror -fstrict-aliasing
PROG_LDFLAGS = $(LDFLAGS)
PROG_LIBS = $(COMMON_LDFLAGS) -lgcov

# MUSL has the following issue in snprintf, so it is ignored:
PROG_CFLAGS += -Wno-format-nonliteral

.PHONY: all clean

all: version $(PROG)

$(PROG): $(INCLUDE_DIR)/version.h $(OBJS)
	$(CC) $(PROG_LDFLAGS) -o $@ $^ $(PROG_LIBS)

${QOSMNGR_LIB}:
	$(CC) $(PROG_LDFLAGS) -shared -o $@ $^ $(PROG_LIBS)

$(SHARED_LIB): $(INCLUDE_DIR)/version.h $(OBJS)

version: $(INCLUDE_DIR)/version.h

$(INCLUDE_DIR)/version.h: $(PROJECT_TOPLEVEL)/VERSION
	@(dirty=$(shell (git status --porcelain | grep -q .) && echo -dirty); \
	[ -f $(PROJECT_TOPLEVEL)/VERSION ] && basever=$(shell cat $(PROJECT_TOPLEVEL)/VERSION) || \
		basever=Unknown; \
	xver=$(shell date +'%y%V%u-%H%M'); \
	echo "const char *qosmngr_base_version = \"$$basever\";" > $@; \
	echo "const char *qosmngr_xtra_version = \"$$xver$$dirty\";" >> $@; \
	)

test: ${QOSMNGR_LIB}

coverage: CFLAGS += -g -O0 -fprofile-arcs -ftest-coverage -fPIC
coverage: LDFLAGS += --coverage
coverage: test $(PROG)
	$(foreach testprog, $(CODECOVERAGE_SRC), $(GCOV) $(testprog);)

functional-test: test
	$(MAKE) -C test/cmocka functional-test

%.o: %.c
	$(CC) $(PROG_CFLAGS) $(FPIC) -c -o $@ $<

clean:
	rm -f *.o $(SHARED_LIB) $(PROG) $(INCLUDE_DIR)/version.h
	rm -f *.xml *.html
	find -name '*.gcda' -exec rm {} -fv \;
	find -name '*.gcno' -exec rm {} -fv \;
	find -name '*.gcov' -exec rm {} -fv \;
	make -C test/cmocka clean