include $(IPTABLES_APPS_DIR)/common.mk

ALL_SO_LIBS := $(IPTABLES_APPS_BLDDIR)/libipt.so
ALL_SO_LIBS += $(IPTABLES_APPS_BLDDIR)/libipt_ext.so
ifneq ($(strip $(IPTABLES_APPS_IPV6_SUPPORT)),0)
ALL_SO_LIBS += $(IPTABLES_APPS_BLDDIR)/libipt_ext6.so
endif
ALL_SO_LIBS += $(IPTABLES_APPS_BLDDIR)/libipt_iptc.so
ALL_STATIC_LIBS := $(foreach T,$(ALL_SO_LIBS),$(basename $(T))_pic.a)

APPL := $(IPTABLES_APPS_BLDDIR)/iptables
ifneq ($(strip $(IPTABLES_APPS_IPV6_SUPPORT)),0)
APPL += $(IPTABLES_APPS_BLDDIR)/ip6tables
endif

ifneq ($(strip $(IPTABLES_APPS_MULTI_SUPPORT)),1)
APPL += $(IPTABLES_APPS_BLDDIR)/iptables-save
APPL += $(IPTABLES_APPS_BLDDIR)/iptables-restore
APPL += $(IPTABLES_APPS_BLDDIR)/iptables-xml
ifneq ($(strip $(IPTABLES_APPS_IPV6_SUPPORT)),0)
APPL += $(IPTABLES_APPS_BLDDIR)/ip6tables-save
APPL += $(IPTABLES_APPS_BLDDIR)/ip6tables-restore
endif
endif

APPL_LDFLAGS := $(foreach T,$(ALL_SO_LIBS),-L$(IPTABLES_APPS_BLDDIR) -l$(subst .so,,$(subst lib,,$(notdir $(T)))))
APPL_LDFLAGS += -Wl,--allow-shlib-undefined

LSRCS := iptables-standalone.c iptables-save.c iptables-restore.c iptables-xml.c iptables.c xshared.c xtables.c
ifneq ($(strip $(IPTABLES_APPS_MULTI_SUPPORT)),0)
LSRCS += iptables-multi.c
endif
ifneq ($(strip $(IPTABLES_APPS_IPV6_SUPPORT)),0)
LSRCS += ip6tables-standalone.c ip6tables-save.c ip6tables-restore.c ip6tables.c xshared.c xtables.c
ifneq ($(strip $(IPTABLES_APPS_MULTI_SUPPORT)),0)
LSRCS += ip6tables-multi.c
endif
endif

APPL_MAIN_LOBJS := iptables-standalone.o iptables.o
ifneq ($(strip $(IPTABLES_APPS_MULTI_SUPPORT)),0)
APPL_MAIN_LOBJS += iptables-multi.o iptables-save.o iptables-restore.o iptables-xml.o
endif
APPL_MAIN_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${APPL_MAIN_LOBJS})

APPL_MAIN6_LOBJS := ip6tables-standalone.o ip6tables.o
ifneq ($(strip $(IPTABLES_APPS_MULTI_SUPPORT)),0)
APPL_MAIN6_LOBJS += ip6tables-multi.o ip6tables-save.o ip6tables-restore.o
endif
APPL_MAIN6_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${APPL_MAIN6_LOBJS})

APPL_SAVE_LOBJS := iptables-save.o iptables.o
APPL_SAVE_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${APPL_SAVE_LOBJS})

APPL_SAVE6_LOBJS := ip6tables-save.o ip6tables.o
APPL_SAVE6_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${APPL_SAVE6_LOBJS})

APPL_RESTORE_LOBJS := iptables-restore.o iptables.o
APPL_RESTORE_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${APPL_RESTORE_LOBJS})

APPL_RESTORE6_LOBJS := ip6tables-restore.o ip6tables.o
APPL_RESTORE6_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${APPL_RESTORE6_LOBJS})

APPL_XML_LOBJS := iptables-xml.o xshared.o xtables.o
APPL_XML_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${APPL_XML_LOBJS})

#SO_LOBJS := iptables.o xshared.o xtables.o
#ifneq ($(strip $(IPTABLES_APPS_IPV6_SUPPORT)),0)
#SO_LOBJS += ip6tables.o
#endif
SO_LOBJS := xshared.o xtables.o
SO_BOBJS := $(addprefix ${IPTABLES_APPS_BLDDIR}/,${SO_LOBJS})
SO_LIB := $(IPTABLES_APPS_BLDDIR)/libipt.so
STATIC_LIB := $(foreach T,$(SO_LIB),$(basename $(T))_pic.a)

all: $(ALL_STATIC_LIBS) $(ALL_SO_LIBS) $(APPL)

$(IPTABLES_APPS_BLDDIR)/libipt_ext.so $(IPTABLES_APPS_BLDDIR)/libipt_ext_pic.a:
	@$(MAKE) -C extensions
	@cp -f $(IPTABLES_APPS_BLDDIR)/extensions/libipt_ext.so $(IPTABLES_APPS_BLDDIR)
	@cp -f $(IPTABLES_APPS_BLDDIR)/extensions/libipt_ext_pic.a $(IPTABLES_APPS_BLDDIR)
	
$(IPTABLES_APPS_BLDDIR)/libipt_ext6.so $(IPTABLES_APPS_BLDDIR)/libipt_ext6_pic.a:
	@$(MAKE) -C extensions
	@cp -f $(IPTABLES_APPS_BLDDIR)/extensions/libipt_ext6.so $(IPTABLES_APPS_BLDDIR)
	@cp -f $(IPTABLES_APPS_BLDDIR)/extensions/libipt_ext6_pic.a $(IPTABLES_APPS_BLDDIR)
	
$(IPTABLES_APPS_BLDDIR)/libipt_iptc.so $(IPTABLES_APPS_BLDDIR)/libipt_iptc_pic.a:
	@$(MAKE) -C libiptc
	@cp -f $(IPTABLES_APPS_BLDDIR)/libiptc/libipt_iptc.so $(IPTABLES_APPS_BLDDIR)
	@cp -f $(IPTABLES_APPS_BLDDIR)/libiptc/libipt_iptc_pic.a $(IPTABLES_APPS_BLDDIR)

$(STATIC_LIB): $(SO_BOBJS)
	@$(AR) rcs $@ $^
	@$(RANLIB) $@
	
$(SO_LIB): $(SO_BOBJS)
	@$(CC) -shared -Wl,-soname,$(notdir $@) $(CFLAGS) -o $@ $^

ifneq ($(strip $(IPTABLES_APPS_MULTI_SUPPORT)),0)
$(IPTABLES_APPS_BLDDIR)/iptables: $(APPL_MAIN_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) -DIPTABLES_MULTI $(APPL_LDFLAGS) -o $@ $^
	
$(IPTABLES_APPS_BLDDIR)/iptables-save: $(IPTABLES_APPS_BLDDIR)/iptables

$(IPTABLES_APPS_BLDDIR)/iptables-restore: $(IPTABLES_APPS_BLDDIR)/iptables

$(IPTABLES_APPS_BLDDIR)/iptables-xml: $(IPTABLES_APPS_BLDDIR)/iptables

$(IPTABLES_APPS_BLDDIR)/ip6tables: $(APPL_MAIN6_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) -DIPTABLES_MULTI $(APPL_LDFLAGS) -o $@ $^
	
$(IPTABLES_APPS_BLDDIR)/ip6tables-save: $(IPTABLES_APPS_BLDDIR)/ip6tables

$(IPTABLES_APPS_BLDDIR)/ip6tables-restore: $(IPTABLES_APPS_BLDDIR)/ip6tables
else
$(IPTABLES_APPS_BLDDIR)/iptables: $(APPL_MAIN_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) $(APPL_LDFLAGS) -o $@ $^

$(IPTABLES_APPS_BLDDIR)/iptables-save: $(APPL_SAVE_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) $(APPL_LDFLAGS) -o $@ $^

$(IPTABLES_APPS_BLDDIR)/iptables-restore: $(APPL_RESTORE_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) $(APPL_LDFLAGS) -o $@ $^
	
$(IPTABLES_APPS_BLDDIR)/iptables-xml: $(APPL_XML_BOBJS)
	$(CC) $(CFLAGS) $(APPL_LDFLAGS) -o $@ $^
	
$(IPTABLES_APPS_BLDDIR)/ip6tables: $(APPL_MAIN6_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) $(APPL_LDFLAGS) -o $@ $^

$(IPTABLES_APPS_BLDDIR)/ip6tables-save: $(APPL_SAVE6_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) $(APPL_LDFLAGS) -o $@ $^

$(IPTABLES_APPS_BLDDIR)/ip6tables-restore: $(APPL_RESTORE_BOBJS) $(ALL_SO_LIBS)
	$(CC) $(CFLAGS) $(APPL_LDFLAGS) -o $@ $^
endif

$(IPTABLES_APPS_BLDDIR)/%.o: %.c
	@echo "Compiling $<"
	@$(CC) $(CFLAGS) -c $< -o $@
	
clean:
	@$(MAKE) -C extensions clean
	@$(MAKE) -C libiptc clean
	@rm -f $(APPL_MAIN_BOBJS:.o=.d)
	@rm -f $(APPL_MAIN_BOBJS)
	@rm -f $(APPL_MAIN6_BOBJS:.o=.d)
	@rm -f $(APPL_MAIN6_BOBJS)
	@rm -f $(APPL_SAVE_BOBJS:.o=.d)
	@rm -f $(APPL_SAVE_BOBJS)
	@rm -f $(APPL_SAVE6_BOBJS:.o=.d)
	@rm -f $(APPL_SAVE6_BOBJS)
	@rm -f $(APPL_RESTORE_BOBJS:.o=.d)
	@rm -f $(APPL_RESTORE_BOBJS)
	@rm -f $(APPL_RESTORE6_BOBJS:.o=.d)
	@rm -f $(APPL_RESTORE6_BOBJS)
	@rm -f $(APPL_XML_BOBJS:.o=.d)
	@rm -f $(APPL_XML_BOBJS)
	@rm -f $(APPL_SUB_BLDDIR)/ip*tables
	@rm -f $(IPTABLES_APPS_BLDDIR)/libipt_*.a
	@rm -f $(IPTABLES_APPS_BLDDIR)/libipt_*.so
	@rm -f $(IPTABLES_APPS_BLDDIR)/libipt.so

ifeq (,$(findstring clean,$(MAKECMDGOALS)))
-include $(addprefix ${IPTABLES_APPS_BLDDIR}/,$(addsuffix .d,$(basename $(LSRCS))))
$(IPTABLES_APPS_BLDDIR)/%.d: %.c
	-@if [ ! -d $(IPTABLES_APPS_BLDDIR)  ]; then mkdir -p $(IPTABLES_APPS_BLDDIR); fi
	$(CC) -M $(CFLAGS) $< >$@.tmp; \
	echo "$@ \\" > $@; \
	sed 's,\($*\)\.o[ :]*,$$(IPTABLES_APPS_BLDDIR)\/\1.o: ,g' < $@.tmp >> $@; \
	rm -f $@.tmp
endif