CC ?= gcc
CFLAGS += -O2 -g -Wall -Werror

ifneq (,$(findstring HAS_WIFI,$(CFLAGS)))
WIFI_TYPE ?= DEFAULT
endif

LIBWIFI_CFLAGS += -I.
LIBWIFI_LDFLAGS += -L.

LIBS += -lnl-3 -lnl-route-3 -lnl-genl-3
LIBS += -leasy

ver:=$(shell ./genversion.sh)
ifeq ($(ver),)
$(error Failed to generate version)
endif
maj=$(word 1,$(ver))
min=$(word 2,$(ver))
rev=$(word 3,$(ver))
version=$(maj).$(min).$(rev)

LIBWIFI_CFLAGS += -DLIBWIFI_MAJOR=$(maj) -DLIBWIFI_MINOR=$(min) -DLIBWIFI_REV=$(rev)

objs_lib = debug.o wifiops.o chlist.o drivers.o
objs_libutil = wifiutils.o opclass.o
objs_dir =

ifneq  (,$(findstring BROADCOM,$(WIFI_TYPE)))
objs_dir += broadcom
LIBWIFI_CFLAGS += -DWIFI_BROADCOM
LIBWIFI_CFLAGS += -Imodules/wpactrl

objs_lib += modules/wpactrl/hostapd_ctrl.o \
	    modules/wpactrl/supplicant_ctrl.o \
	    modules/wpactrl/wpactrl.o

ifneq ($(filter -DCONFIG_BCM963138,$(CFLAGS)),)
objs_lib += modules/broadcom/bcm.o
else
LIBWIFI_CFLAGS += -Imodules/nl80211 \
		  -Imodules/wext

objs_lib += modules/nl80211/nlwifi.o \
	    modules/broadcom/brcm.o \
	    modules/broadcom/wlctrl.o
endif
endif

ifneq (,$(findstring MEDIATEK,$(WIFI_TYPE)))
objs_dir += mediatek
LIBWIFI_CFLAGS += -DWIFI_MEDIATEK
ifneq ($(filter -DCONFIG_MTK,$(CFLAGS)),)
objs_lib += modules/mediatek/mtk.o
else
objs_lib += modules/mediatek/mt.o
endif
endif

ifneq (,$(findstring QUALCOMM,$(WIFI_TYPE)))
objs_dir += qualcomm
LIBWIFI_CFLAGS += -DWIFI_QUALCOMM
objs_lib += modules/qualcomm/qca.o
endif

ifneq (,$(findstring INTEL,$(WIFI_TYPE)))
objs_dir += intel
LIBWIFI_CFLAGS += -DWIFI_INTEL
LIBWIFI_CFLAGS += -Imodules/nl80211 -Imodules/wext
objs_lib += modules/wext/wext.o \
	    modules/nl80211/nlwifi.o \
	    modules/intel/intel.o
endif

ifneq (,$(findstring TEST,$(WIFI_TYPE)))
objs_dir += test
LIBWIFI_CFLAGS += -DWIFI_TEST
LIBWIFI_CFLAGS += -I/usr/include/libnl3
objs_lib += modules/test/test.o
endif

ifneq (,$(findstring -DHAS_WIFI,$(CFLAGS)))
objs_dir += default nl80211 hostapd-cli wpa_supplicant-cli
LIBWIFI_CFLAGS += -I/usr/include/libnl3 \
		  -Imodules/nl80211 \
		  -Imodules/wpactrl

objs_lib += modules/wpactrl/hostapd_ctrl.o \
	    modules/wpactrl/supplicant_ctrl.o \
	    modules/wpactrl/wpactrl.o \
	    modules/nl80211/nlwifi.o \
	    modules/default/wifi.o
endif

ifneq (,$(findstring HAS_WIFI,$(CFLAGS)))
all: libwifiutils.so libwifi-7.so.$(version)
else
all: libwifiutils.so
endif

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

libwifiutils.so: $(objs_libutil)
	$(CC) $(CFLAGS) $(LIBWIFI_CFLAGS) $(EXTRA_CFLAGS) \
		$(LDFLAGS) $(LIBWIFI_LDFLAGS) -shared \
		-Wl,-soname,libwifiutils.so -o $@ $^ $(LIBS)

libwifi-7.so.$(version): $(objs_lib)
	$(CC) $(CFLAGS) $(LIBWIFI_CFLAGS) $(EXTRA_CFLAGS) \
		$(VFLAGS) $(LDFLAGS) $(LIBWIFI_LDFLAGS) -shared \
		-Wl,-soname,libwifi-7.so.$(maj) -o $@ $^ $(LIBS) -lwifiutils
	-ln -sf $@ libwifi-7.so.$(maj)
	-ln -sf $@ libwifi-7.so

ifneq (,$(findstring HAS_WIFI,$(CFLAGS)))
header-files=wifidefs.h wifiutils.h wifiops.h wifi.h
else
header-files=wifidefs.h wifiutils.h
library-files=libwifiutils.so
endif

-include Makefile.inc

install: install-headers install-libs

docs:
	cd docs; doxygen ./Doxyfile
	$(MAKE) -C docs/latex
	cp docs/latex/refman.pdf docs/libwifi.pdf

clean-objs=$(shell ls -d modules/*/*.o)

clean:
	rm -f $(shell ls -d modules/*/*.o 2>/dev/null)
	rm -f *.o *.so*

.PHONY: all docs clean install
