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

ifndef $(LIBBB_DIR)
LIBBB_DIR:=$(top_builddir)/libbb
endif
srcdir=$(top_srcdir)/libbb

LIBBB-n:=
LIBBB-y:= \
	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_last_path_component.c get_line_from_file.c \
	hash_fd.c herror_msg.c herror_msg_and_die.c \
	human_readable.c inet_common.c inode_hash.c isdirectory.c \
	kernel_version.c last_char_is.c login.c loop.c \
	make_directory.c mode_string.c mtab.c mtab_file.c \
	obscure.c parse_mode.c parse_number.c perror_msg.c \
	perror_msg_and_die.c print_file.c get_console.c \
	process_escape_sequence.c procps.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_write.c \
	safe_strncpy.c setup_environment.c simplify_path.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 \
	get_terminal_width_height.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 bb_askpass.c \
	warn_ignoring_args.c concat_subpath_file.c vfork_daemon_rexec.c \
	bb_echo.c bb_do_delay.c

# conditionally compiled objects:
LIBBB-$(CONFIG_FEATURE_SHADOWPASSWDS)+=pwd2spwd.c
LIBBB-$(CONFIG_FEATURE_MTAB_SUPPORT)+= mtab.c


LIBBB-y:=$(patsubst %,$(srcdir)/%,$(LIBBB-y))

# 1:N objects
LIBBB_MSRC0:=$(srcdir)/messages.c
LIBBB_MOBJ0:=full_version.o \
	memory_exhausted.o invalid_date.o io_error.o \
	read_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 shell_file.o \
	bb_dev_null.o bb_common_bufsiz1.o
LIBBB_MOBJ0:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ0))
$(LIBBB_MOBJ0):$(LIBBB_MSRC0)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -o $@ -c $<

LIBBB_MSRC1:=$(srcdir)/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_MOBJ1:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ1))
$(LIBBB_MOBJ1):$(LIBBB_MSRC1)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -o $@ -c $<

LIBBB_MSRC2:=$(srcdir)/printf.c
LIBBB_MOBJ2:=bb_vfprintf.o bb_vprintf.o bb_fprintf.o bb_printf.o
LIBBB_MOBJ2:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ2))
$(LIBBB_MOBJ2):$(LIBBB_MSRC2)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -o $@ -c $<

LIBBB_MSRC3:=$(srcdir)/xgetularg.c
LIBBB_MOBJ3:=xgetularg_bnd_sfx.o xgetlarg_bnd_sfx.o getlarg10_sfx.o \
	xgetularg_bnd.o xgetularg10_bnd.o xgetularg10.o
LIBBB_MOBJ3:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ3))
$(LIBBB_MOBJ3):$(LIBBB_MSRC3)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -o $@ -c $<

LIBBB_MSRC4:=$(srcdir)/safe_strtol.c
LIBBB_MOBJ4:=safe_strtoi.o safe_strtod.o safe_strtol.o safe_strtoul.o
LIBBB_MOBJ4:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ4))
$(LIBBB_MOBJ4):$(LIBBB_MSRC4)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -o $@ -c $<

LIBBB_MSRC5:=$(srcdir)/bb_pwd.c
LIBBB_MOBJ5:=bb_xgetpwnam.o bb_xgetgrnam.o bb_getgrgid.o bb_getpwuid.o \
	bb_getug.o get_ug_id.o
LIBBB_MOBJ5:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ5))
$(LIBBB_MOBJ5):$(LIBBB_MSRC5)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -o $@ -c $<

LIBBB_MSRC6:=$(srcdir)/llist.c
LIBBB_MOBJ6:=llist_add_to.o llist_add_to_end.o llist_free_one.o llist_free.o
LIBBB_MOBJ6:=$(patsubst %,$(LIBBB_DIR)/%, $(LIBBB_MOBJ6))
$(LIBBB_MOBJ6):$(LIBBB_MSRC6)
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -DL_$(notdir $*) -o $@ -c $<


# We need the names of the object files built from MSRC for the L_ defines
LIBBB_ALL_MOBJ:=$(LIBBB_MOBJ0) $(LIBBB_MOBJ1) $(LIBBB_MOBJ2) $(LIBBB_MOBJ3) $(LIBBB_MOBJ4) $(LIBBB_MOBJ5) $(LIBBB_MOBJ6)

LIBBB_ALL_MSRC:=$(LIBBB_MSRC0) $(LIBBB_MSRC1) $(LIBBB_MSRC2) $(LIBBB_MSRC3) \
	$(LIBBB_MSRC4) $(LIBBB_MSRC5) $(LIBBB_MSRC6)

LIBBB-y:=$(sort $(LIBBB-y) $(LIBBB_ALL_MSRC))

LIBBB_AR:=$(LIBBB_DIR)/libbb.a
libraries-y+=$(LIBBB_AR)

needcrypt-y:=
ifneq ($(findstring $(srcdir)/pw_encrypt.c,$(LIBBB-y)),)
needcrypt-y:=y
else
ifneq ($(findstring $(srcdir)/correct_password.c,$(LIBBB-y)),)
needcrypt-y:=y
endif
endif

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

# all 1:1 objects
LIBBB_OBJS:=$(patsubst $(srcdir)/%.c,$(LIBBB_DIR)/%.o, $(LIBBB-y))
$(LIBBB_DIR)/%.o: $(srcdir)/%.c
	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $<


LIBBB_SRC-a:=$(wildcard $(srcdir)/*.c)
LIBRARY_SRC-y+=$(LIBBB-y)
LIBRARY_SRC-a+=$(LIBBB_SRC-a)

# all defines needed for 1:N objects
LIBBB_DEFINE-y:=$(patsubst %,-DL_%,$(subst .o,,$(notdir $(LIBBB_ALL_MOBJ))))
LIBRARY_DEFINE-y+=$(LIBBB_DEFINE-y)
LIBRARY_DEFINE-a+=$(LIBBB_DEFINE-y)

$(LIBBB_AR): $(LIBBB_OBJS) $(LIBBB_ALL_MOBJ)
	$(AR) $(ARFLAGS) $(@) $(^)

