# Makefile for busybox
#
# Copyright (C) 1999-2005 by Erik Andersen <andersen@codepoet.org>
#
# Licensed under the GPL v2, see the file LICENSE in this tarball.

NETWORKING_AR:=networking.a
ifndef $(NETWORKING_DIR)
NETWORKING_DIR:=$(top_builddir)/networking/
endif
srcdir=$(top_srcdir)/networking

NETWORKING-y:=
NETWORKING-$(CONFIG_ARPING)       += arping.o
NETWORKING-$(CONFIG_DNSD)         += dnsd.o
NETWORKING-$(CONFIG_ETHER_WAKE)   += ether-wake.o
NETWORKING-$(CONFIG_FAKEIDENTD)   += fakeidentd.o
NETWORKING-$(CONFIG_FTPGET)       += ftpgetput.o
NETWORKING-$(CONFIG_FTPPUT)       += ftpgetput.o
NETWORKING-$(CONFIG_HOSTNAME)     += hostname.o
NETWORKING-$(CONFIG_HTTPD)        += httpd.o
NETWORKING-$(CONFIG_IFCONFIG)     += ifconfig.o interface.o
NETWORKING-$(CONFIG_IFUPDOWN)     += ifupdown.o
NETWORKING-$(CONFIG_INETD)        += inetd.o
NETWORKING-$(CONFIG_IP)           += ip.o
NETWORKING-$(CONFIG_IPCALC)       += ipcalc.o
NETWORKING-$(CONFIG_IPADDR)       += ipaddr.o
NETWORKING-$(CONFIG_IPLINK)       += iplink.o
NETWORKING-$(CONFIG_IPROUTE)      += iproute.o
NETWORKING-$(CONFIG_IPTUNNEL)     += iptunnel.o
NETWORKING-$(CONFIG_NAMEIF)       += nameif.o
NETWORKING-$(CONFIG_NC)           += nc.o
NETWORKING-$(CONFIG_NETSTAT)      += netstat.o
NETWORKING-$(CONFIG_NSLOOKUP)     += nslookup.o
NETWORKING-$(CONFIG_PING)         += ping.o
NETWORKING-$(CONFIG_PING6)        += ping6.o
NETWORKING-$(CONFIG_ROUTE)        += route.o
NETWORKING-$(CONFIG_TELNET)       += telnet.o
NETWORKING-$(CONFIG_TELNETD)      += telnetd.o
NETWORKING-$(CONFIG_TFTP)         += tftp.o
NETWORKING-$(CONFIG_TRACEROUTE)   += traceroute.o
NETWORKING-$(CONFIG_VCONFIG)      += vconfig.o
NETWORKING-$(CONFIG_WGET)         += wget.o
NETWORKING-$(CONFIG_ZCIP)         += zcip.o

NETWORKING-y:=$(sort $(NETWORKING-y))
libraries-y+=$(NETWORKING_DIR)$(NETWORKING_AR)

NETWORKING_SRC-y:=$(patsubst %.o,$(srcdir)/%.c,$(NETWORKING-y))
NETWORKING_SRC-a:=$(wildcard $(srcdir)/*.c)
APPLET_SRC-y+=$(NETWORKING_SRC-y)
APPLET_SRC-a+=$(NETWORKING_SRC-a)

LIBRARY_DEFINE-y+= -I$(top_srcdir)/networking
LIBRARY_DEFINE-a+= -I$(top_srcdir)/networking

needcrypt-y:=
needcrypt-$(CONFIG_FEATURE_HTTPD_AUTH_MD5) := y

ifeq ($(needcrypt-y),y)
	LIBRARIES := -lcrypt $(filter-out -lcrypt,$(LIBRARIES))
endif

$(NETWORKING_DIR)$(NETWORKING_AR): $(patsubst %,$(NETWORKING_DIR)%, $(NETWORKING-y))
	$(do_ar)

$(NETWORKING_DIR)%.o: $(srcdir)/%.c
	$(compile.c)
