CC := gcc
LD := ld
STRIP := strip
RM := rm -f
INSTALL := install

KERNEL_BASE := /usr/src/linux
NF_BASE := ..
PERL_BASE := $(shell perl -e 'use Config; print $$Config{archlibexp}, "\n";')
INSTALL_BASE := $(shell perl -e 'use Config; print $$Config{siteprefixexp}, "\n";')

KERNEL_INC := $(KERNEL_BASE)/include
NF_INC := $(NF_BASE)/include
PERL_INC := $(PERL_BASE)/CORE
ifndef INSTALL_DIR
INSTALL_DIR := $(INSTALL_BASE)/lib/IPTables-IPv4
endif

CFLAGS := -I$(KERNEL_INC) -I$(NF_INC) -I$(PERL_INC) -I.. -Wall -O2 -Wundef

# Basic protocol modules for IPTables::IPv4
MODULE_NAMES := icmp tcp udp ah esp
# Standard external targets
MODULE_NAMES += DNAT LOG MARK MASQUERADE MIRROR REDIRECT REJECT SNAT TOS standard
# Standard matches
MODULE_NAMES += limit mac mark multiport owner state tos unclean

MODULE_NAMES += DSCP ECN FTOS TARPIT TCPMSS TTL ULOG
MODULE_NAMES += ecn dscp iplimit tcpmss ttl


# Default module for IPTables::IPv6
V6_MODULE_NAMES := eui64 hl icmpv6 length limit mac mark multiport owner standard tcp udp HL LOG MARK

# Pick up any modules that are supposed to be conditional
MODULE_NAMES += $(foreach T,$(wildcard ./.*-test),$(shell KERNEL_DIR=$(KERNEL_BASE) sh $(T)))
V6_MODULE_NAMES += $(foreach T,$(wildcard ./.*-test6),$(shell KERNEL_DIR=$(KERNEL_BASE) sh $(T)))

MODULE_LIST := $(foreach T,$(MODULE_NAMES),ipt_pl_$(T).so)
V6_MODULE_LIST := $(foreach T,$(V6_MODULE_NAMES),ip6t_pl_$(T).so)

default: all

clean:
	-$(RM) *.so *.o

all: $(MODULE_LIST) $(V6_MODULE_LIST)
	@echo "Module build complete."

%.so: %.o
	$(LD) -shared -o $@ $<

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

strip: $(MODULE_LIST) $(V6_MODULE_LIST)
	$(STRIP) $^

install: all strip
	@echo "Installing modules in $(INSTALL_DIR):"
	$(INSTALL) -d -m 755 $(INSTALL_DIR)
	$(INSTALL) -m 644 $(MODULE_LIST) $(V6_MODULE_LIST) $(INSTALL_DIR)