cookutils diff modules/deps @ rev 1020

cook: handle rsum more stable, fix working with sets when copy() isn't used; modules/compressor: find executables and libs beyond [/usr]?/[s]?bin/; modules/deps: don't process *.la files by default; doc/receipts-v2.md: add chapter 'Dependency tracking'.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Sat Dec 23 15:03:39 2017 +0200 (2017-12-23)
parents 845d62611d92
children 0ff8d93e8855
line diff
     1.1 --- a/modules/deps	Sat Nov 18 16:38:50 2017 +0200
     1.2 +++ b/modules/deps	Sat Dec 23 15:03:39 2017 +0200
     1.3 @@ -166,6 +166,7 @@
     1.4  				s("xorg-xcb-util-image-dev",  "xcb-util-image-dev");
     1.5  				s("xorg-xcb-util-renderutil-dev", "xcb-util-renderutil-dev");
     1.6  				s("eudev-dev", "udev-dev");
     1.7 +				s("util-linux-uuid",     "ossp-uuid");
     1.8  				s("util-linux-uuid-dev", "ossp-uuid-dev");
     1.9  				s("polkit-pam-dev", "polkit-dev");
    1.10  				s("nspr", "palemoon"); # I doubt app may depend on Palemoon
    1.11 @@ -186,7 +187,7 @@
    1.12  					$0 != "gcc")
    1.13  						print gensub(" ", "|", "g");
    1.14  			}';;
    1.15 -	esac >>$tmptmp
    1.16 +	esac
    1.17  }
    1.18  
    1.19  
    1.20 @@ -206,8 +207,9 @@
    1.21  					printf("[%s]\n", i);
    1.22  			}
    1.23  		}
    1.24 -	' $2 | tr '\n' ' ')"
    1.25 -	outpkg "${res% }"
    1.26 +	' $2 | tr '\n' ' ' | sed 's| $||')"
    1.27 +
    1.28 +	outpkg "$res"
    1.29  }
    1.30  
    1.31  
    1.32 @@ -215,22 +217,29 @@
    1.33  # Also can process some development files
    1.34  
    1.35  tp_ldd() {
    1.36 +	local tmptmp libs variables pcs pkg pkgs out
    1.37  	unset IFS
    1.38  	tmptmp=$(mktemp)
    1.39  
    1.40  	case $1 in
    1.41  		*.la)
    1.42 -			# found dependencies in the *.la files
    1.43 -			libs=$(. $1; echo $dependency_libs)
    1.44 -			for i in $libs; do
    1.45 -				case $i in
    1.46 -					-l*)  indb "lib${i#-l}.so" $db_so;; # FIXME: I'm not sure it's about a *.so, but *.a often absent
    1.47 -					*.la) indb "$i" $db_la;;
    1.48 -				esac
    1.49 -			done
    1.50 +			if [ -n "$la" ]; then								# use with --la
    1.51 +				# found dependencies in the *.la files
    1.52 +				libs=$(. $1; echo $dependency_libs)
    1.53 +				for i in $libs; do
    1.54 +					case $i in
    1.55 +						-l*)  indb "${i/-l/lib}.so" $db_so >>$tmptmp;; # FIXME: I'm not sure it's about a *.so, but *.a often absent
    1.56 +						*.la) indb "$i" $db_la >>$tmptmp;;
    1.57 +					esac
    1.58 +				done
    1.59 +			fi
    1.60  			;;
    1.61  		*.pc)
    1.62  			# found dependencies in the *.pc files
    1.63 +			variables=$(mktemp)
    1.64 +			grep '^[a-zA-Z_][a-zA-Z_]*=' $1 > $variables
    1.65 +			. $variables
    1.66 +			rm $variables
    1.67  			# Syntax examples:
    1.68  			# Requires: glib-2.0 gobject-2.0
    1.69  			# Requires.private: gmodule-no-export-2.0
    1.70 @@ -241,7 +250,7 @@
    1.71  				isitlib=$(echo $i | tr -d '<=>0-9.')
    1.72  				# if it contains only comparisons, numbers, dot - it is not lib, skip
    1.73  				[ -n "$isitlib" ] || continue
    1.74 -				indb "$i.pc" $db_pc
    1.75 +				indb "$i.pc" $db_pc >>$tmptmp
    1.76  			done
    1.77  			# Syntax examples:
    1.78  			# Libs: -L${libdir} -lgio-2.0
    1.79 @@ -249,7 +258,31 @@
    1.80  			libs=$(grep '^Libs' $1 | cut -d: -f2 | tr '\n' ' ')
    1.81  			for i in $libs; do
    1.82  				case $i in
    1.83 -					-l*) indb "lib${i#-l}.so" $db_so;;
    1.84 +					-L*) eval LIBDIR="${i#-L}";;
    1.85 +					-l*)
    1.86 +						eval i="$i"		# substitute variables
    1.87 +#echo ">i='$i'" >&2
    1.88 +						pkg=$(indb "lib${i#-l}.so" $db_so)
    1.89 +#echo ">>pkg='$pkg'" >&2
    1.90 +						pkgs=$(awk -F$'\t' -vpkg="$pkg" '{if (index(" " $2 " ", " " pkg " ")) print $2;}' /home/slitaz/cache/split.db)
    1.91 +#echo ">>pkgs='$pkgs'" >&2
    1.92 +						unset out
    1.93 +						for j in $pkgs; do
    1.94 +							# seadrch for <pkg>-dev
    1.95 +							case $j in $pkg-dev) out=$j; break;;
    1.96 +							esac
    1.97 +						done
    1.98 +#echo ">>'$out'" >&2
    1.99 +						[ -z "$out" ] &&
   1.100 +						for j in $pkgs; do
   1.101 +							# if not found previously, search for <any>-dev
   1.102 +							case $j in *-dev) out=$j; break;;
   1.103 +							esac
   1.104 +						done
   1.105 +#echo ">>'$out'" >&2
   1.106 +						echo ${out:-$pkg}
   1.107 +#echo >&2
   1.108 +						;;
   1.109  				esac
   1.110  			done
   1.111  			;;
   1.112 @@ -263,10 +296,12 @@
   1.113  			echo 'python'
   1.114  			;;
   1.115  		*)
   1.116 -			LD_PRELOAD= LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux* "$1" 2>/dev/null | \
   1.117 -			sed 's| =>.*||; s| (.*||; s|\t||' | \
   1.118 -			while read i; do
   1.119 -				indb "$i" $db_so
   1.120 +#			LD_PRELOAD= LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux* "$1" 2>/dev/null | \
   1.121 +#			sed 's| =>.*||; s| (.*||; s|\t||' | \
   1.122 +			readelf -dW "$1" 2>/dev/null \
   1.123 +			| sed -n '/NEEDED/ s|.*\[\(.*\)\]|\1|p' \
   1.124 +			| while read i; do
   1.125 +				indb "$i" $db_so >>$tmptmp
   1.126  			done
   1.127  			;;
   1.128  	esac
   1.129 @@ -307,7 +342,7 @@
   1.130  	IFS=$'\n'
   1.131  	while read file; do
   1.132  		tp_ldd "$WOK/$1/taz/$pkg-$VERSION/fs$file"
   1.133 -	done < $WOK/$1/taz/$pkg-$VERSION/files.list | sort -u | grep -v "^$pkg$"
   1.134 +	done < $WOK/$1/taz/$pkg-$VERSION/files.list | sort -u | grep -v "^$pkg$" | sed '/^$/d'
   1.135  done
   1.136  
   1.137  newline