# Makefile for busybox
#
# Copyright (C) 1999-2005 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
#

E2FSPROGS_AR:=e2fsprogs.a

E2FSPROGS_DIR:=$(top_builddir)/e2fsprogs/

srcdir=$(top_srcdir)/e2fsprogs

E2FSPROGS_CFLAGS := -I$(srcdir) -include $(srcdir)/e2fsbb.h

BLKID_SRC   := cache.c dev.c devname.c devno.c blkid_getsize.c \
	       probe.c read.c resolve.c save.c tag.c resolve.c
BLKID_SRCS  := $(patsubst %,blkid/%, $(BLKID_SRC))
BLKID_OBJS  := $(patsubst %.c,%.o, $(BLKID_SRCS))

E2P_SRC     := fgetsetflags.c fgetsetversion.c pf.c iod.c mntopts.c \
	       feature.c ls.c uuid.c pe.c ostype.c ps.c hashstr.c \
	       parse_num.c
E2P_SRCS    := $(patsubst %,e2p/%, $(E2P_SRC))
E2P_OBJS    := $(patsubst %.c,%.o, $(E2P_SRCS))

EXT2FS_SRC  := gen_bitmap.c bitops.c ismounted.c mkjournal.c unix_io.c \
	       rw_bitmaps.c initialize.c bitmaps.c block.c \
	       ind_block.c inode.c freefs.c alloc_stats.c closefs.c \
	       openfs.c io_manager.c finddev.c read_bb.c alloc.c badblocks.c \
	       getsize.c getsectsize.c alloc_tables.c read_bb_file.c mkdir.c \
	       bb_inode.c newdir.c alloc_sb.c lookup.c dirblock.c expanddir.c \
	       dir_iterate.c link.c res_gdt.c
EXT2FS_SRCS := $(patsubst %,ext2fs/%, $(EXT2FS_SRC))
EXT2FS_OBJS := $(patsubst %.c,%.o, $(EXT2FS_SRCS))

UUID_SRC    := compare.c gen_uuid.c pack.c parse.c unpack.c unparse.c \
	       uuid_time.c
UUID_SRCS   := $(patsubst %,uuid/%, $(UUID_SRC))
UUID_OBJS   := $(patsubst %.c,%.o, $(UUID_SRCS))

E2FSPROGS-:=
E2FSPROGS-$(CONFIG_CHATTR)     += chattr.o $(E2P_OBJS)
E2FSPROGS-$(CONFIG_LSATTR)     += lsattr.o $(E2P_OBJS)
E2FSPROGS-$(CONFIG_MKE2FS)     += mke2fs.o util.o $(E2P_OBJS) $(BLKID_OBJS) $(EXT2FS_OBJS) $(UUID_OBJS)
E2FSPROGS-$(CONFIG_TUNE2FS)    += tune2fs.o util.o $(E2P_OBJS) $(BLKID_OBJS) $(EXT2FS_OBJS) $(UUID_OBJS)

libraries-y+=$(E2FSPROGS_DIR)$(E2FSPROGS_AR)


$(E2FSPROGS_DIR)$(E2FSPROGS_AR): $(patsubst %,$(E2FSPROGS_DIR)%, $(E2FSPROGS-y))
	$(AR) $(ARFLAGS) $@ $(patsubst %,$(E2FSPROGS_DIR)%, $(E2FSPROGS-y))

# for e2p/*: check if the dir exists, dude
$(E2FSPROGS_DIR)%.o: $(srcdir)/%.c
	@[ -d $(@D) ] || mkdir -v $(@D)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(E2FSPROGS_CFLAGS) -c -o $@ $<
