#
#   Copyright (C) 1995, 1996, 1997, 2000, 2007, 2011 Free Software Foundation, Inc.
#
#   This file is part of the GNU Hurd.
#
#   The GNU Hurd is free software; you can redistribute it and/or
#   modify it under the terms of the GNU General Public License as
#   published by the Free Software Foundation; either version 2, or (at
#   your option) any later version.
#
#   The GNU Hurd is distributed in the hope that it will be useful, but
#   WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#   General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.

dir		:= pfinet
makemode	:= server

core-srcs	:= datagram.c						      \
		   dev.c						      \
		   dev_mcast.c						      \
		   dst.c						      \
		   iovec.c						      \
		   neighbour.c						      \
		   skbuff.c						      \
		   sock.c						      \
		   utils.c
arch-lib-srcs   := checksum.c old-checksum.c csum_partial_copy.c
ethernet-srcs	:= eth.c
ipv4-srcs	:= af_inet.c						      \
		   arp.c						      \
		   devinet.c						      \
		   fib_frontend.c					      \
		   fib_hash.c						      \
		   fib_semantics.c					      \
		   icmp.c						      \
		   igmp.c						      \
		   ip_forward.c						      \
		   ip_fragment.c					      \
		   ip_input.c						      \
		   ip_options.c						      \
		   ip_output.c						      \
		   ip_sockglue.c					      \
		   protocol.c						      \
		   raw.c						      \
		   route.c						      \
		   syncookies.c						      \
		   sysctl_net_ipv4.c					      \
		   tcp.c						      \
		   tcp_input.c						      \
		   tcp_ipv4.c						      \
		   tcp_output.c						      \
		   tcp_timer.c						      \
		   timer.c						      \
		   udp.c						      \
		   utils.c
ipv6-srcs      :=  addrconf.c						      \
		   af_inet6.c						      \
		   datagram_ipv6.c					      \
		   exthdrs.c						      \
		   icmpv6.c						      \
		   ip6_fib.c      					      \
		   ip6_flowlabel.c					      \
		   ip6_input.c    					      \
		   ip6_output.c   					      \
		   ipv6_sockglue.c					      \
		   mcast.c						      \
		   ndisc.c						      \
		   protocol_ipv6.c					      \
		   raw_ipv6.c						      \
		   reassembly.c						      \
		   route_ipv6.c						      \
		   tcp_ipv6.c						      \
		   udp_ipv6.c
ARCHS		= alpha arm i386 m68k ppc s390 sparc sparc64

LINUXSRCS	= $(core-srcs) $(ethernet-srcs) $(ipv4-srcs) $(ipv6-srcs)
ARCHSRCS	= $(notdir $(wildcard $(addprefix \
			   $(srcdir)/linux-src/arch/$(asm_syntax)/lib/,\
			   $(arch-lib-srcs) $(arch-lib-srcs:.c=.S))))
SRCS		= sched.c timer-emul.c socket.c main.c ethernet.c \
		  io-ops.c socket-ops.c misc.c time.c options.c loopback.c \
		  kmem_cache.c stubs.c dummy.c tunnel.c pfinet-ops.c \
		  iioctl-ops.c
MIGSRCS		= ioServer.c socketServer.c startup_notifyServer.c \
		  pfinetServer.c iioctlServer.c
OBJS		= $(patsubst %.S,%.o,$(patsubst %.c,%.o,\
			     $(LINUXSRCS) $(ARCHSRCS) $(SRCS) $(MIGSRCS)))
LCLHDRS		= config.h mapped-time.h mutations.h pfinet.h
LINUXHDRS	= bitops.h capability.h delay.h errqueue.h etherdevice.h \
		  fddidevice.h firewall.h icmp.h icmpv6.h if_arp.h if_ether.h \
		  if_fddi.h if_packet.h if_ppp.h if_tunnel.h if_tr.h \
		  igmp.h in.h in_route.h inet.h inetdevice.h init.h ip.h \
		  ip_fw.h ipsec.h ipv6_route.h ipx.h kmod.h linkage.h lists.h \
		  module.h mroute.h net.h netdevice.h netlink.h notifier.h \
		  pkt_cls.h pkt_sched.h ppp_defs.h random.h route.h \
		  rtnetlink.h skbuff.h stddef.h sysctl.h tasks.h tcp.h times.h \
		  trdevice.h udp.h
LINUXNETHDRS	= addrconf.h arp.h br.h checksum.h datalink.h dst.h flow.h \
		  icmp.h if_inet6.h inet_common.h ip.h ip_fib.h ip6_fib.h \
		  ip6_route.h ipip.h ipv6.h ipx.h ipxcall.h ndisc.h \
		  neighbour.h p8022.h p8022call.h pkt_cls.h pkt_sched.h \
		  profile.h protocol.h psnap.h psnapcall.h rarp.h raw.h \
		  rawv6.h route.h slhc.h snmp.h sock.h tcp.h transp_v6.h udp.h
ARCHHDRS	= checksum.h
FROBBEDLINUXHEADERS = autoconf.h binfmts.h config.h errno.h fcntl.h fs.h \
	if.h in.h in6.h interrupt.h ioctl.h ipv6.h \
	kernel.h limits.h major.h malloc.h mm.h param.h personality.h \
	poll.h proc_fs.h sched.h slab.h socket.h sockios.h stat.h \
	string.h termios.h time.h timer.h timex.h types.h un.h version.h wait.h
ASMHEADERS = atomic.h bitops.h byteorder.h delay.h errno.h hardirq.h init.h \
	segment.h spinlock.h system.h types.h uaccess.h

HURDLIBS=trivfs fshelp threads ports ihash shouldbeinlibc iohelp

target = pfinet

include ../Makeconf

vpath %.c $(addprefix $(srcdir)/linux-src/net/,core ethernet ipv4 ipv6)
vpath %.c $(srcdir)/linux-src/arch/$(asm_syntax)/lib
vpath %.S $(srcdir)/linux-src/arch/$(asm_syntax)/lib

CPPFLAGS += -imacros $(srcdir)/config.h		\
	    -I$(srcdir)/glue-include		\
	    -I$(srcdir)/linux-src/include

# Don't ask...  We use Linux code.  The problem was first noticed when
# compiling `pfinet' with GCC 4.2.
CFLAGS += -fno-strict-aliasing

asm/checksum.h: ../config.status
	mkdir -p $(@D)
	echo > $@.new \
	     '#include "../linux-src/include/asm-$(asm_syntax)/checksum.h"'
	mv -f $@.new $@

io-MIGSFLAGS = -imacros $(srcdir)/mutations.h
socket-MIGSFLAGS = -imacros $(srcdir)/mutations.h

# cpp doesn't automatically make dependencies for -imacros dependencies. argh.
io_S.h ioServer.c socket_S.h socketServer.c: mutations.h
$(OBJS): config.h

lndist: lndist-linux-src-net-core-files lndist-linux-src-net-ethernet-files lndist-linux-src-net-ipv4-files lndist-linux-src-net-ipv6-files lndist-linux-src-asm-files lndist-linux-src-include-asm-files lndist-linux-src-include-linux-files lndist-linux-src-include-net-files lndist-glue-include-linux-files lndist-glue-include-asm-files

lndist-linux-src-net-core-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net/core
	ln $(addprefix $(srcdir)/linux-src/net/core/,$(core-srcs)) $<

lndist-linux-src-net-ethernet-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net/ethernet
	ln $(addprefix $(srcdir)/linux-src/net/ethernet/,$(ethernet-srcs)) $<

lndist-linux-src-net-ipv4-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net/ipv4
	ln $(addprefix $(srcdir)/linux-src/net/ipv4/,$(ipv4-srcs)) $<

lndist-linux-src-net-ipv6-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net/ipv6
	ln $(addprefix $(srcdir)/linux-src/net/ipv6/,$(ipv6-srcs)) $<

# FIXME !i386
lndist-linux-src-asm-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/arch/i386/lib
	ln $(addprefix $(srcdir)/linux-src/arch/i386/lib/,$(ARCHSRCS)) $<

lndist-linux-src-include-linux-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/include/linux
	ln $(addprefix $(srcdir)/linux-src/include/linux/,$(LINUXHDRS)) $<

lndist-linux-src-include-net-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/include/net
	ln $(addprefix $(srcdir)/linux-src/include/net/,$(LINUXNETHDRS)) $<

lndist-linux-src-include-asm-files: $(top_srcdir)/hurd-snap/$(dir)/linux-src/include/asm-i386
	ln $(addprefix $(srcdir)/linux-src/include/asm-$(asm_syntax)/,$(ARCHHDRS)) $<

lndist-glue-include-linux-files: $(top_srcdir)/hurd-snap/$(dir)/glue-include/linux
	ln $(addprefix $(srcdir)/glue-include/linux/,$(FROBBEDLINUXHEADERS)) $<

lndist-glue-include-asm-files: $(top_srcdir)/hurd-snap/$(dir)/glue-include/asm
	ln $(addprefix $(srcdir)/glue-include/asm/,$(ASMHEADERS)) $<

$(top_srcdir)/hurd-snap/$(dir)/linux-src:
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/arch: $(top_srcdir)/hurd-snap/$(dir)/linux-src
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/arch/%/lib: $(top_srcdir)/hurd-snap/$(dir)/linux-src/arch
	mkdir -p $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/include: $(top_srcdir)/hurd-snap/$(dir)/linux-src
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/include/%: $(top_srcdir)/hurd-snap/$(dir)/linux-src/include
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/net: $(top_srcdir)/hurd-snap/$(dir)/linux-src
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/net/core: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/net/ethernet: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/net/ipv4: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/linux-src/net/ipv6: $(top_srcdir)/hurd-snap/$(dir)/linux-src/net
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/glue-include:
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/glue-include/asm: $(top_srcdir)/hurd-snap/$(dir)/glue-include
	mkdir $@
$(top_srcdir)/hurd-snap/$(dir)/glue-include/linux: $(top_srcdir)/hurd-snap/$(dir)/glue-include
	mkdir $@