# 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



LIBBB_AR:=libbb.a
ifndef $(LIBBB_DIR)
LIBBB_DIR:=$(TOPDIR)libbb/
endif

LIBBB_SRC:= \
	bb_asprintf.c ask_confirmation.c change_identity.c chomp.c \
	compare_string_array.c concat_path_file.c copy_file.c \
	copyfd.c correct_password.c create_icmp_socket.c \
	create_icmp6_socket.c device_open.c dump.c error_msg.c \
	error_msg_and_die.c find_mount_point.c find_pid_by_name.c \
	find_root_device.c fgets_str.c full_read.c full_write.c get_console.c \
	get_last_path_component.c get_line_from_file.c herror_msg.c \
	herror_msg_and_die.c human_readable.c inet_common.c inode_hash.c \
	interface.c isdirectory.c kernel_version.c last_char_is.c \
	llist_add_to.c login.c loop.c make_directory.c mode_string.c \
	module_syscalls.c mtab.c mtab_file.c my_getgrgid.c my_getgrnam.c \
	my_getpwnam.c my_getpwnamegid.c my_getpwuid.c obscure.c parse_mode.c \
	parse_number.c perror_msg.c perror_msg_and_die.c print_file.c \
	process_escape_sequence.c procps.c pwd2spwd.c pw_encrypt.c \
	qmodule.c read_package_field.c recursive_action.c remove_file.c \
	restricted_shell.c run_parts.c run_shell.c safe_read.c safe_strncpy.c \
	setup_environment.c simplify_path.c syscalls.c syslog_msg_with_name.c \
	trim.c u_signal_names.c vdprintf.c verror_msg.c \
	vherror_msg.c vperror_msg.c wfopen.c xconnect.c xgetcwd.c \
	xgethostbyname.c xgethostbyname2.c xreadlink.c xregcomp.c xgetlarg.c \
	\
	fclose_nonstdin.c fflush_stdout_and_exit.c getopt_ulflags.c \
	default_error_retval.c wfopen_input.c speed_table.c \
	perror_nomsg_and_die.c perror_nomsg.c skip_whitespace.c \
	warn_ignoring_args.c concat_subpath_file.c vfork_daemon_rexec.c

LIBBB_OBJS=$(patsubst %.c,$(LIBBB_DIR)%.o, $(LIBBB_SRC))

LIBBB_MSRC0:=$(LIBBB_DIR)messages.c
LIBBB_MOBJ0:=full_version.o \
	memory_exhausted.o invalid_date.o io_error.o \
	write_error.o name_longer_than_foo.o unknown.o \
	can_not_create_raw_socket.o perm_denied_are_you_root.o \
	shadow_file.o passwd_file.o group_file.o gshadow_file.o nologin_file.o \
	securetty_file.o motd_file.o \
	msg_standard_input.o msg_standard_output.o

LIBBB_MSRC1:=$(LIBBB_DIR)xfuncs.c
LIBBB_MOBJ1:=xmalloc.o xrealloc.o xcalloc.o xstrdup.o xstrndup.o \
	xfopen.o xopen.o xread.o xread_all.o xread_char.o \
	xferror.o xferror_stdout.o xfflush_stdout.o strlen.o

LIBBB_MSRC2:=$(LIBBB_DIR)printf.c
LIBBB_MOBJ2:=bb_vfprintf.o bb_vprintf.o bb_fprintf.o bb_printf.o

LIBBB_MSRC3:=$(LIBBB_DIR)xgetularg.c
LIBBB_MOBJ3:=xgetularg_bnd_sfx.o xgetlarg_bnd_sfx.o getlarg10_sfx.o \
	xgetularg_bnd.o xgetularg10_bnd.o xgetularg10.o

LIBBB_MOBJS0=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ0))
LIBBB_MOBJS1=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ1))
LIBBB_MOBJS2=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ2))
LIBBB_MOBJS3=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ3))

libraries-y+=$(LIBBB_DIR)$(LIBBB_AR)

$(LIBBB_DIR)$(LIBBB_AR): $(LIBBB_OBJS) $(LIBBB_MOBJS0) $(LIBBB_MOBJS1) \
	$(LIBBB_MOBJS2) $(LIBBB_MOBJS3)
	$(AR) -ro $@ $(LIBBB_OBJS) $(LIBBB_MOBJS0) $(LIBBB_MOBJS1) \
		$(LIBBB_MOBJS2) $(LIBBB_MOBJS3) 

$(LIBBB_MOBJS0): $(LIBBB_MSRC0)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -c $< -o $@

$(LIBBB_MOBJS1): $(LIBBB_MSRC1)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -c $< -o $@

$(LIBBB_MOBJS2): $(LIBBB_MSRC2)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -c $< -o $@

$(LIBBB_MOBJS3): $(LIBBB_MSRC3)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -c $< -o $@

$(LIBBB_DIR)loop.o: $(LIBBB_DIR)loop.h

$(LIBBB_DIR)loop.h: $(LIBBB_DIR)mk_loop_h.sh
	@ $(SHELL) $< > $@


