]> git.pld-linux.org Git - packages/rpm.git/blame_incremental - rpm-pld-autodep.patch
- updated for 4.4.3
[packages/rpm.git] / rpm-pld-autodep.patch
... / ...
CommitLineData
1--- rpm-4.3/build/rpmfc.c.orig Wed May 19 11:30:29 2004
2+++ rpm-4.3/build/rpmfc.c Wed May 19 17:03:01 2004
3@@ -1,6 +1,7 @@
4 #include "system.h"
5
6 #include <signal.h> /* getOutputFrom() */
7+#include <regex.h>
8
9 #include <rpmbuild.h>
10 #include <argv.h>
11@@ -9,6 +10,8 @@
12 #define _RPMDS_INTERNAL
13 #include <rpmds.h>
14 #include <rpmfi.h>
15+#include <rpmts.h>
16+#include <rpmdb.h>
17
18 #if HAVE_GELF_H
19 #include <gelf.h>
20@@ -301,14 +304,83 @@
21 return buf;
22 };
23
24+static regex_t * rpmfcExpandRegexps(const char * str,int *count){
25+ int i,j,r;
26+ const char *s;
27+ ARGV_t patterns=NULL;
28+ regex_t *compiled=NULL;
29+
30+ s=rpmExpand(str,NULL);
31+ if (s) {
32+ poptParseArgvString(s,count,(const char ***)&patterns);
33+ s = _free(s);
34+ }
35+ if (patterns==NULL){
36+ *count=0;
37+ return NULL;
38+ }
39+ if (*count==0){
40+ _free(patterns);
41+ return NULL;
42+ }
43+
44+ compiled=malloc(sizeof(regex_t)*(*count));
45+ j=0;
46+ for(i=0;i<*count;i++){
47+ r=regcomp(&compiled[j],patterns[i],REG_NOSUB);
48+ if (r==0) j++;
49+ else {
50+ rpmMessage(RPMMESS_NORMAL,
51+ _("Compilation of regular expresion '%s'"
52+ " (expanded from '%s') failed. Skipping it.\n"),
53+ patterns[i],str);
54+ }
55+ }
56+ patterns=_free(patterns);
57+ if (j==0) {
58+ compiled=_free(compiled);
59+ *count=0;
60+ return NULL;
61+ }
62+ *count=j;
63+ return compiled;
64+}
65+
66+static int rpmfcMatchRegexps(regex_t *regexps, int count, const char *str, char deptype)
67+{
68+ int j;
69+ for(j = 0; j < count; j++) {
70+ rpmMessage(RPMMESS_DEBUG,
71+ _("Checking %c: '%s' against _noauto expr. #%i\n"), deptype, str, j);
72+ if (!regexec(&regexps[j], str, 0, NULL, 0)) {
73+ rpmMessage(RPMMESS_NORMAL,
74+ _("Skipping %c: '%s' as it matches _noauto expr. #%i\n"), deptype, str, j);
75+ return 1;
76+ }
77+ }
78+ return 0;
79+}
80+
81+static regex_t * rpmfcFreeRegexps(regex_t *regexps,int count){
82+ int i;
83+
84+ if (regexps)
85+ for(i=0;i<count;i++)
86+ regfree(&regexps[i]);
87+ return _free(regexps);
88+}
89+
90 /**
91 * Run per-interpreter dependency helper.
92 * @param fc file classifier
93 * @param deptype 'P' == Provides:, 'R' == Requires:, helper
94 * @param nsdep class name for interpreter (e.g. "perl")
95+ * @param noauto _noauto* regexps
96+ * @param noauto_c # of _noauto* regexps
97 * @return 0 on success
98 */
99-static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep)
100+static int rpmfcHelper(rpmfc fc, unsigned char deptype, const char * nsdep,
101+ regex_t * noauto, int noauto_c)
102 /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
103 /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
104 {
105@@ -394,6 +466,8 @@
106 }
107 /*@=branchstate@*/
108
109+ if(rpmfcMatchRegexps(noauto, noauto_c, N, deptype))
110+ continue;
111
112 /* Add tracking dependency for versioned Provides: */
113 if (!fc->tracked && deptype == 'P' && *EVR != '\0') {
114@@ -637,9 +711,16 @@
115 /**
116 * Extract script dependencies.
117 * @param fc file classifier
118+ * @param findprov 1 to enable provides
119+ * @param findreq 1 to enable requires
120+ * @param noautoprov _noautoprov regexps
121+ * @param noautoprov_c # of _noautoprov regexps
122+ * @param noautoreq _noautoreq regexps
123+ * @param noautoreq_c # of _noautoreq regexps
124 * @return 0 on success
125 */
126-static int rpmfcSCRIPT(rpmfc fc)
127+static int rpmfcSCRIPT(rpmfc fc, int findprov, int findreq,
128+ regex_t *noautoprov, int noautoprov_c, regex_t *noautoreq, int noautoreq_c)
129 /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
130 /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
131 {
132@@ -691,7 +772,7 @@
133 *se = '\0';
134 se++;
135
136- if (is_executable) {
137+ if (is_executable && findreq && !rpmfcMatchRegexps(noautoreq, noautoreq_c, s, 'R')) {
138 /* Add to package requires. */
139 ds = rpmdsSingle(RPMTAG_REQUIRENAME, s, "", RPMSENSE_FIND_REQUIRES);
140 xx = rpmdsMerge(&fc->requires, ds);
141@@ -718,21 +799,22 @@
142 (void) fclose(fp);
143
144 if (fc->fcolor->vals[fc->ix] & RPMFC_PERL) {
145- if (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)
146- xx = rpmfcHelper(fc, 'P', "perl");
147- if (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE))
148- xx = rpmfcHelper(fc, 'R', "perl");
149+ if (findprov && fc->fcolor->vals[fc->ix] & RPMFC_MODULE)
150+ xx = rpmfcHelper(fc, 'P', "perl", noautoprov, noautoprov_c);
151+ if (findreq && (is_executable || (fc->fcolor->vals[fc->ix] & RPMFC_MODULE)))
152+ xx = rpmfcHelper(fc, 'R', "perl", noautoreq, noautoreq_c);
153 }
154 if (fc->fcolor->vals[fc->ix] & RPMFC_PYTHON) {
155- xx = rpmfcHelper(fc, 'P', "python");
156-#ifdef NOTYET
157- if (is_executable)
158-#endif
159- xx = rpmfcHelper(fc, 'R', "python");
160+ if (findprov)
161+ xx = rpmfcHelper(fc, 'P', "python", noautoprov, noautoprov_c);
162+ if (findreq)
163+ xx = rpmfcHelper(fc, 'R', "python", noautoreq, noautoreq_c);
164 }
165 if (fc->fcolor->vals[fc->ix] & RPMFC_PHP) {
166- xx = rpmfcHelper(fc, 'P', "php");
167- xx = rpmfcHelper(fc, 'R', "php");
168+ if (findprov)
169+ xx = rpmfcHelper(fc, 'P', "php", noautoprov, noautoprov_c);
170+ if (findreq)
171+ xx = rpmfcHelper(fc, 'R', "php", noautoreq, noautoreq_c);
172 }
173
174 return 0;
175@@ -739,9 +823,16 @@
176 /**
177 * Extract Elf dependencies.
178 * @param fc file classifier
179+ * @param findprov 1 to enable provides
180+ * @param findreq 1 to enable requires
181+ * @param noautoprov _noautoprov regexps
182+ * @param noautoprov_c # of _noautoprov regexps
183+ * @param noautoreq _noautoreq regexps
184+ * @param noautoreq_c # of _noautoreq regexps
185 * @return 0 on success
186 */
187-static int rpmfcELF(rpmfc fc)
188+static int rpmfcELF(rpmfc fc, int findprov, int findreq,
189+ regex_t *noautoprov, int noautoprov_c, regex_t *noautoreq, int noautoreq_c)
190 /*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/
191 /*@modifies fc, rpmGlobalMacroContext, fileSystem, internalState @*/
192 {
193@@ -844,26 +935,31 @@
194 && !(filter_GLIBC_PRIVATE != 0
195 && !strcmp(s, "GLIBC_PRIVATE")))
196 {
197+ int doauto;
198+
199 buf[0] = '\0';
200 t = buf;
201 t = stpcpy( stpcpy( stpcpy( stpcpy(t, soname), "("), s), ")");
202
203+ doauto = findprov && !rpmfcMatchRegexps(noautoprov, noautoprov_c, buf, 'P');
204 #if !defined(__alpha__)
205 if (isElf64)
206 t = stpcpy(t, "(64bit)");
207 #endif
208 t++;
209+
210+ if (doauto) {
211+ /* Add to package provides. */
212+ ds = rpmdsSingle(RPMTAG_PROVIDES,
213+ buf, "", RPMSENSE_FIND_PROVIDES);
214+ xx = rpmdsMerge(&fc->provides, ds);
215+
216+ /* Add to file dependencies. */
217+ xx = rpmfcSaveArg(&fc->ddict,
218+ rpmfcFileDep(t, fc->ix, ds));
219
220- /* Add to package provides. */
221- ds = rpmdsSingle(RPMTAG_PROVIDES,
222- buf, "", RPMSENSE_FIND_PROVIDES);
223- xx = rpmdsMerge(&fc->provides, ds);
224-
225- /* Add to file dependencies. */
226- xx = rpmfcSaveArg(&fc->ddict,
227- rpmfcFileDep(t, fc->ix, ds));
228-
229- ds = rpmdsFree(ds);
230+ ds = rpmdsFree(ds);
231+ }
232 }
233 auxoffset += aux->vda_next;
234 }
235@@ -904,25 +1000,30 @@
236 && !(filter_GLIBC_PRIVATE != 0
237 && !strcmp(s, "GLIBC_PRIVATE")))
238 {
239+ int doauto;
240+
241 buf[0] = '\0';
242 t = buf;
243 t = stpcpy( stpcpy( stpcpy( stpcpy(t, soname), "("), s), ")");
244
245+ doauto = findreq && !rpmfcMatchRegexps(noautoreq, noautoreq_c, buf, 'R');
246 #if !defined(__alpha__)
247 if (isElf64)
248 t = stpcpy(t, "(64bit)");
249 #endif
250 t++;
251
252- /* Add to package dependencies. */
253- ds = rpmdsSingle(RPMTAG_REQUIRENAME,
254- buf, "", RPMSENSE_FIND_REQUIRES);
255- xx = rpmdsMerge(&fc->requires, ds);
256-
257- /* Add to file dependencies. */
258- xx = rpmfcSaveArg(&fc->ddict,
259- rpmfcFileDep(t, fc->ix, ds));
260- ds = rpmdsFree(ds);
261+ if (doauto) {
262+ /* Add to package dependencies. */
263+ ds = rpmdsSingle(RPMTAG_REQUIRENAME,
264+ buf, "", RPMSENSE_FIND_REQUIRES);
265+ xx = rpmdsMerge(&fc->requires, ds);
266+
267+ /* Add to file dependencies. */
268+ xx = rpmfcSaveArg(&fc->ddict,
269+ rpmfcFileDep(t, fc->ix, ds));
270+ ds = rpmdsFree(ds);
271+ }
272 }
273 auxoffset += aux->vna_next;
274 }
275@@ -947,23 +1048,30 @@
276 /* Files with executable bit set only. */
277 if (fc->skipReq || !(st->st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)))
278 /*@innercontinue@*/ continue;
279+ if (!findreq)
280+ continue;
281 /* Add to package requires. */
282 depsp = &fc->requires;
283 tagN = RPMTAG_REQUIRENAME;
284 dsContext = RPMSENSE_FIND_REQUIRES;
285 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
286 assert(s != NULL);
287+ if(rpmfcMatchRegexps(noautoreq, noautoreq_c, s, 'R'))
288+ continue;
289 /*@switchbreak@*/ break;
290 case DT_SONAME:
291 gotSONAME = 1;
292 /* Add to package provides. */
293 if (fc->skipProv)
294 /*@innercontinue@*/ continue;
295+ if (!findprov) continue;
296 depsp = &fc->provides;
297 tagN = RPMTAG_PROVIDENAME;
298 dsContext = RPMSENSE_FIND_PROVIDES;
299 s = elf_strptr(elf, shdr->sh_link, dyn->d_un.d_val);
300 assert(s != NULL);
301+ if(rpmfcMatchRegexps(noautoprov, noautoprov_c, s, 'P'))
302+ continue;
303 /*@switchbreak@*/ break;
304 }
305 if (s == NULL)
306@@ -997,7 +1105,7 @@
307 /*@=branchstate =uniondef @*/
308
309 /* For DSO's, provide the basename of the file if DT_SONAME not found. */
310- if (!fc->skipProv && isDSO && !gotDEBUG && !gotSONAME) {
311+ if (findprov && !fc->skipProv && isDSO && !gotDEBUG && !gotSONAME) {
312 depsp = &fc->provides;
313 tagN = RPMTAG_PROVIDENAME;
314 dsContext = RPMSENSE_FIND_PROVIDES;
315@@ -1015,6 +1123,8 @@
316 t = stpcpy(t, s);
317 /*@=nullpass@*/
318
319+ if(!rpmfcMatchRegexps(noautoprov, noautoprov_c, buf, 'P')) {
320+
321 #if !defined(__alpha__)
322 if (isElf64)
323 t = stpcpy(t, "()(64bit)");
324@@ -1032,6 +1142,7 @@
325 /*@=boundswrite@*/
326
327 ds = rpmdsFree(ds);
328+ }
329 }
330
331 exit:
332@@ -1045,7 +1156,8 @@
333 }
334
335 typedef struct rpmfcApplyTbl_s {
336- int (*func) (rpmfc fc);
337+ int (*func) (rpmfc fc, int findprov, int findreq,
338+ regex_t *noautoprov, int noautoprov_c, regex_t *noautoreq, int noautoreq_c);
339 int colormask;
340 } * rpmfcApplyTbl;
341
342@@ -1058,6 +1170,109 @@
343 { NULL, 0 }
344 };
345
346+static int rpmfcFindRequiredPackages(rpmfc fc)
347+{
348+ rpmts ts=NULL;
349+ const char * s;
350+ char * se;
351+ rpmds ds;
352+ const char * N;
353+ const char * EVR;
354+ int_32 Flags;
355+ unsigned char deptype;
356+ int nddict;
357+ int previx;
358+ int ix;
359+ int i;
360+ int j;
361+ int xx;
362+ int r;
363+ const char * hname;
364+ rpmdbMatchIterator it;
365+ Header hdr;
366+ regex_t *noautoreqdep;
367+ int noautoreqdep_c;
368+
369+ noautoreqdep=rpmfcExpandRegexps("%{__noautoreqdep}", &noautoreqdep_c);
370+
371+ ts = rpmtsCreate(); /* XXX ts created in main() should be used */
372+
373+ rpmMessage(RPMMESS_NORMAL, _("Searching for required packages....\n"));
374+
375+ nddict = argvCount(fc->ddict);
376+ previx = -1;
377+ for (i = 0; i < nddict; i++) {
378+ s = fc->ddict[i];
379+
380+ /* Parse out (file#,deptype,N,EVR,Flags) */
381+ ix = strtol(s, &se, 10);
382+ assert(se != NULL);
383+ deptype = *se++;
384+ se++;
385+ N = se;
386+ while (*se && *se != ' ')
387+ se++;
388+ *se++ = '\0';
389+ EVR = se;
390+ while (*se && *se != ' ')
391+ se++;
392+ *se++ = '\0';
393+ Flags = strtol(se, NULL, 16);
394+
395+ if (deptype!='R') continue;
396+
397+ rpmMessage(RPMMESS_DEBUG, _("#%i requires: %s,%s,%i\n"),ix,N,EVR,Flags);
398+ if (EVR && EVR[0]) {
399+ rpmMessage(RPMMESS_DEBUG, _("skipping #%i require\n"));
400+ continue;
401+ }
402+ for(j=0;j<noautoreqdep_c;j++)
403+ if (!regexec(&noautoreqdep[j],N,0,NULL,0)) {
404+ rpmMessage(RPMMESS_NORMAL,
405+ _("skipping %s requirement processing"
406+ " (matches noautoreqdep pattern #%i)\n"),N,j);
407+ break;
408+ }
409+ if (j<noautoreqdep_c) continue;
410+ if (N[0]=='/') {
411+ rpmMessage(RPMMESS_DEBUG, _("skipping #%i require (is file requirement)\n"));
412+ continue;
413+ }
414+ it=rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, N, 0);
415+ if (!it) {
416+ rpmMessage(RPMMESS_DEBUG, _("%s -> not found\n"),N);
417+ continue;
418+ }
419+ rpmMessage(RPMMESS_DEBUG, _("Iterator: %p\n"),it);
420+ if (rpmdbGetIteratorCount(it)>1) {
421+ rpmMessage(RPMMESS_DEBUG, _("%s -> multiple (skipping)\n"),N);
422+ rpmdbFreeIterator(it);
423+ continue;
424+ }
425+ hdr=rpmdbNextIterator(it);
426+ assert(hdr!=NULL);
427+ r=rpmHeaderGetEntry(hdr,RPMTAG_NAME,NULL,(void **)&hname, NULL);
428+ assert(r<2);
429+ if (!strcmp(hname,N)) {
430+ rpmMessage(RPMMESS_DEBUG, _("%s -> %s (skipping)\n"),N,hname);
431+ rpmdbFreeIterator(it);
432+ continue;
433+ }
434+
435+ rpmMessage(RPMMESS_DEBUG, "%s -> %s\n",N,hname);
436+
437+ ds = rpmdsSingle(RPMTAG_REQUIRENAME, hname, "", RPMSENSE_FIND_REQUIRES);
438+ xx = rpmdsMerge(&fc->requires, ds);
439+ ds = rpmdsFree(ds);
440+
441+ rpmdbFreeIterator(it);
442+ }
443+
444+ noautoreqdep=rpmfcFreeRegexps(noautoreqdep,noautoreqdep_c);
445+ ts = rpmtsFree(ts);
446+ return 0;
447+}
448+
449 int rpmfcApply(rpmfc fc)
450 {
451 rpmfcApplyTbl fcat;
452@@ -1075,6 +1290,29 @@
453 int ix;
454 int i;
455 int xx;
456+ int j;
457+ int findprov;
458+ int findreq;
459+ regex_t *noautoprovfiles = NULL;
460+ int noautoprovfiles_c;
461+ regex_t *noautoreqfiles = NULL;
462+ int noautoreqfiles_c;
463+ regex_t *noautoprov = NULL;
464+ int noautoprov_c;
465+ regex_t *noautoreq = NULL;
466+ int noautoreq_c;
467+ const char *buildroot;
468+ int buildroot_l;
469+
470+ buildroot = rpmExpand("%{buildroot}",NULL);
471+ buildroot_l = strlen(buildroot);
472+
473+ noautoprovfiles = rpmfcExpandRegexps("%{__noautoprovfiles}", &noautoprovfiles_c);
474+ noautoreqfiles = rpmfcExpandRegexps("%{__noautoreqfiles}", &noautoreqfiles_c);
475+ noautoprov = rpmfcExpandRegexps("%{__noautoprov}", &noautoprov_c);
476+ noautoreq = rpmfcExpandRegexps("%{__noautoreq}", &noautoreq_c);
477+ rpmMessage(RPMMESS_DEBUG, _("%i _noautoprov patterns.\n"), noautoprov_c);
478+ rpmMessage(RPMMESS_DEBUG, _("%i _noautoreq patterns.\n"), noautoreq_c);
479
480 /* Generate package and per-file dependencies. */
481 for (fc->ix = 0; fc->fn[fc->ix] != NULL; fc->ix++) {
482@@ -1082,10 +1320,44 @@
483 for (fcat = rpmfcApplyTable; fcat->func != NULL; fcat++) {
484 if (!(fc->fcolor->vals[fc->ix] & fcat->colormask))
485 /*@innercontinue@*/ continue;
486- xx = (*fcat->func) (fc);
487+ findprov = 1;
488+ findreq = 1;
489+ if (strncmp(fc->fn[fc->ix],buildroot,buildroot_l)==0) {/* sanity check */
490+ for(j = 0; j < noautoprovfiles_c; j++) {
491+ if (!regexec(&noautoprovfiles[j],
492+ fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
493+ rpmMessage(RPMMESS_NORMAL,
494+ _("skipping %s provides detection"
495+ " (matches noautoprovfiles pattern #%i)\n"),
496+ fc->fn[fc->ix], j);
497+ findprov = 0;
498+ break;
499+ }
500+ }
501+ for(j = 0; j < noautoreqfiles_c; j++) {
502+ if (!regexec(&noautoreqfiles[j],
503+ fc->fn[fc->ix] + buildroot_l, 0, NULL, 0)) {
504+ rpmMessage(RPMMESS_NORMAL,
505+ _("skipping %s requires detection"
506+ " (matches noautoreqfiles pattern #%i)\n"),
507+ fc->fn[fc->ix], j);
508+ findreq = 0;
509+ break;
510+ }
511+ }
512+ }
513+ xx = (*fcat->func) (fc, findprov, findreq,
514+ noautoprov, noautoprov_c, noautoreq, noautoreq_c);
515 }
516 }
517
518+ noautoprovfiles = rpmfcFreeRegexps(noautoprovfiles, noautoprovfiles_c);
519+ noautoreqfiles = rpmfcFreeRegexps(noautoreqfiles, noautoreqfiles_c);
520+ noautoprov = rpmfcFreeRegexps(noautoprov, noautoprov_c);
521+ noautoreq = rpmfcFreeRegexps(noautoreq, noautoreq_c);
522+#ifdef AUTODEP_PKGNAMES /* define to use package names in R */
523+ rpmfcFindRequiredPackages(fc);
524+#endif
525 /*@-boundswrite@*/
526 /* Generate per-file indices into package dependencies. */
527 nddict = argvCount(fc->ddict);
528--- rpm-4.3/po/POTFILES.in.orig 2004-01-04 03:13:02.000000000 +0100
529+++ rpm-4.3/po/POTFILES.in 2004-02-01 21:05:50.567248776 +0100
530@@ -22,6 +22,7 @@
531 build/parseSpec.c
532 build/poptBT.c
533 build/reqprov.c
534+build/rpmfc.c
535 build/spec.c
536 lib/cpio.c
537 lib/depends.c
538--- rpm-4.3/po/pl.po.orig 2004-02-01 20:53:10.000000000 +0100
539+++ rpm-4.3/po/pl.po 2004-02-01 21:20:36.532561576 +0100
540@@ -1295,6 +1295,127 @@
541 msgid "lookup i18N strings in specfile catalog"
542 msgstr "wyszukaj wpisy I18N w katalogu pliku spec"
543
544+#: build/rpmfc.c:94
545+#, c-format
546+msgid "\texecv(%s) pid %d\n"
547+msgstr "\texecv(%s) pid %d\n"
548+
549+#. XXX this error message is probably not seen.
550+#: build/rpmfc.c:100
551+#, c-format
552+msgid "Couldn't exec %s: %s\n"
553