EXECS = mapcontroller
CFLAGS+=-I. -Iutils -D_GNU_SOURCE
CFLAGS+= -g -Wall -Werror

ifeq (,$(findstring EASYMESH_VERSION,$(CFLAGS)))
$(info EASYMESH_VERSION is not set. Build for 6)
EASYMESH_VERSION=6
CFLAGS+=-DEASYMESH_VERSION=6
else
EASYMESH_VERSION=$(patsubst -DEASYMESH_VERSION=%,%,$(filter -DEASYMESH_VERSION=%,$(CFLAGS)))
$(info EASYMESH_VERSION passed is $(EASYMESH_VERSION))
endif

OBJS = \
	timeutils.o \
	timer.o \
	utils/debug.o \
	utils/liblist.o \
	utils/utils.o \
	wifi_opclass.o \
	sta.o \
	mactable.o \
	topology.o \
	cntlr_apis.o \
	cntlr_commands.o \
	cntlr_commands_impl.o \
	cntlr_ubus.o \
	cntlr.o \
	cntlr_map.o \
	cntlr_tlv.o \
	cntlr_cmdu.o \
	acs.o \
	qos.o \
	config.o \
	main.o \
	dpp.o \
	scan.o \
	steer.o \
	steer_module.o \
	son.o \
	cntlr_plugin.o


INCDIR=/usr/include/map-controller
header-files=cntlr_commands.h cntlr_commands_impl.h \
	wifi_dataelements.h timer.h timeutils.h timer_impl.h \
	cntlr_apis.h wifi_opclass.h steer_module.h \
	utils/debug.h

lib-files=libcntlr-apis.so	#TODO: plugins
bin-files=mapcontroller

ifneq (,$(findstring EASYMESH_VENDOR_EXT,$(CFLAGS)))
OBJS += cntlr_extension.o
endif

LIBS = -lubus -lubox -ljson-c -lblobmsg_json -luci -pthread
LIBS += -rdynamic -ldl
LIBS += -leasy -lwifiutils
LIBS += -lieee1905 -lmaputil
ifneq (,$(findstring USE_LIBDPP,$(CFLAGS)))
LIBS += -ldpp
endif

plugin_subdirs ?= $(wildcard plugins/*/*)
plugin_sofile = $(wildcard $(d)/*.so)
plugin_files = $(foreach d, $(plugin_subdirs), $(plugin_sofile))
HOOKS = pre-commit

.PHONY: all version.h check clean plugins FORCE

all: version $(EXECS) libcntlr-apis.so plugins

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

libcntlr-apis.so: cntlr_apis.o
	$(CC) -shared -Wl,-soname,libcntlr-apis.so $^ -o $@ $(LIBS) -L.

version.h:
	@(\
	[ command -v git > /dev/null 2>&1 ] || { \
		h=$(shell git rev-parse --short=8 HEAD); \
	}; \
	echo "const char *verstring = \"6.0\";" > $@; \
	echo "const char *githash = \"$$h\";" >> $@; \
	)

version: version.h

mapcontroller: $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)

plugins:
	@echo "$(plugin_subdirs)"
	for i in $(plugin_subdirs); do [ -d $$i ] && CFLAGS="$(CFLAGS)" $(MAKE) -C $$i all; done


-include Makefile.inc

install: install-headers install-libs install-bins

install-hooks:
	$(foreach hook, $(HOOKS), ln -s -f ../../hooks/$(hook) ../.git/hooks/$(hook);)

check: FORCE
	@cppcheck --quiet --enable=all --inconclusive --std=c99 \
		--suppress=variableScope \
		--suppress=unusedVariable \
		--suppress=unreadVariable \
		--suppress=funcArgNamesDifferent \
		--suppress=unusedFunction \
		--suppress=wrongPrintfScanfArgNum \
		--suppress=redundantAssignment \
		-I. -Iutils \
		. 2> cppcheck.out

test: CFLAGS += -fPIC
test: ${OBJS}
	${CC} ${LDFLAGS} -shared -o libmapcontroller.so ${OBJS} ${LIBS}

unit-test: coverage
	make -C ../test/cmocka unit-test MAPCNTLR_LIB_DIR=$(PWD)

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


clean:
	rm -f *.o *.so utils/*.o utils/*.so $(EXECS)
	for i in $(plugin_subdirs); do [ -d $$i ] && $(MAKE) -C $$i clean; done

FORCE:
