]> git.pld-linux.org Git - packages/adapter.git/blob - adapter.awk
- some fedora extras addons
[packages/adapter.git] / adapter.awk
1 #!/usr/bin/gawk -f
2 #
3 # Adapter adapts .spec files for PLD Linux.
4 #
5 # Copyright (C) 1999-2011 PLD-Team <feedback@pld-linux.org>
6 # Authors:
7 #       Michał Kuratczyk <kura@pld.org.pl>
8 #       Sebastian Zagrodzki <s.zagrodzki@mimuw.edu.pl>
9 #       Tomasz Kłoczko <kloczek@rudy.mif.pg.gda.pl>
10 #       Artur Frysiak <wiget@pld-linux.org>
11 #       Michal Kochanowicz <mkochano@pld.org.pl>
12 #       Jakub Bogusz <qboosh@pld-linux.org>
13 #       Elan Ruusamäe <glen@pld-linux.org>
14 #
15 # See cvs log adapter{,.awk} for list of contributors
16 #
17 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
18
19 # TODO
20 # - really long sourceX make preamble sorting totally fcked up (try snake.spec r1.1)
21 # - parse ../PLD-doc/BuildRequires.txt and setup proper BR epoches?
22 # - add "-nc" option to skip CVS interaction
23 # - sort Summary(XX)
24 # - sort Requires, BuildRequires
25 # - check if %description (lang=C) contains 8bit
26 # - desc wrapping is totally fucked up on global.spec,1.25, dosemu.spec,1.115-
27 # - it should change: /%source([0-9]+)/i to %{SOURCE\1}
28 # - extra quote on LDFLAGS line: https://bugs.launchpad.net/pld-linux/+bug/385836
29 # - %{with_foo:%attr()...} gets converted to %attr() %{with_foo:...} [vlc.spec]
30 # - 'R: foo ' (with traliling space) gets coverted to "R: foo\nR: " [vlc.spec @ 1.199 ]
31
32 BEGIN {
33         RPM_SECTIONS = "package|build|changelog|clean|description|install|post|posttrans|postun|pre|prep|pretrans|preun|triggerin|triggerpostun|triggerun|verifyscript|check"
34         SECTIONS = "^%(" RPM_SECTIONS ")"
35
36         RCSID = "$Id$"
37         rev = RCSID # TODO: parse from RCSID
38         VERSION = "0.35/" rev
39
40         PREAMBLE_TAGS = "(R|BR|Summary|Name|Version|Release|Epoch|License|Group|URL|BuildArch|BuildRoot|Obsoletes|Conflicts|Provides|ExclusiveArch|ExcludeArch|Pre[Rr]eq|(Build)?Requires|Suggests|Auto(Req|Prov))"
41
42         usedigest = 0   # Enable to switch to rpm 4.4.6+ md5 digests
43
44         preamble = 1    # Is it part of preamble? Default - yes
45         boc = 4                 # Beginning of %changelog
46         bod = 0                 # Beginning of %description
47         tw = 70                 # Descriptions width
48
49         b_idx = 0               # index of BR/R arrays
50         BR_count = 0    # number of additional BuildRequires
51
52         # If variable removed, then 1 (for removing it from export)
53         removed["LDFLAGS"] = 0
54         removed["CFLAGS"] = 0
55         removed["CXXFLAGS"] = 0
56
57         # If 1, we are inside of comment block (started with /^#%/)
58         comment_block = 0
59
60         import_rpm_macros()
61
62         packages_dir = topdir
63         groups_file = packages_dir "/rpm.groups"
64
65         system("cd "packages_dir"; [ -f rpm.groups ] || cvs up rpm.groups > /dev/null")
66         system("[ -d ../PLD-doc ] && cd ../PLD-doc && ([ -f BuildRequires.txt ] || cvs up BuildRequires.txt >/dev/null)");
67
68         # Temporary file for changelog section
69         changelog_file = mktemp("adapter.changelogXXXXXX")
70 }
71
72 # There should be a comment with CVS keywords on the first line of file.
73 FNR == 1 {
74         if (!/^# \$[R]evision: .* \$, \$[D]ate: .* \$$/) {      # If this line is already OK?
75                 print "# $" "Revision:$, " "$" "Date:$" # No
76                 if ( /^#.*([rR]evision|[dD]ate)/ ) # There was something similar, but incorrect
77                          next
78         } else {
79                 print $0                                # Yes
80                 next            # It is enough for first line
81         }
82 }
83
84 # If the latest line matched /%files/
85 defattr == 1 {
86         if (ENVIRON["SKIP_DEFATTR"] != 1) {
87                 if ($0 !~ /defattr/) {  # If no %defattr
88                         print "%defattr(644,root,root,755)"     # Add it
89                 } else {
90                         $0 = "%defattr(644,root,root,755)"      # Correct mistakes (if any)
91                 }
92         }
93         defattr = 0
94 }
95
96 # call mktemp(1) and return the value
97 function mktemp(template, tmp) {
98    "mktemp " template | getline tmp
99    return tmp
100 }
101
102 function b_makekey(a, b,        s) {
103         s = a "" b;
104         # kill bcond
105         gsub(/[#%]+{[!?]+[_a-zA-Z0-9]+:/, "", s);
106
107         # kill commented out items
108         gsub(/^#[ \t]*/, "", s);
109
110         # force order
111         gsub(/^Summary\(/, "11Summary(", s);
112         gsub(/^Summary/, "10Summary", s);
113
114         gsub(/^Name/, "2Name", s);
115         gsub(/^Version/, "3Version", s);
116         gsub(/^Release/, "4Release", s);
117         gsub(/^Epoch/, "5Epoch", s);
118         gsub(/^License/, "5License", s);
119         gsub(/^Group/, "6Group", s);
120         gsub(/^URL/, "7URL", s);
121
122         gsub(/^BuildRequires/, "B1BuildRequires", s);
123         gsub(/^BuildConflicts/, "B2BuildConflicts", s);
124
125         gsub(/^Suggests/, "X1Suggests", s);
126         gsub(/^Provides/, "X2Provides", s);
127         gsub(/^Obsoletes/, "X3Obsoletes", s);
128         gsub(/^Conflicts/, "X4Conflicts", s);
129         gsub(/^BuildArch/, "X5BuildArch", s);
130         gsub(/^ExclusiveArch/, "X6ExclusiveArch", s);
131         gsub(/^ExcludeArch/, "X7ExcludeArch", s);
132         gsub(/^BuildRoot/, "X9BuildRoot", s);
133
134         gsub(/^AutoProv/, "Xx1AutoProv", s);
135         gsub(/^AutoReq/, "Xx2AutoReq", s);
136
137 #       printf("%s -> %s\n", a""b, s);
138         return s;
139 }
140
141 # Comments
142 /^#/ && (description == 0) {
143         if (/This file does not like to be adapterized!/) {
144                 print                   # print this message
145                 while (getline)         # print the rest of spec as it is
146                         print
147                 do_not_touch_anything = 1 # do not touch anything in END()
148                 exit(rc = 0)
149         }
150
151         # Generally, comments are printed without touching
152         sub(/[ \t]+$/, "")
153
154         if (/#[ \t]*Source.*md5/) {
155                 if (usedigest == 1) {
156                         sub(/^#[ \t]*Source/, "BuildRequires:\tdigest(%SOURCE", $0)
157                         sub(/-md5[ \t]*:[ \t]*/, ") = ", $0)
158                 }
159                 print $0
160                 next
161         }
162 }
163
164 /^%define/ {
165         # Remove defining _applnkdir (this macro has been included in rpm-3.0.4)
166         if ($2 == "_applnkdir") {
167                 next
168         }
169         if ($2 == "date") {
170                 date = 1
171                 if (did_files == 0) {
172                         print "%files"
173                         print ""
174                         did_files = 1
175                 }
176         }
177
178         # Do not add %define of _prefix if it already is.
179         if ($2 ~ /^_prefix/) {
180                 sub("^"prefix, $3, bindir)
181                 sub("^"prefix, $3, sbindir)
182                 sub("^"prefix, $3, libdir)
183                 sub("^"prefix, $3, datadir)
184                 sub("^"prefix, $3, includedir)
185                 prefix = $3
186         }
187
188         if ($2 ~ /_bindir/ && !/_sbindir/)
189                 bindir = $3
190         if ($2 ~ /_sbindir/)
191                 sbindir = $3
192         if ($2 ~ /_libdir/) {
193                 if ($3 ~ /^%\(/) {
194                         # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.")
195                         libdir = "%%%%%%%%%%%%%%"
196                 } else {
197                         libdir = $3
198                 }
199         }
200         if ($2 ~ /_sysconfdir/) {
201                 if ($3 ~ /^%\(/) {
202                         # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.")
203                         sysconfdir = "%%%%%%%%%%%%%%"
204                 } else {
205                         sysconfdir = $3
206                 }
207         }
208         if ($2 ~ /_datadir/) {
209                 if ($3 ~ /^%\(/) {
210                         # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.")
211                         datadir = "%%%%%%%%%%%%%%"
212                 } else {
213                         datadir = $3
214                 }
215         }
216         if ($2 ~ /_includedir/)
217                 includedir = $3
218         if ($2 ~ /_mandir/)
219                 mandir = $3
220         if ($2 ~ /_infodir/)
221                 infodir = $3
222         if ($2 ~ /_docdir/)
223                 docdir = $3
224
225         # version related macros
226         if ($2 ~ /^_beta$/)
227                 _beta = $3
228         if ($2 ~ /^_rc$/)
229                 _rc = $3
230         if ($2 ~ /^_pre$/)
231                 _pre = $3
232         if ($2 ~ /^_snap$/)
233                 _snap = $3
234         if ($2 ~ /^subver$/)
235                 subver = $3
236
237         # these are used usually when adapterizing external spec
238         if ($2 ~ /^name$/)
239                 name = $3
240         if ($2 ~ /^version$/)
241                 version = $3
242         if ($2 ~ /^release$/)
243                 release = $3
244
245         if ($2 ~ /^mod_name$/)
246                 mod_name = $3
247         if ($2 ~ /^_?pearname$/)
248                 pearname = $3
249         if ($2 ~ /^_class$/)
250                 pear_class = $3
251         if ($2 ~ /^_subclass$/)
252                 pear_subclass = $3
253
254         # kill the _class and _subclass pear macros
255         if ($2 == "_pearname" || $2 == "pearname") {
256                 if (pear_class) {
257                         gsub("%{_class}", pear_class, $3);
258                 }
259                 if (pear_subclass) {
260                         gsub("%{_subclass}", pear_subclass, $3);
261                 }
262         }
263
264         sub(/[ \t]+$/, "");
265         # do nothing further, otherwise adapter thinks we're at preamble
266         print
267         next
268 }
269
270 # Obsolete
271 /^%include.*\/usr\/lib\/rpm\/macros\.python$/ {
272         next
273 }
274
275 ################
276 # %description #
277 ################
278 /^%description/, (!/^%description/ && $0 ~ SECTIONS) {
279         preamble = 0
280
281         if (/^%description/) {
282                 bod++
283                 format_line = ""
284                 format_indent = -1
285         }
286
287         # Format description
288         if (ENVIRON["SKIP_DESC"] != 1 && description == 1 && !/^%[a-z]+/ && !/^%description/) {
289                 if (/^[ \t]*$/) {
290                         format_flush(format_line, format_indent)
291                         print ""
292                         format_line = ""
293                         format_indent = -1
294                 } else if (/^[ \t]*[-\*][ \t]*/) {
295                         format_flush(format_line, format_indent)
296                         match($0, /^[ \t]*/)
297                         format_indent = RLENGTH
298                         match($0, /^[ \t]*[-\*][ \t]/)
299                         format_line = substr($0, RLENGTH)
300                 } else
301                         format_line = format_line " " $0
302                 next
303         }
304
305         if (/^%[a-z]+/ && (!/^%description/ || bod == 2)) {
306                 if (NF > 3 && $2 == "-l") {
307                         ll = $1
308                         for (i = 4; i <= NF; i++)
309                                 ll = ll " " $i
310                         $0 = ll " -l " $3
311                 }
312                 format_flush(format_line, format_indent)
313                 if (bod == 2) {
314                         bod = 1
315                         description = 1
316                 } else {
317                         bod = 0
318                         description = 0
319                 }
320         } else
321                 description = 1
322 }
323
324 #########
325 # %prep #
326 #########
327 /^%prep/, (!/^%prep/ && $0 ~ SECTIONS) {
328         preamble = 0
329         did_prep = 1
330
331         use_macros()
332
333         # Add '-q' to %setup
334         if (/^%setup/ && !/-q/) {
335                 sub(/^%setup/, "%setup -q")
336         }
337
338         if (/^%setup/ && name != "setup") {
339                 $0 = fixedsub(name, "%{name}", $0);
340                 $0 = fixedsub(version, "%{version}", $0);
341                 if (_beta) {
342                         $0 = fixedsub(_beta, "%{_beta}", $0);
343                 }
344                 if (_rc) {
345                         $0 = fixedsub(_rc, "%{_rc}", $0);
346                 }
347                 if (_pre) {
348                         $0 = fixedsub(_pre, "%{_pre}", $0);
349                 }
350                 if (_snap) {
351                         $0 = fixedsub(_snap, "%{_snap}", $0);
352                 }
353                 if (subver) {
354                         $0 = fixedsub(subver, "%{subver}", $0);
355                 }
356         }
357
358         if (/^%setup/ && /-n %{name}-%{version}( |$)/) {
359                 $0 = fixedsub(" -n %{name}-%{version}", "", $0)
360         }
361         sub("^%patch ", "%patch0 ");
362
363         # fedora extras
364         if (/^%apply/) {
365                 sub("^%apply -n", "%patch");
366         }
367
368         # invalid in %prep
369         sub("^rm -rf \$RPM_BUILD_ROOT.*", "");
370 }
371
372 ##########
373 # %build #
374 ##########
375 /^%build/, (!/^%build/ && $0 ~ SECTIONS) {
376         preamble = 0
377
378         if (did_prep == 0) {
379                 print "%prep"
380                 print ""
381                 did_prep = 1
382         }
383
384         use_macros()
385         use_tabs()
386
387         if (/^automake$/)
388                 sub(/$/, " -a -c")
389
390         if (/LDFLAGS/) {
391                 if (/LDFLAGS="-s"/) {
392                         removed["LDFLAGS"] = 1
393                         next
394                 } else {
395                         split($0, tmp, "LDFLAGS=")
396                         count = split(tmp[2], flags, "\"")
397                         if (flags[1] != "" && flags[1] !~ "!?debug") {
398                                 sub(/-s[" ]?/, "%{rpmldflags} ", flags[1])
399                                 $0 = tmp[1] line[1] "LDFLAGS=" flags[1] "\""
400                                 for (i = 2; i < count; i++)
401                                         $0 = $0 flags[i] "\""
402                         }
403                 }
404         }
405
406         if (/CFLAGS=/)
407                 if (cflags("CFLAGS") == 0)
408                         next
409
410         if (/CXXFLAGS=/)
411                 if (cflags("CXXFLAGS") == 0)
412                         next
413
414         if (/^export /) {
415                 if (removed["LDFLAGS"])
416                         sub(" LDFLAGS", "")
417                 if (removed["CFLAGS"])
418                         sub(" CFLAGS", "")
419                 if (removed["CXXFLAGS"])
420                         sub(" CXXFLAGS", "")
421                 # Is there still something?
422                 if (/^export[ ]*$/)
423                         next
424         }
425
426         # quote CC
427         if (/CC=%{__cc} /) {
428                 sub("CC=%{__cc}", "CC=\"%{__cc}\"")
429         }
430         
431         # use PLD Linux macros
432         $0 = fixedsub("glib-gettextize --copy --force","%{__glib_gettextize}", $0);
433         $0 = fixedsub("intltoolize --copy --force", "%{__intltoolize}", $0);
434         $0 = fixedsub("automake --add-missing --copy", "%{__automake}", $0);
435         $0 = fixedsub("automake -a --foreign --copy", "%{__automake}", $0);
436         $0 = fixedsub("automake -a -c --foreign", "%{__automake}", $0);
437         $0 = fixedsub("automake -a -c", "%{__automake}", $0);
438         $0 = fixedsub("libtoolize --force --automake --copy", "%{__libtoolize}", $0);
439         $0 = fixedsub("libtoolize -c -f --automake", "%{__libtoolize}", $0);
440
441         sub(/^aclocal$/, "%{__aclocal}");
442         sub(/^autoheader$/, "%{__autoheader}");
443         sub(/^autoconf$/, "%{__autoconf}");
444         sub(/^automake$/, "%{__automake}");
445         sub(/^libtoolize$/, "%{__libtoolize}");
446
447         # atrpms
448         $0 = fixedsub("%perl_configure", "%{__perl} Makefile.PL \\\n\tINSTALLDIRS=vendor", $0);
449         $0 = fixedsub("%perl_makecheck", "%{?with_tests:%{__make} test}", $0);
450
451         # alt linux
452         $0 = fixedsub("%make_build", "%{__make}", $0);
453 }
454
455 ##########
456 # %clean #
457 ##########
458 /^%clean/, (!/^%clean/ && $0 ~ SECTIONS) {
459         did_clean = 1
460
461         use_macros()
462 }
463
464 ############
465 # %install #
466 ############
467 /^%install/, (!/^%install/ && $0 ~ SECTIONS) {
468
469         preamble = 0
470
471         # foreign rpms
472         sub("^%{__rm} -rf %{buildroot}", "rm -rf $RPM_BUILD_ROOT")
473         sub("%buildroot", "$RPM_BUILD_ROOT");
474         sub("%{buildroot}", "$RPM_BUILD_ROOT");
475
476         if (/^[ \t]*rm([ \t]+-[rf]+)*[ \t]+(\${?RPM_BUILD_ROOT}?|%{?buildroot}?)/ && did_rmroot==0) {
477                 did_rmroot=1
478                 print "rm -rf $RPM_BUILD_ROOT"
479                 next
480         }
481
482         if (!/^(#?[ \t]*)$/ && !/^%install/ && did_rmroot==0) {
483                 print "rm -rf $RPM_BUILD_ROOT"
484                 did_rmroot=1
485         }
486
487         if (tmpdir) {
488                 buildroot = tmpdir "/" name "-" version "-root-" ENVIRON["USER"]
489                 gsub(buildroot, "$RPM_BUILD_ROOT")
490         }
491
492         if (!/%{_lib}/) {
493                 sub("\$RPM_BUILD_ROOT/%", "$RPM_BUILD_ROOT%")
494         }
495
496         use_macros()
497
498         # 'install -d' instead 'mkdir -p'
499         if (/mkdir -p/)
500                 sub(/mkdir -p/, "install -d")
501
502         # cp -a already implies cp -r
503         sub(/^cp -ar/, "cp -a")
504
505         # No '-u root' or '-g root' for 'install'
506         if (/^install/ && /-[ug][ \t]*root/)
507                 gsub(/-[ug][ \t]*root /, "")
508
509         if (/^install/ && /-m[ \t]*[0-9]+/)
510                 gsub(/-m[ \t]*[0-9]+ /, "")
511
512         # No lines contain 'chown' or 'chgrp' if owner/group is 'root'
513         if (($1 ~ /chown/ && $2 ~ /root\.root/) || ($1 ~ /chgrp/ && $2 ~ /root/))
514                 next
515
516         # No lines contain 'chmod' if it sets the modes to '644'
517         if ($1 ~ /chmod/ && $2 ~ /644/)
518                 next
519
520         # atrpms
521         $0 = fixedsub("%perl_makeinstall", "%{__make} pure_install \\\n\tDESTDIR=$RPM_BUILD_ROOT", $0);
522
523         # alt linux
524         $0 = fixedsub("%make_install DESTDIR=$RPM_BUILD_ROOT install", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT", $0);
525 }
526
527 ##########
528 # %files #
529 ##########
530 /^%files/, (!/^%files/ && $0 ~ SECTIONS) {
531         preamble = 0
532         did_files = 1
533
534         if ($0 ~ /^%files/)
535                 defattr = 1
536
537         if (!use_files_macros()) {
538                 next
539         }
540 }
541
542 ##############
543 # %changelog #
544 ##############
545 /^%changelog/, (!/^%changelog/ && $0 ~ SECTIONS) {
546         preamble = 0
547         has_changelog = 1
548         skip = 0
549         # There should be some CVS keywords on the first line of %changelog.
550         if (boc == 3) {
551                 if ($0 !~ _cvsmailfeedback) {
552                         print "* %{date} " _cvsmailfeedback > changelog_file
553                 } else {
554                         skip = 1
555                 }
556                 boc = 2
557         }
558         if (boc == 2 && !skip) {
559                 if (!/All persons listed below/) {
560                         printf "All persons listed below can be reached at " > changelog_file
561                         print "<cvs_login>" _cvsmaildomain "\n" > changelog_file
562                 } else {
563                         skip = 1
564                 }
565                 boc = 1
566         }
567         if (boc == 1 && !skip) {
568                 if (!/^$/) {
569                         if (!/\$.*Log:.*\$/) {
570                                 print "$" "Log:$" > changelog_file
571                         }
572                         boc = 0
573                 }
574         }
575         # Define date macro.
576         if (boc == 4) {
577                 if (date == 0) {
578                         printf "%%define date\t%%(echo `LC_ALL=\"C\"" > changelog_file
579                         print " date +\"%a %b %d %Y\"`)" > changelog_file
580                         date = 1
581                 }
582                 boc = 3
583         }
584
585         sub(/[ \t]+$/, "");
586         if (!/^%[a-z]+$/ || /changelog/) {
587                 # stop changelog if "real" changelog starts
588                 if (boc == 0 && /^\* /) {
589                         boc = -1
590                 }
591                 if (boc == -1) {
592                         next;
593                 }
594                 print > changelog_file
595         } else {
596                 print
597         }
598         next
599 }
600
601 ###########
602 # SCRIPTS #
603 ###########
604 /^%pre/, (!/^%pre/ && $0 ~ SECTIONS) {
605         preamble = 0
606
607         if (gsub("/usr/sbin/useradd", "%useradd")) {
608                 sub(" 2> /dev/null \|\| :", "");
609                 sub(" >/dev/null 2>&1 \|\|:", "");
610         }
611
612         # fedora extras macros
613         if (/%__fe_useradd/) {
614                 sub("%__fe_useradd", "%useradd -u ");
615                 sub(" 2> /dev/null \|\| :", "");
616                 sub(" >/dev/null 2>&1 \|\|:", "");
617                 sub(" &>/dev/null \\|\\| :", "");
618         }
619
620         if (/%__fe_groupadd/) {
621                 sub("%__fe_groupadd", "%groupadd -g ");
622                 sub(" &>/dev/null \\|\\| :", "");
623         }
624
625         # %useradd and %groupadd may not be wrapped
626         if (/%(useradd|groupadd).*\\$/) {
627                 a = $0; getline;
628                 sub(/^[\s\t]*/, "");
629                 $0 = substr(a, 1, length(a) - 1) $0;
630         }
631         use_script_macros()
632 }
633
634 /^%post/, (!/^%post/ && $0 ~ SECTIONS) {
635         preamble = 0
636
637         # fedora extras macros
638         sub("%__chkconfig", "/sbin/chkconfig");
639
640         use_macros()
641 }
642 /^%preun/, (!/^%preun/ && $0 ~ SECTIONS) {
643         preamble = 0
644         use_macros()
645 }
646 /^%postun/, (!/^%postun/ && $0 ~ SECTIONS) {
647         preamble = 0
648
649         # fedora extras macros
650         if (/%__fe_userdel|%__fe_groupdel/) {
651                 sub("%__fe_groupdel", "%groupremove");
652                 sub("%__fe_userdel", "%userremove");
653                 sub(" &>/dev/null \\|\\| :", "");
654         }
655
656         use_script_macros()
657 }
658 /^%triggerin/, (!/^%triggerin/ && $0 ~ SECTIONS) {
659         preamble = 0
660         use_script_macros()
661 }
662 /^%triggerun/, (!/^%triggerun/ && $0 ~ SECTIONS) {
663         preamble = 0
664         use_script_macros()
665 }
666 /^%triggerpostun/, (!/^%triggerpostun/ && $0 ~ SECTIONS) {
667         preamble = 0
668         use_script_macros()
669 }
670 /^%pretrans/, (!/^%pretrans/ && $0 ~ SECTIONS) {
671         preamble = 0
672         use_script_macros()
673 }
674 /^%posttrans/, (!/^%posttrans/ && $0 ~ SECTIONS) {
675         preamble = 0
676         use_script_macros()
677 }
678 /^%verifyscript/, (!/^%verifyscript/ && $0 ~ SECTIONS) {
679         preamble = 0
680         use_script_macros()
681 }
682 /^%check/, (!/^%check/ && $0 ~ SECTIONS) {
683         preamble = 0
684         use_script_macros()
685 }
686
687 #############
688 # PREAMBLES #
689 #############
690 preamble == 1 {
691         # There should not be a space after the name of field
692         # and before the colon.
693         sub(/[ \t]*:/, ":")
694
695         if (/^%perl_module_wo_prefix/) {
696                 name = $2
697                 version = $3
698                 release = "0." fixedsub(".%{disttag}.at", "", $4)
699         }
700
701         field = tolower($1)
702         if (field ~ /summary:/ && !/etc\.$/ && !/Inc\.$/) {
703                 sub(/\.$/, "", $0);
704         }
705         if (field ~ /group(\([^)]+\)):/)
706                 next
707         if (field ~ /group:/) {
708                 format_preamble()
709                 group = $0;
710                 sub(/^[^ \t]*[ \t]*/, "", group);
711                 group = replace_groupnames(group);
712                 $0 = "Group:\t\t" group
713
714                 if (group ~ /^X11/ && x11 == 0) # Is it X11 application?
715                         x11 = 1
716
717                 byl_plik_z_groupmi = 0
718                 byl_opis_grupy = 0
719                 while ((getline linia_grup < groups_file) > 0) {
720                         byl_plik_z_groupmi = 1
721                         if (linia_grup == group) {
722                                 byl_opis_grupy = 1
723                                 break
724                         }
725                 }
726
727                 if (!byl_plik_z_groupmi)
728                         print "######\t\t" groups_file ": no such file"
729                 else if (!byl_opis_grupy)
730                         print "######\t\t" "Unknown group!"
731
732                 close(groups_file)
733                 did_groups = 1
734         }
735
736         if (field ~ /prereq:/) {
737                 sub(/Pre[Rr]eq:/, "Requires:", $1);
738         }
739
740         # split (build)requires, obsoletes on commas
741         if (field ~ /(obsoletes|requires|provides|conflicts|suggests):/ && NF > 2) {
742                 value = substr($0, index($0, $2));
743                 $0 = format_requires($1, value);
744         }
745
746         # BR: tar (and others) is to common (rpm-build requires it)
747         if (field ~ /^buildrequires:/) {
748                 l = substr($0, index($0, $2));
749                 if (l == "awk" ||
750                         l == "binutils" ||
751                         l == "bzip2" ||
752                         l == "cpio" ||
753                         l == "diffutils" ||
754                         l == "elfutils" ||
755                         l == "fileutils" ||
756                         l == "findutils" ||
757                         l == "glibc-devel" ||
758                         l == "grep" ||
759                         l == "gzip" ||
760                         l == "make" ||
761                         l == "patch" ||
762                         l == "sed" ||
763                         l == "sh-utils" ||
764                         l == "tar" ||
765                         l == "textutils") {
766                         next
767                 }
768
769                 replace_requires();
770         }
771
772         if (field ~ /^requires:/ || field ~ /^requires\(/) {
773                 replace_requires();
774         }
775
776
777         # obsolete/unwanted tags
778         if (field ~ /vendor:|packager:|distribution:|docdir:|prefix:|icon:|author:|author-email:|metadata-version:/) {
779                 next
780         }
781
782         if (field ~ /buildroot:/) {
783                 $0 = $1 "%{tmpdir}/%{name}-%{version}-root-%(id -u -n)"
784                 did_build_root = 1
785         }
786
787         # Use "License" instead of "Copyright" if it is (L)GPL or BSD
788         if (field ~ /copyright:/ && $2 ~ /GPL|BSD/) {
789                 $1 = "License:"
790         }
791
792         # ease updating from debian .dsc
793         if (field ~ /homepage:/) {
794                 $1 = "URL:"
795         }
796
797         # suse
798         if (field ~ /recommends:/) {
799                 $1 = "Suggests:"
800         }
801
802         if ($3 == "==" && $1 !~ /%/) {
803                 $3 = "="
804         }
805
806         if (field ~ /license:/) {
807                 l = substr($0, index($0, $2));
808                 if (l == "Python Software Foundation License") {
809                         l = "PSF"
810                 }
811                 if (l == "Apache License 2.0" || l == "Apache 2.0" || l == "Apache License Version 2.0" || l == "Apache License, Version 2.0" || l == "Apache Software License v2") {
812                         l = "Apache v2.0"
813                 }
814                 if (l == "Apache Group License" || l == "Apache Software License" || l == "Apache License") {
815                         l = "Apache"
816                 }
817                 if (l == "Apache-style License" || l == "Apache-style Software License") {
818                         l = "Apache-like"
819                 }
820                 if (l == "Apache Software License 1.1" || l == "Apache 1.1") {
821                         l = "Apache v1.1"
822                 }
823                 if (l == "GPLv2") {
824                         l = "GPL v2"
825                 }
826                 if (l == "GPLv2+") {
827                         l = "GPL v2+"
828                 }
829                 if (l == "GPL v2 or later") {
830                         l = "GPL v2+"
831                 }
832                 if (l == "LGPL v2.0 only") {
833                         l = "LGPL v2"
834                 }
835                 if (l == "LGPLv2+") {
836                         l = "LGPL v2+"
837                 }
838                 if (l == "GPLv3") {
839                         l = "GPL v3"
840                 }
841                 if (l == "GPLv3+") {
842                         l = "GPL v3+"
843                 }
844                 if (l == "MPLv1.1") {
845                         l = "MPL v1.1"
846                 }
847                 $0 = "License:\t" l;
848         }
849
850
851         if (field ~ /name:/) {
852                 if ($2 == "%{name}" && name) {
853                         $2 = name
854                 }
855                 name = $2
856                 name_seen = 1;
857         }
858
859         if (field ~ /version:/) {
860                 if ($2 == "%{version}" && version) {
861                         $2 = version
862                 }
863                 version = $2
864                 version_seen = 1;
865         }
866
867         if (field ~ /release:/) {
868                 if ($2 == "%{release}" && release) {
869                         $2 = release
870                 }
871                 sub(/%atrelease /, "0.", $0)
872                 release = $2
873                 release_seen = 1;
874         }
875
876
877         if (field ~ /serial:/)
878                 $1 = "Epoch:"
879
880         if (field ~ /home-page:/)
881                 $1 = "URL:"
882
883         # proper caps
884         if (field ~ /^url:$/)
885                 $1 = "URL:"
886
887         if (field ~ /^patch/)
888                 $1 = "Patch" substr(field, 6);
889
890         if (field ~ /^description:$/)
891                 $1 = "\n%description\n"
892
893         # Use %{name} and %{version} in the filenames in "Source:"
894         if (field ~ /^source/ || field ~ /patch/) {
895                 n = split($2, url, /\//)
896                 if (url[n] ~ /\.gz$/) {
897                         url[n+1] = ".gz" url[n+1]
898                         sub(/\.gz$/,"",url[n])
899                 }
900                 if (url[n] ~ /\.zip$/) {
901                         url[n+1] = ".zip" url[n+1]
902                         sub(/\.zip$/,"",url[n])
903                 }
904                 if (url[n] ~ /\.tar$/) {
905                         url[n+1] = ".tar" url[n+1]
906                         sub(/\.tar$/,"",url[n])
907                 }
908                 if (url[n] ~ /\.patch$/) {
909                         url[n+1] = ".patch" url[n+1]
910                         sub(/\.patch$/,"",url[n])
911                 }
912                 if (url[n] ~ /\.bz2$/) {
913                         url[n+1] = ".bz2" url[n+1]
914                         sub(/\.bz2$/,"",url[n])
915                 }
916                 if (url[n] ~ /\.logrotate$/) {
917                         url[n+1] = ".logrotate" url[n+1]
918                         sub(/\.logrotate$/,"",url[n])
919                 }
920                 if (url[n] ~ /\.pamd$/) {
921                         url[n+1] = ".pamd" url[n+1]
922                         sub(/\.pamd$/,"",url[n])
923                 }
924
925                 # allow %{name} only in last url component
926                 s = ""
927                 for (i = 1; i <= n; i++) {
928                         url[i] = fixedsub("%{name}", name, url[i])
929                         if (s) {
930                                 s = s "/" url[i]
931                         } else {
932                                 s = url[i]
933                         }
934                 }
935                 $2 = s url[n+1]
936
937                 filename = url[n]
938                 if (name) {
939                         url[n] = fixedsub(name, "%{name}", url[n])
940                 }
941                 if (field ~ /source/) {
942                         if (version) {
943                                 url[n] = fixedsub(version, "%{version}", url[n])
944                         }
945                         if (_beta) {
946                                 url[n] = fixedsub(_beta, "%{_beta}", url[n])
947                         }
948                         if (_rc) {
949                                 url[n] = fixedsub(_rc, "%{_rc}", url[n])
950                         }
951                         if (_pre) {
952                                 url[n] = fixedsub(_pre, "%{_pre}", url[n])
953                         }
954                         if (_snap) {
955                                 url[n] = fixedsub(_snap, "%{_snap}", url[n])
956                         }
957                         if (subver) {
958                                 url[n] = fixedsub(subver, "%{subver}", url[n])
959                         }
960                 }
961                 # assigning to $2 kills preamble formatting
962                 $2 = fixedsub(filename, url[n], $2)
963
964                 $2 = unify_url($2)
965         }
966
967
968         if (field ~ /^source:/)
969                 $1 = "Source0:"
970
971         if (field ~ /^patch:/)
972                 $1 = "Patch0:"
973
974         kill_preamble_macros();
975         format_preamble()
976
977         if (field ~ /requires/) {
978                 # atrpms
979                 $0 = fixedsub("%{eversion}", "%{epoch}:%{version}-%{release}", $0);
980         }
981 }
982
983 /^%bcond_/ {
984         # do nothing
985         print
986         next
987 }
988
989 # sort BR/R!
990 #
991 # NOTES:
992 # - mixing BR/R and anything else confuses this (all will be sorted together)
993 #       so don't do that.
994 # - comments leading the BR/R can not be associated,
995 #       so don't adapterize when the BR/R are mixed with comments
996 ENVIRON["SKIP_SORTBR"] != 1 && preamble == 1 && $0 ~ PREAMBLE_TAGS ":", $0 ~ PREAMBLE_TAGS ":"{
997         if ($1 ~ /Pre[Rr]eq:/) {
998                 sub(/Pre[Rr]eq:/, "Requires:", $1);
999         }
1000         if ($1 == "BR:" ) {
1001                 $1 = "BuildRequires:"
1002         }
1003         if ($1 == "R:" ) {
1004                 $1 = "Requires:"
1005         }
1006         format_preamble()
1007 #       kill_preamble_macros(); # breaks tabbing
1008
1009         b_idx++;
1010         l = substr($0, index($0, $2));
1011         b_ktmp = b_makekey($1, l);
1012         b_key[b_idx] = b_ktmp;
1013         b_val[b_ktmp] = $0;
1014
1015         next;
1016 }
1017
1018 preamble == 1 {
1019         if (b_idx > 0) {
1020                 isort(b_key, b_idx);
1021                 for (i = 1; i <= b_idx; i++) {
1022                         v = b_val[b_key[i]];
1023                         sub(/[ \t]+$/, "", v);
1024                         print "" v;
1025                 }
1026                 b_idx = 0
1027         }
1028 }
1029
1030 # main() ;-)
1031 {
1032         preamble = 1
1033
1034         sub(/[ \t]+$/, "")
1035         print
1036
1037         if (name_seen == 0 && name) {
1038                 print "Name:\t\t" name
1039                 name_seen = 1
1040         }
1041
1042         if (version_seen == 0 && version) {
1043                 print "Version:\t" version
1044                 version_seen = 1
1045         }
1046
1047         if (release_seen == 0 && release) {
1048                 print "Release:\t" release
1049                 release_seen = 1
1050         }
1051
1052         if (did_build_root == 0) {
1053 #               print "BuildRoot:\t%{tmpdir}/%{name}-%{version}-root-%(id -u -n)"
1054                 did_build_root = 1
1055         }
1056         if (did_groups == 0) {
1057 #               print "Group:\t\tunknown"
1058                 did_groups = 1
1059         }
1060 }
1061
1062
1063 END {
1064         if (do_not_touch_anything) {
1065                 exit(rc)
1066         }
1067
1068         # TODO: need to output these in proper place
1069         if (BR_count > 0) {
1070                 for (i = 0; i <= BR_count; i++) {
1071                         print BR[i];
1072                 }
1073         }
1074
1075         close(changelog_file)
1076         while ((getline < changelog_file) > 0)
1077                 print
1078         system("rm -f " changelog_file)
1079
1080         if (did_clean == 0) {
1081                 print ""
1082                 print "%clean"
1083                 print "rm -rf $RPM_BUILD_ROOT"
1084         }
1085
1086         if (date == 0) {
1087                 print ""
1088                 print "%define date\t%(echo `LC_ALL=\"C\" date +\"%a %b %d %Y\"`)"
1089         }
1090
1091         if (has_changelog == 0) {
1092                 print "%changelog"
1093         }
1094
1095         if (boc > 2) {
1096                 print "* %{date} PLD Team <feedback@pld-linux.org>"
1097         }
1098         if (boc > 1) {
1099                 printf "All persons listed below can be reached at "
1100                 print "<cvs_login>@pld-linux.org\n"
1101         }
1102         if (boc > 0) {
1103                 print "$" "Log:$"
1104         }
1105 }
1106
1107 # substitutes fixed strings (not regexps)
1108 function fixedsub(s1,s2,t, ind) {
1109         if (ind = index(t,s1))
1110                 t = substr(t, 1, ind-1) s2 substr(t, ind+length(s1))
1111         return t
1112 }
1113
1114 # replace s with s2 if it equals to s1
1115 function replace(s, s1, s2) {
1116         if (s == s1) {
1117                 return s2;
1118         } else {
1119                 return s;
1120         }
1121 }
1122
1123 # There should be one or two tabs after the colon.
1124 function format_preamble()
1125 {
1126         if (/^#/ || /^%bcond_with/) {
1127                 return;
1128         }
1129         sub(/:[ \t]*/, ":")
1130         if (match($0, /[A-Za-z0-9(),#_ \t.-]+[ \t]*:[ \t]*/) == 1) {
1131                 if (RLENGTH < 8) {
1132                         sub(/:/, ":\t\t")
1133                 } else {
1134                         sub(/:/, ":\t")
1135                 }
1136         }
1137 }
1138
1139 # Replace directly specified directories with macros
1140 function use_macros()
1141 {
1142         # -m, --skip-macros, --no-macros -- skip macros subst
1143         if (ENVIRON["SKIP_MACROS"]) {
1144                 return
1145         }
1146
1147         # leave inline sed lines alone
1148         if (/(%{__sed}|sed) -i -e/) {
1149                 return;
1150         }
1151
1152         sub("%{_defaultdocdir}", "%{_docdir}");
1153         sub("%{_bindir}/perl", "%{__perl}");
1154         sub("%{_bindir}/python", "%{__python}");
1155
1156         gsub(infodir, "%{_infodir}")
1157
1158         gsub(perl_sitearch, "%{perl_sitearch}")
1159         gsub(perl_archlib, "%{perl_archlib}")
1160         gsub(perl_privlib, "%{perl_privlib}")
1161         gsub(perl_vendorlib, "%{perl_vendorlib}")
1162         gsub(perl_vendorarch, "%{perl_vendorarch}")
1163         gsub(perl_sitelib, "%{perl_sitelib}")
1164         
1165         gsub(py_sitescriptdir, "%{py_sitescriptdir}")
1166         gsub(py_sitedir, "%{py_sitedir}")
1167         gsub(py_scriptdir, "%{py_scriptdir}")
1168
1169         gsub(py3_sitescriptdir, "%{py3_sitescriptdir}")
1170         gsub(py3_sitedir, "%{py3_sitedir}")
1171         gsub(py3_scriptdir, "%{py3_scriptdir}")
1172
1173         gsub(ruby_archdir, "%{ruby_archdir}")
1174         gsub(ruby_ridir, "%{ruby_ridir}")
1175         gsub(ruby_rubylibdir, "%{ruby_rubylibdir}")
1176         gsub(ruby_sitearchdir, "%{ruby_sitearchdir}")
1177         gsub(ruby_sitelibdir, "%{ruby_sitelibdir}")
1178         gsub(ruby_rdocdir, "%{ruby_rdocdir}")
1179
1180         gsub("%{_datadir}/applications", "%{_desktopdir}")
1181         gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}")
1182         gsub("%{_datadir}/java", "%{_javadir}")
1183
1184         gsub("%{_libdir}/pkgconfig", "%{_pkgconfigdir}")
1185         gsub(pkgconfigdir, "%{_pkgconfigdir}")
1186
1187         gsub("%{_datadir}/pkgconfig", "%{_npkgconfigdir}")
1188         gsub(npkgconfigdir, "%{_npkgconfigdir}")
1189
1190         gsub(libdir, "%{_libdir}")
1191         gsub(javadir, "%{_javadir}")
1192
1193         gsub(bindir, "%{_bindir}")
1194         gsub("%{prefix}/bin", "%{_bindir}")
1195         if (prefix"/bin" == bindir)
1196                 gsub("%{_prefix}/bin", "%{_bindir}")
1197
1198         for (c = 1; c <= NF; c++) {
1199                 if ($c ~ sbindir "/fix-info-dir")
1200                         continue;
1201                 if ($c ~ sbindir "/webapp")
1202                         continue;
1203                 if ($c ~ sbindir "/ldconfig")
1204                         continue;
1205                 if ($c ~ sbindir "/chsh")
1206                         continue;
1207                 if ($c ~ sbindir "/usermod")
1208                         continue;
1209                 if ($c ~ sbindir "/chkconfig")
1210                         continue;
1211                 if ($c ~ sbindir "/installzope(product|3package)")
1212                         continue;
1213                 gsub(sbindir, "%{_sbindir}", $c)
1214         }
1215
1216         gsub("%{prefix}/sbin", "%{_sbindir}")
1217         if (prefix"/sbin" == sbindir) {
1218                 gsub("%{_prefix}/sbin", "%{_sbindir}")
1219         }
1220
1221         for (c = 1; c <= NF; c++) {
1222                 if ($c ~ sysconfdir "/{?cron.")
1223                         continue;
1224                 if ($c ~ sysconfdir "/{?crontab.d")
1225                         continue;
1226                 if ($c ~ sysconfdir "/{?env.d")
1227                         continue;
1228                 if ($c ~ sysconfdir "/{?modprobe.(d|conf)")
1229                         continue;
1230                 if ($c ~ sysconfdir "/{?udev")
1231                         continue;
1232                 if ($c ~ sysconfdir "/{?hotplug")
1233                         continue;
1234                 if ($c ~ sysconfdir "/{?logrotate.d")
1235                         continue;
1236                 if ($c ~ sysconfdir "/{?pam.d")
1237                         continue;
1238                 if ($c ~ sysconfdir "/{?profile.d")
1239                         continue;
1240                 if ($c ~ sysconfdir "/{?rc.d")
1241                         continue;
1242                 if ($c ~ sysconfdir "/{?security")
1243                         continue;
1244                 if ($c ~ sysconfdir "/{?skel")
1245                         continue;
1246                 if ($c ~ sysconfdir "/{?sysconfig")
1247                         continue;
1248                 if ($c ~ sysconfdir "/{?shrc.d")
1249                         continue;
1250                 if ($c ~ sysconfdir "/{?certs")
1251                         continue;
1252                 if ($c ~ sysconfdir "/{?X11")
1253                         continue;
1254                 if ($c ~ sysconfdir "/{?ld.so.conf.d")
1255                         continue;
1256                 if ($c ~ sysconfdir "/{?rpm")
1257                         continue;
1258                 if ($c ~ sysconfdir "/{?bash_completion.d")
1259                         continue;
1260                 if ($c ~ sysconfdir "/{?samba")
1261                         continue;
1262                 if ($c ~ sysconfdir "/{?xdg")
1263                         continue;
1264                 if ($c ~ sysconfdir "/shells")
1265                         continue;
1266                 if ($c ~ sysconfdir "/inittab")
1267                         continue;
1268                 if ($c ~ sysconfdir "/init")
1269                         continue;
1270                 if ($c ~ sysconfdir "/ppp")
1271                         continue;
1272                 if ($c ~ sysconfdir "/dbus-1")
1273                         continue;
1274                 if ($c ~ sysconfdir "/tmpwatch")
1275                         continue;
1276                 if ($c ~ sysconfdir "/acpi")
1277                         continue;
1278                 if ($c ~ sysconfdir "/apm")
1279                         continue;
1280                 gsub(sysconfdir, "%{_sysconfdir}", $c)
1281         }
1282
1283         gsub(docdir, "%{_docdir}")
1284
1285         gsub(kdedocdir, "%{_kdedocdir}")
1286
1287         gsub(gtkdocdir, "%{_gtkdocdir}")
1288         gsub("%{_docdir}/gtk-doc/html", "%{_gtkdocdir}")
1289
1290         gsub(php_pear_dir, "%{php_pear_dir}")
1291         gsub(php_data_dir, "%{php_data_dir}")
1292
1293         for (c = 1; c <= NF; c++) {
1294                 if ($c ~ datadir "/automake")
1295                         continue;
1296                 if ($c ~ datadir "/unsermake")
1297                         continue;
1298                 if ($c ~ datadir "/file/magic.mime")
1299                         continue;
1300                 gsub(datadir, "%{_datadir}", $c)
1301         }
1302
1303         gsub("%{prefix}/share", "%{_datadir}")
1304         if (prefix"/share" == datadir)
1305                 gsub("%{_prefix}/share", "%{_datadir}")
1306
1307         # CFLAGS="-I/usr/include/ncurses is usually correct.
1308         if (!/-I\/usr\/include/) {
1309                 gsub(includedir, "%{_includedir}")
1310         }
1311
1312         gsub("%{prefix}/include", "%{_includedir}")
1313         if (prefix"/include" == includedir) {
1314                 gsub("%{_prefix}/include", "%{_includedir}")
1315         }
1316
1317         gsub(mandir, "%{_mandir}")
1318         if ($0 !~ "%{_datadir}/manual") {
1319                 gsub("%{_datadir}/man", "%{_mandir}")
1320         }
1321         gsub("%{_prefix}/share/man", "%{_mandir}")
1322         gsub("%{prefix}/share/man", "%{_mandir}")
1323         gsub("%{prefix}/man", "%{_mandir}")
1324         gsub("%{_prefix}/man", "%{_mandir}")
1325
1326         gsub(infodir, "%{_infodir}")
1327         gsub("%{prefix}/info", "%{_infodir}")
1328         gsub("%{_prefix}/info", "%{_infodir}")
1329
1330         if (prefix !~ "/X11R6") {
1331                 gsub("%{_datadir}/aclocal", "%{_aclocaldir}")
1332         }
1333
1334         gsub(examplesdir, "%{_examplesdir}")
1335
1336         if (prefix != "/") {
1337                 # leave --with-foo=/usr alone
1338                 if ($0 !~ "--with.*=.*" prefix) {
1339                         for (c = 1; c <= NF; c++) {
1340                                 if ($c ~ prefix "/sbin/fix-info-dir")
1341                                         continue;
1342                                 if ($c ~ prefix "/sbin/webapp")
1343                                         continue;
1344                                 if ($c ~ prefix "/sbin/chsh")
1345                                         continue;
1346                                 if ($c ~ prefix "/sbin/usermod")
1347                                         continue;
1348                                 if ($c ~ prefix "/sbin/installzope(product|3package)")
1349                                         continue;
1350                                 if ($c ~ prefix "/share/automake")
1351                                         continue;
1352                                 if ($c ~ prefix "/share/unsermake")
1353                                         continue;
1354                                 if ($c ~ prefix "/lib/sendmail")
1355                                         continue;
1356                                 if ($c ~ prefix "/lib/pkgconfig")
1357                                         continue;
1358
1359                                 # CFLAGS="-I/usr..." is usually correct.
1360                                 if (/-I\/usr/)
1361                                         continue;
1362                                 # same for LDFLAGS="-L/usr..."
1363                                 if (/-L\/usr/)
1364                                         continue;
1365
1366                                 gsub(prefix, "%{_prefix}", $c)
1367                         }
1368                 }
1369                 gsub("%{prefix}", "%{_prefix}")
1370         }
1371
1372         # replace back
1373         gsub("%{_includedir}/ncurses", "/usr/include/ncurses")
1374         gsub("%{_includedir}/freetype", "/usr/include/freetype")
1375
1376         gsub("%{PACKAGE_VERSION}", "%{version}")
1377         gsub("%{PACKAGE_NAME}", "%{name}")
1378
1379         gsub("^make$", "%{__make}")
1380         gsub("^make ", "%{__make} ")
1381         gsub("^gcc ", "%{__cc} ")
1382         gsub("^rm --interactive=never ", "%{__rm} ")
1383
1384         # fedora
1385         gsub("%{ruby_sitearch}", "%{ruby_sitearchdir}")
1386         gsub("%{python_sitearch}", "%{py_sitedir}")
1387         gsub("%{python_sitelib}", "%{py_sitescriptdir}")
1388
1389         # alt linux
1390         gsub("%_man1dir", "%{_mandir}/man1")
1391
1392         # mandrake specs
1393         gsub("^%make$", "%{__make}")
1394         gsub("^%make ", "%{__make} ")
1395         gsub("^%makeinstall_std", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1396         gsub("^%{makeinstall}", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1397         gsub("^%makeinstall", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1398         gsub("^%{__rm} -rf %{buildroot}", "rm -rf $RPM_BUILD_ROOT")
1399         gsub("^%{__install}", "install")
1400         gsub("%optflags", "%{rpmcflags}")
1401         gsub("%{compat_perl_vendorarch}", "%{perl_vendorarch}")
1402
1403         gsub("^%{__make} install DESTDIR=\$RPM_BUILD_ROOT", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1404         gsub("^fix-info-dir$", "[ ! -x /usr/sbin/fix-info-dir ] || /usr/sbin/fix-info-dir -c %{_infodir} >/dev/null 2>\\&1")
1405         $0 = fixedsub("%buildroot", "$RPM_BUILD_ROOT", $0)
1406         $0 = fixedsub("%{buildroot}", "$RPM_BUILD_ROOT", $0)
1407         $0 = fixedsub("CXXFLAGS=%{rpmcflags} %configure", "CXXFLAGS=%{rpmcflags}\n%configure", $0);
1408         $0 = fixedsub("%__install", "install", $0);
1409
1410         # split configure line to multiple lines
1411         if (/%configure +$/) {
1412                 sub( / +$/, "" );
1413         } else if (/%configure / && !/\\$/) {
1414                 $0 = format_configure($0);
1415         }
1416
1417         gsub("%_bindir", "%{_bindir}")
1418         gsub("%_datadir", "%{_datadir}")
1419         gsub("%_iconsdir", "%{_iconsdir}")
1420         gsub("%_sbindir", "%{_sbindir}")
1421         gsub("%_mandir", "%{_mandir}")
1422         gsub("%name", "%{name}")
1423         gsub(/%__rm/, "rm");
1424         gsub(/%__mkdir_p/, "install -d");
1425         gsub(/%__cp/, "cp");
1426         gsub(/%__ln_s/, "ln -s");
1427         gsub(/%__sed/, "%{__sed}");
1428         gsub(/%__cat/, "cat");
1429         gsub(/%__chmod/, "chmod");
1430
1431         gsub("/usr/src/linux", "%{_kernelsrcdir}")
1432         gsub("%{_prefix}/src/linux", "%{_kernelsrcdir}")
1433
1434         if (/^ant / || /^%{ant}/) {
1435                 sub(/^ant/, "%ant")
1436                 sub(/^%{ant}/, "%ant")
1437                 add_br("BuildRequires:  jpackage-utils");
1438                 add_br("BuildRequires:  rpmbuild(macros) >= 1.300");
1439         }
1440
1441         $0 = fixedsub("%(%{__cc} -dumpversion)", "%{cc_version}", $0);
1442         $0 = fixedsub("%(%{__cxx} -dumpversion)", "%{cxx_version}", $0);
1443
1444         # kill the _class and _subclass pear macros
1445         if (pear_class) {
1446                 gsub("%{_class}", pear_class);
1447         }
1448         if (pear_subclass) {
1449                 gsub("%{_subclass}", pear_subclass);
1450         }
1451
1452 }
1453
1454 function format_configure(line,         n, a, s) {
1455         n = split(line, a, / /);
1456         s = a[1] " \\\n";
1457         for (i = 2; i <= n; i++) {
1458                 s = s "\t" a[i] " \\\n"
1459         }
1460         return s
1461 }
1462
1463
1464 # insertion sort of A[1..n]
1465 # copied from mawk manual
1466 function isort(A,n,             i,j,hold) {
1467         for (i = 2; i <= n; i++) {
1468                 hold = A[j = i]
1469                 while (A[j-1] > hold) {
1470                         j-- ; A[j+1] = A[j]
1471                 }
1472                 A[j] = hold
1473         }
1474         # sentinel A[0] = "" will be created if needed
1475 }
1476
1477
1478 function use_files_macros(      i, n, t, a, l)
1479 {
1480         use_macros()
1481
1482         # skip comments
1483         if (/^#/) {
1484                 return 1;
1485         }
1486
1487         sub("^%doc %{_mandir}", "%{_mandir}")
1488
1489         gsub("^%{_sbindir}", "%attr(755,root,root) %{_sbindir}")
1490         gsub("^%{_bindir}", "%attr(755,root,root) %{_bindir}")
1491
1492         # uid/gid nobody is not valid in %files
1493         if (/%attr([^)]*nobody[^)]*)/ && !/FIXME/) {
1494                 $0 = $0 " # FIXME nobody user/group can't own files! -adapter.awk"
1495         }
1496
1497         # s[gu]id programs with globs are evil
1498         if (/%attr\([246]...,.*\*/ && !/FIXME/) {
1499                 $0 = $0 " # FIXME no globs for suid/sgid files"
1500         }
1501
1502         # replace back
1503         gsub("%{_sysconfdir}/cron\.d", "/etc/cron.d")
1504         gsub("%{_sysconfdir}/crontab\.d", "/etc/crontab.d")
1505         gsub("%{_sysconfdir}/logrotate\.d", "/etc/logrotate.d")
1506         gsub("%{_sysconfdir}/pam\.d", "/etc/pam.d")
1507         gsub("%{_sysconfdir}/profile\.d", "/etc/profile.d")
1508         gsub("%{_sysconfdir}/rc\.d", "/etc/rc.d")
1509         gsub("%{_sysconfdir}/security", "/etc/security")
1510         gsub("%{_sysconfdir}/skel", "/etc/skel")
1511         gsub("%{_sysconfdir}/sysconfig", "/etc/sysconfig")
1512         gsub("%{_sysconfdir}/certs", "/etc/certs")
1513         gsub("%{_sysconfdir}/init.d", "/etc/init.d")
1514         gsub("%{_sysconfdir}/dbus-1", "/etc/dbus-1")
1515         gsub("%{_sysconfdir}/pki", "/etc/pki")
1516         gsub("%{_sysconfdir}/tmpwatch", "/etc/tmpwatch")
1517
1518         # /etc/init.d -> /etc/rc.d/init.d
1519         if (!/^\/etc\/init\.d$/) {
1520                  gsub("/etc/init.d", "/etc/rc.d/init.d")
1521         }
1522
1523         if (/\/etc\/rc\.d\/init\.d\// && !/functions/) {
1524                 if (!/%attr.*\/etc\/rc\.d\/init\.d/) {
1525                         $0 = "%attr(754,root,root) " $0
1526                 }
1527                 if (/^%attr.*\/etc\/rc\.d\/init\.d/ && !/^%attr\(754 *,/) {
1528                         gsub("^%attr\\(... *,", "%attr(754,");
1529                 }
1530         }
1531
1532         if (/lib.+\.so\b/ && !/\.so$/ && !/^%attr.*/ && !/%exclude/) {
1533                 $0 = "%attr(755,root,root) " $0
1534         }
1535
1536         if (/%{perl_vendorarch}.*\.so$/ && !/^%attr.*/) {
1537                 $0 = "%attr(755,root,root) " $0
1538         }
1539
1540         # remove attrs from man pages
1541         if (/%{_mandir}/ && /^%attr/) {
1542                 sub("^%attr\\(.*\\) *", "");
1543         }
1544
1545         # /etc/sysconfig files
1546         # %attr(640,root,root) %config(noreplace) %verify(not size mtime md5) /etc/sysconfig/*
1547         # attr not required, allow default 644 attr
1548         if (!/network-scripts/ && !/%dir/ && !/\.d$/ && !/functions/ && !/\/etc\/sysconfig\/wmstyle/) {
1549                 if (/\/etc\/sysconfig\// && /%config/ && !/%config\(noreplace/) {
1550                         gsub("%config", "%config(noreplace)")
1551                 }
1552
1553                 if (/\/etc\/sysconfig\// && !/%config\(noreplace/) {
1554                         $NF = "%config(noreplace) " $NF
1555                 }
1556
1557                 if (/\/etc\/sysconfig\// && /%attr\(755/) {
1558                         gsub("^%attr\\(... *,", "%attr(640,");
1559                 }
1560
1561                 if (/\/etc\/sysconfig\// && !/%verify/) {
1562                         gsub("/etc/sysconfig", "%verify(not size mtime md5) /etc/sysconfig");
1563                 }
1564         }
1565
1566         # kill leading zeros
1567         if (/%attr\(0[1-9]/) {
1568                 gsub("%attr\\(0", "%attr(")
1569         }
1570
1571         # kill leading whitespace
1572         gsub(/^ +/, "");
1573
1574         # kill default attrs
1575         gsub(/%dir %attr\(755,root,root\)/, "%dir");
1576         gsub(/%attr\(755,root,root\) %dir/, "%dir");
1577         if (!/%dir/) {
1578                 gsub(/%attr\(644,root,root\) /, "");
1579         }
1580
1581         # sort %verify attrs
1582         if (match($0, /%verify\(not([^)]+)\)/)) {
1583                 t = substr($0, RSTART, RLENGTH)
1584                 # kill commas: %verify(not,md5,size,mtime)
1585                 gsub(/,/, " ", t);
1586
1587                 gsub(/^%verify\(not |\)$/, "", t)
1588                 n = split(t, a, / /)
1589                 isort(a, n)
1590
1591                 s = "%verify(not"
1592                 for (i = 1 ; i <= n; i++) {
1593                         s = s " " a[i]
1594                 }
1595                 s = s ")"
1596
1597                 gsub(/%verify\(not[^)]+\)/, s)
1598         }
1599
1600         if (/%{_mandir}/) {
1601                 gsub("\.gz$", "*")
1602                 gsub("%ext_man$", "*")
1603         }
1604
1605         # locale dir and no %lang -> bad
1606         if (/%{_datadir}\/locale\/.*\// && !/%(dir|lang)/) {
1607                 $(NF + 1) = "# FIXME consider using %find_lang"
1608         }
1609
1610         # python egg-infos
1611         if (match($0, "^%{py_site(script)?dir}/.+-py"py_ver".egg-info$")) {
1612                 # tests:
1613                 #%{py_sitedir}/*-py2.4.egg-info
1614                 #%{py_sitescriptdir}/GnuPGInterface-%{version}-py2.4.egg-info
1615                 #%{py_sitescriptdir}/python_mpd-%{version}-py2.4.egg-info
1616                 #%{py_sitescriptdir}/mechanize-0.1.6b-py2.4.egg-info
1617
1618                 l = index($0, "/");
1619                 t = substr($0, 0, l);
1620                 s = substr($0, l + 1, RLENGTH - l - length("-py"py_ver".egg-info"));
1621                 if (match(s, "[^-]+$")) {
1622                         if (RSTART > 1) {
1623                                 s = substr(s, 0, RSTART - 1);
1624                         }
1625                         print "%if \"%{py_ver}\" > \"2.4\""
1626                         gsub(t "/.+.egg-info", t "/" s "-*.egg-info");
1627                         print
1628                         print "%endif"
1629                         return 0;
1630                 }
1631         }
1632
1633         # atrpms
1634         $0 = fixedsub("%{perl_man1dir}", "%{_mandir}/man1", $0);
1635         $0 = fixedsub("%{perl_man3dir}", "%{_mandir}/man3", $0);
1636         $0 = fixedsub("%{perl_bin}", "%{_bindir}", $0);
1637
1638         gsub(libdir "/pkgconfig", "%{_pkgconfigdir}");
1639         gsub("%{_libdir}/pkgconfig", "%{_pkgconfigdir}");
1640         gsub("%{_prefix}/lib/pkgconfig", "%{_pkgconfigdir}");
1641
1642         gsub("%{_datadir}/applications", "%{_desktopdir}");
1643         gsub("%{_datadir}/icons", "%{_iconsdir}");
1644         gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}");
1645         gsub("%{_datadir}/pear", "%{php_pear_dir}");
1646         gsub("%{_datadir}/php", "%{php_data_dir}");
1647
1648         return 1
1649 }
1650
1651 function use_script_macros()
1652 {
1653         if (gsub("/sbin/service", "%service")) {
1654                 sub(" >/dev/null 2>&1 \|\|:", "");
1655                 sub(" 2> /dev/null \|\| :", "");
1656         }
1657 }
1658
1659 function fill(ch, n, i) {
1660         for (i = 0; i < n; i++)
1661                 printf("%c", ch)
1662 }
1663
1664 function format_flush(line, indent, newline, word, first_word) {
1665         first_word = 1
1666         if (format_indent == -1)
1667                 newline = ""
1668         else
1669                 newline = fill(" ", format_indent) "- "
1670
1671         while (match(line, /[^\t ]+/)) {
1672                 word = substr(line, RSTART, RLENGTH)
1673                 if (length(newline) + length(word) + 1 > tw) {
1674                         print newline
1675
1676                         if (format_indent == -1)
1677                                 newline = ""
1678                         else
1679                                 newline = fill(" ", format_indent + 2)
1680                         first_word = 1
1681                 }
1682
1683                 if (first_word) {
1684                         newline = newline word
1685                         first_word = 0
1686                 } else
1687                         newline = newline " " word
1688
1689                 line = substr(line, RSTART + RLENGTH)
1690         }
1691         if (newline ~ /[^\t ]/) {
1692                 print newline
1693         }
1694 }
1695
1696 function cflags(var)
1697 {
1698         if ($0 == var "=\"$RPM_OPT_FLAGS\"") {
1699                 removed[var] = 1
1700                 return 0
1701         }
1702
1703         if (!/!\?debug/)
1704                 sub("\$RPM_OPT_FLAGS", "%{rpmcflags}")
1705         return 1
1706 }
1707
1708 # return whole matched pattern
1709 function matchstr(str, pat)
1710 {
1711         match(str, "[^/]+$");
1712         return substr(str, RSTART, RLENGTH);
1713 }
1714
1715 function unify_url(url)
1716 {
1717
1718         # sourceforge urls
1719         # Docs about sourceforge mirror system: http://sourceforge.net/apps/trac/sourceforge/wiki/Mirrors
1720
1721         # 1. unify domains
1722         sub("^http://prdownloads\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1723         sub("^http://download\.sf\.net/", "http://downloads.sourceforge.net/", url)
1724         sub("^http://download\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1725         sub("^http://dl\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1726         sub("^http://.*\.dl\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1727         sub("^http://dl\.sf\.net/", "http://downloads.sourceforge.net/", url)
1728         sub("^http://downloads\.sourceforge\.net/sourceforge/", "http://downloads.sourceforge.net/", url)
1729
1730         # 3. unify urls
1731         if (url ~ /sourceforge.net/) {
1732                 sub("[?&]big_mirror=.*$", "", url);
1733                 sub("[?&]modtime=.*$", "", url);
1734                 sub("[?]use_mirror=.*$", "", url);
1735                 sub("[?]download$", "", url);
1736                 sub("/download$", "", url);
1737         }
1738
1739         # SF: new style urls, strip "files/" between and prepend dl.
1740         if (match(url, "^http://sourceforge.net/projects/[^/]+/files/")) {
1741                 url = substr(url, 1, RLENGTH - length("files/")) substr(url, RSTART + RLENGTH);
1742                 sub("^http://sourceforge.net/projects/", "http://downloads.sourceforge.net/project/", url);
1743         }
1744
1745         # SF unify: http://downloads.sourceforge.net/PROJECT/TARBALL
1746         # http://downloads.sourceforge.net/project/PROJECT/FILE/VERSION/%{name}-%{version}.zip
1747         if (match(url, "^http://downloads.sourceforge.net/project/[^/]+")) {
1748                 url = sprintf("http://downloads.sourceforge.net/%s/%s", substr(url, 42, RLENGTH - 41), matchstr(url, "[^/]+$"));
1749         }
1750
1751         sub("^ftp://ftp\.gnome\.org/", "http://ftp.gnome.org/", url)
1752         sub("^http://ftp\.gnome\.org/pub/gnome/", "http://ftp.gnome.org/pub/GNOME/", url)
1753
1754         # apache urls
1755         sub("^http://apache.zone-h.org/", "http://www.apache.org/dist/", url)
1756
1757         # gnu.org
1758         sub("^ftp://ftp\.gnu\.org/", "http://ftp.gnu.org/", url)
1759         sub("^http://ftp\.gnu\.org/pub/gnu/", "http://ftp.gnu.org/gnu/", url)
1760
1761         # debian.org
1762         sub("^ftp://ftp\.[^.]+\.debian\.org/", "ftp://ftp.debian.org/", url)
1763         sub("^http://ftp\.[^.]+\.debian\.org/", "ftp://ftp.debian.org/", url)
1764         sub("^ftp://ftp\.debian\.org/pub/debian/", "ftp://ftp.debian.org/debian/", url)
1765
1766         return url
1767 }
1768
1769 function demacroize(str)
1770 {
1771         if (mod_name) {
1772                 sub("%{mod_name}", mod_name, str);
1773         }
1774         if (pearname) {
1775                 sub("%{_pearname}", pearname, str);
1776         }
1777         if (pearname) {
1778                 sub("%{pearname}", pearname, str);
1779         }
1780         if (name) {
1781                 sub("%{name}", name, str);
1782         }
1783         if (version) {
1784                 sub("%{version}", version, str);
1785         }
1786         if (_beta) {
1787                 sub("%{_beta}", _beta, str);
1788         }
1789         if (_rc) {
1790                 sub("%{_rc}", _rc, str);
1791         }
1792         if (_pre) {
1793                 sub("%{_pre}", _pre, str);
1794         }
1795         if (_snap) {
1796                 sub("%{_snap}", _snap, str);
1797         }
1798         if (subver) {
1799                 sub("%{subver}", subver, str);
1800         }
1801         return str;
1802 }
1803
1804 function kill_preamble_macros()
1805 {
1806         if ($1 ~ /^Obsoletes:/) {
1807                 # NB! assigning $2 a value breaks tabbing
1808                 $2 = demacroize($2);
1809         }
1810         if ($1 ~ /^URL:/) {
1811                 # NB! assigning $2 a value breaks tabbing
1812                 $2 = demacroize($2);
1813                 $2 = unify_url($2)
1814         }
1815
1816         # fedora extras
1817         if (/%{\?FE_USERADD_REQ}/) {
1818                 $0 = "";
1819                 print "BuildRequires:   rpmbuild(macros) >= 1.202"
1820                 print "Provides:        user(xxx)"
1821                 print "Requires(postun):        /usr/sbin/userdel"
1822                 print "Requires(pre):  /bin/id"
1823                 print "Requires(pre):  /usr/sbin/useradd"
1824         }
1825 }
1826
1827 function get_epoch(pkg, ver,    epoch)
1828 {
1829         return
1830 # should parse the BR lines more adequately:
1831 #       freetype = 2.0.0 -> correct
1832 #       freetype = 2.1.9 -> with epoch 1, as epoch 1 was added in 2.1.7
1833
1834         shell = "grep -o '^" pkg ":[^:]\+' ../PLD-doc/BuildRequires.txt | awk '{print $NF}'";
1835         shell | getline epoch;
1836         return epoch;
1837 }
1838
1839 function format_requires(tag, value,    n, p, i, deps, ndeps) {
1840         # skip any formatting for commented out items or some weird macros
1841         if (/^#/ || /%\(/) {
1842                 return tag "\t" value
1843         }
1844         n = split(value, p, / *,? */);
1845         for (i = 1; i <= n; i++) {
1846                 if (p[i+1] ~ /[<=>]/) {
1847                         # add epoch if the version doesn't have it but BuildRequires.txt has
1848                         if (p[i] ~ /^[a-z]/ && p[i+2] !~ /^[0-9]+:/) {
1849                                 epoch = get_epoch(p[i], p[i+2])
1850                                 if (epoch) {
1851                                         p[i+2] = epoch ":" p[i+2];
1852                                 }
1853                         }
1854                         deps[ndeps++] = p[i] " " p[i+1] " " p[i+2];
1855                         i += 2;
1856                 } else {
1857                         deps[ndeps++] = p[i];
1858                 }
1859         }
1860         s = ""
1861         for (i in deps) {
1862                 s = s sprintf("%s\t%s\n", tag, deps[i]);
1863         }
1864         return substr(s, 1, length(s)-1);
1865 }
1866
1867 function use_tabs()
1868 {
1869         # reverse vim: ts=4 sw=4 et
1870         gsub(/    /, "\t");
1871 }
1872
1873 function add_br(br)
1874 {
1875         BR[BR_count++] = br
1876 }
1877
1878 # Load rpm macros
1879 # you should update the list also in adapter when making changes here
1880 function import_rpm_macros() {
1881         # File with rpm groups
1882         topdir = ENVIRON["_topdir"]
1883
1884         if (!topdir) {
1885                 print "adapter.awk should not not be invoked directly, but via adapter script" > "/dev/stderr"
1886                 do_not_touch_anything = 1
1887                 exit(rc = 1);
1888         }
1889
1890         # update this version dep each time some new macro export is added
1891         if (!ENVIRON["ADAPTER_REVISION"] || ENVIRON["ADAPTER_REVISION"] < 1.47) {
1892                 print "adapter shell script is outdated, please cvs up it" > "/dev/stderr"
1893                 do_not_touch_anything = 1
1894                 exit(rc = 1);
1895         }
1896
1897         # get cvsaddress for changelog section
1898         # using rpm macros as too lazy to add ~/.adapterrc parsing support.
1899         _cvsmaildomain = ENVIRON["_cvsmaildomain"]
1900         _cvsmailfeedback = ENVIRON["_cvsmailfeedback"]
1901
1902         prefix = ENVIRON["_prefix"]
1903         bindir = ENVIRON["_bindir"]
1904         sbindir = ENVIRON["_sbindir"]
1905         libdir = ENVIRON["_libdir"]
1906         sysconfdir = ENVIRON["_sysconfdir"]
1907         datadir = ENVIRON["_datadir"]
1908         includedir = ENVIRON["_includedir"]
1909         mandir = ENVIRON["_mandir"]
1910         infodir = ENVIRON["_infodir"]
1911         examplesdir = ENVIRON["_examplesdir"]
1912         docdir = ENVIRON["_defaultdocdir"]
1913         kdedocdir = ENVIRON["_kdedocdir"]
1914         gtkdocdir = ENVIRON["_gtkdocdir"]
1915         desktopdir = ENVIRON["_desktopdir"]
1916         pixmapsdir = ENVIRON["_pixmapsdir"]
1917         javadir = ENVIRON["_javadir"]
1918         pkgconfigdir = ENVIRON["_pkgconfigdir"]
1919         npkgconfigdir = ENVIRON["_npkgconfigdir"]
1920
1921         perl_sitearch = ENVIRON["perl_sitearch"]
1922         perl_archlib = ENVIRON["perl_archlib"]
1923         perl_privlib = ENVIRON["perl_privlib"]
1924         perl_vendorlib = ENVIRON["perl_vendorlib"]
1925         perl_vendorarch = ENVIRON["perl_vendorarch"]
1926         perl_sitelib = ENVIRON["perl_sitelib"]
1927
1928         py_sitescriptdir = ENVIRON["py_sitescriptdir"]
1929         py_sitedir = ENVIRON["py_sitedir"]
1930         py_scriptdir = ENVIRON["py_scriptdir"]
1931         py_ver = ENVIRON["py_ver"]
1932
1933         py3_sitescriptdir = ENVIRON["py3_sitescriptdir"]
1934         py3_sitedir = ENVIRON["py3_sitedir"]
1935         py3_scriptdir = ENVIRON["py3_scriptdir"]
1936         py3_ver = ENVIRON["py3_ver"]
1937
1938         ruby_archdir = ENVIRON["ruby_archdir"]
1939         ruby_ridir = ENVIRON["ruby_ridir"]
1940         ruby_rubylibdir = ENVIRON["ruby_rubylibdir"]
1941         ruby_sitearchdir = ENVIRON["ruby_sitearchdir"]
1942         ruby_sitelibdir = ENVIRON["ruby_sitelibdir"]
1943         ruby_rdocdir = ENVIRON["ruby_rdocdir"]
1944
1945         php_pear_dir = ENVIRON["php_pear_dir"]
1946         php_data_dir = ENVIRON["php_data_dir"]
1947         tmpdir = ENVIRON["tmpdir"]
1948 }
1949
1950 # php virtual deps as discussed in devel-en
1951 function replace_php_virtual_deps() {
1952         pkg = $2
1953 #       if (pkg == "php-program") {
1954 #               $0 = $1 "\t/usr/bin/php"
1955 #               return
1956 #       }
1957
1958 #       if (pkg ~ /^php-[a-z]/ && pkg !~ /^php-(pear|common|cli|devel|fcgi|cgi|dirs|program|pecl-)/) {
1959 #               sub(/^php-/, "php(", pkg);
1960 #               sub(/$/, ") # verify this correctness -- it may be wanted to use specific not virtual dep", pkg);
1961 #               $2 = pkg
1962 #       }
1963
1964         if (pkg ~/^php$/) {
1965                 $2 = "webserver(php)";
1966                 if ($4 ~ /^[0-9]:/) {
1967                         $4 = substr($4, 3);
1968                 }
1969         }
1970
1971         if (pkg ~/^php4$/) {
1972                 $2 = "webserver(php)";
1973                 if ($4 ~ /^[0-9]:/) {
1974                         $4 = substr($4, 3);
1975                 }
1976         }
1977 }
1978
1979 function replace_groupnames(group) {
1980         group = replace(group, "Amusements/Games", "Applications/Games");
1981         group = replace(group, "Amusements/Games/Strategy/Real Time", "X11/Applications/Games/Strategy");
1982         group = replace(group, "Application/Multimedia", "Applications/Multimedia");
1983         group = replace(group, "Application/System", "Applications/System");
1984         group = replace(group, "Applications/Compilers", "Development/Languages");
1985         group = replace(group, "Applications/Daemons", "Daemons");
1986         group = replace(group, "Applications/Internet", "Applications/Networking");
1987         group = replace(group, "Applications/Internet/Peer to Peer", "Applications/Networking");
1988         group = replace(group, "Applications/Productivity", "X11/Applications");
1989         group = replace(group, "Applications/Security", "Applications/System");
1990         group = replace(group, "Applications/Web", "Applications/WWW");
1991         group = replace(group, "Database", "Applications/Databases");
1992         group = replace(group, "Development/C", "Development/Libraries");
1993         group = replace(group, "Development/Code Generators", "Development");
1994         group = replace(group, "Development/Docs", "Documentation");
1995         group = replace(group, "Development/Documentation", "Documentation");
1996         group = replace(group, "Development/Java", "Development/Languages/Java");
1997         group = replace(group, "Development/Languages/C and C++", "Libraries");
1998         group = replace(group, "Development/Languages/Other", "Development/Languages");;
1999         group = replace(group, "Development/Languages/Ruby", "Development/Languages");
2000         group = replace(group, "Development/Libraries/C and C++", "Development/Libraries");
2001         group = replace(group, "Development/Libraries/Java", "Development/Languages/Java");
2002         group = replace(group, "Development/Libraries/Python", "Development/Languages/Python");
2003         group = replace(group, "Development/Libraries/TCL", "Development/Languages/Tcl");;
2004         group = replace(group, "Development/Other", "Development");
2005         group = replace(group, "Development/Python", "Development/Languages/Python");
2006         group = replace(group, "Development/Testing", "Development");
2007         group = replace(group, "Editors", "Applications/Text");
2008         group = replace(group, "Emulators", "Applications/Emulators");
2009         group = replace(group, "File tools", "Applications/File");
2010         group = replace(group, "Games", "Applications/Games");
2011         group = replace(group, "Library/Development", "Development/Libraries");
2012         group = replace(group, "Networking/Deamons", "Networking/Daemons");
2013         group = replace(group, "Networking/Mail", "Applications/Mail");
2014         group = replace(group, "Networking/Other", "Networking");
2015         group = replace(group, "Productivity/Databases/Servers", "Applications/Databases");
2016         group = replace(group, "Productivity/Multimedia/Other", "X11/Applications/Multimedia");
2017         group = replace(group, "Productivity/Networking/Web/Servers", "Networking/Daemons/HTTP");;
2018         group = replace(group, "Shells", "Applications/Shells");
2019         group = replace(group, "System Environment/Base", "Base");
2020         group = replace(group, "System Environment/Daemons", "Daemons");
2021         group = replace(group, "System Environment/Kernel", "Base/Kernel");
2022         group = replace(group, "System Environment/Libraries", "Libraries");
2023         group = replace(group, "System Tools", "Applications/System");
2024         group = replace(group, "System", "Base");
2025         group = replace(group, "System/Base", "Base");
2026         group = replace(group, "System/Kernel and hardware", "Base/Kernel");
2027         group = replace(group, "System/Libraries", "Libraries");
2028         group = replace(group, "System/Servers", "Daemons");
2029         group = replace(group, "Text Processing/Markup/HTML", "Applications/Text");
2030         group = replace(group, "Text Processing/Markup/XML", "Applications/Text");
2031         group = replace(group, "Text tools", "Applications/Text");
2032         group = replace(group, "User Interface/Desktops", "X11/Applications");
2033         group = replace(group, "Utilities/System", "Applications/System");
2034         group = replace(group, "Web/Database", "Applications/WWW");
2035         group = replace(group, "X11/GNOME", "X11/Applications");
2036         group = replace(group, "X11/GNOME/Applications", "X11/Applications");
2037         group = replace(group, "X11/GNOME/Development/Libraries", "X11/Development/Libraries");
2038         group = replace(group, "X11/Games", "X11/Applications/Games");
2039         group = replace(group, "X11/Games/Strategy", "X11/Applications/Games/Strategy");
2040         group = replace(group, "X11/Library", "X11/Libraries");
2041         group = replace(group, "X11/Utilities", "X11/Applications");
2042         group = replace(group, "X11/XFree86", "X11");
2043         group = replace(group, "X11/Xserver", "X11/Servers");
2044
2045         return group;
2046 }
2047
2048 function replace_requires() {
2049
2050         sub(/^python-setuptools-devel$/, "python-distribute", $2);
2051         sub(/^gcc-g77/, "gcc-fortran", $2);
2052
2053         # use virtual, not package name
2054         sub(/^rpm-build-macros$/, "rpmbuild(macros)", $2);
2055
2056         # bad package.xml, see http://pear.php.net/bugs/bug.php?id=17779
2057         sub(/^php-php-gtk/, "php-gtk2", $2);
2058
2059         # jpackages
2060         sub(/^antlr3$/, "java-antlr3", $2);
2061         sub(/^avalon-framework$/, "java-avalon-framework", $2);
2062         sub(/^avalon-logkit$/, "java-avalon-logkit", $2);
2063         sub(/^axis$/, "java-axis", $2);
2064         sub(/^bsf$/, "java-bsf", $2);
2065         sub(/^gnu-regexp$/, "java-gnu-regexp", $2);
2066         sub(/^gnu.regexp$/, "java-gnu-regexp", $2);
2067         sub(/^hamcrest$/, "java-hamcrest", $2);
2068         sub(/^jaas$/, "java(jaas)", $2);
2069         sub(/^jaf$/, "java(jaf)", $2);
2070         sub(/^jakarta-ant$/, "ant", $2);
2071         sub(/^jakarta-commons-httpclient$/, "java-commons-httpclient", $2);
2072         sub(/^jakarta-log4j$/, "java-log4j", $2);
2073         sub(/^jakarta-oro$/, "java-oro", $2);
2074         sub(/^jakarta-servletapi$/, "java(servlet)", $2);
2075         sub(/^java-devel$/, "jdk", $2);
2076         sub(/^java\(JSP\)$/, "java(jsp)", $2);
2077         sub(/^java\(JavaServerFaces\)$/, "java(javaserverfaces)", $2);
2078         sub(/^java\(Portlet\)$/, "java(portlet)", $2);
2079         sub(/^java\(Servlet\)$/, "java(servlet)", $2);
2080         sub(/^javamail$/, "java(javamail)", $2);
2081         sub(/^jaxp$/, "java(jaxp)", $2);
2082         sub(/^jaxp_parser_impl$/, "java(jaxp_parser_impl)", $2);
2083         sub(/^jaxp_transform_impl$/, "java(jaxp_transform_impl)", $2);
2084         sub(/^jce$/, "java(jce)", $2);
2085         sub(/^jcommon$/, "java-jcommon", $2);
2086         sub(/^jdbc-stdext$/, "java(jdbc-stdext)", $2);
2087         sub(/^jdepend$/, "java-jdepend", $2);
2088         sub(/^jfreechart$/, "java-jfreechart", $2);
2089         sub(/^jmx$/, "java(jmx)", $2);
2090         sub(/^jndi$/, "java(jndi)", $2);
2091         sub(/^jsch$/, "java-jsch", $2);
2092         sub(/^jsse$/, "java(jsse)", $2);
2093         sub(/^jta$/, "java(jta)", $2);
2094         sub(/^junit$/, "java-junit", $2);
2095         sub(/^ldapjdk$/, "ldapsdk", $2);
2096         sub(/^log4j$/, "java-log4j", $2);
2097         sub(/^logging-log4j$/, "java-log4j", $2);
2098         sub(/^oro$/, "java-oro", $2);
2099         sub(/^rhino$/, "java-rhino", $2);
2100         sub(/^saxon-scripts$/, "saxon", $2);
2101         sub(/^servlet$/, "java(servlet)", $2);
2102         sub(/^uddi4j$/, "java-uddi4j", $2);
2103         sub(/^wsdl4j$/, "java-wsdl4j", $2);
2104         sub(/^xalan-j$/, "java-xalan", $2);
2105         sub(/^xalan-j2$/, "java-xalan", $2);
2106         sub(/^xerces-j$/, "java(jaxp_parser_impl)", $2);
2107         sub(/^xerces-j2$/, "java(jaxp_parser_impl)", $2);
2108         sub(/^java-xerces$/, "java(jaxp_parser_impl)", $2);
2109         sub(/^xml-commons-apis$/, "java-xml-commons-apis", $2);
2110         sub(/^xml-commons-resolver$/, "java-xml-commons-resolver", $2);
2111
2112         # fedora / redhat
2113         sub(/^Django$/, "python-django", $2);
2114         sub(/^GitPython$/, "python-git", $2);
2115         sub(/^PyQt4-devel$/, "python-PyQt4-devel", $2);
2116         sub(/^PyQwt-devel$/, "python-PyQwt-devel", $2);
2117         sub(/^ccid$/, "pcsc-driver-ccid", $2);
2118         sub(/^chkconfig$/, "/sbin/chkconfig", $2);
2119         sub(/^db4-devel$/, "db-devel", $2);
2120         sub(/^dbus-python$/, "python-dbus", $2);
2121         sub(/^file-devel$/, "libmagic-devel", $2);
2122         sub(/^freetype2-devel$/, "freetype-devel", $2);
2123         sub(/^fuse-devel$/, "libfuse-devel", $2);
2124         sub(/^gamin-python$/, "python-gamin", $2);
2125         sub(/^gcc-c\+\+$/, "libstdc++-devel", $2);
2126         sub(/^gnome-python2-extras$/, "python-gnome-extras", $2);
2127         sub(/^gnome-python2-gtkspell$/, "python-gnome-extras-gtkspell", $2);
2128         sub(/^gtk-sharp2-devel$/, "dotnet-gtk-sharp2-devel", $2);
2129         sub(/^gtk2$/, "gtk+2", $2);
2130         sub(/^gtk2-devel$/, "gtk+2-devel", $2);
2131         sub(/^gtk3-devel$/, "gtk+3-devel", $2);
2132         sub(/^initscripts$/, "rc-scripts", $2);
2133         sub(/^iproute$/, "iproute2", $2);
2134         sub(/^iscsi-initiator-utils$/, "open-iscsi", $2);
2135         sub(/^libXft-devel$/, "xorg-lib-libXft-devel", $2);
2136         sub(/^libXrandr-devel$/, "xorg-lib-libXrandr-devel", $2);
2137         sub(/^libacl-devel$/, "acl-devel", $2);
2138         sub(/^libcurl-devel$/, "curl-devel", $2);
2139         sub(/^libsrtp-devel$/, "srtp-devel", $2);
2140         sub(/^mod_wsgi$/, "apache-mod_wsgi", $2);
2141         sub(/^notify-python$/, "python-pynotify", $2);
2142         sub(/^pcsc-lite-ccid$/, "pcsc-driver-ccid", $2);
2143         sub(/^pulseaudio-libs-devel$/, "pulseaudio-devel", $2);
2144         sub(/^pyOpenSSL$/, "python-pyOpenSSL", $2);
2145         sub(/^pyflakes$/, "python-pyflakes", $2);
2146         sub(/^pygobject2$/, "python-pygobject", $2);
2147         sub(/^pygtk2$/, "python-pygtk", $2);
2148         sub(/^pygtk2-devel$/, "python-pygtk-devel", $2);
2149         sub(/^pysvn$/, "python-pysvn", $2);
2150         sub(/^python-enchant$/, "python-pyenchant", $2);
2151         sub(/^python-imaging$/, "python-PIL", $2);
2152         sub(/^python-imaging-tk$/, "python-PIL-tk", $2);
2153         sub(/^python-pygtk$/, "python-pygtk-gtk", $2);
2154         sub(/^python-recaptcha-client$/, "python-recaptcha", $2);
2155         sub(/^python-twisted-core$/, "python-TwistedCore", $2);
2156         sub(/^python-twisted-core$/, "python-TwistedCore", $2);
2157         sub(/^python-twisted-names$/, "python-TwistedNames", $2);
2158         sub(/^python2-devel$/, "python-devel", $2);
2159         sub(/^pytz$/, "python-pytz", $2);
2160         sub(/^qt4-devel$/, "qt4-build", $2);
2161         sub(/^qt4-webkit-devel$/, "QtWebKit-devel", $2);
2162         sub(/^qtlockedfile-devel$/, "QtLockedFile-devel", $2);
2163         sub(/^qtsingleapplication-devel$/, "QtSingleApplication-devel", $2);
2164         sub(/^rpm-python$/, "python-rpm", $2);
2165         sub(/^sip-devel$/, "python-sip-devel", $2);
2166         sub(/^tftp-server$/, "tftpdaemon", $2);
2167         sub(/^tkinter$/, "python-tkinter", $2);
2168         sub(/^xapian-bindings-python$/, "python-xapian", $2);
2169         sub(/^xorg-x11-server-sdk$/, "xorg-xserver-server-devel", $2);
2170
2171         # mandriva
2172         sub(/^python-gobject-devel$/, "python-pygobject-devel", $2);
2173         sub(/^python-pyrex$/, "python-Pyrex", $2);
2174         sub(/^webkitgtk-devel$/, "gtk-webkit-devel", $2);
2175         sub(/^python-curl$/, "python-pycurl", $2);
2176         sub(/^python-webkitgtk$/, "python-pywebkitgtk", $2);
2177         sub(/^pygtk2.0$/, "python-pygtk-gtk", $2);
2178         sub(/^gnome-python-gconf$/, "python-gnome-gconf", $2);
2179
2180         # debian / ubuntu
2181         sub(/^blkid-dev$/, "libblkid-devel", $2);
2182         sub(/^ext2fs-dev$/, "e2fsprogs-devel", $2);
2183         sub(/^libao-dev$/, "libao-devel", $2);
2184         sub(/^libboost-filesystem[0-9.]+-dev$/, "boost-devel", $2);
2185         sub(/^libboost-program-options[0-9.]+-dev$/, "boost-devel", $2);
2186         sub(/^libboost-regex[0-9.]+-dev$/, "boost-devel", $2);
2187         sub(/^libboost-thread[0-9.]+-dev$/, "boost-devel", $2);
2188         sub(/^libcurl4-openssl-dev$/, "curl-devel", $2);
2189         sub(/^libdnet-dev$/, "libdnet-devel", $2);
2190         sub(/^libesd0-dev$/, "esound-devel", $2);
2191         sub(/^libfishsound1-dev$/, "libfishsound-devel", $2);
2192         sub(/^libgconf2-dev$/, "GConf2-devel", $2);
2193         sub(/^libgl1-mesa-dev$/, "OpenGL-devel", $2);
2194         sub(/^libgl1-mesa-dri$/, "OpenGL", $2);
2195         sub(/^libglib2.0-dev$/, "glib2-devel", $2);
2196         sub(/^libglu1-mesa-dev$/, "OpenGL-GLU-devel", $2);
2197         sub(/^libgtk2.0-dev$/, "gtk+2-devel", $2);
2198         sub(/^libhunspell-dev$/, "hunspell-devel", $2);
2199         sub(/^libmcrypt-dev$/, "libmcrypt-devel", $2);
2200         sub(/^libmhash-dev$/, "mhash-devel", $2);
2201         sub(/^liboggz1-dev$/, "libggz-devel", $2);
2202         sub(/^libpango1.0-dev$/, "pango-devel", $2);
2203         sub(/^libqt4-dev$/, "qt4-build", $2);
2204         sub(/^libshout3-dev$/, "libshout-devel", $2);
2205         sub(/^libslp-dev$/, "openslp-devel", $2);
2206         sub(/^libsndfile1-dev$/, "libsndfile-devel", $2);
2207         sub(/^libspeex-dev$/, "speex-devel", $2);
2208         sub(/^libssl-dev$/, "openssl-devel", $2);
2209         sub(/^libvorbis-dev$/, "libvorbis-devel", $2);
2210         sub(/^libxslt1-dev$/, "libxslt-devel", $2);
2211         sub(/^libxss-dev$/, "xorg-lib-libXScrnSaver-devel", $2);
2212         sub(/^mesa-common-dev$/, "OpenGL-devel", $2);
2213         sub(/^libudev$/, "udev-libs", $2);
2214         sub(/^tcp_wrappers-devel$/, "libwrap-devel", $2);
2215         sub(/^vala-tools$/, "vala", $2);
2216         sub(/^vala-devel$/, "vala", $2);
2217
2218         # altlinux
2219         sub(/^libgit-devel$/, "git-core-devel", $2);
2220         sub(/^libncurses-devel$/, "ncurses-devel", $2);
2221         sub(/^libncursesxx-devel$/, "ncurses-c++-devel", $2);
2222         sub(/^libpcre-devel$/, "pcre-devel", $2);
2223         sub(/^libssl-devel$/, "openssl-devel", $2);
2224
2225         # suse
2226         sub(/^alsa-devel$/, "alsa-lib-devel", $2);
2227         sub(/^gtk-sharp2$/, "dotnet-gtk-sharp2", $2);
2228         sub(/^gtkmm2-devel$/, "gtkmm-devel", $2);
2229         sub(/^libexpat-devel$/, "expat-devel", $2);
2230         sub(/^libffmpeg-devel$/, "ffmpeg-devel", $2);
2231         sub(/^libopenssl-devel$/, "openssl-devel", $2);
2232         sub(/^libpulse-devel$/, "pulseaudio-devel", $2);
2233         sub(/^monodoc-core$/, "mono-monodoc", $2);
2234         sub(/^python-gtk$/, "python-pygtk-gtk", $2);
2235
2236         replace_php_virtual_deps()
2237 }
2238
2239 # vim:ts=4:sw=4
This page took 0.18942 seconds and 4 git commands to generate.