#
# Copyright (C) 1993-1998 by Darren Reed.
#
# See the IPFILTER.LICENCE file for details on licencing.
#
TOP=$(shell echo `pwd`/..)
TOP:sh=echo `pwd`/..
BINDEST=/usr/local/bin
SBINDEST=/sbin/$(OBJ)
MANDIR=/usr/share/man
CC=cc
CFLAGS=-I$(TOP)
#
# For SunOS 5.x
#
CPUDIR=$(shell echo `uname -p`-`uname -r`)
CPUDIR:sh=echo `uname -p`-`uname -r`
ROOT=$(CPUDIR)/root
PKGDIR=$(ROOT)/opt/ipf
PKGMAN=$(PKGDIR)/man
PKGBIN=$(PKGDIR)/bin/$(OBJ)
#
DEST=$(OBJ)
TOOL=$(TOP)/tools
#CPU=$(shell uname -p)
#REV=$(shell uname -v)
#CPU:sh=uname -p
#REV:sh=uname -r
HERE=SunOS5/$(CPUDIR)
BITS=$(shell if optisa amd64 sparcv9 >/dev/null 2>&1; then echo "64"; else echo "32"; fi)
BITS:sh=if optisa amd64 sparcv9 >/dev/null 2>&1; then echo "64"; else echo "32"; fi
ARCH=$(shell uname -p)
ARCH:sh=uname -p

OBJ32_i386=i86
OBJ64_i386=amd64
OBJ32_sparc=sparcv7
OBJ64_sparc=sparcv9
OBJ32=$(OBJ32_$(ARCH))
OBJ64=$(OBJ64_$(ARCH))

PROTO32_i386=prototype_ia32
PROTO64_i386=prototype_amd64
PROTO32_sparc=prototype32
PROTO64_sparc=prototype64
PROTO32=$(PROTO32_$(ARCH))
PROTO64=$(PROTO64_$(ARCH))

CC=gcc -Wall
DEBUG=-g
LIBS=-lsocket -lnsl -lelf -L$(OBJ) -lipf $(LIBBPF)
DEF=-I$(TOP)/../pfil -D_KERNEL -DSUNDDI $(IPFBPF)
OBJ=.
PKG=ipf
PROTO=prototype
BITTYPE=`if [ "$(BITS)" = 64 ];then echo ' (64-bit)'; fi`
OBJDIR=$(CPUDIR)/$(OBJ)
TMP=/tmp/ipfpkgs
ATON=-DNEED_INET_ATON
ROOTINC=$(ROOT)/usr/include
#
MFLAGS="BINDEST=$(BINDEST)" "SBINDEST=$(SBINDEST)" "MANDIR=$(MANDIR)" \
        'CFLAGS=$(CFLAGS) $(ARCHINC) $(SOLARIS2)' "IPFLKM=$(IPFLKM)" \
        "IPFLOG=$(IPFLOG)" "LOGFAC=$(LOGFAC)" "POLICY=$(POLICY)" \
        "SOLARIS2=$(SOLARIS2)" "DEBUG=$(DEBUG)" "CPUDIR=$(CPUDIR)" \
	"BITS=$(BITS)" "OBJ=$(OBJ)" "LOOKUP=$(LOOKUP)" "SYNC=$(SYNC)" \
	"ALLOPTS=$(ALLOPTS)"
#
########## ########## ########## ########## ########## ########## ##########
#
CP=/bin/cp
RM=/bin/rm
CHMOD=/bin/chmod
INSTALL=$(TOP)/bsdinstall
LIBSRC=$(TOP)/lib
RANLIB=echo
AROPTS=crs
#
DFLAGS=$(IPFLKM) $(DEF) $(SOLARIS2) $(IPFLOG) $(LOOKUP) $(SYNC)
#-DIPFDEBUG
MODOBJS=$(OBJ)/ip_fil.o $(OBJ)/fil.o $(OBJ)/solaris.o $(OBJ)/ip_state.o \
    $(OBJ)/ip_frag.o $(OBJ)/ip_nat.o $(OBJ)/ip_proxy.o $(OBJ)/ip_auth.o \
    $(OBJ)/ip_pool.o $(OBJ)/ip_htable.o $(OBJ)/ip_lookup.o $(OBJ)/ip_log.o \
    $(OBJ)/ip_scan.o $(OBJ)/ip_sync.o $(OBJ)/radix.o $(OBJ)/md5.o $(BPFILTER)
#	$(OBJ)/ip_trafcon.o
IPF=$(OBJ)/ipf.o $(OBJ)/ipfcomp.o $(OBJ)/ipf_y.o $(OBJ)/ipf_l.o
IPT=$(OBJ)/ipftest.o $(OBJ)/ip_fil_u.o $(OBJ)/ip_state_u.o \
    $(OBJ)/ip_frag_u.o $(OBJ)/ip_nat_u.o $(OBJ)/fil_u.o \
    $(OBJ)/ip_scan_u.o $(OBJ)/ip_sync_u.o $(OBJ)/ip_pool_u.o \
    $(OBJ)/ip_htable_u.o $(OBJ)/ip_lookup_u.o $(OBJ)/ip_proxy_u.o \
    $(OBJ)/ip_auth_u.o $(OBJ)/ip_log_u.o $(OBJ)/ip_rules_u.o\
    $(OBJ)/ippool_y.o $(OBJ)/ippool_l.o $(OBJ)/ipnat_y.o $(OBJ)/ipnat_l.o \
    $(OBJ)/ipf_y.o $(OBJ)/ipf_l.o $(OBJ)/radix_u.o $(OBJ)/md5_u.o \
    $(OBJ)/bpf_filter_u.o
#	$(OBJ)/ip_trafcon_u.o
IPNAT=$(OBJ)/ipnat.o $(OBJ)/ipnat_y.o $(OBJ)/ipnat_l.o
IPMON=$(OBJ)/ipmon.o $(OBJ)/ipmon_y.o $(OBJ)/ipmon_l.o
IPPOOL=$(OBJ)/ippool_y.o $(OBJ)/ippool_l.o $(OBJ)/kmem.o $(OBJ)/ippool.o
IPTRAFCON=$(OBJ)/iptrafcon.o
FILS=$(OBJ)/ipfstat.o
#
CCARGS=-I. $(DEBUG) $(CFLAGS)
EXTRA=$(ALLOPTS)

include $(TOP)/lib/Makefile

$(OBJ):
	@if [ ! -d $(OBJ) ]; then mkdir $(OBJ); fi


sunos5 solaris2 build: $(OBJ) $(OBJ)/libipf.a $(OBJ)/ipf.exe $(OBJ)/ipfstat \
    $(OBJ)/ipftest $(OBJ)/ipmon $(OBJ)/ipnat $(OBJ)/ipf $(OBJ)/ipfs \
    $(OBJ)/ippool $(OBJ)/ipfrule
	/bin/rm -f $(TOP)/ipf $(TOP)/$(OBJ)/ipf
	if [ -f /usr/lib/isaexec -a "$(OBJ)" != . ] ; then \
		mkdir -p $(TOP)/$(OBJ); \
		cp /usr/lib/isaexec $(TOP)/ipf; \
	fi
	ln -s `pwd`/$(OBJ)/ipf.exe $(TOP)/$(OBJ)/ipf
	-(for i in ipftest ipmon ippool ipnat ipscan ipsyncm ipsyncs; do \
		/bin/rm -f $(TOP)/$$i $(TOP)/$(OBJ)/$$i; \
		if [ -f /usr/lib/isaexec -a "$(OBJ)" != "." ] ; then \
			ln $(TOP)/ipf $(TOP)/$$i; \
		fi; \
		ln -s `pwd`/$(OBJ)/$$i $(TOP)/$(OBJ)/$$i; \
		done;\
	)

pkg: $(CPUDIR)/ipf.pkg

$(OBJ)/ipfstat: $(FILS) $(OBJ)/libipf.a
	$(CC) $(CCARGS) $(FILS) -o $@ $(LIBS) $(STATETOP_LIB) -lkvm

$(OBJ)/ipf.exe: $(IPF) $(OBJ)/libipf.a
	$(CC) $(CCARGS) $(IPF) -o $@ $(LIBS) -ll $(LIBBPF)

# Magic dependency on ipf.exe creates the $(TOP)/$(OBJ{32,64}) directories.
$(OBJ)/ipftest: $(IPT) $(OBJ)/ipf.exe $(OBJ)/libipf.a
	$(CC) $(CCARGS) $(IPT) -o $@ $(LIBS) -ll $(LIBBPF)

$(OBJ)/ipnat: $(IPNAT) $(OBJ)/libipf.a
	$(CC) $(CFLAGS) $(IPNAT) -o $@ $(LIBS) -lkvm -ll

$(OBJ)/ipfs: $(OBJ)/ipfs.o
	$(CC) $(CCARGS) $(OBJ)/ipfs.o -o $@

$(OBJ)/ipsyncm: $(OBJ)/ipsyncm.o $(OBJ)/libipf.a
	$(CC) $(CCARGS) $(OBJ)/ipsyncm.o -o $@ $(LIBS)

$(OBJ)/ipsyncs: $(OBJ)/ipsyncs.o $(OBJ)/libipf.a
	$(CC) $(CCARGS) $(OBJ)/ipsyncs.o -o $@ $(LIBS)

$(OBJ)/ipsyncm.o: $(TOOL)/ipsyncm.c $(TOP)/ip_sync.h
	$(CC) $(CCARGS) -c $(TOOL)/ipsyncm.c -o $@

$(OBJ)/ipsyncs.o: $(TOOL)/ipsyncs.c $(TOP)/ip_sync.h
	$(CC) $(CCARGS) -c $(TOOL)/ipsyncs.c -o $@

tests:
	(cd test; make )

$(OBJ)/ipfstat.o: $(TOOL)/ipfstat.c $(TOP)/ip_fil.h $(TOP)/ipf.h
	$(CC) $(CCARGS) $(STATETOP_CFLAGS) $(STATETOP_INC) \
		-c $(TOOL)/ipfstat.c -o $@

$(OBJ)/ipfs.o: $(TOOL)/ipfs.c $(TOP)/ip_fil.h $(TOP)/ipf.h $(TOP)/ip_state.h \
		$(TOP)/ip_nat.h
	$(CC) $(CCARGS) -c $(TOOL)/ipfs.c -o $@

$(OBJ)/fil_u.o: $(TOP)/fil.c $(TOP)/ip_fil.h $(TOP)/ipf.h
	$(CC) $(CCARGS) $(EXTRA) $(IPFBPF) -c $(TOP)/fil.c -o $@

$(OBJ)/fil.o: $(TOP)/fil.c $(TOP)/ip_fil.h $(TOP)/ipf.h
	$(CC) -I$(TOP) $(POLICY) $(DFLAGS) $(IPFBPF) -c $(TOP)/fil.c -o $@

$(OBJ)/ipf.o: $(TOOL)/ipf.c $(TOP)/ip_fil.h $(TOP)/ipf.h
	$(CC) $(CCARGS) -c $(TOOL)/ipf.c -o $@

$(OBJ)/ipfcomp.o: $(TOOL)/ipfcomp.c $(TOP)/ip_fil.h $(TOP)/ipf.h
	$(CC) $(CCARGS) -c $(TOOL)/ipfcomp.c -o $@

$(OBJ)/ipf_y.o: ipf_y.c $(TOP)/ip_fil.h $(TOP)/ipf.h ipf_y.h ipf_l.h
	$(CC) $(CCARGS) $(IPFBPF) -c ipf_y.c -o $@

$(OBJ)/ipf_l.o: ipf_l.c $(TOP)/ip_fil.h $(TOP)/ipf.h ipf_y.h ipf_l.h
	$(CC) $(CCARGS) -I. -I$(TOP)/tools -c ipf_l.c -o $@

ipf_y.h ipf_y.c: $(TOOL)/ipf_y.y $(TOP)/ipf.h $(TOP)/ip_fil.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ipf_l.c: $(TOOL)/lexer.c $(TOP)/ipf.h $(TOP)/ip_fil.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ipf_l.h: $(TOOL)/lexer.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

$(OBJ)/ipftest.o: $(TOOL)/ipftest.c $(TOP)/ip_fil.h $(TOP)/ipt.h $(TOP)/ipf.h
	$(CC) $(CCARGS) -c $(TOOL)/ipftest.c -o $@

$(OBJ)/ipnat.o: $(TOOL)/ipnat.c $(TOP)/ip_fil.h $(TOP)/ipf.h $(TOP)/ip_nat.h
	$(CC) $(CCARGS) -c $(TOOL)/ipnat.c -o $@

$(OBJ)/ipnat_y.o: ipnat_y.c ipnat_y.h $(TOP)/ip_nat.h ipnat_l.h
	$(CC) $(CCARGS) -c ipnat_y.c -o $@

$(OBJ)/ipnat_l.o: ipnat_l.c ipnat_y.h $(TOP)/ip_nat.h ipnat_l.h
	$(CC) $(CCARGS) -I. -I$(TOP)/tools -c ipnat_l.c -o $@

ipnat_y.h ipnat_y.c: $(TOOL)/ipnat_y.y $(TOP)/ip_nat.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ipnat_l.c: $(TOOL)/lexer.c $(TOP)/ip_nat.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ipnat_l.h: $(TOOL)/lexer.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

$(OBJ)/mlso_rule.o: $(TOP)/mlso_rule.c
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/mlso_rule.c -o $@

$(OBJ)/ip_rules.o: $(OBJ)/ip_rules.c $(TOP)/ip_rules.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(OBJ)/ip_rules.c -o $@

$(OBJ)/ip_rulesx.o: $(OBJ)/ip_rules.c $(TOP)/ip_rules.h
	$(CC) -I$(TOP) -DIPFILTER_COMPILED $(DFLAGS) -c $(OBJ)/ip_rules.c -o $@

$(OBJ)/ipfrule: $(OBJ)/ip_rulesx.o $(OBJ)/mlso_rule.o
	ld -r $(OBJ)/ip_rulesx.o $(OBJ)/mlso_rule.o -o $@

$(OBJ)/ipf: $(MODOBJS)
	ld -dy -Ndrv/ip -Ndrv/pfil -Nmisc/md5 -r $(MODOBJS) -o $@

$(OBJ)/md5.o: $(TOP)/md5.c $(TOP)/md5.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/md5.c -o $@

$(OBJ)/radix.o: $(TOP)/md5.c $(TOP)/radix_ipf.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/radix.c -o $@

$(OBJ)/ip_nat.o: $(TOP)/ip_nat.c $(TOP)/ip_nat.h $(TOP)/ip_compat.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_nat.c -o $@

$(OBJ)/ip_state.o: $(TOP)/ip_state.c $(TOP)/ip_state.h $(TOP)/ip_compat.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_state.c -o $@

$(OBJ)/ip_scan.o: $(TOP)/ip_scan.c $(TOP)/ip_scan.h $(TOP)/ip_compat.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_scan.c -o $@

$(OBJ)/ip_sync.o: $(TOP)/ip_sync.c $(TOP)/ip_sync.h $(TOP)/ip_compat.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_sync.c -o $@

$(OBJ)/ip_proxy.o: $(TOP)/ip_proxy.c $(TOP)/ip_proxy.h $(TOP)/ip_compat.h \
        $(TOP)/ip_ftp_pxy.c $(TOP)/ip_rcmd_pxy.c $(TOP)/ip_raudio_pxy.c \
        $(TOP)/ip_rpcb_pxy.c $(TOP)/ip_ipsec_pxy.c $(TOP)/ip_nat.h \
	$(TOP)/ip_fil.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_proxy.c -o $@

$(OBJ)/ip_frag.o: $(TOP)/ip_frag.c $(TOP)/ip_frag.h $(TOP)/ip_compat.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_frag.c -o $@

$(OBJ)/ip_auth.o: $(TOP)/ip_auth.c $(TOP)/ip_auth.h $(TOP)/ip_compat.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_auth.c -o $@

$(OBJ)/ip_pool.o: $(TOP)/ip_pool.c $(TOP)/ip_compat.h $(TOP)/ip_fil.h \
	$(TOP)/ip_pool.h $(TOP)/ip_lookup.h
	$(CC) $(CCARGS) $(DFLAGS) -c $(TOP)/ip_pool.c -o $@

$(OBJ)/ip_htable.o: $(TOP)/ip_htable.c $(TOP)/ip_compat.h $(TOP)/ip_fil.h \
	$(TOP)/ip_htable.h $(TOP)/ip_lookup.h
	$(CC) $(CCARGS) $(DFLAGS) -c $(TOP)/ip_htable.c -o $@

$(OBJ)/ip_lookup.o: $(TOP)/ip_lookup.c $(TOP)/ip_compat.h $(TOP)/ip_fil.h \
	$(TOP)/ip_pool.h $(TOP)/ip_htable.h $(TOP)/ip_lookup.h
	$(CC) $(CCARGS) $(DFLAGS) -c $(TOP)/ip_lookup.c -o $@

$(OBJ)/ip_trafcon.o: $(TOP)/ip_trafcon.c $(TOP)/ip_compat.h $(TOP)/ip_fil.h \
	$(TOP)/ip_trafcon.h
	$(CC) $(CCARGS) $(DFLAGS) -c $(TOP)/ip_trafcon.c -o $@

$(OBJ)/bpf_filter.o: $(TOP)/bpf_filter.c $(TOP)/bpf-ipf.h $(TOP)/pcap-ipf.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/bpf_filter.c -o $@

$(OBJ)/bpf_filter_u.o: $(TOP)/bpf_filter.c
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/bpf_filter.c -o $@

$(OBJ)/md5_u.o: $(TOP)/md5.c $(TOP)/md5.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/md5.c -o $@

$(OBJ)/radix_u.o: $(TOP)/radix.c $(TOP)/radix_ipf.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/radix.c -o $@

$(OBJ)/ip_nat_u.o: $(TOP)/ip_nat.c $(TOP)/ip_nat.h $(TOP)/ip_compat.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_nat.c -o $@

$(OBJ)/ip_frag_u.o: $(TOP)/ip_frag.c $(TOP)/ip_frag.h $(TOP)/ip_compat.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_frag.c -o $@

$(OBJ)/ip_state_u.o: $(TOP)/ip_state.c $(TOP)/ip_state.h $(TOP)/ip_compat.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_state.c -o $@

$(OBJ)/ip_scan_u.o: $(TOP)/ip_scan.c $(TOP)/ip_scan.h $(TOP)/ip_compat.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_scan.c -o $@

$(OBJ)/ip_sync_u.o: $(TOP)/ip_sync.c $(TOP)/ip_sync.h $(TOP)/ip_compat.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_sync.c -o $@

$(OBJ)/ip_pool_u.o: $(TOP)/ip_pool.c $(TOP)/ip_pool.h $(TOP)/ip_compat.h \
	$(TOP)/ip_fil.h $(TOP)/ip_lookup.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_pool.c -o $@

$(OBJ)/ip_htable_u.o: $(TOP)/ip_htable.c $(TOP)/ip_htable.h $(TOP)/ip_compat.h \
	$(TOP)/ip_fil.h $(TOP)/ip_lookup.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_htable.c -o $@

$(OBJ)/ip_lookup_u.o: $(TOP)/ip_lookup.c $(TOP)/ip_lookup.h $(TOP)/ip_compat.h \
	$(TOP)/ip_fil.h $(TOP)/ip_lookup.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_lookup.c -o $@

$(OBJ)/ip_trafcon_u.o: $(TOP)/ip_trafcon.c $(TOP)/ip_compat.h $(TOP)/ip_fil.h \
	$(TOP)/ip_trafcon.h
	$(CC) $(CCARGS) -c $(TOP)/ip_trafcon.c -o $@

$(OBJ)/ip_auth_u.o: $(TOP)/ip_auth.c $(TOP)/ip_auth.h $(TOP)/ip_compat.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_auth.c -o $@

$(OBJ)/ip_proxy_u.o: $(TOP)/ip_proxy.c $(TOP)/ip_proxy.h $(TOP)/ip_compat.h \
        $(TOP)/ip_ftp_pxy.c $(TOP)/ip_rcmd_pxy.c $(TOP)/ip_raudio_pxy.c \
        $(TOP)/ip_rpcb_pxy.c $(TOP)/ip_ipsec_pxy.c $(TOP)/ip_nat.h \
	$(TOP)/ip_fil.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_proxy.c -o $@

$(OBJ)/ip_rules.c: $(OBJ)/ipf.exe $(TOP)/tools/ipfcomp.c $(TOP)/rules/ip_rules
	$(OBJ)/ipf.exe -cc -nf $(TOP)/rules/ip_rules
	-/bin/mv -f ip_rules.c $(OBJ)

$(TOP)/ip_rules.h: $(OBJ)/ip_rules.c
	if [ -f ip_rules.h ] ; then \
		/bin/mv -f ip_rules.h $(TOP) ; \
	fi

$(OBJ)/ip_rules_u.o: $(OBJ)/ip_rules.c $(TOP)/ip_fil.h $(TOP)/ip_rules.h
	$(CC) $(CCARGS) $(EXTRA) -c $(OBJ)/ip_rules.c -o $@

$(OBJ)/ip_fil_u.o: $(TOP)/ip_fil.c $(TOP)/ip_fil.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_fil.c -o $@

$(OBJ)/ip_fil.o: $(TOP)/ip_fil_solaris.c $(TOP)/ip_fil.h
	$(CC) -I$(TOP) $(DFLAGS) $(COMPIPF) -c $(TOP)/ip_fil_solaris.c -o $@

$(OBJ)/ip_log_u.o: $(TOP)/ip_log.c $(TOP)/ip_fil.h
	$(CC) $(CCARGS) $(EXTRA) -c $(TOP)/ip_log.c -o $@

$(OBJ)/ip_log.o: $(TOP)/ip_log.c $(TOP)/ip_fil.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/ip_log.c -o $@

$(OBJ)/solaris.o: $(TOP)/solaris.c $(TOP)/ipl.h
	$(CC) -I$(TOP) $(DFLAGS) -c $(TOP)/solaris.c -o $@

$(OBJ)/ipmon: $(IPMON) $(OBJ)/libipf.a
	$(CC) $(CCARGS) $(LOGFAC) $(IPMON) -o $@ $(LIBS) -ll

$(OBJ)/ipmon.o: $(TOOL)/ipmon.c $(TOP)/ipmon.h
	$(CC) $(CCARGS) $(LOGFAC) -c $(TOOL)/ipmon.c -o $@

$(OBJ)/ipmon_y.o: ipmon_y.c $(TOP)/ipmon.h ipmon_y.h ipmon_l.h
	$(CC) $(CCARGS) -c ipmon_y.c -o $@

$(OBJ)/ipmon_l.o: ipmon_l.c $(TOP)/ipmon.h ipmon_y.h ipmon_l.h
	$(CC) $(CCARGS) -I. -I$(TOP)/tools -c ipmon_l.c -o $@

ipmon_y.c $(OBJ)/ipmon_y.h: $(TOOL)/ipmon_y.y $(TOP)/ipmon.h
	(cd $(TOOL); make DEST=../$(HERE) ../$(HERE)/$@)
	mv ipmon_y.c y.tab.c
	sed -e 's/extern [a-z]* .*();//' \
	    -e 's/^\(static [a-z]* .*\)();/\1(void);/' y.tab.c > $@
	/bin/rm -f y.tab.c

ipmon_l.c: $(TOOL)/lexer.c $(TOP)/ipmon.h
	(cd $(TOOL); make DEST=../$(HERE) ../$(HERE)/$@)

ipmon_l.h: $(TOOL)/lexer.h
	(cd $(TOOL); make DEST=../$(HERE) ../$(HERE)/$@)

$(OBJ)/ipscan: $(OBJ)/ipscan_y.o $(OBJ)/ipscan_l.o $(OBJ)/libipf.a
	$(CC) $(DEBUG) $(OBJ)/ipscan_y.o $(OBJ)/ipscan_l.o -o $@ -ll $(LIBS)

$(OBJ)/ipscan_y.o: ipscan_y.c ipscan_y.h $(TOP)/ip_scan.h
	$(CC) $(CCARGS) -c ipscan_y.c -o $@

$(OBJ)/ipscan_l.o: ipscan_l.c ipscan_y.h $(TOP)/ip_scan.h ipscan_l.h
	$(CC) $(CCARGS) -I. -I$(TOP)/tools -c ipscan_l.c -o $@

ipscan_y.h ipscan_y.c: $(TOOL)/ipscan_y.y $(TOP)/ip_scan.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ipscan_l.c: $(TOOL)/lexer.c $(TOP)/ip_scan.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ipscan_l.h: $(TOOL)/lexer.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

$(OBJ)/ippool: $(IPPOOL)
	$(CC) $(CCARGS) -I. $(IPPOOL) -o $@ $(LIBS) -ll -lkvm

$(OBJ)/ippool.o: $(TOOL)/ippool.c $(TOP)/ip_pool.h
	$(CC) $(CCARGS) -c $(TOOL)/ippool.c -o $@

$(OBJ)/ippool_y.o: ippool_y.c ippool_y.h $(TOP)/ip_pool.h ippool_l.h
	$(CC) $(CCARGS) -c ippool_y.c -o $@

$(OBJ)/ippool_l.o: ippool_l.c ippool_y.h $(TOP)/ip_pool.h ippool_l.h
	$(CC) $(CCARGS) -I. -I$(TOP)/tools -c ippool_l.c -o $@

ippool_y.h ippool_y.c: $(TOOL)/ippool_y.y $(TOP)/ip_pool.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ippool_l.c: $(TOOL)/lexer.c $(TOP)/ip_pool.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

ippool_l.h: $(TOOL)/lexer.h
	(cd $(TOOL); make "DEST=../$(HERE)" ../$(HERE)/$@)

$(OBJ)/iptrafcon.o: $(TOP)/iptrafcon.c
	$(CC) $(CCARGS) -c $(TOP)/iptrafcon.c -o $@

$(OBJ)/iptrafcon: $(IPTRAFCON) $(OBJ)/libipf.a
	$(CC) $(CCARGS) $(IPTRAFCON) -o $@ $(LIBS)

.y.c:

.l.c:

clean:
	${RM} -f $(TOP)/ipf $(TOP)/ipnat $(TOP)/ipmon $(TOP)/ippool
	${RM} -f $(TOP)/ipftest $(TOP)/ipscan $(TOP)/ipsyncm $(TOP)/ipsyncs
	if [ `basename \`pwd\`` != SunOS5 ] ; then \
		${RM} -f core *.o ipfrule ipf ipfstat ipftest ipmon ipnat ; \
		${RM} -f ipf.exe ipfs ipsyncm ipsyncs libipf.a; \
		${RM} -f ipnat.5 ipnat.4 ipnat.8 ipfilter.4 ipfilter.5; \
		${RM} -f ippool.8 ippool.5 ipscan.8 ipscan.5 ipmon.5; \
		${RM} -f prototype pkginfo postinstall postremove copyright; \
		${RM} -f ip_fil.c ipf_l.c ipf_y.c ipf_y.h ipf_l.h; \
		${RM} -f ipscan ipscan_y.c ipscan_y.h ipscan_l.c; \
		${RM} -f ippool ippool_y.c ippool_y.h ippool_l.c; \
		${RM} -f ipscan_l.h ippool_l.h ip_rules.c ip_rules.h; \
		${RM} -f ipnat_y.c ipnat_y.h ipnat_l.c ipnat_l.h; \
		${RM} -f ipmon_y.c ipmon_y.h ipmon_l.c ipmon_l.h; \
		${RM} -f ipsyncm ipsyncs ipfs; \
	fi
	/bin/rm -rf */root ipf.pkg* $(OBJ32) $(OBJ64)
	make -f Makefile.ipsend clean "TOP=${TOP}"
	-(for i in *; do \
		if [ -d $${i} -a -h $${i}/Makefile ] ; then \
			(cd $${i}; make TOP=`cd ..; cd $(TOP); pwd` clean); \
			rm $${i}/Makefile $${i}/Makefile.ipsend; \
			rmdir $${i}; \
		fi \
	 done)

$(CPUDIR)/ipf.pkg: $(CPUDIR)/ipf.pkg.common
	if [ -d $(CPUDIR)/$(OBJ32) ]; then \
		$(MAKE) PROTO=$(PROTO32) PKG=ipf OBJ=$(OBJ32) \
		 BITS=32 TOP=$(TOP) ipf.pkg.bin; \
		$(MAKE) PROTO=$(PROTO64) PKG=ipfx OBJ=$(OBJ64) \
		 BITS=64 TOP=$(TOP) ipf.pkg.bin; \
	else \
		($(MAKE) PROTO=prototype OBJ=. BITS=${BITS} \
		 TOP=$(TOP) ipf.pkg.bin) \
	fi
	touch $(CPUDIR)/ipf.pkg
	pkgtrans -s $(TMP) $(CPUDIR)/ipf.pkg `ls $(TMP)`
	/bin/rm -f ipf.pkg
	rm -rf $(TMP)/ipf*

$(CPUDIR)/ipf.pkg.common:
	mkdir -p $(ROOTINC)/ipfilter $(PKGDIR)/examples $(ROOT)/usr/kernel/drv
	mkdir -p $(ROOT)/etc/init.d $(TMP)
	mkdir -p $(PKGMAN)/man1 $(PKGMAN)/man4 $(PKGMAN)/man5 $(PKGMAN)/man8
	-$(INSTALL) -c ipfboot $(ROOT)/etc/init.d
	-cp $(TOP)/man/*.[0-9] .
	-$(INSTALL) -c ipf.conf $(ROOT)/usr/kernel/drv
	-$(INSTALL) ipf.8 $(PKGMAN)/man8
	-$(INSTALL) ipfs.8 $(PKGMAN)/man8
	-$(INSTALL) ipnat.8 $(PKGMAN)/man8
	-$(INSTALL) ipftest.1 $(PKGMAN)/man1
	-$(INSTALL) mkfilters.1 $(PKGMAN)/man1
	-$(INSTALL) ipf.4 $(PKGMAN)/man4
	-$(INSTALL) ipfilter.4 $(PKGMAN)/man4
	-$(INSTALL) ipnat.4 $(PKGMAN)/man4
	-$(INSTALL) ipl.4 $(PKGMAN)/man4
	-$(INSTALL) ipf.5 $(PKGMAN)/man5
	-$(INSTALL) ipnat.5 $(PKGMAN)/man5
	-$(INSTALL) ippool.5 $(PKGMAN)/man5
	-$(INSTALL) ipfilter.5 $(PKGMAN)/man5
	-$(INSTALL) ipfstat.8 $(PKGMAN)/man8
	-$(INSTALL) ipmon.8 $(PKGMAN)/man8
	-$(INSTALL) ippool.8 $(PKGMAN)/man8
	-cp $(TOP)/rules/* $(PKGDIR)/examples
	-cp $(TOP)/ip_fil.h $(TOP)/ip_compat.h $(TOP)/ip_state.h .
	-cp $(TOP)/ip_nat.h $(TOP)/ip_frag.h $(TOP)/ip_proxy.h .
	-cp $(TOP)/ip_auth.h $(TOP)/ip_htable.h $(TOP)/ip_pool.h .
	-cp $(TOP)/ip_lookup.h .
	-$(INSTALL) ip_fil.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_compat.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_state.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_nat.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_frag.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_htable.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_lookup.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_pool.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_proxy.h $(ROOTINC)/ipfilter
	-$(INSTALL) ip_auth.h $(ROOTINC)/ipfilter
	touch $@

#
# For 64 bit Solaris, we build 32 and 64 bit packages, but the 64 bit package
# is smaller and only contains the 64 bit specific and not the common stuff.
#
ipf.pkg.bin:
	mkdir -p $(PKGBIN) $(ROOT)/$(SBINDEST) $(ROOT)/usr/kernel/drv/$(OBJ)
	-$(INSTALL) -c -s $(OBJDIR)/ipftest $(PKGBIN)/ipftest
	-$(INSTALL) -c -s $(OBJDIR)/ipmon $(PKGBIN)/ipmon
	-$(INSTALL) -c -s $(OBJDIR)/ipsend $(PKGBIN)/ipsend
	-$(INSTALL) -c -s $(OBJDIR)/ipresend $(PKGBIN)/ipresend
	-$(INSTALL) -c $(TOP)/mkfilters $(PKGBIN)/mkfilters
	-$(INSTALL) -c $(OBJDIR)/ipf $(ROOT)/usr/kernel/drv/$(OBJ)/ipf
	-$(INSTALL) -c -s $(OBJDIR)/ipnat $(ROOT)/$(SBINDEST)/ipnat
	-$(INSTALL) -c -s $(OBJDIR)/ippool $(ROOT)/$(SBINDEST)/ippool
	-$(INSTALL) -c -s $(OBJDIR)/ipf.exe $(ROOT)/$(SBINDEST)/ipf
	-$(INSTALL) -c -s $(OBJDIR)/ipfs $(ROOT)/$(SBINDEST)/ipfs
	-$(INSTALL) -c -s $(OBJDIR)/ipfstat $(ROOT)/$(SBINDEST)/ipfstat
#	-(cd $(CPUDIR); rm -f copyright post* prototype pkginfo)
	-(cd $(CPUDIR); rm -f prototype)
#	-(cd $(CPUDIR); ln -s ../copyright ../postinstall ../postremove .)
	-(cd $(CPUDIR); ln -s ../$(PROTO) prototype)
	-sed -e 's/ipf/$(PKG)/' -e "s/NAME=.*/&$(BITTYPE)/" \
	     -e "s/ARCH=.*/ARCH=`uname -p` (${BITS}-bit)/" \
		< pkginfo > $(CPUDIR)/pkginfo
	-if [ "$(BITS)" = 64 ]; then echo 'SUNW_ISA=$(OBJ64)' >> $(CPUDIR)/pkginfo; fi
	(cd $(CPUDIR); pkgmk -a `uname -p` -o -d $(TMP))


package install: $(CPUDIR)/ipf.pkg
	/bin/rm -f ipf.pkg
	ln -s $(CPUDIR)/ipf.pkg ipf.pkg
	@if [ `id|sed -e 's/^.[^(]*(\([^)]*\)).*/\1/'` != root ] ; then \
		echo "Can only install if root"; \
		exit 1; \
	fi
	# Must add ipfx before ipf or driver attach fails.
	-[ -d $(CPUDIR)/$(OBJ64) ] && pkgadd -d ipf.pkg ipfx
	-pkgadd -d ipf.pkg ipf
