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@932
|
182
|
al@957
|
183 # if called with "--incl": show all deps including glibc-base,
|
al@957
|
184 # gcc-lib-base, glibc-dev and gcc; otherwise hide them
|
al@957
|
185 if (incl == "yes" ||
|
al@957
|
186 ! index($0, "glibc-base") &&
|
al@932
|
187 ! index($0, "gcc-lib-base") &&
|
al@932
|
188 ! index($0, "glibc-dev") &&
|
al@932
|
189 $0 != "gcc")
|
al@932
|
190 print gensub(" ", "|", "g");
|
al@932
|
191 }';;
|
al@1020
|
192 esac
|
al@932
|
193 }
|
al@932
|
194
|
al@932
|
195
|
al@932
|
196 # Search for item $1 in db $2
|
al@932
|
197
|
al@932
|
198 indb() {
|
al@932
|
199 local res="$(awk -vi="$1" '
|
al@932
|
200 {
|
al@932
|
201 if ($1 == i)
|
al@932
|
202 { print $2; found = 1; }
|
al@932
|
203 }
|
al@932
|
204 END {
|
al@932
|
205 if (found != 1) {
|
al@932
|
206 if (index(i, "statically linked"))
|
al@932
|
207 print gensub(" ", "_", "g", i);
|
al@932
|
208 else
|
al@932
|
209 printf("[%s]\n", i);
|
al@932
|
210 }
|
al@932
|
211 }
|
al@1020
|
212 ' $2 | tr '\n' ' ' | sed 's| $||')"
|
al@1020
|
213
|
al@1020
|
214 outpkg "$res"
|
al@932
|
215 }
|
al@932
|
216
|
al@932
|
217
|
al@932
|
218 # Like `ldd` function but returns packages names where dependency exists.
|
al@932
|
219 # Also can process some development files
|
al@932
|
220
|
al@932
|
221 tp_ldd() {
|
al@1020
|
222 local tmptmp libs variables pcs pkg pkgs out
|
al@932
|
223 unset IFS
|
al@932
|
224 tmptmp=$(mktemp)
|
al@932
|
225
|
al@932
|
226 case $1 in
|
al@932
|
227 *.la)
|
al@1020
|
228 if [ -n "$la" ]; then # use with --la
|
al@1020
|
229 # found dependencies in the *.la files
|
al@1020
|
230 libs=$(. $1; echo $dependency_libs)
|
al@1020
|
231 for i in $libs; do
|
al@1020
|
232 case $i in
|
al@1020
|
233 -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
|
234 *.la) indb "$i" $db_la >>$tmptmp;;
|
al@1020
|
235 esac
|
al@1020
|
236 done
|
al@1020
|
237 fi
|
al@932
|
238 ;;
|
al@932
|
239 *.pc)
|
al@932
|
240 # found dependencies in the *.pc files
|
al@1020
|
241 variables=$(mktemp)
|
al@1053
|
242 # variable value may contain spaces, so use pkg-config to safely get variable's value
|
al@1053
|
243 for i in $(grep '^[a-zA-Z_][a-zA-Z_]*=' $1 | cut -d= -f1); do
|
al@1053
|
244 echo "$i=\"$(pkg-config --variable=$i $1)\""
|
al@1053
|
245 done > $variables
|
al@1020
|
246 . $variables
|
al@1020
|
247 rm $variables
|
al@932
|
248 # Syntax examples:
|
al@932
|
249 # Requires: glib-2.0 gobject-2.0
|
al@932
|
250 # Requires.private: gmodule-no-export-2.0
|
al@932
|
251 # Requires: gobject-2.0,gio-2.0
|
al@938
|
252 # Requires.private: nspr >= 4.9.2
|
al@932
|
253 pcs=$(grep '^Requires' $1 | cut -d: -f2 | tr ',' ' ' | tr '\n' ' ')
|
al@1053
|
254 # expand $variables here, if any:
|
al@1054
|
255 # (remove '>' because '>=' here will redirect `echo` output to file '=')
|
al@1054
|
256 pcs=$(eval echo "${pcs//>/}")
|
al@932
|
257 for i in $pcs; do
|
al@938
|
258 isitlib=$(echo $i | tr -d '<=>0-9.')
|
al@938
|
259 # if it contains only comparisons, numbers, dot - it is not lib, skip
|
al@938
|
260 [ -n "$isitlib" ] || continue
|
al@1020
|
261 indb "$i.pc" $db_pc >>$tmptmp
|
al@932
|
262 done
|
al@932
|
263 # Syntax examples:
|
al@932
|
264 # Libs: -L${libdir} -lgio-2.0
|
al@932
|
265 # Libs.private: -lz -lresolv
|
al@932
|
266 libs=$(grep '^Libs' $1 | cut -d: -f2 | tr '\n' ' ')
|
al@932
|
267 for i in $libs; do
|
al@932
|
268 case $i in
|
al@1020
|
269 -L*) eval LIBDIR="${i#-L}";;
|
al@1020
|
270 -l*)
|
al@1020
|
271 eval i="$i" # substitute variables
|
al@1020
|
272 #echo ">i='$i'" >&2
|
al@1020
|
273 pkg=$(indb "lib${i#-l}.so" $db_so)
|
al@1020
|
274 #echo ">>pkg='$pkg'" >&2
|
al@1020
|
275 pkgs=$(awk -F$'\t' -vpkg="$pkg" '{if (index(" " $2 " ", " " pkg " ")) print $2;}' /home/slitaz/cache/split.db)
|
al@1020
|
276 #echo ">>pkgs='$pkgs'" >&2
|
al@1020
|
277 unset out
|
al@1020
|
278 for j in $pkgs; do
|
al@1020
|
279 # seadrch for <pkg>-dev
|
al@1020
|
280 case $j in $pkg-dev) out=$j; break;;
|
al@1020
|
281 esac
|
al@1020
|
282 done
|
al@1020
|
283 #echo ">>'$out'" >&2
|
al@1020
|
284 [ -z "$out" ] &&
|
al@1020
|
285 for j in $pkgs; do
|
al@1020
|
286 # if not found previously, search for <any>-dev
|
al@1020
|
287 case $j in *-dev) out=$j; break;;
|
al@1020
|
288 esac
|
al@1020
|
289 done
|
al@1020
|
290 #echo ">>'$out'" >&2
|
al@1020
|
291 echo ${out:-$pkg}
|
al@1020
|
292 #echo >&2
|
al@1020
|
293 ;;
|
al@932
|
294 esac
|
al@932
|
295 done
|
al@932
|
296 ;;
|
al@932
|
297 */lib/modules/*)
|
al@932
|
298 echo 'linux'
|
al@932
|
299 ;;
|
al@932
|
300 *.pl|*.pm)
|
al@932
|
301 echo 'perl'
|
al@932
|
302 ;;
|
al@932
|
303 *.py)
|
al@932
|
304 echo 'python'
|
al@932
|
305 ;;
|
al@932
|
306 *)
|
al@1020
|
307 # LD_PRELOAD= LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux* "$1" 2>/dev/null | \
|
al@1020
|
308 # sed 's| =>.*||; s| (.*||; s|\t||' | \
|
al@1020
|
309 readelf -dW "$1" 2>/dev/null \
|
al@1020
|
310 | sed -n '/NEEDED/ s|.*\[\(.*\)\]|\1|p' \
|
al@1020
|
311 | while read i; do
|
al@1020
|
312 indb "$i" $db_so >>$tmptmp
|
al@932
|
313 done
|
al@932
|
314 ;;
|
al@932
|
315 esac
|
al@932
|
316
|
al@932
|
317 sort -u $tmptmp
|
al@932
|
318 rm $tmptmp
|
al@932
|
319 }
|
al@932
|
320
|
al@932
|
321
|
al@932
|
322 # Return all the names of packages bundled in this receipt
|
al@932
|
323
|
al@932
|
324 all_names() {
|
al@1008
|
325 # Get package names from $SPLIT variable
|
al@1008
|
326 local split=$(echo $SPLIT \
|
al@1008
|
327 | awk '
|
al@1008
|
328 BEGIN { RS = " "; FS = ":"; }
|
al@1008
|
329 { print $1; }' \
|
al@1008
|
330 | tr '\n' ' ')
|
al@1008
|
331 local split_space=" $split "
|
al@1008
|
332 if [ "${split_space/ $PACKAGE /}" != "$split_space" ]; then
|
al@932
|
333 # $PACKAGE included somewhere in $SPLIT (probably in the end).
|
al@932
|
334 # We should build packages in the order defined in the $SPLIT.
|
al@1008
|
335 echo $split
|
al@932
|
336 else
|
al@932
|
337 # We'll build the $PACKAGE, then all defined in the $SPLIT.
|
al@1008
|
338 echo $PACKAGE $split
|
al@932
|
339 fi
|
al@932
|
340 }
|
al@932
|
341
|
al@932
|
342
|
al@932
|
343
|
al@932
|
344
|
al@932
|
345 unset IFS
|
al@932
|
346 . $WOK/$1/receipt
|
al@932
|
347
|
al@1040
|
348 if [ -n "$quiet" ]; then
|
al@1040
|
349 sub='\n'
|
al@1040
|
350 else
|
al@1040
|
351 sub=' '
|
al@1040
|
352 fi
|
al@1040
|
353
|
al@932
|
354 for pkg in $(all_names); do
|
al@932
|
355 title 'Dependencies for "%s"' "$pkg"
|
al@1040
|
356 [ -n "$quiet" ] && echo -n "$pkg: "
|
al@932
|
357 IFS=$'\n'
|
al@932
|
358 while read file; do
|
al@1088
|
359 # run in subprocess because VERSION may be redefined in .pc file
|
al@1088
|
360 ( tp_ldd "$WOK/$1/taz/$pkg-$VERSION/fs$file" )
|
al@1040
|
361 done < $WOK/$1/taz/$pkg-$VERSION/files.list \
|
al@1040
|
362 | sort -u | grep -v "^$pkg$" | sed '/^$/d' \
|
al@1040
|
363 | tr "$sub" ' '
|
al@1040
|
364 [ -n "$quiet" ] && echo
|
al@932
|
365 done
|
al@932
|
366
|
al@932
|
367 newline
|