# Makefile for busybox
#
# Copyright (C) 1999-2003 by Erik Andersen <andersen@codepoet.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
#

COREUTILS_AR:=coreutils.a
ifndef $(COREUTILS_DIR)
COREUTILS_DIR:=$(TOPDIR)coreutils/
endif

COREUTILS-y:=
COREUTILS-$(CONFIG_BASENAME)		+= basename.o
COREUTILS-$(CONFIG_CAL)		+= cal.o
COREUTILS-$(CONFIG_CAT)		+= cat.o
COREUTILS-$(CONFIG_CHGRP)	+= chgrp.o
COREUTILS-$(CONFIG_CHMOD)	+= chmod.o
COREUTILS-$(CONFIG_CHOWN)	+= chown.o
COREUTILS-$(CONFIG_CHROOT)		+= chroot.o
COREUTILS-$(CONFIG_CMP)		+= cmp.o
COREUTILS-$(CONFIG_CP)		+= cp.o
COREUTILS-$(CONFIG_CUT)		+= cut.o
COREUTILS-$(CONFIG_DATE)		+= date.o
COREUTILS-$(CONFIG_DD)		+= dd.o
COREUTILS-$(CONFIG_DF)		+= df.o
COREUTILS-$(CONFIG_DIRNAME)		+= dirname.o
COREUTILS-$(CONFIG_DOS2UNIX)	+= dos2unix.o
COREUTILS-$(CONFIG_DU)		+= du.o
COREUTILS-$(CONFIG_ECHO)		+= echo.o
COREUTILS-$(CONFIG_ENV)		+= env.o
COREUTILS-$(CONFIG_EXPR)		+= expr.o
COREUTILS-$(CONFIG_FALSE)		+= false.o
COREUTILS-$(CONFIG_FOLD)	+= fold.o
COREUTILS-$(CONFIG_HEAD)	+= head.o
COREUTILS-$(CONFIG_HOSTID)		+= hostid.o
COREUTILS-$(CONFIG_ID)			+= id.o
COREUTILS-$(CONFIG_LENGTH)	+= length.o
COREUTILS-$(CONFIG_LN)		+= ln.o
COREUTILS-$(CONFIG_LOGNAME)		+= logname.o
COREUTILS-$(CONFIG_LS)		+= ls.o
COREUTILS-$(CONFIG_MD5SUM)	+= md5sum.o
COREUTILS-$(CONFIG_MKDIR)	+= mkdir.o
COREUTILS-$(CONFIG_MKFIFO)	+= mkfifo.o
COREUTILS-$(CONFIG_MKNOD)	+= mknod.o
COREUTILS-$(CONFIG_MV)		+= mv.o
COREUTILS-$(CONFIG_OD)		+= od.o
COREUTILS-$(CONFIG_PRINTF)		+= printf.o
COREUTILS-$(CONFIG_PWD)		+= pwd.o
COREUTILS-$(CONFIG_REALPATH)		+= realpath.o
COREUTILS-$(CONFIG_RM)		+= rm.o
COREUTILS-$(CONFIG_RMDIR)	+= rmdir.o
COREUTILS-$(CONFIG_SHA1SUM)	+= sha1sum.o
COREUTILS-$(CONFIG_SLEEP)		+= sleep.o
COREUTILS-$(CONFIG_SORT)	+= sort.o
COREUTILS-$(CONFIG_STTY)		+= stty.o
COREUTILS-$(CONFIG_SYNC)	+= sync.o
COREUTILS-$(CONFIG_TAIL)	+= tail.o
COREUTILS-$(CONFIG_TEE)		+= tee.o
COREUTILS-$(CONFIG_TEST)		+= test.o
COREUTILS-$(CONFIG_TOUCH)	+= touch.o
COREUTILS-$(CONFIG_TR)		+= tr.o
COREUTILS-$(CONFIG_TRUE)		+= true.o
COREUTILS-$(CONFIG_TTY)		+= tty.o
COREUTILS-$(CONFIG_UNAME)		+= uname.o
COREUTILS-$(CONFIG_UNIQ)	+= uniq.o
COREUTILS-$(CONFIG_USLEEP)		+= usleep.o
COREUTILS-$(CONFIG_UUDECODE)	+= uudecode.o
COREUTILS-$(CONFIG_UUENCODE)	+= uuencode.o
COREUTILS-$(CONFIG_WATCH)		+= watch.o
COREUTILS-$(CONFIG_WC)		+= wc.o
COREUTILS-$(CONFIG_WHO)		+= who.o
COREUTILS-$(CONFIG_WHOAMI)		+= whoami.o
COREUTILS-$(CONFIG_YES)		+= yes.o

libraries-y+=$(COREUTILS_DIR)$(COREUTILS_AR)

$(COREUTILS_DIR)$(COREUTILS_AR): $(patsubst %,$(COREUTILS_DIR)%, $(COREUTILS-y))
	$(AR) -ro $@ $(patsubst %,$(COREUTILS_DIR)%, $(COREUTILS-y))

