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