CC=gcc # gcc || clang
PROG = wifimngr
OBJS = debug.o uci.o ubus.o wifimngr.o wifimngr_event.o main.o wps.o

BINDIR ?= /usr/sbin

PROG_CFLAGS = $(CFLAGS) -DHAS_UBUS -Wall -Werror -fstrict-aliasing -ggdb
#PROG_CFLAGS += -DDONOT_CREATE_AFFILIATED_IFACE_OBJECT
#PROG_CFLAGS += -DWIFI_CACHE_SCANRESULTS
CFLAGS += -Wno-address-of-packed-member
PROG_LDFLAGS = $(LDFLAGS)
PROG_LIBS += -lssl -lcrypto -leasy -lwifiutils -lwifi-7 -lm -ldl
PROG_LIBS += -luci -lubus -lubox -ljson-c -lblobmsg_json -lnl-genl-3 -lnl-3 -lgcov
GCOV = gcov
CODECOVERAGE_SRC = main.c wifimngr.c uci.c
ifneq (,$(findstring HAS_UBUS,$(CFLAGS)))
CODECOVERAGE_SRC += ubus.c
endif

BUILDCOLOR=@printf "\e[1;32mBuilding $< \e[0m\n"

.PHONY: version clean install help help.h

all: wifimngr

$(OBJS): help.h version.h

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

version: version.h files.md5

help: help.h

help.h:
	@echo "const char *helpstr = \" \\" > $@;
	@base64 -w0 ./help.json >> $@;
	@echo "\";" >> $@

version.h:
	@(dirty=$(shell ./verifysum.sh); \
	[ -f version.h ] || { \
		[ -f VERSION ] && basever=$(shell cat VERSION) || \
			basever=Unknown; \
		xver=$(shell date +'%y%V%u-%H%M'); \
		echo "const char *wifimngr_base_version = \"$$basever\";" > $@; \
	}; \
	echo "const char *wifimngr_xtra_version = \"$$xver$$dirty\";" >> $@; \
	)

files.md5:
	@md5sum *.c > $@

wifimngr: $(OBJS)
	$(CC) $(PROG_LDFLAGS) -o $@ $^ $(PROG_LIBS)


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

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

functional-test: coverage
	make -C test/cmocka functional-test WIFIMNGR_LIB_DIR=$(PWD)

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

$(DESTDIR)/$(BINDIR)/%: %
	install -D $< $@

install: $(addprefix $(DESTDIR)/$(BINDIR)/,wifimngr)

clean:
	rm -f *.o libwifimngr.so $(PROG)
	rm -f *.xml *.html
	rm -rf coverage
	find -name '*.gcda' -exec rm {} -fv \;
	find -name '*.gcno' -exec rm {} -fv \;
	find -name '*.gcov' -exec rm {} -fv \;
	make -C test/cmocka clean
