##############################################################################
#
#	Makefile -- Master makefile for all libraries.
#

.EXPORT_ALL_VARIABLES:

all:

##############################################################################
#
# Include architecture specific build rules.
#

_reldir = .
include lib.mak

##############################################################################

dir_base = $(LIBCDIR)

ifeq ($(LIBCDIR),libc)
.PHONY:
libm: $(LIBCDIR)
dir_base += libm
lib_libm = *.a
inc_libm = *.h,.
endif

.PHONY: libcrypt_old
libcrypt_old: $(LIBCDIR)
ifeq ($(LIBCDIR),libc)
dir_base += libcrypt_old
else
dir_$(CONFIG_LIB_LIBCRYPT_OLD) += libcrypt_old
endif
lib_libcrypt_old = libcrypt_old.a
inc_libcrypt_old = *.h,.

dir_$(CONFIG_LIB_ADNS) += adns
lib_adns = src/libadns.a

dir_$(CONFIG_LIB_FLEX) += flex
lib_flex = build/*.a
inc_flex = build/FlexLexer.h,.

dir_$(CONFIG_LIB_LIBSSL)+= libssl
lib_libssl = build/*.so* build/*.a
inc_libssl = build/include/*,.

dir_$(CONFIG_LIB_LIBGMP) += libgmp
lib_libgmp = build/install/lib/*.a
inc_libgmp = build/install/include/*.h,.

dir_$(CONFIG_LIB_LIBG) += libg
lib_libg = *.a

dir_$(CONFIG_LIB_LIBPAM) += libpam
lib_libpam = build/libpam*/.libs/*.a build/libpam*/.libs/*.so
inc_libpam = */include/security/*.h,security

dir_$(CONFIG_LIB_LIBPCAP) += libpcap
lib_libpcap = *.a
inc_libpcap = \
	pcap*.h,. \
	pcap/*.h,pcap \
	net/bpf.h,net

dir_$(CONFIG_LIB_ZLIB) += zlib
lib_zlib = libz.a* libz.so*
inc_zlib = *.h,. \

dir_$(CONFIG_LIB_LIBBZ2) += libbzip2
lib_libbzip2 = libbz2.a* libbz2.so*
inc_libbzip2 = bzlib.h,.

dir_$(CONFIG_LIB_LIBATM) += libatm
lib_libatm = \
	src/lib/.libs/*.a \
	src/lib/*.so* \
	src/lib/*.a
inc_libatm = src/include/atm*.h,.

dir_$(CONFIG_LIB_LIBNET) += Libnet

dir_$(CONFIG_LIB_LIBNETOLD) += libnet
lib_libnet = *.a
inc_libnet = *.h,.

dir_$(CONFIG_LIB_LIBJPEG) += libjpeg
lib_libjpeg = *.a
inc_libjpeg = *.h,.

dir_$(CONFIG_LIB_LIBUPNP) += libupnp
lib_libupnp = upnp/bin/*.so*
inc_libupnp = upnp/inc/upnp,.

dir_$(CONFIG_LIB_EXPAT) += expat
lib_expat = *.a *.so*
inc_expat = lib/expat.h,.

dir_$(CONFIG_LIB_LIBKRB5) += libkrb5
dep_libkrb5 = termcap
lib_libkrb5 = build/lib/*.so
inc_libkrb5 = \
	build/include/com_err.h,. \
	build/include/krb5/*.h,. \
	build/include/gssapi/*.h,.

dir_$(CONFIG_LIB_CYRUSSASL) += libcyrussasl
dep_libcyrussasl = libkrb5
lib_libcyrussasl = build/lib/.libs/*.so
inc_libcyrussasl = \
	include/*.h,sasl \
	build/include/*.h,sasl \

dir_$(CONFIG_LIB_LIBLDAP) += libldap
dep_libldap = libcyrussasl
lib_libldap = \
	builddir/libraries/libldap/.libs/*.a \
	builddir/libraries/liblber/.libs/*.a
inc_libldap = \
	include/*.h,. \
	builddir/include/*.h,.

dir_$(CONFIG_LIB_TINYTCL) += tinytcl
path_tinytcl = ../user/tinytcl
lib_tinytcl = *.a* *.so*
inc_tinytcl = *.h,.

dir_$(CONFIG_LIB_LIBCCMALLOC) += libccmalloc

dir_$(CONFIG_LIB_ARES) += libares
lib_libares = build/*.a
inc_libares = ares.h,.

dir_$(CONFIG_LIB_LIBIDN) += libidn
lib_libidn = build/lib/.libs/libidn.a
inc_libidn = lib/*.h,.

dir_$(CONFIG_LIB_LIBLZO) += lzo
lib_lzo = build/src/.libs/*.a
inc_lzo = include/lzo,.

dir_$(CONFIG_LIB_LIBPCRE) += pcre
lib_pcre = builddir/.libs/*.a
inc_pcre = \
	builddir/pcre.h,. \
	pcreposix.h,.

dir_$(CONFIG_LIB_LIBLZMA) += liblzma
lib_libzlma = *.a

dir_$(CONFIG_LIB_OSIP2) += osip2
lib_osip2 = build/install/lib/*.a
inc_osip2 = build/install/include/osip*2,.

dir_$(CONFIG_LIB_LIBEFENCE) += libefence
lib_libefence = *.a

dir_$(CONFIG_LIB_TERMCAP) += termcap
lib_termcap = *.a
inc_termcap = termcap.h,.

dir_$(CONFIG_LIB_LIBSYSFS) += sysfsutils
lib_sysfsutils = build/lib/.libs/*.a
inc_sysfsutils = include/*.h,sysfs

dir_$(CONFIG_LIB_LIBNL) += libnl
lib_libnl = build/libnl*-install/lib/*.a* build/libnl*-install/lib/*.so*
inc_libnl = build/libnl*-install/include/libnl*/netlink*,.

dir_$(CONFIG_USER_TCL_LIBTCL) += tcl
path_tcl = ../user/tcl
lib_tcl = build/*.a

dir_$(CONFIG_LIB_IPTABLES) += iptables
path_iptables = ../user/iptables
lib_iptables = install/lib/*.a install/lib/*.so*
inc_iptables = install/include/*,.

dir_$(CONFIG_LIB_LIBIBERTY) += libiberty
lib_libiberty = build/*.a

dir_$(CONFIG_LIB_BFD) += bfd
lib_bfd = build/*.a
inc_bfd = build/bfd.h,.

dir_$(CONFIG_LIB_POPT) += popt
lib_popt = build/.libs/*.a
inc_popt = popt.h,.

dir_$(CONFIG_LIB_LIBJUDY) += libjudy
lib_libjudy = \
	src/obj/.libs/libJudy.a \
	src/obj/.libs/libJudy.so

dir_$(CONFIG_LIB_CLASSPATH) += classpath

dir_$(CONFIG_LIB_BITVECTOR) += bitvector
lib_bitvector = *.so
inc_bitvector = *.h,.

dir_$(CONFIG_LIB_LIBNVRAM) += libnvram
lib_libnvram = *.so *.a
inc_libnvram = *.h,.

dir_$(CONFIG_LIB_LIBPNG) += libpng
dep_libpng = zlib
lib_libpng = *.a
inc_libpng = *.h,.

dir_$(CONFIG_LIB_LIBXML2) += libxml2
lib_libxml2 = build/.libs/libxml2.so
inc_libxml2 = \
	include/libxml/*.h,libxml \
	build/include/libxml/*.h,libxml

dir_$(CONFIG_LIB_NFNETLINK) += libnfnetlink
lib_libnfnetlink = \
	build/src/.libs/*.a* \
	build/src/.libs/*.so* \
	build/libnfnetlink.pc
inc_libnfnetlink = include/libnfnetlink,.

dir_$(CONFIG_LIB_NETFILTER_LOG) += libnetfilter_log
dep_libnetfilter_log = libnfnetlink
lib_libnetfilter_log = \
	build/src/.libs/*.a* \
	build/src/.libs/*.so* \
	build/libnetfilter_log.pc
inc_libnetfilter_log = include/libnetfilter_log,.

dir_$(CONFIG_LIB_NETFILTER_CONNTRACK) += libnetfilter_conntrack
dep_libnetfilter_conntrack = libnfnetlink
lib_libnetfilter_conntrack = \
	build/src/.libs/*.a* \
	build/src/.libs/*.so* \
	build/libnetfilter_conntrack.pc
inc_libnetfilter_conntrack = include/libnetfilter_conntrack,.

dir_$(CONFIG_LIB_PWLIB) += pwlib
dep_pwlib = STLport

dir_$(CONFIG_LIB_LIBOPENH323) += libopenh323
dep_libopenh323 = pwlib

dir_$(CONFIG_LIB_MINI_LIBINTL) += mini-libintl 
inc_mini-libintl = libintl.h,.


dep_glib = libiconv mini-iconv libffi gettext mini-libintl
dep_libusb-compat = libusb

dep_dbus-glib = dbus glib

ifdef CONFIG_LIB_JSON_C
dep_libubox += json-c
endif

dep_libfuse = mini-iconv libiconv

inc_libiconv = build/libiconv*-install/include/*.h,.
lib_libiconv = build/libiconv*-install/lib/*.a

inc_glib = build/glib*-install/include/*,.
lib_glib = build/glib*-install/lib/*.a \
		   build/glib*-install/lib/*.so

inc_libroxml = build/libroxml*-install/usr/include/*,.
lib_libroxml = build/libroxml*-install/usr/lib/*.a \
		       build/libroxml*-install/usr/lib/*.so

#
# dir 6, 7 and 8 reserved for Makefile.local
#
-include Makefile.local

# And build libraries in the prop directory last
dir_extra += $(ROOTDIR)/prop

include Makefile.auto

##############################################################################

DIRS_y   = $(sort $(dir_base) $(dir_y) $(dir_extra))
DIRS_all = $(dir_$(n)_n) $(dir_$(n)_) $(sort $(dir_base) $(dir_y) $(dir_n) $(dir_) $(dir_extra))
DIRPATH = $(if $(path_$(1)),$(path_$(1)),$(1))

##############################################################################

# The dynamic linker library needs to be linked into lib via a different name
LD_LIB = $(ROOTDIR)/lib/uClibc/lib/ld-uClibc-0.9.29.so
LD_LIB_DEST = $(STAGEDIR)/lib/ld-linux.so.2

##############################################################################

all: base $(DIRS_y)

define dep
.PHONY: $(1)
$(1): base $(dep_$(1))
endef

$(foreach d,$(sort $(dir_y) $(dir_n) $(dir_)),$(eval $(call dep,$(d))))

.PHONY: base
base: $(dir_base) basepost
	@ln -sf $(LD_LIB) $(LD_LIB_DEST)		

$(dir_base): baseprep

basepost: $(dir_base)

.PHONY: baseprep
baseprep:
	mkdir -p $(STAGEDIR)/lib
	$(MAKE) -j1 -C ../include || exit $$?

.PHONY: basepost
basepost:
ifneq ($(findstring uClibc,$(LIBCDIR)),)
	$(MAKE) -C $(LIBCDIR) install_headers PREFIX=$(STAGEDIR)/ DEVEL_PREFIX=uClibc/
endif

.PHONY: $(dir_extra)
$(dir_extra): base $(dir_y)

# the actual dir target
.PHONY: $(DIRS_y)
$(DIRS_y):
	i=$(call DIRPATH,$@); [ ! -d $$i ] || ( touch $$i/.sgbuilt_lib && $(MAKE) $(SUBDIR_SMP_BUILD) -C $$i ) || exit $$?
	@set -f; \
	for p in $(lib_$@); do \
		set +f; \
		for i in $(ROOTDIR)/lib/$(call DIRPATH,$@)/$$p; do \
			[ ! -e "$$i" ] && continue; \
			[ "`basename $$i`" = CVS ] && continue; \
			[ -L "$(STAGEDIR)/lib/`basename $$i`" ] && continue; \
			ln -s $$i $(STAGEDIR)/lib/.; \
			echo "ln -s $$i $(STAGEDIR)/lib/."; \
		done ; \
	done	
	@set -f; \
	for p in $(inc_$@); do \
		src=$(ROOTDIR)/lib/$(call DIRPATH,$@)/`expr "$$p" : '\(.*\),.*'` ; \
		dst=$(STAGEDIR)/include/`expr "$$p" : '.*,\(.*\)'` ; \
		set +f; \
		for i in $$src; do \
			[ ! -e "$$i" ] && continue; \
			[ "`basename $$i`" = CVS ] && continue; \
			[ -L "$$dst/`basename $$i`" ] && continue; \
			[ -d $$dst ] || mkdir $$dst; \
			ln -s $$i $$dst/.; \
			echo "ln -s $$i $$dst/."; \
		done ; \
	done

%_only:
	touch $(@:_only=)/.sgbuilt_lib && $(MAKE) -j$(HOST_NCPU) $(SUBDIR_SMP_BUILD) -C $(@:_only=)

%_clean:
	$(MAKE) -j1 -C $(@:_clean=) clean; rm -f $(@:_clean=)/.sgbuilt_lib; true

%_romfs:
	$(MAKE) $(SUBDIR_SMP_BUILD) -C $(@:_romfs=) romfs

##############################################################################

# Not the best place to install these symlinks, but it will do for now
romfs:
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s /etc/config/passwd /etc/passwd
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s /etc/config/group /etc/group
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s /etc/config/mtab /etc/mtab
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s /etc/config/fstab /etc/fstab
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s /etc/config/hosts /etc/hosts
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -s /etc/config/resolv.conf /etc/resolv.conf
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -e CONFIG_USER_BASH_BASH -s /etc/config/profile /etc/profile
	$(ROMFSINST) -e CONFIG_USER_FLATFSD_FLATFSD -e CONFIG_USER_TINYLOGIN_SHADOWPASSWDS -s /etc/config/shadow /etc/shadow
	for i in $(foreach d,$(DIRS_y),$(call DIRPATH,$d)) ; do \
		[ ! -d $$i ] || $(MAKE) $(SUBDIR_SMP_BUILD) -C $$i romfs || exit $$? ; \
	done

##############################################################################

clean:
	-for i in $(foreach d,$(DIRS_all),$(call DIRPATH,$d)); do \
		if [ -f $$i/.sgbuilt_lib ]; then \
			$(MAKE) -C $$i clean ; \
			rm -f $$i/.sgbuilt_lib; \
		fi; \
	done

##############################################################################

prune:
	-for i in $(foreach d,$(DIRS_all),$(call DIRPATH,$d)); do \
		found=0; \
		for j in $(sort $(foreach d,$(DIRS_y),$(call DIRPATH,$d))) ; do \
			if [ $$i = $$j ]; then \
				found=1; \
			fi; \
		done; \
		if [ $$found = 0 ]; then \
			rm -fr $$i; \
		fi; \
	done

##############################################################################
