]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - adapter.awk
- lftp debug 5 when debug enabled
[packages/rpm-build-tools.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         sub("update-desktop-database &> /dev/null \\|\\| :", "%update_desktop_database");
641         sub("touch --no-create %{_datadir}/icons/hicolor", "%update_icon_cache_post hicolor");
642         sub("if \\[ -x %{_bindir}/gtk-update-icon-cache \\]; then\n\t%{_bindir}/gtk-update-icon-cache -q %{_datadir}/icons/hicolor \|\| :\nfi", "");
643
644         sub("export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`", "")
645         if (/gconftool-2 --makefile-install-rule/) {
646                 sub("gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/", "%gconf_schema_install ")
647                 sub("> /dev/null", "");
648         }
649
650         use_macros()
651 }
652 /^%preun/, (!/^%preun/ && $0 ~ SECTIONS) {
653         preamble = 0
654         use_macros()
655 }
656 /^%postun/, (!/^%postun/ && $0 ~ SECTIONS) {
657         preamble = 0
658
659         # fedora extras macros
660         if (/%__fe_userdel|%__fe_groupdel/) {
661                 sub("%__fe_groupdel", "%groupremove");
662                 sub("%__fe_userdel", "%userremove");
663                 sub(" &>/dev/null \\|\\| :", "");
664         }
665
666         use_script_macros()
667 }
668 /^%triggerin/, (!/^%triggerin/ && $0 ~ SECTIONS) {
669         preamble = 0
670         use_script_macros()
671 }
672 /^%triggerun/, (!/^%triggerun/ && $0 ~ SECTIONS) {
673         preamble = 0
674         use_script_macros()
675 }
676 /^%triggerpostun/, (!/^%triggerpostun/ && $0 ~ SECTIONS) {
677         preamble = 0
678         use_script_macros()
679 }
680 /^%pretrans/, (!/^%pretrans/ && $0 ~ SECTIONS) {
681         preamble = 0
682         use_script_macros()
683 }
684 /^%posttrans/, (!/^%posttrans/ && $0 ~ SECTIONS) {
685         preamble = 0
686         use_script_macros()
687 }
688 /^%verifyscript/, (!/^%verifyscript/ && $0 ~ SECTIONS) {
689         preamble = 0
690         use_script_macros()
691 }
692 /^%check/, (!/^%check/ && $0 ~ SECTIONS) {
693         preamble = 0
694         use_script_macros()
695 }
696
697 #############
698 # PREAMBLES #
699 #############
700 preamble == 1 {
701         # There should not be a space after the name of field
702         # and before the colon.
703         sub(/[ \t]*:/, ":")
704
705         if (/^%perl_module_wo_prefix/) {
706                 name = $2
707                 version = $3
708                 release = "0." fixedsub(".%{disttag}.at", "", $4)
709         }
710
711         field = tolower($1)
712         if (field ~ /summary:/ && !/etc\.$/ && !/Inc\.$/) {
713                 sub(/\.$/, "", $0);
714         }
715         if (field ~ /group(\([^)]+\)):/)
716                 next
717         if (field ~ /group:/) {
718                 format_preamble()
719                 group = $0;
720                 sub(/^[^ \t]*[ \t]*/, "", group);
721                 group = replace_groupnames(group);
722                 $0 = "Group:\t\t" group
723
724                 if (group ~ /^X11/ && x11 == 0) # Is it X11 application?
725                         x11 = 1
726
727                 byl_plik_z_groupmi = 0
728                 byl_opis_grupy = 0
729                 while ((getline linia_grup < groups_file) > 0) {
730                         byl_plik_z_groupmi = 1
731                         if (linia_grup == group) {
732                                 byl_opis_grupy = 1
733                                 break
734                         }
735                 }
736
737                 if (!byl_plik_z_groupmi)
738                         print "######\t\t" groups_file ": no such file"
739                 else if (!byl_opis_grupy)
740                         print "######\t\t" "Unknown group!"
741
742                 close(groups_file)
743                 did_groups = 1
744         }
745
746         if (field ~ /prereq:/) {
747                 sub(/Pre[Rr]eq:/, "Requires:", $1);
748         }
749
750         # split (build)requires, obsoletes on commas
751         if (field ~ /(obsoletes|requires|provides|conflicts|suggests):/ && NF > 2) {
752                 value = substr($0, index($0, $2));
753                 $0 = format_requires($1, value);
754         }
755
756         # BR: tar (and others) is to common (rpm-build requires it)
757         if (field ~ /^buildrequires:/) {
758                 l = substr($0, index($0, $2));
759                 if (l == "awk" ||
760                         l == "binutils" ||
761                         l == "bzip2" ||
762                         l == "cpio" ||
763                         l == "diffutils" ||
764                         l == "elfutils" ||
765                         l == "fileutils" ||
766                         l == "findutils" ||
767                         l == "glibc-devel" ||
768                         l == "grep" ||
769                         l == "gzip" ||
770                         l == "make" ||
771                         l == "patch" ||
772                         l == "sed" ||
773                         l == "sh-utils" ||
774                         l == "tar" ||
775                         l == "textutils") {
776                         next
777                 }
778
779                 replace_requires();
780         }
781
782         if (field ~ /^requires:/ || field ~ /^requires\(/) {
783                 replace_requires();
784         }
785
786
787         # obsolete/unwanted tags
788         if (field ~ /vendor:|packager:|distribution:|docdir:|prefix:|icon:|author:|author-email:|metadata-version:/) {
789                 next
790         }
791
792         if (field ~ /buildroot:/) {
793                 $0 = $1 "%{tmpdir}/%{name}-%{version}-root-%(id -u -n)"
794                 did_build_root = 1
795         }
796
797         # Use "License" instead of "Copyright" if it is (L)GPL or BSD
798         if (field ~ /copyright:/ && $2 ~ /GPL|BSD/) {
799                 $1 = "License:"
800         }
801
802         # ease updating from debian .dsc
803         if (field ~ /homepage:/) {
804                 $1 = "URL:"
805         }
806
807         # suse
808         if (field ~ /recommends:/) {
809                 $1 = "Suggests:"
810         }
811
812         if ($3 == "==" && $1 !~ /%/) {
813                 $3 = "="
814         }
815
816         if (field ~ /license:/) {
817                 l = substr($0, index($0, $2));
818                 if (l == "Python Software Foundation License") {
819                         l = "PSF"
820                 }
821                 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") {
822                         l = "Apache v2.0"
823                 }
824                 if (l == "Apache Group License" || l == "Apache Software License" || l == "Apache License") {
825                         l = "Apache"
826                 }
827                 if (l == "Apache-style License" || l == "Apache-style Software License") {
828                         l = "Apache-like"
829                 }
830                 if (l == "Apache Software License 1.1" || l == "Apache 1.1") {
831                         l = "Apache v1.1"
832                 }
833                 if (l == "GPLv2") {
834                         l = "GPL v2"
835                 }
836                 if (l == "GPLv2+") {
837                         l = "GPL v2+"
838                 }
839                 if (l == "GPL v2 or later") {
840                         l = "GPL v2+"
841                 }
842                 if (l == "LGPL v2.0 only") {
843                         l = "LGPL v2"
844                 }
845                 if (l == "LGPLv2+") {
846                         l = "LGPL v2+"
847                 }
848                 if (l == "GPLv3") {
849                         l = "GPL v3"
850                 }
851                 if (l == "GPLv3+") {
852                         l = "GPL v3+"
853                 }
854                 if (l == "MPLv1.1") {
855                         l = "MPL v1.1"
856                 }
857                 $0 = "License:\t" l;
858         }
859
860
861         if (field ~ /name:/) {
862                 if ($2 == "%{name}" && name) {
863                         $2 = name
864                 }
865                 name = $2
866                 name_seen = 1;
867         }
868
869         if (field ~ /version:/) {
870                 if ($2 == "%{version}" && version) {
871                         $2 = version
872                 }
873                 version = $2
874                 version_seen = 1;
875         }
876
877         if (field ~ /release:/) {
878                 if ($2 == "%{release}" && release) {
879                         $2 = release
880                 }
881                 sub(/%atrelease /, "0.", $0)
882                 release = $2
883                 release_seen = 1;
884         }
885
886
887         if (field ~ /serial:/)
888                 $1 = "Epoch:"
889
890         if (field ~ /home-page:/)
891                 $1 = "URL:"
892
893         # proper caps
894         if (field ~ /^url:$/)
895                 $1 = "URL:"
896
897         if (field ~ /^patch/)
898                 $1 = "Patch" substr(field, 6);
899
900         if (field ~ /^description:$/)
901                 $1 = "\n%description\n"
902
903         # Use %{name} and %{version} in the filenames in "Source:"
904         if (field ~ /^source/ || field ~ /patch/) {
905                 n = split($2, url, /\//)
906                 if (url[n] ~ /\.gz$/) {
907                         url[n+1] = ".gz" url[n+1]
908                         sub(/\.gz$/,"",url[n])
909                 }
910                 if (url[n] ~ /\.zip$/) {
911                         url[n+1] = ".zip" url[n+1]
912                         sub(/\.zip$/,"",url[n])
913                 }
914                 if (url[n] ~ /\.tar$/) {
915                         url[n+1] = ".tar" url[n+1]
916                         sub(/\.tar$/,"",url[n])
917                 }
918                 if (url[n] ~ /\.patch$/) {
919                         url[n+1] = ".patch" url[n+1]
920                         sub(/\.patch$/,"",url[n])
921                 }
922                 if (url[n] ~ /\.bz2$/) {
923                         url[n+1] = ".bz2" url[n+1]
924                         sub(/\.bz2$/,"",url[n])
925                 }
926                 if (url[n] ~ /\.logrotate$/) {
927                         url[n+1] = ".logrotate" url[n+1]
928                         sub(/\.logrotate$/,"",url[n])
929                 }
930                 if (url[n] ~ /\.pamd$/) {
931                         url[n+1] = ".pamd" url[n+1]
932                         sub(/\.pamd$/,"",url[n])
933                 }
934
935                 # allow %{name} only in last url component
936                 s = ""
937                 for (i = 1; i <= n; i++) {
938                         url[i] = fixedsub("%{name}", name, url[i])
939                         if (s) {
940                                 s = s "/" url[i]
941                         } else {
942                                 s = url[i]
943                         }
944                 }
945                 $2 = s url[n+1]
946
947                 filename = url[n]
948                 if (name) {
949                         url[n] = fixedsub(name, "%{name}", url[n])
950                 }
951                 if (field ~ /source/) {
952                         if (version) {
953                                 url[n] = fixedsub(version, "%{version}", url[n])
954                         }
955                         if (_beta) {
956                                 url[n] = fixedsub(_beta, "%{_beta}", url[n])
957                         }
958                         if (_rc) {
959                                 url[n] = fixedsub(_rc, "%{_rc}", url[n])
960                         }
961                         if (_pre) {
962                                 url[n] = fixedsub(_pre, "%{_pre}", url[n])
963                         }
964                         if (_snap) {
965                                 url[n] = fixedsub(_snap, "%{_snap}", url[n])
966                         }
967                         if (subver) {
968                                 url[n] = fixedsub(subver, "%{subver}", url[n])
969                         }
970                 }
971                 # assigning to $2 kills preamble formatting
972                 $2 = fixedsub(filename, url[n], $2)
973
974                 $2 = unify_url($2)
975         }
976
977
978         if (field ~ /^source:/)
979                 $1 = "Source0:"
980
981         if (field ~ /^patch:/)
982                 $1 = "Patch0:"
983
984         kill_preamble_macros();
985         format_preamble()
986
987         if (field ~ /requires/) {
988                 # atrpms
989                 $0 = fixedsub("%{eversion}", "%{epoch}:%{version}-%{release}", $0);
990         }
991 }
992
993 /^%bcond_/ {
994         # do nothing
995         print
996         next
997 }
998
999 # sort BR/R!
1000 #
1001 # NOTES:
1002 # - mixing BR/R and anything else confuses this (all will be sorted together)
1003 #       so don't do that.
1004 # - comments leading the BR/R can not be associated,
1005 #       so don't adapterize when the BR/R are mixed with comments
1006 ENVIRON["SKIP_SORTBR"] != 1 && preamble == 1 && $0 ~ PREAMBLE_TAGS ":", $0 ~ PREAMBLE_TAGS ":"{
1007         if ($1 ~ /Pre[Rr]eq:/) {
1008                 sub(/Pre[Rr]eq:/, "Requires:", $1);
1009         }
1010         if ($1 == "BR:" ) {
1011                 $1 = "BuildRequires:"
1012         }
1013         if ($1 == "R:" ) {
1014                 $1 = "Requires:"
1015         }
1016         format_preamble()
1017 #       kill_preamble_macros(); # breaks tabbing
1018
1019         b_idx++;
1020         l = substr($0, index($0, $2));
1021         b_ktmp = b_makekey($1, l);
1022         b_key[b_idx] = b_ktmp;
1023         b_val[b_ktmp] = $0;
1024
1025         next;
1026 }
1027
1028 preamble == 1 {
1029         if (b_idx > 0) {
1030                 isort(b_key, b_idx);
1031                 for (i = 1; i <= b_idx; i++) {
1032                         v = b_val[b_key[i]];
1033                         sub(/[ \t]+$/, "", v);
1034                         print "" v;
1035                 }
1036                 b_idx = 0
1037         }
1038 }
1039
1040 # main() ;-)
1041 {
1042         preamble = 1
1043
1044         sub(/[ \t]+$/, "")
1045         print
1046
1047         if (name_seen == 0 && name) {
1048                 print "Name:\t\t" name
1049                 name_seen = 1
1050         }
1051
1052         if (version_seen == 0 && version) {
1053                 print "Version:\t" version
1054                 version_seen = 1
1055         }
1056
1057         if (release_seen == 0 && release) {
1058                 print "Release:\t" release
1059                 release_seen = 1
1060         }
1061
1062         if (did_build_root == 0) {
1063 #               print "BuildRoot:\t%{tmpdir}/%{name}-%{version}-root-%(id -u -n)"
1064                 did_build_root = 1
1065         }
1066         if (did_groups == 0) {
1067 #               print "Group:\t\tunknown"
1068                 did_groups = 1
1069         }
1070 }
1071
1072
1073 END {
1074         if (do_not_touch_anything) {
1075                 exit(rc)
1076         }
1077
1078         # TODO: need to output these in proper place
1079         if (BR_count > 0) {
1080                 for (i = 0; i <= BR_count; i++) {
1081                         print BR[i];
1082                 }
1083         }
1084
1085         close(changelog_file)
1086         while ((getline < changelog_file) > 0)
1087                 print
1088         system("rm -f " changelog_file)
1089
1090         if (did_clean == 0) {
1091                 print ""
1092                 print "%clean"
1093                 print "rm -rf $RPM_BUILD_ROOT"
1094         }
1095
1096         if (date == 0) {
1097                 print ""
1098                 print "%define date\t%(echo `LC_ALL=\"C\" date +\"%a %b %d %Y\"`)"
1099         }
1100
1101         if (has_changelog == 0) {
1102                 print "%changelog"
1103         }
1104
1105         if (boc > 2) {
1106                 print "* %{date} PLD Team <feedback@pld-linux.org>"
1107         }
1108         if (boc > 1) {
1109                 printf "All persons listed below can be reached at "
1110                 print "<cvs_login>@pld-linux.org\n"
1111         }
1112         if (boc > 0) {
1113                 print "$" "Log:$"
1114         }
1115 }
1116
1117 # substitutes fixed strings (not regexps)
1118 function fixedsub(s1,s2,t, ind) {
1119         if (ind = index(t,s1))
1120                 t = substr(t, 1, ind-1) s2 substr(t, ind+length(s1))
1121         return t
1122 }
1123
1124 # replace s with s2 if it equals to s1
1125 function replace(s, s1, s2) {
1126         if (s == s1) {
1127                 return s2;
1128         } else {
1129                 return s;
1130         }
1131 }
1132
1133 # There should be one or two tabs after the colon.
1134 function format_preamble()
1135 {
1136         if (/^#/ || /^%bcond_with/) {
1137                 return;
1138         }
1139         sub(/:[ \t]*/, ":")
1140         if (match($0, /[A-Za-z0-9(),#_ \t.-]+[ \t]*:[ \t]*/) == 1) {
1141                 if (RLENGTH < 8) {
1142                         sub(/:/, ":\t\t")
1143                 } else {
1144                         sub(/:/, ":\t")
1145                 }
1146         }
1147 }
1148
1149 # Replace directly specified directories with macros
1150 function use_macros()
1151 {
1152         # -m, --skip-macros, --no-macros -- skip macros subst
1153         if (ENVIRON["SKIP_MACROS"]) {
1154                 return
1155         }
1156
1157         # leave inline sed lines alone
1158         if (/(%{__sed}|sed) -i -e/) {
1159                 return;
1160         }
1161
1162         sub("%{_defaultdocdir}", "%{_docdir}");
1163         sub("%{_bindir}/perl", "%{__perl}");
1164         sub("%{_bindir}/python", "%{__python}");
1165
1166         gsub(infodir, "%{_infodir}")
1167
1168         gsub(perl_sitearch, "%{perl_sitearch}")
1169         gsub(perl_archlib, "%{perl_archlib}")
1170         gsub(perl_privlib, "%{perl_privlib}")
1171         gsub(perl_vendorlib, "%{perl_vendorlib}")
1172         gsub(perl_vendorarch, "%{perl_vendorarch}")
1173         gsub(perl_sitelib, "%{perl_sitelib}")
1174         
1175         gsub(py_sitescriptdir, "%{py_sitescriptdir}")
1176         gsub(py_sitedir, "%{py_sitedir}")
1177         gsub(py_scriptdir, "%{py_scriptdir}")
1178
1179         gsub(py3_sitescriptdir, "%{py3_sitescriptdir}")
1180         gsub(py3_sitedir, "%{py3_sitedir}")
1181         gsub(py3_scriptdir, "%{py3_scriptdir}")
1182
1183         gsub(ruby_archdir, "%{ruby_archdir}")
1184         gsub(ruby_ridir, "%{ruby_ridir}")
1185         gsub(ruby_rubylibdir, "%{ruby_rubylibdir}")
1186         gsub(ruby_sitearchdir, "%{ruby_sitearchdir}")
1187         gsub(ruby_sitelibdir, "%{ruby_sitelibdir}")
1188         gsub(ruby_rdocdir, "%{ruby_rdocdir}")
1189
1190         gsub("%{_datadir}/applications", "%{_desktopdir}")
1191         gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}")
1192         gsub("%{_datadir}/java", "%{_javadir}")
1193
1194         gsub("%{_libdir}/pkgconfig", "%{_pkgconfigdir}")
1195         gsub(pkgconfigdir, "%{_pkgconfigdir}")
1196
1197         gsub("%{_datadir}/pkgconfig", "%{_npkgconfigdir}")
1198         gsub(npkgconfigdir, "%{_npkgconfigdir}")
1199
1200         gsub(libdir, "%{_libdir}")
1201         gsub(javadir, "%{_javadir}")
1202
1203         gsub(bindir, "%{_bindir}")
1204         gsub("%{prefix}/bin", "%{_bindir}")
1205         if (prefix"/bin" == bindir)
1206                 gsub("%{_prefix}/bin", "%{_bindir}")
1207
1208         for (c = 1; c <= NF; c++) {
1209                 if ($c ~ sbindir "/fix-info-dir")
1210                         continue;
1211                 if ($c ~ sbindir "/webapp")
1212                         continue;
1213                 if ($c ~ sbindir "/ldconfig")
1214                         continue;
1215                 if ($c ~ sbindir "/chsh")
1216                         continue;
1217                 if ($c ~ sbindir "/usermod")
1218                         continue;
1219                 if ($c ~ sbindir "/chkconfig")
1220                         continue;
1221                 if ($c ~ sbindir "/installzope(product|3package)")
1222                         continue;
1223                 gsub(sbindir, "%{_sbindir}", $c)
1224         }
1225
1226         gsub("%{prefix}/sbin", "%{_sbindir}")
1227         if (prefix"/sbin" == sbindir) {
1228                 gsub("%{_prefix}/sbin", "%{_sbindir}")
1229         }
1230
1231         for (c = 1; c <= NF; c++) {
1232                 if ($c ~ sysconfdir "/{?cron.")
1233                         continue;
1234                 if ($c ~ sysconfdir "/{?crontab.d")
1235                         continue;
1236                 if ($c ~ sysconfdir "/{?env.d")
1237                         continue;
1238                 if ($c ~ sysconfdir "/{?modprobe.(d|conf)")
1239                         continue;
1240                 if ($c ~ sysconfdir "/{?udev")
1241                         continue;
1242                 if ($c ~ sysconfdir "/{?hotplug")
1243                         continue;
1244                 if ($c ~ sysconfdir "/{?logrotate.d")
1245                         continue;
1246                 if ($c ~ sysconfdir "/{?pam.d")
1247                         continue;
1248                 if ($c ~ sysconfdir "/{?profile.d")
1249                         continue;
1250                 if ($c ~ sysconfdir "/{?rc.d")
1251                         continue;
1252                 if ($c ~ sysconfdir "/{?security")
1253                         continue;
1254                 if ($c ~ sysconfdir "/{?skel")
1255                         continue;
1256                 if ($c ~ sysconfdir "/{?sysconfig")
1257                         continue;
1258                 if ($c ~ sysconfdir "/{?shrc.d")
1259                         continue;
1260                 if ($c ~ sysconfdir "/{?certs")
1261                         continue;
1262                 if ($c ~ sysconfdir "/{?X11")
1263                         continue;
1264                 if ($c ~ sysconfdir "/{?ld.so.conf.d")
1265                         continue;
1266                 if ($c ~ sysconfdir "/{?rpm")
1267                         continue;
1268                 if ($c ~ sysconfdir "/{?bash_completion.d")
1269                         continue;
1270                 if ($c ~ sysconfdir "/{?samba")
1271                         continue;
1272                 if ($c ~ sysconfdir "/{?xdg")
1273                         continue;
1274                 if ($c ~ sysconfdir "/shells")
1275                         continue;
1276                 if ($c ~ sysconfdir "/inittab")
1277                         continue;
1278                 if ($c ~ sysconfdir "/init")
1279                         continue;
1280                 if ($c ~ sysconfdir "/ppp")
1281                         continue;
1282                 if ($c ~ sysconfdir "/dbus-1")
1283                         continue;
1284                 if ($c ~ sysconfdir "/tmpwatch")
1285                         continue;
1286                 if ($c ~ sysconfdir "/acpi")
1287                         continue;
1288                 if ($c ~ sysconfdir "/apm")
1289                         continue;
1290                 gsub(sysconfdir, "%{_sysconfdir}", $c)
1291         }
1292
1293         gsub(docdir, "%{_docdir}")
1294
1295         gsub(kdedocdir, "%{_kdedocdir}")
1296
1297         gsub(gtkdocdir, "%{_gtkdocdir}")
1298         gsub("%{_docdir}/gtk-doc/html", "%{_gtkdocdir}")
1299
1300         gsub(php_pear_dir, "%{php_pear_dir}")
1301         gsub(php_data_dir, "%{php_data_dir}")
1302
1303         for (c = 1; c <= NF; c++) {
1304                 if ($c ~ datadir "/automake")
1305                         continue;
1306                 if ($c ~ datadir "/unsermake")
1307                         continue;
1308                 if ($c ~ datadir "/file/magic.mime")
1309                         continue;
1310                 gsub(datadir, "%{_datadir}", $c)
1311         }
1312
1313         gsub("%{prefix}/share", "%{_datadir}")
1314         if (prefix"/share" == datadir)
1315                 gsub("%{_prefix}/share", "%{_datadir}")
1316
1317         # CFLAGS="-I/usr/include/ncurses is usually correct.
1318         if (!/-I\/usr\/include/) {
1319                 gsub(includedir, "%{_includedir}")
1320         }
1321
1322         gsub("%{prefix}/include", "%{_includedir}")
1323         if (prefix"/include" == includedir) {
1324                 gsub("%{_prefix}/include", "%{_includedir}")
1325         }
1326
1327         gsub(mandir, "%{_mandir}")
1328         if ($0 !~ "%{_datadir}/manual") {
1329                 gsub("%{_datadir}/man", "%{_mandir}")
1330         }
1331         gsub("%{_prefix}/share/man", "%{_mandir}")
1332         gsub("%{prefix}/share/man", "%{_mandir}")
1333         gsub("%{prefix}/man", "%{_mandir}")
1334         gsub("%{_prefix}/man", "%{_mandir}")
1335
1336         gsub(infodir, "%{_infodir}")
1337         gsub("%{prefix}/info", "%{_infodir}")
1338         gsub("%{_prefix}/info", "%{_infodir}")
1339
1340         if (prefix !~ "/X11R6") {
1341                 gsub("%{_datadir}/aclocal", "%{_aclocaldir}")
1342         }
1343
1344         gsub(examplesdir, "%{_examplesdir}")
1345
1346         if (prefix != "/") {
1347                 # leave --with-foo=/usr alone
1348                 if ($0 !~ "--with.*=.*" prefix) {
1349                         for (c = 1; c <= NF; c++) {
1350                                 if ($c ~ prefix "/sbin/fix-info-dir")
1351                                         continue;
1352                                 if ($c ~ prefix "/sbin/webapp")
1353                                         continue;
1354                                 if ($c ~ prefix "/sbin/chsh")
1355                                         continue;
1356                                 if ($c ~ prefix "/sbin/usermod")
1357                                         continue;
1358                                 if ($c ~ prefix "/sbin/installzope(product|3package)")
1359                                         continue;
1360                                 if ($c ~ prefix "/share/automake")
1361                                         continue;
1362                                 if ($c ~ prefix "/share/unsermake")
1363                                         continue;
1364                                 if ($c ~ prefix "/lib/sendmail")
1365                                         continue;
1366                                 if ($c ~ prefix "/lib/pkgconfig")
1367                                         continue;
1368
1369                                 # CFLAGS="-I/usr..." is usually correct.
1370                                 if (/-I\/usr/)
1371                                         continue;
1372                                 # same for LDFLAGS="-L/usr..."
1373                                 if (/-L\/usr/)
1374                                         continue;
1375
1376                                 gsub(prefix, "%{_prefix}", $c)
1377                         }
1378                 }
1379                 gsub("%{prefix}", "%{_prefix}")
1380         }
1381
1382         # replace back
1383         gsub("%{_includedir}/ncurses", "/usr/include/ncurses")
1384         gsub("%{_includedir}/freetype", "/usr/include/freetype")
1385
1386         gsub("%{PACKAGE_VERSION}", "%{version}")
1387         gsub("%{PACKAGE_NAME}", "%{name}")
1388
1389         gsub("^make$", "%{__make}")
1390         gsub("^make ", "%{__make} ")
1391         gsub("^gcc ", "%{__cc} ")
1392         gsub("^rm --interactive=never ", "%{__rm} ")
1393
1394         # fedora
1395         gsub("%{ruby_sitearch}", "%{ruby_sitearchdir}")
1396         gsub("%{python_sitearch}", "%{py_sitedir}")
1397         gsub("%{python_sitelib}", "%{py_sitescriptdir}")
1398
1399         # alt linux
1400         gsub("%_man1dir", "%{_mandir}/man1")
1401
1402         # mandrake specs
1403         gsub("^%make$", "%{__make}")
1404         gsub("^%make ", "%{__make} ")
1405         gsub("^%makeinstall_std", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1406         gsub("^%{makeinstall}", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1407         gsub("^%makeinstall", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1408         gsub("^%{__rm} -rf %{buildroot}", "rm -rf $RPM_BUILD_ROOT")
1409         gsub("^%{__install}", "install")
1410         gsub("%optflags", "%{rpmcflags}")
1411         gsub("%{compat_perl_vendorarch}", "%{perl_vendorarch}")
1412
1413         gsub("^%{__make} install DESTDIR=\$RPM_BUILD_ROOT", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT")
1414         gsub("^fix-info-dir$", "[ ! -x /usr/sbin/fix-info-dir ] || /usr/sbin/fix-info-dir -c %{_infodir} >/dev/null 2>\\&1")
1415         $0 = fixedsub("%buildroot", "$RPM_BUILD_ROOT", $0)
1416         $0 = fixedsub("%{buildroot}", "$RPM_BUILD_ROOT", $0)
1417         $0 = fixedsub("CXXFLAGS=%{rpmcflags} %configure", "CXXFLAGS=%{rpmcflags}\n%configure", $0);
1418         $0 = fixedsub("%__install", "install", $0);
1419
1420         # split configure line to multiple lines
1421         if (/%configure +$/) {
1422                 sub( / +$/, "" );
1423         } else if (/%configure / && !/\\$/) {
1424                 $0 = format_configure($0);
1425         }
1426
1427         gsub("%_bindir", "%{_bindir}")
1428         gsub("%_datadir", "%{_datadir}")
1429         gsub("%_iconsdir", "%{_iconsdir}")
1430         gsub("%_sbindir", "%{_sbindir}")
1431         gsub("%_mandir", "%{_mandir}")
1432         gsub("%name", "%{name}")
1433         gsub(/%__rm/, "rm");
1434         gsub(/%__mkdir_p/, "install -d");
1435         gsub(/%__cp/, "cp");
1436         gsub(/%__ln_s/, "ln -s");
1437         gsub(/%__sed/, "%{__sed}");
1438         gsub(/%__cat/, "cat");
1439         gsub(/%__chmod/, "chmod");
1440
1441         gsub("/usr/src/linux", "%{_kernelsrcdir}")
1442         gsub("%{_prefix}/src/linux", "%{_kernelsrcdir}")
1443
1444         if (/^ant / || /^%{ant}/) {
1445                 sub(/^ant/, "%ant")
1446                 sub(/^%{ant}/, "%ant")
1447                 add_br("BuildRequires:  jpackage-utils");
1448                 add_br("BuildRequires:  rpmbuild(macros) >= 1.300");
1449         }
1450
1451         $0 = fixedsub("%(%{__cc} -dumpversion)", "%{cc_version}", $0);
1452         $0 = fixedsub("%(%{__cxx} -dumpversion)", "%{cxx_version}", $0);
1453
1454         # kill the _class and _subclass pear macros
1455         if (pear_class) {
1456                 gsub("%{_class}", pear_class);
1457         }
1458         if (pear_subclass) {
1459                 gsub("%{_subclass}", pear_subclass);
1460         }
1461
1462 }
1463
1464 function format_configure(line,         n, a, s) {
1465         n = split(line, a, / /);
1466         s = a[1] " \\\n";
1467         for (i = 2; i <= n; i++) {
1468                 s = s "\t" a[i] " \\\n"
1469         }
1470         return s
1471 }
1472
1473
1474 # insertion sort of A[1..n]
1475 # copied from mawk manual
1476 function isort(A,n,             i,j,hold) {
1477         for (i = 2; i <= n; i++) {
1478                 hold = A[j = i]
1479                 while (A[j-1] > hold) {
1480                         j-- ; A[j+1] = A[j]
1481                 }
1482                 A[j] = hold
1483         }
1484         # sentinel A[0] = "" will be created if needed
1485 }
1486
1487
1488 function use_files_macros(      i, n, t, a, l)
1489 {
1490         use_macros()
1491
1492         # skip comments
1493         if (/^#/) {
1494                 return 1;
1495         }
1496
1497         sub("^%doc %{_mandir}", "%{_mandir}")
1498
1499         gsub("^%{_sbindir}", "%attr(755,root,root) %{_sbindir}")
1500         gsub("^%{_bindir}", "%attr(755,root,root) %{_bindir}")
1501
1502         # uid/gid nobody is not valid in %files
1503         if (/%attr([^)]*nobody[^)]*)/ && !/FIXME/) {
1504                 $0 = $0 " # FIXME nobody user/group can't own files! -adapter.awk"
1505         }
1506
1507         # s[gu]id programs with globs are evil
1508         if (/%attr\([246]...,.*\*/ && !/FIXME/) {
1509                 $0 = $0 " # FIXME no globs for suid/sgid files"
1510         }
1511
1512         # replace back
1513         gsub("%{_sysconfdir}/cron\.d", "/etc/cron.d")
1514         gsub("%{_sysconfdir}/crontab\.d", "/etc/crontab.d")
1515         gsub("%{_sysconfdir}/logrotate\.d", "/etc/logrotate.d")
1516         gsub("%{_sysconfdir}/pam\.d", "/etc/pam.d")
1517         gsub("%{_sysconfdir}/profile\.d", "/etc/profile.d")
1518         gsub("%{_sysconfdir}/rc\.d", "/etc/rc.d")
1519         gsub("%{_sysconfdir}/security", "/etc/security")
1520         gsub("%{_sysconfdir}/skel", "/etc/skel")
1521         gsub("%{_sysconfdir}/sysconfig", "/etc/sysconfig")
1522         gsub("%{_sysconfdir}/certs", "/etc/certs")
1523         gsub("%{_sysconfdir}/init.d", "/etc/init.d")
1524         gsub("%{_sysconfdir}/dbus-1", "/etc/dbus-1")
1525         gsub("%{_sysconfdir}/pki", "/etc/pki")
1526         gsub("%{_sysconfdir}/tmpwatch", "/etc/tmpwatch")
1527
1528         # /etc/init.d -> /etc/rc.d/init.d
1529         if (!/^\/etc\/init\.d$/) {
1530                  gsub("/etc/init.d", "/etc/rc.d/init.d")
1531         }
1532
1533         if (/\/etc\/rc\.d\/init\.d\// && !/functions/) {
1534                 if (!/%attr.*\/etc\/rc\.d\/init\.d/) {
1535                         $0 = "%attr(754,root,root) " $0
1536                 }
1537                 if (/^%attr.*\/etc\/rc\.d\/init\.d/ && !/^%attr\(754 *,/) {
1538                         gsub("^%attr\\(... *,", "%attr(754,");
1539                 }
1540         }
1541
1542         if (/lib.+\.so\b/ && !/\.so$/ && !/^%attr.*/ && !/%exclude/) {
1543                 $0 = "%attr(755,root,root) " $0
1544         }
1545
1546         if (/%{perl_vendorarch}.*\.so$/ && !/^%attr.*/) {
1547                 $0 = "%attr(755,root,root) " $0
1548         }
1549
1550         # remove attrs from man pages
1551         if (/%{_mandir}/ && /^%attr/) {
1552                 sub("^%attr\\(.*\\) *", "");
1553         }
1554
1555         # /etc/sysconfig files
1556         # %attr(640,root,root) %config(noreplace) %verify(not size mtime md5) /etc/sysconfig/*
1557         # attr not required, allow default 644 attr
1558         if (!/network-scripts/ && !/%dir/ && !/\.d$/ && !/functions/ && !/\/etc\/sysconfig\/wmstyle/) {
1559                 if (/\/etc\/sysconfig\// && /%config/ && !/%config\(noreplace/) {
1560                         gsub("%config", "%config(noreplace)")
1561                 }
1562
1563                 if (/\/etc\/sysconfig\// && !/%config\(noreplace/) {
1564                         $NF = "%config(noreplace) " $NF
1565                 }
1566
1567                 if (/\/etc\/sysconfig\// && /%attr\(755/) {
1568                         gsub("^%attr\\(... *,", "%attr(640,");
1569                 }
1570
1571                 if (/\/etc\/sysconfig\// && !/%verify/) {
1572                         gsub("/etc/sysconfig", "%verify(not size mtime md5) /etc/sysconfig");
1573                 }
1574         }
1575
1576         # kill leading zeros
1577         if (/%attr\(0[1-9]/) {
1578                 gsub("%attr\\(0", "%attr(")
1579         }
1580
1581         # kill leading whitespace
1582         gsub(/^ +/, "");
1583
1584         # kill default attrs
1585         gsub(/%dir %attr\(755,root,root\)/, "%dir");
1586         gsub(/%attr\(755,root,root\) %dir/, "%dir");
1587         if (!/%dir/) {
1588                 gsub(/%attr\(644,root,root\) /, "");
1589         }
1590
1591         # sort %verify attrs
1592         if (match($0, /%verify\(not([^)]+)\)/)) {
1593                 t = substr($0, RSTART, RLENGTH)
1594                 # kill commas: %verify(not,md5,size,mtime)
1595                 gsub(/,/, " ", t);
1596
1597                 gsub(/^%verify\(not |\)$/, "", t)
1598                 n = split(t, a, / /)
1599                 isort(a, n)
1600
1601                 s = "%verify(not"
1602                 for (i = 1 ; i <= n; i++) {
1603                         s = s " " a[i]
1604                 }
1605                 s = s ")"
1606
1607                 gsub(/%verify\(not[^)]+\)/, s)
1608         }
1609
1610         if (/%{_mandir}/) {
1611                 gsub("\.gz$", "*")
1612                 gsub("%ext_man$", "*")
1613         }
1614
1615         # locale dir and no %lang -> bad
1616         if (/%{_datadir}\/locale\/.*\// && !/%(dir|lang)/) {
1617                 $(NF + 1) = "# FIXME consider using %find_lang"
1618         }
1619
1620         # python egg-infos
1621         if (match($0, "^%{py_site(script)?dir}/.+-py"py_ver".egg-info$")) {
1622                 # tests:
1623                 #%{py_sitedir}/*-py2.4.egg-info
1624                 #%{py_sitescriptdir}/GnuPGInterface-%{version}-py2.4.egg-info
1625                 #%{py_sitescriptdir}/python_mpd-%{version}-py2.4.egg-info
1626                 #%{py_sitescriptdir}/mechanize-0.1.6b-py2.4.egg-info
1627
1628                 l = index($0, "/");
1629                 t = substr($0, 0, l);
1630                 s = substr($0, l + 1, RLENGTH - l - length("-py"py_ver".egg-info"));
1631                 if (match(s, "[^-]+$")) {
1632                         if (RSTART > 1) {
1633                                 s = substr(s, 0, RSTART - 1);
1634                         }
1635                         print "%if \"%{py_ver}\" > \"2.4\""
1636                         gsub(t "/.+.egg-info", t "/" s "-*.egg-info");
1637                         print
1638                         print "%endif"
1639                         return 0;
1640                 }
1641         }
1642
1643         # atrpms
1644         $0 = fixedsub("%{perl_man1dir}", "%{_mandir}/man1", $0);
1645         $0 = fixedsub("%{perl_man3dir}", "%{_mandir}/man3", $0);
1646         $0 = fixedsub("%{perl_bin}", "%{_bindir}", $0);
1647
1648         gsub(libdir "/pkgconfig", "%{_pkgconfigdir}");
1649         gsub("%{_libdir}/pkgconfig", "%{_pkgconfigdir}");
1650         gsub("%{_prefix}/lib/pkgconfig", "%{_pkgconfigdir}");
1651
1652         gsub("%{_datadir}/applications", "%{_desktopdir}");
1653         gsub("%{_datadir}/icons", "%{_iconsdir}");
1654         gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}");
1655         gsub("%{_datadir}/pear", "%{php_pear_dir}");
1656         gsub("%{_datadir}/php", "%{php_data_dir}");
1657
1658         return 1
1659 }
1660
1661 function use_script_macros()
1662 {
1663         if (gsub("/sbin/service", "%service")) {
1664                 sub(" >/dev/null 2>&1 \|\|:", "");
1665                 sub(" 2> /dev/null \|\| :", "");
1666         }
1667 }
1668
1669 function fill(ch, n, i) {
1670         for (i = 0; i < n; i++)
1671                 printf("%c", ch)
1672 }
1673
1674 function format_flush(line, indent, newline, word, first_word) {
1675         first_word = 1
1676         if (format_indent == -1)
1677                 newline = ""
1678         else
1679                 newline = fill(" ", format_indent) "- "
1680
1681         while (match(line, /[^\t ]+/)) {
1682                 word = substr(line, RSTART, RLENGTH)
1683                 if (length(newline) + length(word) + 1 > tw) {
1684                         print newline
1685
1686                         if (format_indent == -1)
1687                                 newline = ""
1688                         else
1689                                 newline = fill(" ", format_indent + 2)
1690                         first_word = 1
1691                 }
1692
1693                 if (first_word) {
1694                         newline = newline word
1695                         first_word = 0
1696                 } else
1697                         newline = newline " " word
1698
1699                 line = substr(line, RSTART + RLENGTH)
1700         }
1701         if (newline ~ /[^\t ]/) {
1702                 print newline
1703         }
1704 }
1705
1706 function cflags(var)
1707 {
1708         if ($0 == var "=\"$RPM_OPT_FLAGS\"") {
1709                 removed[var] = 1
1710                 return 0
1711         }
1712
1713         if (!/!\?debug/)
1714                 sub("\$RPM_OPT_FLAGS", "%{rpmcflags}")
1715         return 1
1716 }
1717
1718 # return whole matched pattern
1719 function matchstr(str, pat)
1720 {
1721         match(str, "[^/]+$");
1722         return substr(str, RSTART, RLENGTH);
1723 }
1724
1725 function unify_url(url)
1726 {
1727
1728         # sourceforge urls
1729         # Docs about sourceforge mirror system: http://sourceforge.net/apps/trac/sourceforge/wiki/Mirrors
1730
1731         # 1. unify domains
1732         sub("^http://prdownloads\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1733         sub("^http://download\.sf\.net/", "http://downloads.sourceforge.net/", url)
1734         sub("^http://download\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1735         sub("^http://dl\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1736         sub("^http://.*\.dl\.sourceforge\.net/", "http://downloads.sourceforge.net/", url)
1737         sub("^http://dl\.sf\.net/", "http://downloads.sourceforge.net/", url)
1738         sub("^http://downloads\.sourceforge\.net/sourceforge/", "http://downloads.sourceforge.net/", url)
1739
1740         # 3. unify urls
1741         if (url ~ /sourceforge.net/) {
1742                 sub("[?&]big_mirror=.*$", "", url);
1743                 sub("[?&]modtime=.*$", "", url);
1744                 sub("[?]use_mirror=.*$", "", url);
1745                 sub("[?]download$", "", url);
1746                 sub("/download$", "", url);
1747         }
1748
1749         # SF: new style urls, strip "files/" between and prepend dl.
1750         if (match(url, "^http://sourceforge.net/projects/[^/]+/files/")) {
1751                 url = substr(url, 1, RLENGTH - length("files/")) substr(url, RSTART + RLENGTH);
1752                 sub("^http://sourceforge.net/projects/", "http://downloads.sourceforge.net/project/", url);
1753         }
1754
1755         # SF unify: http://downloads.sourceforge.net/PROJECT/TARBALL
1756         # http://downloads.sourceforge.net/project/PROJECT/FILE/VERSION/%{name}-%{version}.zip
1757         if (match(url, "^http://downloads.sourceforge.net/project/[^/]+")) {
1758                 url = sprintf("http://downloads.sourceforge.net/%s/%s", substr(url, 42, RLENGTH - 41), matchstr(url, "[^/]+$"));
1759         }
1760
1761         sub("^ftp://ftp\.gnome\.org/", "http://ftp.gnome.org/", url)
1762         sub("^http://ftp\.gnome\.org/pub/gnome/", "http://ftp.gnome.org/pub/GNOME/", url)
1763
1764         # apache urls
1765         sub("^http://apache.zone-h.org/", "http://www.apache.org/dist/", url)
1766
1767         # gnu.org
1768         sub("^ftp://ftp\.gnu\.org/", "http://ftp.gnu.org/", url)
1769         sub("^http://ftp\.gnu\.org/pub/gnu/", "http://ftp.gnu.org/gnu/", url)
1770
1771         # debian.org
1772         sub("^ftp://ftp\.[^.]+\.debian\.org/", "ftp://ftp.debian.org/", url)
1773         sub("^http://ftp\.[^.]+\.debian\.org/", "ftp://ftp.debian.org/", url)
1774         sub("^ftp://ftp\.debian\.org/pub/debian/", "ftp://ftp.debian.org/debian/", url)
1775
1776         return url
1777 }
1778
1779 function demacroize(str)
1780 {
1781         if (mod_name) {
1782                 sub("%{mod_name}", mod_name, str);
1783         }
1784         if (pearname) {
1785                 sub("%{_pearname}", pearname, str);
1786         }
1787         if (pearname) {
1788                 sub("%{pearname}", pearname, str);
1789         }
1790         if (name) {
1791                 sub("%{name}", name, str);
1792         }
1793         if (version) {
1794                 sub("%{version}", version, str);
1795         }
1796         if (_beta) {
1797                 sub("%{_beta}", _beta, str);
1798         }
1799         if (_rc) {
1800                 sub("%{_rc}", _rc, str);
1801         }
1802         if (_pre) {
1803                 sub("%{_pre}", _pre, str);
1804         }
1805         if (_snap) {
1806                 sub("%{_snap}", _snap, str);
1807         }
1808         if (subver) {
1809                 sub("%{subver}", subver, str);
1810         }
1811         return str;
1812 }
1813
1814 function kill_preamble_macros()
1815 {
1816         if ($1 ~ /^Obsoletes:/) {
1817                 # NB! assigning $2 a value breaks tabbing
1818                 $2 = demacroize($2);
1819         }
1820         if ($1 ~ /^URL:/) {
1821                 # NB! assigning $2 a value breaks tabbing
1822                 $2 = demacroize($2);
1823                 $2 = unify_url($2)
1824         }
1825
1826         # fedora extras
1827         if (/%{\?FE_USERADD_REQ}/) {
1828                 $0 = "";
1829                 print "BuildRequires:   rpmbuild(macros) >= 1.202"
1830                 print "Provides:        user(xxx)"
1831                 print "Requires(postun):        /usr/sbin/userdel"
1832                 print "Requires(pre):  /bin/id"
1833                 print "Requires(pre):  /usr/sbin/useradd"
1834         }
1835 }
1836
1837 function get_epoch(pkg, ver,    epoch)
1838 {
1839         return
1840 # should parse the BR lines more adequately:
1841 #       freetype = 2.0.0 -> correct
1842 #       freetype = 2.1.9 -> with epoch 1, as epoch 1 was added in 2.1.7
1843
1844         shell = "grep -o '^" pkg ":[^:]\+' ../PLD-doc/BuildRequires.txt | awk '{print $NF}'";
1845         shell | getline epoch;
1846         return epoch;
1847 }
1848
1849 function format_requires(tag, value,    n, p, i, deps, ndeps) {
1850         # skip any formatting for commented out items or some weird macros
1851         if (/^#/ || /%\(/) {
1852                 return tag "\t" value
1853         }
1854         n = split(value, p, / *,? */);
1855         for (i = 1; i <= n; i++) {
1856                 if (p[i+1] ~ /[<=>]/) {
1857                         # add epoch if the version doesn't have it but BuildRequires.txt has
1858                         if (p[i] ~ /^[a-z]/ && p[i+2] !~ /^[0-9]+:/) {
1859                                 epoch = get_epoch(p[i], p[i+2])
1860                                 if (epoch) {
1861                                         p[i+2] = epoch ":" p[i+2];
1862                                 }
1863                         }
1864                         deps[ndeps++] = p[i] " " p[i+1] " " p[i+2];
1865                         i += 2;
1866                 } else {
1867                         deps[ndeps++] = p[i];
1868                 }
1869         }
1870         s = ""
1871         for (i in deps) {
1872                 s = s sprintf("%s\t%s\n", tag, deps[i]);
1873         }
1874         return substr(s, 1, length(s)-1);
1875 }
1876
1877 function use_tabs()
1878 {
1879         # reverse vim: ts=4 sw=4 et
1880         gsub(/    /, "\t");
1881 }
1882
1883 function add_br(br)
1884 {
1885         BR[BR_count++] = br
1886 }
1887
1888 # Load rpm macros
1889 # you should update the list also in adapter when making changes here
1890 function import_rpm_macros() {
1891         # File with rpm groups
1892         topdir = ENVIRON["_topdir"]
1893
1894         if (!topdir) {
1895                 print "adapter.awk should not not be invoked directly, but via adapter script" > "/dev/stderr"
1896                 do_not_touch_anything = 1
1897                 exit(rc = 1);
1898         }
1899
1900         # update this version dep each time some new macro export is added
1901         if (!ENVIRON["ADAPTER_REVISION"] || ENVIRON["ADAPTER_REVISION"] < 1.47) {
1902                 print "adapter shell script is outdated, please cvs up it" > "/dev/stderr"
1903                 do_not_touch_anything = 1
1904                 exit(rc = 1);
1905         }
1906
1907         # get cvsaddress for changelog section
1908         # using rpm macros as too lazy to add ~/.adapterrc parsing support.
1909         _cvsmaildomain = ENVIRON["_cvsmaildomain"]
1910         _cvsmailfeedback = ENVIRON["_cvsmailfeedback"]
1911
1912         prefix = ENVIRON["_prefix"]
1913         bindir = ENVIRON["_bindir"]
1914         sbindir = ENVIRON["_sbindir"]
1915         libdir = ENVIRON["_libdir"]
1916         sysconfdir = ENVIRON["_sysconfdir"]
1917         datadir = ENVIRON["_datadir"]
1918         includedir = ENVIRON["_includedir"]
1919         mandir = ENVIRON["_mandir"]
1920         infodir = ENVIRON["_infodir"]
1921         examplesdir = ENVIRON["_examplesdir"]
1922         docdir = ENVIRON["_defaultdocdir"]
1923         kdedocdir = ENVIRON["_kdedocdir"]
1924         gtkdocdir = ENVIRON["_gtkdocdir"]
1925         desktopdir = ENVIRON["_desktopdir"]
1926         pixmapsdir = ENVIRON["_pixmapsdir"]
1927         javadir = ENVIRON["_javadir"]
1928         pkgconfigdir = ENVIRON["_pkgconfigdir"]
1929         npkgconfigdir = ENVIRON["_npkgconfigdir"]
1930
1931         perl_sitearch = ENVIRON["perl_sitearch"]
1932         perl_archlib = ENVIRON["perl_archlib"]
1933         perl_privlib = ENVIRON["perl_privlib"]
1934         perl_vendorlib = ENVIRON["perl_vendorlib"]
1935         perl_vendorarch = ENVIRON["perl_vendorarch"]
1936         perl_sitelib = ENVIRON["perl_sitelib"]
1937
1938         py_sitescriptdir = ENVIRON["py_sitescriptdir"]
1939         py_sitedir = ENVIRON["py_sitedir"]
1940         py_scriptdir = ENVIRON["py_scriptdir"]
1941         py_ver = ENVIRON["py_ver"]
1942
1943         py3_sitescriptdir = ENVIRON["py3_sitescriptdir"]
1944         py3_sitedir = ENVIRON["py3_sitedir"]
1945         py3_scriptdir = ENVIRON["py3_scriptdir"]
1946         py3_ver = ENVIRON["py3_ver"]
1947
1948         ruby_archdir = ENVIRON["ruby_archdir"]
1949         ruby_ridir = ENVIRON["ruby_ridir"]
1950         ruby_rubylibdir = ENVIRON["ruby_rubylibdir"]
1951         ruby_sitearchdir = ENVIRON["ruby_sitearchdir"]
1952         ruby_sitelibdir = ENVIRON["ruby_sitelibdir"]
1953         ruby_rdocdir = ENVIRON["ruby_rdocdir"]
1954
1955         php_pear_dir = ENVIRON["php_pear_dir"]
1956         php_data_dir = ENVIRON["php_data_dir"]
1957         tmpdir = ENVIRON["tmpdir"]
1958 }
1959
1960 # php virtual deps as discussed in devel-en
1961 function replace_php_virtual_deps() {
1962         pkg = $2
1963 #       if (pkg == "php-program") {
1964 #               $0 = $1 "\t/usr/bin/php"
1965 #               return
1966 #       }
1967
1968 #       if (pkg ~ /^php-[a-z]/ && pkg !~ /^php-(pear|common|cli|devel|fcgi|cgi|dirs|program|pecl-)/) {
1969 #               sub(/^php-/, "php(", pkg);
1970 #               sub(/$/, ") # verify this correctness -- it may be wanted to use specific not virtual dep", pkg);
1971 #               $2 = pkg
1972 #       }
1973
1974         if (pkg ~/^php$/) {
1975                 $2 = "webserver(php)";
1976                 if ($4 ~ /^[0-9]:/) {
1977                         $4 = substr($4, 3);
1978                 }
1979         }
1980
1981         if (pkg ~/^php4$/) {
1982                 $2 = "webserver(php)";
1983                 if ($4 ~ /^[0-9]:/) {
1984                         $4 = substr($4, 3);
1985                 }
1986         }
1987 }
1988
1989 function replace_groupnames(group) {
1990         group = replace(group, "Amusements/Games", "Applications/Games");
1991         group = replace(group, "Amusements/Games/Strategy/Real Time", "X11/Applications/Games/Strategy");
1992         group = replace(group, "Application/Multimedia", "Applications/Multimedia");
1993         group = replace(group, "Application/System", "Applications/System");
1994         group = replace(group, "Applications/Compilers", "Development/Languages");
1995         group = replace(group, "Applications/Daemons", "Daemons");
1996         group = replace(group, "Applications/Internet", "Applications/Networking");
1997         group = replace(group, "Applications/Internet/Peer to Peer", "Applications/Networking");
1998         group = replace(group, "Applications/Productivity", "X11/Applications");
1999         group = replace(group, "Applications/Security", "Applications/System");
2000         group = replace(group, "Applications/Web", "Applications/WWW");
2001         group = replace(group, "Database", "Applications/Databases");
2002         group = replace(group, "Development/C", "Development/Libraries");
2003         group = replace(group, "Development/Code Generators", "Development");
2004         group = replace(group, "Development/Docs", "Documentation");
2005         group = replace(group, "Development/Documentation", "Documentation");
2006         group = replace(group, "Development/Java", "Development/Languages/Java");
2007         group = replace(group, "Development/Languages/C and C++", "Libraries");
2008         group = replace(group, "Development/Languages/Other", "Development/Languages");;
2009         group = replace(group, "Development/Languages/Ruby", "Development/Languages");
2010         group = replace(group, "Development/Libraries/C and C++", "Development/Libraries");
2011         group = replace(group, "Development/Libraries/Java", "Development/Languages/Java");
2012         group = replace(group, "Development/Libraries/Python", "Development/Languages/Python");
2013         group = replace(group, "Development/Libraries/TCL", "Development/Languages/Tcl");;
2014         group = replace(group, "Development/Other", "Development");
2015         group = replace(group, "Development/Python", "Development/Languages/Python");
2016         group = replace(group, "Development/Testing", "Development");
2017         group = replace(group, "Editors", "Applications/Text");
2018         group = replace(group, "Emulators", "Applications/Emulators");
2019         group = replace(group, "File tools", "Applications/File");
2020         group = replace(group, "Games", "Applications/Games");
2021         group = replace(group, "Library/Development", "Development/Libraries");
2022         group = replace(group, "Networking/Deamons", "Networking/Daemons");
2023         group = replace(group, "Networking/Mail", "Applications/Mail");
2024         group = replace(group, "Networking/Other", "Networking");
2025         group = replace(group, "Productivity/Databases/Servers", "Applications/Databases");
2026         group = replace(group, "Productivity/Multimedia/Other", "X11/Applications/Multimedia");
2027         group = replace(group, "Productivity/Networking/Web/Servers", "Networking/Daemons/HTTP");;
2028         group = replace(group, "Shells", "Applications/Shells");
2029         group = replace(group, "System Environment/Base", "Base");
2030         group = replace(group, "System Environment/Daemons", "Daemons");
2031         group = replace(group, "System Environment/Kernel", "Base/Kernel");
2032         group = replace(group, "System Environment/Libraries", "Libraries");
2033         group = replace(group, "System Tools", "Applications/System");
2034         group = replace(group, "System", "Base");
2035         group = replace(group, "System/Base", "Base");
2036         group = replace(group, "System/Kernel and hardware", "Base/Kernel");
2037         group = replace(group, "System/Libraries", "Libraries");
2038         group = replace(group, "System/Servers", "Daemons");
2039         group = replace(group, "Text Processing/Markup/HTML", "Applications/Text");
2040         group = replace(group, "Text Processing/Markup/XML", "Applications/Text");
2041         group = replace(group, "Text tools", "Applications/Text");
2042         group = replace(group, "User Interface/Desktops", "X11/Applications");
2043         group = replace(group, "Utilities/System", "Applications/System");
2044         group = replace(group, "Web/Database", "Applications/WWW");
2045         group = replace(group, "X11/GNOME", "X11/Applications");
2046         group = replace(group, "X11/GNOME/Applications", "X11/Applications");
2047         group = replace(group, "X11/GNOME/Development/Libraries", "X11/Development/Libraries");
2048         group = replace(group, "X11/Games", "X11/Applications/Games");
2049         group = replace(group, "X11/Games/Strategy", "X11/Applications/Games/Strategy");
2050         group = replace(group, "X11/Library", "X11/Libraries");
2051         group = replace(group, "X11/Utilities", "X11/Applications");
2052         group = replace(group, "X11/XFree86", "X11");
2053         group = replace(group, "X11/Xserver", "X11/Servers");
2054
2055         return group;
2056 }
2057
2058 function replace_requires() {
2059
2060         sub(/^python-setuptools-devel$/, "python-distribute", $2);
2061         sub(/^gcc-g77/, "gcc-fortran", $2);
2062
2063         # use virtual, not package name
2064         sub(/^rpm-build-macros$/, "rpmbuild(macros)", $2);
2065
2066         # bad package.xml, see http://pear.php.net/bugs/bug.php?id=17779
2067         sub(/^php-php-gtk/, "php-gtk2", $2);
2068
2069         # jpackages / fedora java packages
2070         sub(/^antlr3$/, "java-antlr3", $2);
2071         sub(/^avalon-framework$/, "java-avalon-framework", $2);
2072         sub(/^avalon-logkit$/, "java-avalon-logkit", $2);
2073         sub(/^axis$/, "java-axis", $2);
2074         sub(/^bouncycastle$/, "java-bcprov", $2);
2075         sub(/^bouncycastle-mail$/, "java-bcmail", $2);
2076         sub(/^bouncycastle-tsp$/, "java-bctsp", $2);
2077         sub(/^bsf$/, "java-bsf", $2);
2078         sub(/^dom4j$/, "java-dom4j", $2);
2079         sub(/^flute$/, "java-flute", $2);
2080         sub(/^gnu-regexp$/, "java-gnu-regexp", $2);
2081         sub(/^gnu.regexp$/, "java-gnu-regexp", $2);
2082         sub(/^hamcrest$/, "java-hamcrest", $2);
2083         sub(/^itext$/, "java-itext", $2);
2084         sub(/^jaas$/, "java(jaas)", $2);
2085         sub(/^jaf$/, "java(jaf)", $2);
2086         sub(/^jakarta-ant$/, "ant", $2);
2087         sub(/^jakarta-commons-codec$/, "java-commons-codec", $2);
2088         sub(/^jakarta-commons-httpclient$/, "java-commons-httpclient", $2);
2089         sub(/^jakarta-commons-logging$/, "java-commons-logging", $2);
2090         sub(/^jakarta-commons-logging$/, "java-commons-logging", $2);
2091         sub(/^jakarta-log4j$/, "java-log4j", $2);
2092         sub(/^jakarta-oro$/, "java-oro", $2);
2093         sub(/^jakarta-servletapi$/, "java(servlet)", $2);
2094         sub(/^java-devel$/, "jdk", $2);
2095         sub(/^java-xerces$/, "java(jaxp_parser_impl)", $2);
2096         sub(/^java\(JSP\)$/, "java(jsp)", $2);
2097         sub(/^java\(JavaServerFaces\)$/, "java(javaserverfaces)", $2);
2098         sub(/^java\(Portlet\)$/, "java(portlet)", $2);
2099         sub(/^java\(Servlet\)$/, "java(servlet)", $2);
2100         sub(/^javamail$/, "java(javamail)", $2);
2101         sub(/^jaxp$/, "java(jaxp)", $2);
2102         sub(/^jaxp_parser_impl$/, "java(jaxp_parser_impl)", $2);
2103         sub(/^jaxp_transform_impl$/, "java(jaxp_transform_impl)", $2);
2104         sub(/^jce$/, "java(jce)", $2);
2105         sub(/^jcommon$/, "java-jcommon", $2);
2106         sub(/^jdbc-stdext$/, "java(jdbc-stdext)", $2);
2107         sub(/^jdepend$/, "java-jdepend", $2);
2108         sub(/^jfreechart$/, "java-jfreechart", $2);
2109         sub(/^jmx$/, "java(jmx)", $2);
2110         sub(/^jndi$/, "java(jndi)", $2);
2111         sub(/^jsch$/, "java-jsch", $2);
2112         sub(/^jsse$/, "java(jsse)", $2);
2113         sub(/^jta$/, "java(jta)", $2);
2114         sub(/^junit$/, "java-junit", $2);
2115         sub(/^junit4$/, "java-junit", $2);
2116         sub(/^ldapjdk$/, "ldapsdk", $2);
2117         sub(/^libbase$/, "java-libbase", $2);
2118         sub(/^libfonts$/, "java-libfonts", $2);
2119         sub(/^libformula$/, "java-libformula", $2);
2120         sub(/^liblayout$/, "java-liblayout", $2);
2121         sub(/^libloader$/, "java-libloader", $2);
2122         sub(/^librepository$/, "java-librepository", $2);
2123         sub(/^libserializer$/, "java-libserializer", $2);
2124         sub(/^log4j$/, "java-log4j", $2);
2125         sub(/^logging-log4j$/, "java-log4j", $2);
2126         sub(/^oro$/, "java-oro", $2);
2127         sub(/^pdf-renderer$/, "java-pdf-renderer", $2);
2128         sub(/^pentaho-libxml$/, "java-libxml", $2);
2129         sub(/^rhino$/, "java-rhino", $2);
2130         sub(/^sac$/, "java-sac", $2);
2131         sub(/^saxon-scripts$/, "saxon", $2);
2132         sub(/^servlet$/, "java(servlet)", $2);
2133         sub(/^uddi4j$/, "java-uddi4j", $2);
2134         sub(/^ws-jaxme$/, "java-jaxme", $2);
2135         sub(/^wsdl4j$/, "java-wsdl4j", $2);
2136         sub(/^xalan-j$/, "java-xalan", $2);
2137         sub(/^xalan-j2$/, "java-xalan", $2);
2138         sub(/^xerces-j$/, "java(jaxp_parser_impl)", $2);
2139         sub(/^xerces-j2$/, "java(jaxp_parser_impl)", $2);
2140         sub(/^xml-commons-apis$/, "java-xml-commons", $2);
2141         sub(/^xml-commons-resolver$/, "java-xml-commons-resolver", $2);
2142         sub(/^xmldb-api$/, "java-xmldb", $2);
2143         sub(/^xmldb-api-sdk$/, "java-xmldb-sdk", $2);
2144
2145         # fedora / redhat
2146         sub(/^Django$/, "python-django", $2);
2147         sub(/^GitPython$/, "python-git", $2);
2148         sub(/^PyQt4-devel$/, "python-PyQt4-devel", $2);
2149         sub(/^PyQwt-devel$/, "python-PyQwt-devel", $2);
2150         sub(/^ccid$/, "pcsc-driver-ccid", $2);
2151         sub(/^chkconfig$/, "/sbin/chkconfig", $2);
2152         sub(/^db4-devel$/, "db-devel", $2);
2153         sub(/^dbus-python$/, "python-dbus", $2);
2154         sub(/^file-devel$/, "libmagic-devel", $2);
2155         sub(/^freetype2-devel$/, "freetype-devel", $2);
2156         sub(/^fuse-devel$/, "libfuse-devel", $2);
2157         sub(/^gamin-python$/, "python-gamin", $2);
2158         sub(/^gcc-c\+\+$/, "libstdc++-devel", $2);
2159         sub(/^gnome-python2-extras$/, "python-gnome-extras", $2);
2160         sub(/^gnome-python2-gconf$/, "python-gnome-gconf", $2);
2161         sub(/^gnome-python2-gnomekeyring$/, "python-gnome-desktop-keyring", $2);
2162         sub(/^gnome-python2-gtkspell$/, "python-gnome-extras-gtkspell", $2);
2163         sub(/^gtk-sharp2-devel$/, "dotnet-gtk-sharp2-devel", $2);
2164         sub(/^gtk2$/, "gtk+2", $2);
2165         sub(/^gtk2-devel$/, "gtk+2-devel", $2);
2166         sub(/^gtk3-devel$/, "gtk+3-devel", $2);
2167         sub(/^initscripts$/, "rc-scripts", $2);
2168         sub(/^iproute$/, "iproute2", $2);
2169         sub(/^iscsi-initiator-utils$/, "open-iscsi", $2);
2170         sub(/^keyutils-libs-devel$/, "keyutils-devel", $2);
2171         sub(/^libXft-devel$/, "xorg-lib-libXft-devel", $2);
2172         sub(/^libXrandr-devel$/, "xorg-lib-libXrandr-devel", $2);
2173         sub(/^libacl-devel$/, "acl-devel", $2);
2174         sub(/^libcurl-devel$/, "curl-devel", $2);
2175         sub(/^libgudev1-devel$/, "udev-glib-devel", $2);
2176         sub(/^libsrtp-devel$/, "srtp-devel", $2);
2177         sub(/^libtdb$/, "tdb", $2);
2178         sub(/^libtdb-devel$/, "tdb-devel", $2);
2179         sub(/^libtevent$/, "tevent", $2);
2180         sub(/^libtevent-devel$/, "tevent-devel", $2);
2181         sub(/^mod_wsgi$/, "apache-mod_wsgi", $2);
2182         sub(/^notify-python$/, "python-pynotify", $2);
2183         sub(/^pcsc-lite-ccid$/, "pcsc-driver-ccid", $2);
2184         sub(/^pulseaudio-libs-devel$/, "pulseaudio-devel", $2);
2185         sub(/^pyOpenSSL$/, "python-pyOpenSSL", $2);
2186         sub(/^pyflakes$/, "python-pyflakes", $2);
2187         sub(/^pygobject2$/, "python-pygobject", $2);
2188         sub(/^pygtk2$/, "python-pygtk", $2);
2189         sub(/^pygtk2-devel$/, "python-pygtk-devel", $2);
2190         sub(/^pygtk2-libglade$/, "python-pygtk-glade", $2);
2191         sub(/^pysvn$/, "python-pysvn", $2);
2192         sub(/^pytalloc$/, "python-talloc", $2);
2193         sub(/^pytalloc-devel$/, "python-talloc-devel", $2);
2194         sub(/^python-enchant$/, "python-pyenchant", $2);
2195         sub(/^python-imaging$/, "python-PIL", $2);
2196         sub(/^python-imaging-tk$/, "python-PIL-tk", $2);
2197         sub(/^python-pygtk$/, "python-pygtk-gtk", $2);
2198         sub(/^python-recaptcha-client$/, "python-recaptcha", $2);
2199         sub(/^python-twisted-core$/, "python-TwistedCore", $2);
2200         sub(/^python-twisted-core$/, "python-TwistedCore", $2);
2201         sub(/^python-twisted-names$/, "python-TwistedNames", $2);
2202         sub(/^python2-devel$/, "python-devel", $2);
2203         sub(/^pytz$/, "python-pytz", $2);
2204         sub(/^qt4-devel$/, "qt4-build", $2);
2205         sub(/^qt4-webkit-devel$/, "QtWebKit-devel", $2);
2206         sub(/^qtlockedfile-devel$/, "QtLockedFile-devel", $2);
2207         sub(/^qtsingleapplication-devel$/, "QtSingleApplication-devel", $2);
2208         sub(/^rpm-python$/, "python-rpm", $2);
2209         sub(/^sip-devel$/, "python-sip-devel", $2);
2210         sub(/^tftp-server$/, "tftpdaemon", $2);
2211         sub(/^tkinter$/, "python-tkinter", $2);
2212         sub(/^urw-fonts$/, "fonts-Type1-urw", $2);
2213         sub(/^xapian-bindings-python$/, "python-xapian", $2);
2214         sub(/^xorg-x11-server-sdk$/, "xorg-xserver-server-devel", $2);
2215
2216         # mandriva
2217         sub(/^python-gobject-devel$/, "python-pygobject-devel", $2);
2218         sub(/^python-pyrex$/, "python-Pyrex", $2);
2219         sub(/^webkitgtk-devel$/, "gtk-webkit-devel", $2);
2220         sub(/^python-curl$/, "python-pycurl", $2);
2221         sub(/^python-webkitgtk$/, "python-pywebkitgtk", $2);
2222         sub(/^pygtk2.0$/, "python-pygtk-gtk", $2);
2223         sub(/^gnome-python-gconf$/, "python-gnome-gconf", $2);
2224
2225         # debian / ubuntu
2226         sub(/^blkid-dev$/, "libblkid-devel", $2);
2227         sub(/^ext2fs-dev$/, "e2fsprogs-devel", $2);
2228         sub(/^libao-dev$/, "libao-devel", $2);
2229         sub(/^libboost-filesystem[0-9.]+-dev$/, "boost-devel", $2);
2230         sub(/^libboost-program-options[0-9.]+-dev$/, "boost-devel", $2);
2231         sub(/^libboost-regex[0-9.]+-dev$/, "boost-devel", $2);
2232         sub(/^libboost-thread[0-9.]+-dev$/, "boost-devel", $2);
2233         sub(/^libcurl4-openssl-dev$/, "curl-devel", $2);
2234         sub(/^libdnet-dev$/, "libdnet-devel", $2);
2235         sub(/^libesd0-dev$/, "esound-devel", $2);
2236         sub(/^libfishsound1-dev$/, "libfishsound-devel", $2);
2237         sub(/^libgconf2-dev$/, "GConf2-devel", $2);
2238         sub(/^libgl1-mesa-dev$/, "OpenGL-devel", $2);
2239         sub(/^libgl1-mesa-dri$/, "OpenGL", $2);
2240         sub(/^libglib2.0-dev$/, "glib2-devel", $2);
2241         sub(/^libglu1-mesa-dev$/, "OpenGL-GLU-devel", $2);
2242         sub(/^libgtk2.0-dev$/, "gtk+2-devel", $2);
2243         sub(/^libhunspell-dev$/, "hunspell-devel", $2);
2244         sub(/^libmcrypt-dev$/, "libmcrypt-devel", $2);
2245         sub(/^libmhash-dev$/, "mhash-devel", $2);
2246         sub(/^liboggz1-dev$/, "libggz-devel", $2);
2247         sub(/^libpango1.0-dev$/, "pango-devel", $2);
2248         sub(/^libqt4-dev$/, "qt4-build", $2);
2249         sub(/^libshout3-dev$/, "libshout-devel", $2);
2250         sub(/^libslp-dev$/, "openslp-devel", $2);
2251         sub(/^libsndfile1-dev$/, "libsndfile-devel", $2);
2252         sub(/^libspeex-dev$/, "speex-devel", $2);
2253         sub(/^libssl-dev$/, "openssl-devel", $2);
2254         sub(/^libvorbis-dev$/, "libvorbis-devel", $2);
2255         sub(/^libxslt1-dev$/, "libxslt-devel", $2);
2256         sub(/^libxss-dev$/, "xorg-lib-libXScrnSaver-devel", $2);
2257         sub(/^mesa-common-dev$/, "OpenGL-devel", $2);
2258         sub(/^libudev$/, "udev-libs", $2);
2259         sub(/^tcp_wrappers-devel$/, "libwrap-devel", $2);
2260         sub(/^vala-tools$/, "vala", $2);
2261         sub(/^vala-devel$/, "vala", $2);
2262
2263         # altlinux
2264         sub(/^libgit-devel$/, "git-core-devel", $2);
2265         sub(/^libncurses-devel$/, "ncurses-devel", $2);
2266         sub(/^libncursesxx-devel$/, "ncurses-c++-devel", $2);
2267         sub(/^libpcre-devel$/, "pcre-devel", $2);
2268         sub(/^libssl-devel$/, "openssl-devel", $2);
2269
2270         # suse
2271         sub(/^alsa-devel$/, "alsa-lib-devel", $2);
2272         sub(/^gtk-sharp2$/, "dotnet-gtk-sharp2", $2);
2273         sub(/^gtkmm2-devel$/, "gtkmm-devel", $2);
2274         sub(/^libexpat-devel$/, "expat-devel", $2);
2275         sub(/^libffmpeg-devel$/, "ffmpeg-devel", $2);
2276         sub(/^libopenssl-devel$/, "openssl-devel", $2);
2277         sub(/^libpulse-devel$/, "pulseaudio-devel", $2);
2278         sub(/^monodoc-core$/, "mono-monodoc", $2);
2279         sub(/^python-gtk$/, "python-pygtk-gtk", $2);
2280
2281         replace_php_virtual_deps()
2282 }
2283
2284 # vim:ts=4:sw=4
This page took 0.450004 seconds and 3 git commands to generate.