# 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.

LOGINUTILS_AR:=loginutils.a
ifndef LOGINUTILS_DIR
LOGINUTILS_DIR:=$(top_builddir)/loginutils/
endif
srcdir=$(top_srcdir)/loginutils

LOGINUTILS-y:=
LOGINUTILS-$(CONFIG_ADDGROUP)	+= addgroup.o
LOGINUTILS-$(CONFIG_ADDUSER)	+= adduser.o
LOGINUTILS-$(CONFIG_GETTY)	+= getty.o
LOGINUTILS-$(CONFIG_LOGIN)	+= login.o
LOGINUTILS-$(CONFIG_PASSWD)	+= passwd.o
LOGINUTILS-$(CONFIG_SU)		+= su.o
LOGINUTILS-$(CONFIG_SULOGIN)	+= sulogin.o
LOGINUTILS-$(CONFIG_VLOCK)	+= vlock.o
LOGINUTILS-$(CONFIG_DELUSER)	+= deluser.o
LOGINUTILS-$(CONFIG_DELGROUP)	+= deluser.o

LOGINUTILS-y:=$(sort $(LOGINUTILS-y))

ifneq ($(strip $(LOGINUTILS-y)),)
libraries-y+=$(LOGINUTILS_DIR)$(LOGINUTILS_AR)
endif

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

needcrypt-y:=
needcrypt-$(CONFIG_LOGIN)	:= y
needcrypt-$(CONFIG_PASSWD)	:= y
needcrypt-$(CONFIG_SU)		:= y
needcrypt-$(CONFIG_SULOGIN)	:= y
needcrypt-$(CONFIG_VLOCK)	:= y


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

$(LOGINUTILS_DIR)$(LOGINUTILS_AR): $(patsubst %,$(LOGINUTILS_DIR)%, $(LOGINUTILS-y))
	$(do_ar)

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