# Makefile for busybox
#
# Copyright (C) 1999-2002 Erik Andersen <andersee@debian.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:= \
	arith.c bb_asprintf.c ask_confirmation.c change_identity.c chomp.c \
	compare_string_array.c concat_path_file.c copy_file.c \
	copy_file_chunk.c copyfd.c correct_password.c create_icmp_socket.c \
	create_icmp6_socket.c device_open.c dirname.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 libc5.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 \
	time_string.c trim.c u_signal_names.c vdprintf.c verror_msg.c \
	vherror_msg.c vperror_msg.c wfopen.c xconnect.c xgetcwd.c xfuncs.c \
	xgethostbyname.c xgethostbyname2.c xreadlink.c xregcomp.c xgetlarg.c 
	

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

LIBBB_MSRC:=$(LIBBB_DIR)messages.c
LIBBB_MOBJ:=full_version.o name_too_long.o omitting_directory.o not_a_directory.o \
	memory_exhausted.o invalid_date.o invalid_option.o io_error.o dash_dash_help.o \
	write_error.o too_few_args.o name_longer_than_foo.o unknown.o can_not_create_raw_socket.o \
	shadow_file.o passwd_file.o group_file.o gshadow_file.o nologin_file.o securetty_file.o \
	motd_file.o
LIBBB_MOBJS=$(patsubst %,$(LIBBB_DIR)%, $(LIBBB_MOBJ))

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

$(LIBBB_DIR)$(LIBBB_AR): $(LIBBB_OBJS) $(LIBBB_MOBJS) 
	$(AR) -ro $@ $(LIBBB_OBJS) $(LIBBB_MOBJS)

$(LIBBB_MOBJS): $(LIBBB_MSRC)
	$(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) $< > $@


