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@932
|
21 # recreate "combined list of all files" in the cases:
|
paul@937
|
22 # * if absent
|
al@932
|
23 # * mirror files list has been updated
|
al@932
|
24 # * local files list has been updated
|
al@932
|
25
|
al@938
|
26 case $(hostname) in
|
al@938
|
27 # Do we need to use mirror files list?
|
paul@939
|
28 # It's useful on casual development on local host, but useless on cooker server
|
paul@939
|
29 # (and slows down list creation a lot).
|
al@938
|
30 tank)
|
al@938
|
31 if [ ! -s $fl -o $fl_mirrorz -nt $fl -o $fl_local -nt $fl ]; then
|
al@938
|
32 # unpack mirror files list
|
al@938
|
33 fl_mirror="$(mktemp)"
|
al@938
|
34 lzcat $fl_mirrorz > $fl_mirror
|
al@932
|
35
|
al@938
|
36 # remove packages that exist in local list
|
al@938
|
37 cut -d: -f1 $fl_local | uniq | \
|
al@938
|
38 while read package; do
|
al@938
|
39 sed -i "/^$package: /d" $fl_mirror
|
al@938
|
40 done
|
al@932
|
41
|
al@938
|
42 # combine lists
|
al@938
|
43 cat $fl_mirror $fl_local > $fl
|
al@932
|
44
|
al@938
|
45 # clean
|
al@938
|
46 rm $fl_mirror
|
al@938
|
47 fi
|
al@938
|
48 ;;
|
al@938
|
49 *)
|
al@938
|
50 [ ! -s $fl -o $fl_local -nt $fl ] && cp $fl_local $fl
|
al@938
|
51 ;;
|
al@938
|
52 esac
|
al@932
|
53
|
al@932
|
54 # recreate "database with *.so files" in the cases:
|
paul@937
|
55 # * if absent
|
al@932
|
56 # * combined list of all files has been updated
|
al@932
|
57
|
al@932
|
58 if [ ! -s $db_so -o $fl -nt $db_so ]; then
|
al@932
|
59 fgrep '/lib/' $fl | fgrep '.so' | \
|
al@932
|
60 sed 's|^\([^:]*\):.*/\([^/]*\)$|\2\t\1|' | \
|
al@932
|
61 awk -F$'\t' '{if ($2 !~ "uclibc") print}' | \
|
al@932
|
62 sort > $db_so
|
al@932
|
63 fi
|
al@932
|
64
|
al@932
|
65 # recreate "database with *.a files" in the cases:
|
paul@937
|
66 # * if absent
|
al@932
|
67 # * combined list of all files has been updated
|
al@932
|
68
|
al@932
|
69 if [ ! -s $db_a -o $fl -nt $db_a ]; then
|
al@932
|
70 fgrep '/usr/lib/lib' $fl | fgrep '.a' | \
|
al@932
|
71 sed 's|^\([^:]*\):.*/\([^/]*\)$|\2\t\1|' | \
|
al@932
|
72 sort > $db_a
|
al@932
|
73 fi
|
al@932
|
74
|
al@932
|
75 # recreate "database with *.la files" in the cases:
|
paul@937
|
76 # * if absent
|
al@932
|
77 # * combined list of all files has been updated
|
al@932
|
78
|
al@932
|
79 if [ ! -s $db_la -o $fl -nt $db_la ]; then
|
al@932
|
80 fgrep '/usr/lib/' $fl | fgrep '.la' | \
|
al@932
|
81 sed 's|^\([^:]*\): \(.*\)$|\2\t\1|' | \
|
al@932
|
82 sort > $db_la
|
al@932
|
83 fi
|
al@932
|
84
|
al@932
|
85 # recreate "database with *.pc 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_pc -o $fl -nt $db_pc ]; then
|
al@932
|
90 grep '\.pc$' $fl | \
|
al@932
|
91 sed -e 's|^\([^:]*\):.*/\([^/]*\)$|\2\t\1|' -e '/\tbuildroot$/d' | \
|
al@932
|
92 sort > $db_pc
|
al@932
|
93 fi
|
al@932
|
94
|
al@932
|
95
|
al@932
|
96
|
al@932
|
97
|
paul@937
|
98 # Auxiliary function that deals with "not found" packages as well as with "repeatedly found" packages
|
al@932
|
99
|
al@932
|
100 outpkg() {
|
al@932
|
101 pkgs="$1"
|
al@932
|
102 case $pkgs in
|
al@932
|
103 *ld-linux.so*);;
|
al@932
|
104 *linux-gate.so*);;
|
al@932
|
105 *)
|
al@932
|
106 echo "$pkgs" | awk '
|
al@932
|
107 # if both packages exist in list, return the first one only
|
al@932
|
108 function s(pkg1, pkg2) {
|
al@932
|
109 if (index(" "$0" ", " "pkg1" ") && index(" "$0" ", " " pkg2 " "))
|
al@932
|
110 $0 = pkg1;
|
al@932
|
111 }
|
al@932
|
112 {
|
al@932
|
113 s("wine", "wine-rt");
|
al@932
|
114 s("samba", "samba-pam");
|
al@932
|
115 s("mesa", "mesa-wayland");
|
al@932
|
116 s("mysql", "mariadb");
|
al@932
|
117 s("perl", "perl-thread");
|
al@932
|
118 s("xorg-server", "xorg-server-light");
|
al@932
|
119 s("cairo", "cairo-gl");
|
al@932
|
120 s("freetype", "freetype-infinality");
|
al@932
|
121 s("freetype", "freetype-without-harfbuzz");
|
al@932
|
122 s("harfbuzz", "harfbuzz-icu");
|
al@932
|
123 s("openbox", "openbox-imlib2");
|
al@932
|
124 s("gcc-lib-base", "gcc49-lib-base"); # also gcc54-lib-base and gcc61-lib-base
|
al@932
|
125 s("polkit", "polkit-pam");
|
al@932
|
126 s("libgudev", "eudev"); # also systemd
|
al@932
|
127 s("xz-dev", "liblzma-dev");
|
al@932
|
128
|
al@932
|
129 if (! index($0, "glibc-base") &&
|
al@932
|
130 ! index($0, "gcc-lib-base") &&
|
al@932
|
131 ! index($0, "glibc-dev") &&
|
al@932
|
132 $0 != "gcc")
|
al@932
|
133 print gensub(" ", "|", "g");
|
al@932
|
134 }';;
|
al@932
|
135 esac >>$tmptmp
|
al@932
|
136 }
|
al@932
|
137
|
al@932
|
138
|
al@932
|
139 # Search for item $1 in db $2
|
al@932
|
140
|
al@932
|
141 indb() {
|
al@932
|
142 local res="$(awk -vi="$1" '
|
al@932
|
143 {
|
al@932
|
144 if ($1 == i)
|
al@932
|
145 { print $2; found = 1; }
|
al@932
|
146 }
|
al@932
|
147 END {
|
al@932
|
148 if (found != 1) {
|
al@932
|
149 if (index(i, "statically linked"))
|
al@932
|
150 print gensub(" ", "_", "g", i);
|
al@932
|
151 else
|
al@932
|
152 printf("[%s]\n", i);
|
al@932
|
153 }
|
al@932
|
154 }
|
al@932
|
155 ' $2 | tr '\n' ' ')"
|
al@932
|
156 outpkg "${res% }"
|
al@932
|
157 }
|
al@932
|
158
|
al@932
|
159
|
al@932
|
160 # Like `ldd` function but returns packages names where dependency exists.
|
al@932
|
161 # Also can process some development files
|
al@932
|
162
|
al@932
|
163 tp_ldd() {
|
al@932
|
164 unset IFS
|
al@932
|
165 tmptmp=$(mktemp)
|
al@932
|
166
|
al@932
|
167 case $1 in
|
al@932
|
168 *.la)
|
al@932
|
169 # found dependencies in the *.la files
|
al@932
|
170 libs=$(. $1; echo $dependency_libs)
|
al@932
|
171 for i in $libs; do
|
al@932
|
172 case $i in
|
al@932
|
173 -l*) indb "lib${i#-l}.so" $db_so;; # FIXME: I'm not sure it's about a *.so, but *.a often absent
|
al@932
|
174 *.la) indb "$i" $db_la;;
|
al@932
|
175 esac
|
al@932
|
176 done
|
al@932
|
177 ;;
|
al@932
|
178 *.pc)
|
al@932
|
179 # found dependencies in the *.pc files
|
al@932
|
180 # Syntax examples:
|
al@932
|
181 # Requires: glib-2.0 gobject-2.0
|
al@932
|
182 # Requires.private: gmodule-no-export-2.0
|
al@932
|
183 # Requires: gobject-2.0,gio-2.0
|
al@938
|
184 # Requires.private: nspr >= 4.9.2
|
al@932
|
185 pcs=$(grep '^Requires' $1 | cut -d: -f2 | tr ',' ' ' | tr '\n' ' ')
|
al@932
|
186 for i in $pcs; do
|
al@938
|
187 isitlib=$(echo $i | tr -d '<=>0-9.')
|
al@938
|
188 # if it contains only comparisons, numbers, dot - it is not lib, skip
|
al@938
|
189 [ -n "$isitlib" ] || continue
|
al@932
|
190 indb "$i.pc" $db_pc
|
al@932
|
191 done
|
al@932
|
192 # Syntax examples:
|
al@932
|
193 # Libs: -L${libdir} -lgio-2.0
|
al@932
|
194 # Libs.private: -lz -lresolv
|
al@932
|
195 libs=$(grep '^Libs' $1 | cut -d: -f2 | tr '\n' ' ')
|
al@932
|
196 for i in $libs; do
|
al@932
|
197 case $i in
|
al@932
|
198 -l*) indb "lib${i#-l}.so" $db_so;;
|
al@932
|
199 esac
|
al@932
|
200 done
|
al@932
|
201 ;;
|
al@932
|
202 */lib/modules/*)
|
al@932
|
203 echo 'linux'
|
al@932
|
204 ;;
|
al@932
|
205 *.pl|*.pm)
|
al@932
|
206 echo 'perl'
|
al@932
|
207 ;;
|
al@932
|
208 *.py)
|
al@932
|
209 echo 'python'
|
al@932
|
210 ;;
|
al@932
|
211 *)
|
al@932
|
212 LD_PRELOAD= LD_TRACE_LOADED_OBJECTS=1 /lib/ld-linux* "$1" 2>/dev/null | \
|
al@932
|
213 sed 's| =>.*||; s| (.*||; s|\t||' | \
|
al@932
|
214 while read i; do
|
al@932
|
215 indb "$i" $db_so
|
al@932
|
216 done
|
al@932
|
217 ;;
|
al@932
|
218 esac
|
al@932
|
219
|
al@932
|
220 sort -u $tmptmp
|
al@932
|
221 rm $tmptmp
|
al@932
|
222 }
|
al@932
|
223
|
al@932
|
224
|
al@932
|
225 # Return all the names of packages bundled in this receipt
|
al@932
|
226
|
al@932
|
227 all_names() {
|
al@932
|
228 local split=" $SPLIT "
|
al@932
|
229 if [ "${split/ $PACKAGE /}" != "$split" ]; then
|
al@932
|
230 # $PACKAGE included somewhere in $SPLIT (probably in the end).
|
al@932
|
231 # We should build packages in the order defined in the $SPLIT.
|
al@932
|
232 echo $SPLIT
|
al@932
|
233 else
|
al@932
|
234 # We'll build the $PACKAGE, then all defined in the $SPLIT.
|
al@932
|
235 echo $PACKAGE $SPLIT
|
al@932
|
236 fi
|
al@932
|
237 }
|
al@932
|
238
|
al@932
|
239
|
al@932
|
240
|
al@932
|
241
|
al@932
|
242 unset IFS
|
al@932
|
243 . $WOK/$1/receipt
|
al@932
|
244
|
al@932
|
245 for pkg in $(all_names); do
|
al@932
|
246 title 'Dependencies for "%s"' "$pkg"
|
al@932
|
247 IFS=$'\n'
|
al@932
|
248 while read file; do
|
al@932
|
249 tp_ldd "$WOK/$1/taz/$pkg-$VERSION/fs$file"
|
al@932
|
250 done < $WOK/$1/taz/$pkg-$VERSION/files.list | sort -u | grep -v "^$pkg$"
|
al@932
|
251 done
|
al@932
|
252
|
al@932
|
253 newline
|