CC ?= gcc
EXECS = mapagent dynbh/dynbhd
CFLAGS+=-I. -Iutils -D_GNU_SOURCE -DCONFIG_ALL_RADIOS #DEBUG=1
CFLAGS+= -ggdb3 -Wall -Werror
CFLAGS += -I/usr/include/libnl3

CFLAGS += -DVENDOR_EXTENSION

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 = \
	utils/debug.o \
	utils/liblist.o \
	utils/utils.o \
	utils/1905_ubus.o \
	utils/allmac.o

AGENT_OBJS = \
	timer.o \
	wifi_ubus.o \
	wifi_opclass.o \
	wifi_caps.o \
	wifi_scanresults.o \
	wifi.o \
	steer_rules.o \
	agent_ubus.o \
	agent_ubus_dbg.o \
	agent.o \
	agent_map.o \
	agent_tlv.o \
	agent_cmdu.o \
	assoc_ctrl.o \
	backhaul.o \
	backhaul_blacklist.o \
	config.o \
	main.o \
	nl.o \
	dpp.o \
	dppfrag.o \
	dpphandler.o \
	qos.o \
	unasta.o \
	zt.o


ifneq (,$(findstring VENDOR_EXTENSION,$(CFLAGS)))
AGENT_OBJS += extension.o
endif

ifneq (,$(findstring EASYMESH_VENDOR_EXT,$(CFLAGS)))
AGENT_OBJS += vendor.o
endif

LIBS = -lubus -lubox -ljson-c -lblobmsg_json -luci -leasy
LIBS += -I/usr/include/libnl3 -lnl-3 -lnl-route-3
LIBS += -rdynamic -ldl
LIBS += -lieee1905 -lmaputil -lm
LIBS += -lssl -lcrypto -lwifiutils

ifneq (,$(findstring USE_LIBDPP,$(CFLAGS)))
LIBS += -ldpp
endif

plugin_subdirs ?= $(wildcard extensions/*)
plugin_sofile = $(wildcard $(d)/*.so)
plugin_files = $(foreach d, $(plugin_subdirs), $(plugin_sofile))


.PHONY: all check clean extensions FORCE

all: $(EXECS) extensions

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

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

dynbh/dynbhd: $(OBJS) dynbh/dynbh.o dynbh/dbh_nl.o dynbh/dbh_config.o
	$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)

extensions:
	@echo "$(plugin_subdirs)"
	for i in $(plugin_subdirs); do [ -d $$i ] && $(MAKE) -C $$i all || exit 1; done

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

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

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

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

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

FORCE:
