#!/bin/sh
# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
# find-depends - TazPkg module
# Functions that are common to tazpkg and tazpkg-convert and sourced by them.


# search dependencies for files in $TMP_DIR/$file/fs

find_depends() {
	DEFAULT_DEPENDS='glibc-base gcc-lib-base'

	[ ! -f "$PKGS_DB/files.list.lzma" ] && tazpkg recharge >/dev/null

	for i in "$PKGS_DB/files.list.lzma" \
		"$PKGS_DB/undigest/"*"/files.list.lzma"; do
		# Extract files.list.lzma to find dependencies
		# only lines with .so libs produces much faster search
		[ -f "$i" ] && lzma d "$i" -so | fgrep '.so' | fgrep '/lib/' >> "$TMP_DIR/files.list"
	done

	_ 'Find depends...' 1>&2
	libs_found=''
	find "$1" -type f | \
	while read chkfile; do
		[ "$(dd bs=1 skip=1 count=3 < "$chkfile" 2>/dev/null)" != 'ELF' ] && continue

		case "$chkfile" in
			*.o|*.ko|*.ko.gz|*.ko.xz) continue;;
		esac

		for lib in $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so "$chkfile" 2>/dev/null | sed '/=>/!d;s/ =>.*//'); do
			debug "lib='$lib'"
			case " $libs_found " in
				*\ $lib\ *) continue;;
			esac
			libs_found="$libs_found $lib"
			case "$lib" in
				statically|linux-gate.so*|ld-*.so|*/ld-*.so) continue;;
			esac
			find "${1:-$TMP_DIR/$file/fs}" | grep -q /$lib$ && continue

			_n 'for %s' "$lib" 1>&2
			echo -ne '                   \r' 1>&2

			for dep in $(fgrep "$lib" "$TMP_DIR/files.list" | cut -d: -f1); do
				debug "  dep='$dep'"
				case " $DEFAULT_DEPENDS " in
					*\ $dep\ *) continue 2;;
				esac
				grep -qs "^$dep$" "$TMP_DIR/depends" && continue 2
			done

			if [ -n "$dep" ]; then
				debug "  add '$dep' to depends"
				echo "$dep" >> "$TMP_DIR/depends"
			else
				debug "  add '$lib' to unresolved"
				grep -qs ^$lib$ "$TMP_DIR/unresolved" ||
					echo "$lib" >> "$TMP_DIR/unresolved"
			fi
		done
	done

	spc=''
	[ -s "$TMP_DIR/depends" ] &&
	sort < "$TMP_DIR/depends" 2>/dev/null | uniq | \
	while read file; do
		echo -n "$spc$file"
		spc=' '
	done
}


