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

srcdir:=$(top_srcdir)/libbb
objdir:=$(top_builddir)/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 \
	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 \
	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 md5.c mode_string.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 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 sha1.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-$(CONFIG_PASSWD)+= pw_encrypt.c
LIBBB-$(CONFIG_SULOGIN)+= pw_encrypt.c
LIBBB-$(CONFIG_FEATURE_HTTPD_AUTH_MD5)+= pw_encrypt.c
LIBBB-$(CONFIG_VLOCK)+= correct_password.c
LIBBB-$(CONFIG_SU)+= correct_password.c
LIBBB-$(CONFIG_LOGIN)+= correct_password.c


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

# 1:N objects
LIBBB_MSRC0:=$(srcdir)/messages.c
LIBBB_M0:=full_version \
	memory_exhausted invalid_date io_error \
	read_error write_error name_longer_than_foo unknown \
	can_not_create_raw_socket perm_denied_are_you_root \
	shadow_file passwd_file group_file gshadow_file nologin_file \
	securetty_file motd_file \
	msg_standard_input msg_standard_output shell_file \
	bb_dev_null bb_common_bufsiz1
LIBBB_MOBJ0:=$(patsubst %,$(objdir)/%$(om),$(LIBBB_M0))
$(LIBBB_MOBJ0):$(LIBBB_MSRC0)

LIBBB_MSRC1:=$(srcdir)/xfuncs.c
LIBBB_M1:=xmalloc xrealloc xcalloc xstrdup xstrndup \
	xfopen xopen xread xread_all xread_char \
	xferror xferror_stdout xfflush_stdout strlen
LIBBB_MOBJ1:=$(patsubst %,$(objdir)/%$(om),$(LIBBB_M1))
$(LIBBB_MOBJ1):$(LIBBB_MSRC1)

LIBBB_MSRC2:=$(srcdir)/printf.c
LIBBB_M2:=bb_vfprintf bb_vprintf bb_fprintf bb_printf
LIBBB_MOBJ2:=$(patsubst %,$(objdir)/%$(om),$(LIBBB_M2))
$(LIBBB_MOBJ2):$(LIBBB_MSRC2)

LIBBB_MSRC3:=$(srcdir)/xgetularg.c
LIBBB_M3:=xgetularg_bnd_sfx xgetlarg_bnd_sfx getlarg10_sfx \
	xgetularg_bnd xgetularg10_bnd xgetularg10
LIBBB_MOBJ3:=$(patsubst %,$(objdir)/%$(om),$(LIBBB_M3))
$(LIBBB_MOBJ3):$(LIBBB_MSRC3)

LIBBB_MSRC4:=$(srcdir)/safe_strtol.c
LIBBB_M4:=safe_strtoi safe_strtod safe_strtol safe_strtoul
LIBBB_MOBJ4:=$(patsubst %,$(objdir)/%$(om),$(LIBBB_M4))
$(LIBBB_MOBJ4):$(LIBBB_MSRC4)

LIBBB_MSRC5:=$(srcdir)/bb_pwd.c
LIBBB_M5:=bb_xgetpwnam bb_xgetgrnam bb_getgrgid bb_getpwuid \
	bb_getug get_ug_id
LIBBB_MOBJ5:=$(patsubst %,$(objdir)/%$(om),$(LIBBB_M5))
$(LIBBB_MOBJ5):$(LIBBB_MSRC5)

LIBBB_MSRC6:=$(srcdir)/llist.c
LIBBB_M6:=llist_add_to llist_add_to_end llist_free_one llist_free
LIBBB_MOBJ6:=$(patsubst %,$(objdir)/%$(om),$(LIBBB_M6))
$(LIBBB_MOBJ6):$(LIBBB_MSRC6)


# We need the names of the object files built from MSRC for the L_ defines
LIBBB_ALL_MDEFS:=$(LIBBB_M0) $(LIBBB_M1) $(LIBBB_M2) $(LIBBB_M3) $(LIBBB_M4) $(LIBBB_M5) $(LIBBB_M6)

# All multi objects
libbb_MOBJ$(os):=$(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))

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

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

# all 1:1 objects
libbb_OBJ$(os):=$(patsubst $(srcdir)/%.c,$(objdir)/%$(os),$(LIBBB-y))

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

# all defines needed for 1:N objects
LIBBB_DEFINE-y:=$(patsubst %,-DL_%,$(LIBBB_ALL_MDEFS))
LIBRARY_DEFINE-y+=$(LIBBB_DEFINE-y)
LIBRARY_DEFINE-a+=$(LIBBB_DEFINE-y)

ifeq ($(om),.osm)
# XXX FIXME:
# also create a pattern for the non-shared case
$(LIBBB_MOBJ0:.osm=.om): $(LIBBB_MSRC0)
$(LIBBB_MOBJ1:.osm=.om): $(LIBBB_MSRC1)
$(LIBBB_MOBJ2:.osm=.om): $(LIBBB_MSRC2)
$(LIBBB_MOBJ3:.osm=.om): $(LIBBB_MSRC3)
$(LIBBB_MOBJ4:.osm=.om): $(LIBBB_MSRC4)
$(LIBBB_MOBJ5:.osm=.om): $(LIBBB_MSRC5)
$(LIBBB_MOBJ6:.osm=.om): $(LIBBB_MSRC6)
endif

$(libbb_OBJ.os): $(objdir)/%.os: $(srcdir)/%.c
$(libbb_OBJ.o): $(objdir)/%.o: $(srcdir)/%.c
$(objdir)/libbb.a: $(libbb_OBJ$(os)) $(libbb_MOBJ$(os))
libraries-y:=$(libraries-y) $(objdir)/libbb.a

