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

UTILLINUX_AR:=util-linux.a
ifndef $(UTILLINUX_DIR)
UTILLINUX_DIR:=$(top_builddir)/util-linux/
endif
srcdir=$(top_srcdir)/util-linux

UTILLINUX-:=
UTILLINUX-$(CONFIG_DMESG)		+=dmesg.o
UTILLINUX-$(CONFIG_FBSET)		+=fbset.o
UTILLINUX-$(CONFIG_FDFLUSH)		+=fdflush.o
UTILLINUX-$(CONFIG_FDFORMAT)		+=fdformat.o
UTILLINUX-$(CONFIG_FDISK)		+=fdisk.o
UTILLINUX-$(CONFIG_FREERAMDISK)		+=freeramdisk.o
UTILLINUX-$(CONFIG_FSCK_MINIX)		+=fsck_minix.o
UTILLINUX-$(CONFIG_GETOPT)		+=getopt.o
UTILLINUX-$(CONFIG_HEXDUMP)		+=hexdump.o
UTILLINUX-$(CONFIG_HWCLOCK)		+=hwclock.o
UTILLINUX-$(CONFIG_IPCRM)		+=ipcrm.o
UTILLINUX-$(CONFIG_IPCS)		+=ipcs.o
UTILLINUX-$(CONFIG_LOSETUP)		+=losetup.o
UTILLINUX-$(CONFIG_MKFS_MINIX)		+=mkfs_minix.o
UTILLINUX-$(CONFIG_MKSWAP)		+=mkswap.o
UTILLINUX-$(CONFIG_MORE)		+=more.o
UTILLINUX-$(CONFIG_MOUNT)		+=mount.o
UTILLINUX-$(CONFIG_NFSMOUNT)		+=nfsmount.o
UTILLINUX-$(CONFIG_PIVOT_ROOT)		+=pivot_root.o
UTILLINUX-$(CONFIG_RDATE)		+=rdate.o
UTILLINUX-$(CONFIG_SWAPONOFF)		+=swaponoff.o
UTILLINUX-$(CONFIG_UMOUNT)		+=umount.o
UTILLINUX-$(CONFIG_READPROFILE)		+=readprofile.o

libraries-y+=$(UTILLINUX_DIR)$(UTILLINUX_AR)

$(UTILLINUX_DIR)$(UTILLINUX_AR): $(patsubst %,$(UTILLINUX_DIR)%, $(UTILLINUX-y))
	$(AR) $(ARFLAGS) $@ $(patsubst %,$(UTILLINUX_DIR)%, $(UTILLINUX-y))

$(UTILLINUX_DIR)%.o: $(srcdir)/%.c
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<

ifneq ($(strip $(CONFIG_LFS)),y)
ifeq ($(strip $(FDISK_SUPPORT_LARGE_DISKS)),y)

$(UTILLINUX_DIR)fdisk.o: $(srcdir)/fdisk.c
	$(CC) $(CFLAGS) \
		-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \
		$(EXTRA_CFLAGS) -c -o $@ $<

endif
endif
