cookutils annotate modules/deps @ rev 1150

Show recent broken packages first
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Feb 19 15:32:45 2022 +0000 (2022-02-19)
parents 461c3da71257
children
rev   line source
al@932 1 #!/bin/sh
al@932 2 #
al@932 3 # deps - module of the SliTaz Cook
al@932 4 # Copyright (C) SliTaz GNU/Linux - GNU GPL v3
al@932 5 #
al@932 6
al@932 7 . /usr/lib/slitaz/libcook.sh
al@932 8
al@932 9
al@932 10 # Maintain databases
al@932 11
al@932 12 fl="$cache/tp.files.db" # combined list of all files
al@932 13 db_so="$cache/tp.so.db" # database with *.so files
al@932 14 db_a="$cache/tp.a.db" # database with *.a files
al@932 15 db_la="$cache/tp.la.db" # database with *.la files
al@932 16 db_pc="$cache/tp.pc.db" # database with *.pc files
al@932 17
al@932 18 fl_mirrorz='/var/lib/tazpkg/files.list.lzma' # mirror files list
al@932 19 fl_local='/home/slitaz/cache/files.list' # local files list
al@932 20
al@994 21
al@994 22 # check "local files list" doesn't contain files from missing/removed packages
al@994 23
al@994 24 action 'Updating %s...' "$(basename $fl_local)"
al@994 25
al@994 26 splitdb="$CACHE/split.db"
al@994 27 sed 's|:.*||' $fl_local \
al@994 28 | sort -u \
al@994 29 | while read pkg; do
al@994 30 mainpkg=$(awk -F$'\t' -vpkg=" $pkg " '{
al@994 31 if (index(" " $2 " ", pkg)) {print 1; exit}
al@994 32 }' $splitdb)
al@994 33 [ -n "$mainpkg" ] || sed -i "/^$pkg: /d" $fl_local
al@994 34 done
al@994 35 status
al@994 36
al@932 37 # recreate "combined list of all files" in the cases:
paul@937 38 # * if absent
al@932 39 # * mirror files list has been updated
al@932 40 # * local files list has been updated
al@932 41
al@938 42 case $(hostname) in
al@938 43 # Do we need to use mirror files list?
paul@939 44 # It's useful on casual development on local host, but useless on cooker server
paul@939 45 # (and slows down list creation a lot).
al@938 46 tank)
al@940 47 [ ! -s $fl -o $fl_local -nt $fl ] && cp $fl_local $fl
al@940 48 ;;
al@940 49 *)
al@938 50 if [ ! -s $fl -o $fl_mirrorz -nt $fl -o $fl_local -nt $fl ]; then
al@940 51 action 'Updating %s...' "$(basename $fl)"
al@938 52 # unpack mirror files list
al@938 53 fl_mirror="$(mktemp)"
al@944 54 lzcat $fl_mirrorz | sed '/\.\(so.*\|a\|la\|pc\)$/!d' > $fl_mirror
al@932 55
al@938 56 # remove packages that exist in local list
al@938 57 cut -d: -f1 $fl_local | uniq | \
al@938 58 while read package; do
al@938 59 sed -i "/^$package: /d" $fl_mirror
al@938 60 done
al@932 61
al@938 62 # combine lists
al@938 63 cat $fl_mirror $fl_local > $fl
al@932 64
al@938 65 # clean
al@938 66 rm $fl_mirror
al@940 67 status
al@938 68 fi
al@938 69 ;;
al@938 70 esac
al@932 71
al@932 72 # recreate "database with *.so files" in the cases:
paul@937 73 # * if absent
al@932 74 # * combined list of all files has been updated
al@932 75
al@932 76 if [ ! -s $db_so -o $fl -nt $db_so ]; then
al@940 77 action 'Updating %s...' "$(basename $db_so)"
al@932 78 fgrep '/lib/' $fl | fgrep '.so' | \
al@932 79 sed 's|^\([^:]*\):.*/\([^/]*\)$|\2\t\1|' | \
al@932 80 awk -F$'\t' '{if ($2 !~ "uclibc") print}' | \
al@932 81 sort > $db_so
al@940 82 status
al@932 83 fi
al@932 84
al@932 85 # recreate "database with *.a files" in the cases:
paul@937 86 # * if absent
al@932 87 # * combined list of all files has been updated
al@932 88
al@932 89 if [ ! -s $db_a -o $fl -nt $db_a ]; then
al@940 90 action 'Updating %s...' "$(basename $db_a)"
al@932 91 fgrep '/usr/lib/lib' $fl | fgrep '.a' | \
al@932 92 sed 's|^\([^:]*\):.*/\([^/]*\)$|\2\t\1|' | \
al@932 93 sort > $db_a
al@940 94 status
al@932 95 fi
al@932 96
al@932 97 # recreate "database with *.la files" in the cases:
paul@937 98 # * if absent
al@932 99 # * combined list of all files has been updated
al@932 100
al@932 101 if [ ! -s $db_la -o $fl -nt $db_la ]; then
al@940 102 action 'Updating %s...' "$(basename $db_la)"
al@932 103 fgrep '/usr/lib/' $fl | fgrep '.la' | \
al@932 104 sed 's|^\([^:]*\): \(.*\)$|\2\t\1|' | \
al@932 105 sort > $db_la
al@940 106 status
al@932 107 fi
al@932 108
al@932 109 # recreate "database with *.pc files" in the cases:
paul@937 110 # * if absent
al@932 111 # * combined list of all files has been updated
al@932 112
al@932 113 if [ ! -s $db_pc -o $fl -nt $db_pc ]; then
al@940 114 action 'Updating %s...' "$(basename $db_pc)"
al@932 115 grep '\.pc$' $fl | \
al@932 116 sed -e 's|^\([^:]*\):.*/\([^/]*\)$|\2\t\1|' -e '/\tbuildroot$/d' | \
al@932 117 sort > $db_pc
al@940 118 status
al@932 119 fi
al@932 120
al@932 121
al@932 122
al@932 123
paul@937 124 # Auxiliary function that deals with "not found" packages as well as with "repeatedly found" packages
al@932 125
al@932 126 outpkg() {
al@932 127 pkgs="$1"
al@932 128 case $pkgs in
al@932 129 *ld-linux.so*);;
al@932 130 *linux-gate.so*);;
al@932 131 *)
al@957 132 echo "$pkgs" | awk -vincl="$incl" '
al@932 133 # if both packages exist in list, return the first one only
al@932 134 function s(pkg1, pkg2) {
al@932 135 if (index(" "$0" ", " "pkg1" ") && index(" "$0" ", " " pkg2 " "))
al@932 136 $0 = pkg1;
al@932 137 }
al@932 138 {
al@932 139 s("wine", "wine-rt");
al@932 140 s("samba", "samba-pam");
al@932 141 s("mesa", "mesa-wayland");
al@932 142 s("mysql", "mariadb");
al@932 143 s("perl", "perl-thread");
al@932 144 s("xorg-server", "xorg-server-light");
al@932 145 s("cairo", "cairo-gl");
al@932 146 s("freetype", "freetype-infinality");
al@932 147 s("freetype", "freetype-without-harfbuzz");
al@932 148 s("harfbuzz", "harfbuzz-icu");
al@932 149 s("openbox", "openbox-imlib2");
al@932 150 s("gcc-lib-base", "gcc49-lib-base"); # also gcc54-lib-base and gcc61-lib-base
al@932 151 s("polkit", "polkit-pam");
al@932 152 s("libgudev", "eudev"); # also systemd
al@932 153 s("xz-dev", "liblzma-dev");
al@945 154 s("xorg-libxcb", "libxcb");
al@945 155 s("xorg-xcb-util-image", "xcb-util-image");
al@945 156 s("xorg-xcb-util-keysyms", "xcb-util-keysyms");
al@945 157 s("xorg-xcb-util-renderutil", "xcb-util-renderutil");
al@945 158 s("xorg-xcb-util-wm", "xcb-util-wm");
al@945 159 s("xorg-xcb-util", "xcb-util");
al@945 160 s("xorg-libxcb", "libxcb");
al@945 161 s("xorg-libxcb-dev", "libxcb-dev");
al@945 162 s("xorg-pixman", "pixman");
al@945 163 s("xorg-pixman-dev", "pixman-dev");
al@945 164 s("xorg-xcb-util-cursor", "xcb-util-cursor");
al@945 165 s("xorg-xcb-util-dev", "xcb-util-dev");
al@945 166 s("xorg-xcb-util-image-dev", "xcb-util-image-dev");
al@945 167 s("xorg-xcb-util-renderutil-dev", "xcb-util-renderutil-dev");
al@945 168 s("eudev-dev", "udev-dev");
al@1020 169 s("util-linux-uuid", "ossp-uuid");
al@987 170 s("util-linux-uuid-dev", "ossp-uuid-dev");
al@988 171 s("polkit-pam-dev", "polkit-dev");
al@989 172 s("nspr", "palemoon"); # I doubt app may depend on Palemoon
al@989 173 s("nss", "palemoon"); #
al@994 174 s("xfconf", "libxfconf"); s("xfconf-dev", "libxfconf-dev");
al@994 175 s("exo", "libexo"); s("exo-dev", "libexo-dev");
al@998 176 s("gconf", "GConf"); s("gconf-dev", "GConf-dev");
al@1003 177 s("pulseaudio", "apulse");
al@1009 178 s("cairo-dev", "cairo-gl-dev");
al@1009 179 s("freetype-dev", "freetype-infinality-dev");
al@1056 180 s("nspr", "webian-shell");
al@1063 181 s("nss", "webian-shell");
al@1090 182 s("libxml2", "libxml2-min");
al@932 183
al@957 184 # if called with "--incl": show all deps including glibc-base,
al@957 185 # gcc-lib-base, glibc-dev and gcc; otherwise hide them
al@957 186 if (incl == "yes" ||
al@957 187 ! index($0, "glibc-base") &&
al@932 188 ! index($0, "gcc-lib-base") &&
al@932 189 ! index($0, "glibc-dev") &&
al@932 190 $0 != "gcc")
al@932 191 print gensub(" ", "|", "g");
al@932 192 }';;
al@1020 193 esac
al@932 194 }
al@932 195
al@932 196
al@932 197 # Search for item $1 in db $2
al@932 198
al@932 199 indb() {
al@932 200 local res="$(awk -vi="$1" '
al@932 201 {
al@932 202 if ($1 == i)
al@932 203 { print $2; found = 1; }
al@932 204 }
al@932 205 END {
al@932 206 if (found != 1) {
al@932 207 if (index(i, "statically linked"))
al@932 208 print gensub(" ", "_", "g", i);
al@932 209 else
al@932 210 printf("[%s]\n", i);
al@932 211 }
al@932 212 }
al@1020 213 ' $2 | tr '\n' ' ' | sed 's| $||')"
al@1020 214
al@1020 215 outpkg "$res"
al@932 216 }
al@932 217
al@932 218
al@932 219 # Like `ldd` function but returns packages names where dependency exists.
al@932 220 # Also can process some development files
al@932 221
al@932 222 tp_ldd() {
al@1020 223 local tmptmp libs variables pcs pkg pkgs out
al@932 224 unset IFS
al@932 225 tmptmp=$(mktemp)
al@932 226
al@932 227 case $1 in
al@932 228 *.la)
al@1020 229 if [ -n "$la" ]; then # use with --la
al@1020 230 # found dependencies in the *.la files
al@1020 231 libs=$(. $1; echo $dependency_libs)
al@1020 232 for i in $libs; do
al@1020 233 case $i in
al@1020 234 -l*) indb "${i/-l/lib}.so" $db_so >>$tmptmp;; # FIXME: I'm not sure it's about a *.so, but *.a often absent
al@1020 235 *.la) indb "$i" $db_la >>$tmptmp;;
al@1020 236 esac
al@1020 237 done
al@1020 238 fi
al@932 239 ;;
al@932 240 *.pc)
al@932 241 # found dependencies in the *.pc files
al@1020 242 variables=$(mktemp)
al@1053 243 # variable value may contain spaces, so use pkg-config to safely get variable's value
al@1053 244 for i in $(grep '^[a-zA-Z_][a-zA-Z_]*=' $1 | cut -d= -f1); do
al@1053 245 echo "$i=\"$(pkg-config --variable=$i $1)\""
al@1053 246 done > $variables
al@1020 247 . $variables
al@1020 248 rm $variables
al@932 249 # Syntax examples:
al@932 250 # Requires: glib-2.0 gobject-2.0
al@932 251 # Requires.private: gmodule-no-export-2.0
al@932 252 # Requires: gobject-2.0,gio-2.0
al@938 253 # Requires.private: nspr >= 4.9.2
al@932 254 pcs=$(grep '^Requires' $1 | cut -d: -f2 | tr ',' ' ' | tr '\n' ' ')
al@1053 255 # expand $variables here, if any:
al@1054 256 # (remove '>' because '>=' here will redirect `echo` output to file '=')
al@1054 257 pcs=$(eval echo "${pcs//>/}")
al@932 258 for i in $pcs; do
al@938 259 isitlib=$(echo $i | tr -d '<=>0-9.')
al@938 260 # if it contains only comparisons, numbers, dot - it is not lib, skip
al@938 261 [ -n "$isitlib" ] || continue
al@1020 262 indb "$i.pc" $db_pc >>$tmptmp
al@932 263 done
al@932 264 # Syntax examples:
al@932 265 # Libs: -L${libdir} -lgio-2.0
al@932 266 # Libs.private: -lz -lresolv
al@932 267 libs=$(grep '^Libs' $1 | cut -d: -f2 | tr '\n' ' ')
al@932 268 for i in $libs; do
al@932 269 case $i in
al@1020 270 -L*) eval LIBDIR="${i#-L}";;
al@1020 271 -l*)
al@1020 272 eval i="$i" # substitute variables
al@1020 273 #echo ">i='$i'" >&2
al@1020 274 pkg=$(indb "lib${i#-l}.so" $db_so)
al@1020 275 #echo ">>pkg='$pkg'" >&2
al@1020 276 pkgs=$(awk -F$'\t' -vpkg="$pkg" '{if (index(" " $2 " ", " " pkg " ")) print $2;}' /home/slitaz/cache/split.db)
al@1020 277 #echo ">>pkgs='$pkgs'" >&2
al@1020 278 unset out
al@1020 279 for j in $pkgs; do
al@1020 280 # seadrch for <pkg>-dev
al@1020 281 case $j in $pkg-dev) out=$j; break;;
al@1020 282 esac
al@1020 283 done
al@1020 284 #echo ">>'$out'" >&2
al@1020 285 [ -z "$out" ] &&
al@1020 286 for j in $pkgs; do
al@1020 287 # if not found previously, search for <any>-dev
al@1020 288 case $j in *-dev) out=$j; break;;
al@1020 289 esac
al@1020 290 done
al@1020 291 #echo ">>'$out'" >&2
al@1020 292 echo ${out:-$pkg}
al@1020 293 #echo >&2
al@1020 294 ;;
al@932 295 esac
al@932 296 done
al@932 297 ;;
al@932 298 */lib/modules/*)
al@932 299 echo 'linux'
al@932 300 ;;
al@932 301 *.pl|*.pm)
al@932 302 echo 'perl'
al@932 303 ;;
al@932 304 *.py)
al@932 305 echo 'python'
al@932 306 ;;
al@932 307 *)
al@1020 308 # LD_PRELOAD= LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux* "$1" 2>/dev/null | \
al@1020 309 # sed 's| =>.*||; s| (.*||; s|\t||' | \
al@1020 310 readelf -dW "$1" 2>/dev/null \
al@1020 311 | sed -n '/NEEDED/ s|.*\[\(.*\)\]|\1|p' \
al@1020 312 | while read i; do
al@1020 313 indb "$i" $db_so >>$tmptmp
al@932 314 done
al@932 315 ;;
al@932 316 esac
al@932 317
al@932 318 sort -u $tmptmp
al@932 319 rm $tmptmp
al@932 320 }
al@932 321
al@932 322
al@932 323 # Return all the names of packages bundled in this receipt
al@932 324
al@932 325 all_names() {
al@1008 326 # Get package names from $SPLIT variable
al@1008 327 local split=$(echo $SPLIT \
al@1008 328 | awk '
al@1008 329 BEGIN { RS = " "; FS = ":"; }
al@1008 330 { print $1; }' \
al@1008 331 | tr '\n' ' ')
al@1008 332 local split_space=" $split "
al@1008 333 if [ "${split_space/ $PACKAGE /}" != "$split_space" ]; then
al@932 334 # $PACKAGE included somewhere in $SPLIT (probably in the end).
al@932 335 # We should build packages in the order defined in the $SPLIT.
al@1008 336 echo $split
al@932 337 else
al@932 338 # We'll build the $PACKAGE, then all defined in the $SPLIT.
al@1008 339 echo $PACKAGE $split
al@932 340 fi
al@932 341 }
al@932 342
al@932 343
al@932 344
al@932 345
al@932 346 unset IFS
al@932 347 . $WOK/$1/receipt
al@932 348
al@1040 349 if [ -n "$quiet" ]; then
al@1040 350 sub='\n'
al@1040 351 else
al@1040 352 sub=' '
al@1040 353 fi
al@1040 354
al@932 355 for pkg in $(all_names); do
al@932 356 title 'Dependencies for "%s"' "$pkg"
al@1040 357 [ -n "$quiet" ] && echo -n "$pkg: "
al@932 358 IFS=$'\n'
al@932 359 while read file; do
al@1088 360 # run in subprocess because VERSION may be redefined in .pc file
al@1088 361 ( tp_ldd "$WOK/$1/taz/$pkg-$VERSION/fs$file" )
al@1040 362 done < $WOK/$1/taz/$pkg-$VERSION/files.list \
al@1040 363 | sort -u | grep -v "^$pkg$" | sed '/^$/d' \
al@1040 364 | tr "$sub" ' '
al@1040 365 [ -n "$quiet" ] && echo
al@932 366 done
al@932 367
al@932 368 newline