# Makefile for busybox
#
# Copyright (C) 1999-2002 Erik Andersen <andersee@debian.org>
#
# This program 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 of the License, or
# (at your option) any later version.
#
# This program 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-1307 USA
#

NETWORKING_AR:=networking.a
ifndef $(NETWORKING_DIR)
NETWORKING_DIR:=$(TOPDIR)networking/
endif

NETWORKING-y:=
NETWORKING-$(CONFIG_HOSTNAME)		+= hostname.o
NETWORKING-$(CONFIG_IFCONFIG)		+= ifconfig.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_WGET)		+= wget.o

libraries-y+=$(NETWORKING_DIR)$(NETWORKING_AR)

$(NETWORKING_DIR)$(NETWORKING_AR): $(patsubst %,$(NETWORKING_DIR)%, $(NETWORKING-y))
	$(AR) -ro $@ $(patsubst %,$(NETWORKING_DIR)%, $(NETWORKING-y))

