X-Git-Url: http://git.pld-linux.org/?a=blobdiff_plain;f=adapter.awk;h=0e53498f4703f3d2c8b5187fe8eb00997f28cb45;hb=026ed59b36d63bf40b16e0d9f80368d0e7d134db;hp=edcbed8de7486a4f7b77ae38c6270a36a8330f34;hpb=934f886df25492cffc7e18b62ac0be2a1a07e984;p=packages%2Frpm.git diff --git a/adapter.awk b/adapter.awk index edcbed8..0e53498 100644 --- a/adapter.awk +++ b/adapter.awk @@ -1,34 +1,61 @@ #!/bin/awk -f # -# This is adapter v0.27. Adapter adapts .spec files for PLD. +# This is adapter v0.28. Adapter adapts .spec files for PLD Linux. +# $Id$ # -# Copyright (C) 1999-2003 PLD-Team +# Copyright (C) 1999-2006 PLD-Team # Authors: # Micha³ Kuratczyk # Sebastian Zagrodzki # Tomasz K³oczko -# Artur Frysiak +# Artur Frysiak # Michal Kochanowicz +# Elan Ruusamä¤e +# +# See cvs log adapter{,.awk} for list of contributors +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# TODO +# - parse ../PLD-doc/BuildRequires.txt and setup proper BR epoches? +# - add "-nc" option to skip CVS interaction +# - sort Summary(XX) +# - sort Requires, BuildRequires +# - check if %description (lang=C) contains 8bit +# - desc wrapping is totally fucked up on global.spec,1.25, dosemu.spec,1.115- + BEGIN { - preamble = 1 # Is it part of preamble? Default - yes - boc = 4 # Beggining of %changelog - bod = 0 # Beggining of %description - tw = 70 # Descriptions width - + RPM_SECTIONS = "package|build|changelog|clean|description|install|post|posttrans|postun|pre|prep|pretrans|preun|triggerin|triggerpostun|triggerun|verifyscript|check" + SECTIONS = "^%(" RPM_SECTIONS ")" + + PREAMBLE_TAGS = "(Summary|Name|Version|Release|Epoch|License|Group|URL|BuildArch|BuildRoot|Obsoletes|Conflicts|Provides|ExclusiveArch|ExcludeArch|Pre[Rr]eq|(Build)?Requires)" + + preamble = 1 # Is it part of preamble? Default - yes + boc = 4 # Beginning of %changelog + bod = 0 # Beginning of %description + tw = 70 # Descriptions width + + b_idx = 0 # index of BR/R arrays + BR_count = 0 # number of additional BuildRequires + # If variable removed, then 1 (for removing it from export) removed["LDFLAGS"] = 0 removed["CFLAGS"] = 0 removed["CXXFLAGS"] = 0 + # get cvsaddress for changelog section + # using rpm macros as too lazy to add ~/.adapterrc parsing support. + "rpm --eval '%{?_cvsmaildomain}%{!?_cvsmaildomain:@pld-linux.org}'" | getline _cvsmaildomain + "rpm --eval '%{?_cvsmailfeedback}%{!?_cvsmailfeedback:PLD Team }'" | getline _cvsmailfeedback + # If 1, we are inside of comment block (started with /^#%/) comment_block = 0 - + # File with rpm groups "rpm --eval %_sourcedir" | getline groups_file groups_file = groups_file "/rpm.groups" - system("cd `rpm --eval %_sourcedir`; cvs up rpm.groups >/dev/null") + system("cd `rpm --eval %_sourcedir`; [ -f rpm.groups ] || cvs up rpm.groups >/dev/null") + system("[ -d ../PLD-doc ] && cd ../PLD-doc && ([ -f BuildRequires.txt ] || cvs up BuildRequires.txt >/dev/null)"); # Temporary file for changelog section changelog_file = ENVIRON["HOME"] "/tmp/adapter.changelog" @@ -43,6 +70,30 @@ BEGIN { "rpm --eval %_includedir" | getline includedir "rpm --eval %_mandir" | getline mandir "rpm --eval %_infodir" | getline infodir + "rpm --eval %_examplesdir" | getline examplesdir + "rpm --eval %_defaultdocdir" | getline docdir + "rpm --eval %_desktopdir" | getline desktopdir + "rpm --eval %_pixmapsdir" | getline pixmapsdir + + "rpm --eval %perl_sitearch" | getline perl_sitearch + "rpm --eval %perl_archlib" | getline perl_archlib + "rpm --eval %perl_privlib" | getline perl_privlib + "rpm --eval %perl_vendorlib" | getline perl_vendorlib + "rpm --eval %perl_vendorarch" | getline perl_vendorarch + "rpm --eval %perl_sitelib" | getline perl_sitelib + + "rpm --eval %py_sitescriptdir 2>/dev/null" | getline py_sitescriptdir + "rpm --eval %py_sitedir 2>/dev/null" | getline py_sitedir + "rpm --eval %py_scriptdir 2>/dev/null" | getline py_scriptdir + + "rpm --eval %ruby_archdir" | getline ruby_archdir + "rpm --eval %ruby_ridir" | getline ruby_ridir + "rpm --eval %ruby_rubylibdir" | getline ruby_rubylibdir + "rpm --eval %ruby_sitearchdir" | getline ruby_sitearchdir + "rpm --eval %ruby_sitelibdir" | getline ruby_sitelibdir + + "rpm --eval %php_pear_dir" | getline php_pear_dir + "rpm --eval %tmpdir" | getline tmpdir } # There should be a comment with CVS keywords on the first line of file. @@ -57,13 +108,49 @@ FNR == 1 { # If the latest line matched /%files/ defattr == 1 { - if ($0 !~ /defattr/) # If no %defattr - print "%defattr(644,root,root,755)" # Add it - else - $0 = "%defattr(644,root,root,755)" # Correct mistakes (if any) + if (ENVIRON["SKIP_DEFATTR"] != 1) { + if ($0 !~ /defattr/) { # If no %defattr + print "%defattr(644,root,root,755)" # Add it + } else { + $0 = "%defattr(644,root,root,755)" # Correct mistakes (if any) + } + } defattr = 0 } +function b_makekey(a, b, s) { + s = a "" b; + # kill bcond + gsub(/[#%]+{[!?]+[_a-zA-Z0-9]+:/, "", s); + + # kill commented out items + gsub(/^#[ \t]*/, "", s); + + # force order + gsub(/^Summary\(/, "11Summary(", s); + gsub(/^Summary/, "10Summary", s); + gsub(/^Name/, "2Name", s); + gsub(/^Version/, "3Version", s); + gsub(/^Release/, "4Release", s); + gsub(/^Epoch/, "5Epoch", s); + gsub(/^License/, "5License", s); + gsub(/^Group/, "6Group", s); + gsub(/^URL/, "7URL", s); + + gsub(/^BuildRequires/, "B1BuildRequires", s); + gsub(/^BuildConflicts/, "B2BuildConflicts", s); + gsub(/^Provides/, "X1Provides", s); + gsub(/^Obsoletes/, "X2Obsoletes", s); + gsub(/^Conflicts/, "X3Conflicts", s); + gsub(/^BuildArch/, "X4BuildArch", s); + gsub(/^ExclusiveArch/, "X6ExclusiveArch", s); + gsub(/^ExcludeArch/, "X7ExcludeArch", s); + gsub(/^BuildRoot/, "X9BuildRoot", s); + +# printf("%s -> %s\n", a""b, s); + return s; +} + # Comments /^#/ && (description == 0) { if (/This file does not like to be adapterized!/) { @@ -76,22 +163,110 @@ defattr == 1 { # Generally, comments are printed without touching sub(/[ \t]+$/, "") - print $0 - next + + if (/Source.*md5/) { + print $0 + next + } } -# Remove defining _applnkdir (this macro has been included in rpm-3.0.4) /^%define/ { - if ($2 == "_applnkdir") + # Remove defining _applnkdir (this macro has been included in rpm-3.0.4) + if ($2 == "_applnkdir") { next - if ($2 == "date") + } + if ($2 == "date") { date = 1 + if (did_files == 0) { + print "%files" + print "" + did_files = 1 + } + } + + # Do not add %define of _prefix if it already is. + if ($2 ~ /^_prefix/) { + sub("^"prefix, $3, bindir) + sub("^"prefix, $3, sbindir) + sub("^"prefix, $3, libdir) + sub("^"prefix, $3, datadir) + sub("^"prefix, $3, includedir) + prefix = $3 + } + + if ($2 ~ /_bindir/ && !/_sbindir/) + bindir = $3 + if ($2 ~ /_sbindir/) + sbindir = $3 + if ($2 ~ /_libdir/) { + if ($3 ~ /^%\(/) { + # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.") + libdir = "%%%%%%%%%%%%%%" + } else { + libdir = $3 + } + } + if ($2 ~ /_sysconfdir/) { + if ($3 ~ /^%\(/) { + # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.") + sysconfdir = "%%%%%%%%%%%%%%" + } else { + sysconfdir = $3 + } + } + if ($2 ~ /_datadir/) { + if ($3 ~ /^%\(/) { + # TODO: should escape for latter checks like: ($c ~ sysconfdir "/{?cron.") + datadir = "%%%%%%%%%%%%%%" + } else { + datadir = $3 + } + } + if ($2 ~ /_includedir/) + includedir = $3 + if ($2 ~ /_mandir/) + mandir = $3 + if ($2 ~ /_infodir/) + infodir = $3 + if ($2 ~ /_docdir/) + docdir = $3 + + # version related macros + if ($2 ~ /^_beta$/) + _beta = $3 + if ($2 ~ /^_rc$/) + _rc = $3 + if ($2 ~ /^_pre$/) + _pre = $3 + if ($2 ~ /^_snap$/) + _snap = $3 + + # these are used usually when adapterizing external spec + if ($2 ~ /^name$/) + name = $3 + if ($2 ~ /^version$/) + version = $3 + if ($2 ~ /^release$/) + release = $3 + + if ($2 ~ /^mod_name$/) + mod_name = $3 + + sub(/[ \t]+$/, ""); + # do nothing further, otherwise adapter thinks we're at preamble + print + next +} + +# Obsolete +/^%include.*\/usr\/lib\/rpm\/macros\.python$/ { + next } ################ # %description # ################ -/^%description/, (/^%[a-z]+/ && !/^%description/) { +/^%description/, (!/^%description/ && $0 ~ SECTIONS) { preamble = 0 if (/^%description/) { @@ -100,16 +275,8 @@ defattr == 1 { format_indent = -1 } - # Define _prefix and _mandir if it is X11 application -# if (/^%description$/ && x11 == 1) { -# print "%define\t\t_prefix\t\t/usr/X11R6" -# print "%define\t\t_mandir\t\t%{_prefix}/man\n" -# prefix = "/usr/X11R6" -# x11 = 2 -# } - # Format description - if (description == 1 && !/^%[a-z]+/ && !/^%description/) { + if (ENVIRON["SKIP_DESC"] != 1 && description == 1 && !/^%[a-z]+/ && !/^%description/) { if (/^[ \t]*$/) { format_flush(format_line, format_indent) print "" @@ -117,15 +284,15 @@ defattr == 1 { format_indent = -1 } else if (/^[ \t]*[-\*][ \t]*/) { format_flush(format_line, format_indent) - match($0, /^[ \t]*/) + match($0, /^[ \t]*/) format_indent = RLENGTH match($0, /^[ \t]*[-\*][ \t]/) format_line = substr($0, RLENGTH) - } else + } else format_line = format_line " " $0 next } - + if (/^%[a-z]+/ && (!/^%description/ || bod == 2)) { if (NF > 3 && $2 == "-l") { ll = $1 @@ -148,22 +315,58 @@ defattr == 1 { ######### # %prep # ######### -/^%prep/, (/^%[a-z]+$/ && !/^%prep/) { +/^%prep/, (!/^%prep/ && $0 ~ SECTIONS) { preamble = 0 - + did_prep = 1 + + use_macros() + # Add '-q' to %setup - if (/^%setup/ && !/-q/) + if (/^%setup/ && !/-q/) { sub(/^%setup/, "%setup -q") + } + + if (/^%setup/ && name != "setup") { + $0 = fixedsub(name, "%{name}", $0); + $0 = fixedsub(version, "%{version}", $0); + if (_beta) { + $0 = fixedsub(_beta, "%{_beta}", $0); + } + if (_rc) { + $0 = fixedsub(_rc, "%{_rc}", $0); + } + if (_pre) { + $0 = fixedsub(_pre, "%{_pre}", $0); + } + if (_snap) { + $0 = fixedsub(_snap, "%{_snap}", $0); + } + } + + if (/^%setup/ && /-n %{name}-%{version}( |$)/) { + $0 = fixedsub(" -n %{name}-%{version}", "", $0) + } + sub("^%patch ", "%patch0 "); + + # invalid in %prep + sub("^rm -rf \$RPM_BUILD_ROOT.*", ""); } ########## # %build # ########## -/^%build/, (/^%[a-z]+$/ && !/^%build/) { +/^%build/, (!/^%build/ && $0 ~ SECTIONS) { preamble = 0 + if (did_prep == 0) { + print "%prep" + print "" + did_prep = 1 + } + use_macros() - + use_tabs() + if (/^automake$/) sub(/$/, " -a -c") @@ -190,7 +393,7 @@ defattr == 1 { if (/CXXFLAGS=/) if (cflags("CXXFLAGS") == 0) next - + if (/^export /) { if (removed["LDFLAGS"]) sub(" LDFLAGS", "") @@ -202,24 +405,53 @@ defattr == 1 { if (/^export[ ]*$/) next } - + + # quote CC + if (/CC=%{__cc} /) { + sub("CC=%{__cc}", "CC=\"%{__cc}\"") + } + + # use PLD Linux macros + $0 = fixedsub("glib-gettextize --copy --force","%{__glib_gettextize}", $0); + $0 = fixedsub("intltoolize --copy --force", "%{__intltoolize}", $0); + $0 = fixedsub("automake --add-missing --copy", "%{__automake}", $0); + $0 = fixedsub("automake -a --foreign --copy", "%{__automake}", $0); + $0 = fixedsub("automake -a -c --foreign", "%{__automake}", $0); + $0 = fixedsub("libtoolize --force --automake --copy", "%{__libtoolize}", $0); + $0 = fixedsub("libtoolize -c -f --automake", "%{__libtoolize}", $0); + + sub(/^aclocal$/, "%{__aclocal}"); + sub(/^autoheader$/, "%{__autoheader}"); + sub(/^autoconf$/, "%{__autoconf}"); + sub(/^automake$/, "%{__automake}"); + + # atrpms + $0 = fixedsub("%perl_configure", "%{__perl} Makefile.PL \\\n\tINSTALLDIRS=vendor", $0); + $0 = fixedsub("%perl_makecheck", "%{?with_tests:%{__make} test}", $0); } ########## # %clean # ########## -/^%clean/, (/^%[a-z]+$/ && !/^%clean/) { +/^%clean/, (!/^%clean/ && $0 ~ SECTIONS) { did_clean = 1 + + use_macros() } ############ # %install # ############ -/^%install/, (/^%[a-z]+$/ && !/^%install/) { - +/^%install/, (!/^%install/ && $0 ~ SECTIONS) { + preamble = 0 - - if (/^[ \t]*rm([ \t]+-[rf]+)*[ \t]+\${?RPM_BUILD_ROOT}?/ && did_rmroot==0) { + + # foreign rpms + sub("^%{__rm} -rf %{buildroot}", "rm -rf $RPM_BUILD_ROOT") + sub("%buildroot", "$RPM_BUILD_ROOT"); + sub("%{buildroot}", "$RPM_BUILD_ROOT"); + + if (/^[ \t]*rm([ \t]+-[rf]+)*[ \t]+(\${?RPM_BUILD_ROOT}?|%{?buildroot}?)/ && did_rmroot==0) { did_rmroot=1 print "rm -rf $RPM_BUILD_ROOT" next @@ -229,53 +461,68 @@ defattr == 1 { print "rm -rf $RPM_BUILD_ROOT" did_rmroot=1 } - + + if (tmpdir) { + buildroot = tmpdir "/" name "-" version "-root-" ENVIRON["USER"] + gsub(buildroot, "$RPM_BUILD_ROOT") + } + + if (!/%{_lib}/) { + sub("\$RPM_BUILD_ROOT/%", "$RPM_BUILD_ROOT%") + } + use_macros() - + # 'install -d' instead 'mkdir -p' if (/mkdir -p/) sub(/mkdir -p/, "install -d") - + + # cp -a already implies cp -r + sub(/^cp -ar/, "cp -a") + # No '-u root' or '-g root' for 'install' if (/^install/ && /-[ug][ \t]*root/) gsub(/-[ug][ \t]*root /, "") - - if (/^install/ && /-m[ \t]*644/) - gsub(/-m[ \t]*644 /, "") - + + if (/^install/ && /-m[ \t]*[0-9]+/) + gsub(/-m[ \t]*[0-9]+ /, "") + # No lines contain 'chown' or 'chgrp' if owner/group is 'root' if (($1 ~ /chown/ && $2 ~ /root\.root/) || ($1 ~ /chgrp/ && $2 ~ /root/)) next - + # No lines contain 'chmod' if it sets the modes to '644' if ($1 ~ /chmod/ && $2 ~ /644/) next + + # atrpms + $0 = fixedsub("%perl_makeinstall", "%{__make} pure_install \\\n\tDESTDIR=$RPM_BUILD_ROOT", $0); } ########## # %files # ########## -/^%files/, (/^%[a-z \-]+$/ && !/^%files/) { +/^%files/, (!/^%files/ && $0 ~ SECTIONS) { preamble = 0 - + did_files = 1 + if ($0 ~ /^%files/) defattr = 1 - - use_macros() + use_files_macros() } ############## # %changelog # ############## -/^%changelog/, (/^%[a-z]+$/ && !/^%changelog/) { +/^%changelog/, (!/^%changelog/ && $0 ~ SECTIONS) { preamble = 0 has_changelog = 1 skip = 0 # There should be some CVS keywords on the first line of %changelog. if (boc == 3) { - if (!/PLD Team/) - print "* %{date} PLD Team " > changelog_file + if ($0 !~ _cvsmailfeedback) + print "* %{date} " _cvsmailfeedback > changelog_file else skip = 1 boc = 2 @@ -283,7 +530,7 @@ defattr == 1 { if (boc == 2 && !skip) { if (!/All persons listed below/) { printf "All persons listed below can be reached at " > changelog_file - print "@pld-linux.org\n" > changelog_file + print "" _cvsmaildomain "\n" > changelog_file } else skip = 1 boc = 1 @@ -316,17 +563,62 @@ defattr == 1 { ########### # SCRIPTS # ########### -/^%pre/, (/^%[a-z]+$/ && !/^%pre/) { +/^%pre/, (!/^%pre/ && $0 ~ SECTIONS) { preamble = 0 + + if (gsub("/usr/sbin/useradd", "%useradd")) { + sub(" 2> /dev/null \|\| :", ""); + sub(" >/dev/null 2>&1 \|\|:", ""); + } + + # %useradd and %groupadd may not be wrapped + if (/%(useradd|groupadd).*\\$/) { + a = $0; getline; + sub(/^[\s\t]*/, ""); + $0 = substr(a, 1, length(a) - 1) $0; + } + use_script_macros() } -/^%post/, (/^%[a-z]+$/ && !/^%post/) { + +/^%post/, (!/^%post/ && $0 ~ SECTIONS) { + preamble = 0 + use_macros() +} +/^%preun/, (!/^%preun/ && $0 ~ SECTIONS) { + preamble = 0 + use_script_macros() +} +/^%postun/, (!/^%postun/ && $0 ~ SECTIONS) { preamble = 0 + use_script_macros() } -/^%preun/, (/^%[a-z]+$/ && !/^%preun/) { +/^%triggerin/, (!/^%triggerin/ && $0 ~ SECTIONS) { preamble = 0 + use_script_macros() } -/^%postun/, (/^%[a-z]+$/ && !/^%postun/) { +/^%triggerun/, (!/^%triggerun/ && $0 ~ SECTIONS) { preamble = 0 + use_script_macros() +} +/^%triggerpostun/, (!/^%triggerpostun/ && $0 ~ SECTIONS) { + preamble = 0 + use_script_macros() +} +/^%pretrans/, (!/^%pretrans/ && $0 ~ SECTIONS) { + preamble = 0 + use_script_macros() +} +/^%posttrans/, (!/^%posttrans/ && $0 ~ SECTIONS) { + preamble = 0 + use_script_macros() +} +/^%verifyscript/, (!/^%verifyscript/ && $0 ~ SECTIONS) { + preamble = 0 + use_script_macros() +} +/^%check/, (!/^%check/ && $0 ~ SECTIONS) { + preamble = 0 + use_script_macros() } ############# @@ -336,68 +628,197 @@ preamble == 1 { # There should not be a space after the name of field # and before the colon. sub(/[ \t]*:/, ":") - + + if (/^%perl_module_wo_prefix/) { + name = $2 + version = $3 + release = "0." fixedsub(".%{disttag}.at", "", $4) + } + field = tolower($1) fieldnlower = $1 + if (field ~ /summary:/ && !/etc\.$/) { + sub(/\.$/, "", $0); + } if (field ~ /group(\([^)]+\)):/) next if (field ~ /group:/) { format_preamble() - sub(/^Utilities\//,"Applications/",$2) - sub(/^Games/,"Applications/Games",$2) - sub(/^X11\/Games/,"X11/Applications/Games",$2) - sub(/^X11\/GNOME\/Development\/Libraries/,"X11/Development/Libraries",$2) - sub(/^X11\/GNOME\/Applications/,"X11/Applications",$2) - sub(/^X11\/GNOME/,"X11/Applications",$2) - sub(/^X11\/Utilities/,"X11/Applications",$2) - sub(/^X11\/Games\/Strategy/,"X11/Applications/Games/Strategy",$2) - sub(/^Shells/,"Applications/Shells",$2) - - sub(/^[^ \t]*[ \t]*/,"") - Grupa = $0 - - print "Group:\t\t" Grupa - if (Grupa ~ /^X11/ && x11 == 0) # Is it X11 application? - x11 = 1 - - byl_plik_z_grupami = 0 + group = $0; + sub(/^[^ \t]*[ \t]*/, "", group); + + sub(/^Utilities\//,"Applications/", group) + sub(/^Games/,"Applications/Games", group) + sub(/^X11\/Games/,"X11/Applications/Games", group) + sub(/^X11\/GNOME\/Development\/Libraries/,"X11/Development/Libraries", group) + sub(/^X11\/GNOME\/Applications/,"X11/Applications", group) + sub(/^X11\/GNOME/,"X11/Applications", group) + sub(/^X11\/Utilities/,"X11/Applications", group) + sub(/^X11\/Games\/Strategy/,"X11/Applications/Games/Strategy", group) + sub(/^X11\/Library/,"X11/Libraries", group) + sub(/^Shells/,"Applications/Shells", group) + sub(/^System Environment\/Libraries$/, "Libraries", group) + sub(/^Library\/Development$/, "Development/Libraries", group) + sub(/^System Environment\/Daemons$/, "Daemons", group) + sub(/^Applications\/Internet$/, "Applications/Networking", group) + sub(/^Applications\/Daemons$/, "Daemons", group) + sub(/^Application\/Multimedia$/, "Applications/Multimedia", group) + sub(/^System\/Servers$/, "Daemons", group) + sub(/^X11\/Xserver$/, "X11/Servers", group) + sub(/^X11\/XFree86/, "X11", group) + sub(/^Applications\/Compilers$/, "Development/Languages", group) + sub(/^Applications\/Internet\/Peer to Peer/, "Applications/Networking", group) + sub(/^Networking\/Deamons$/, "Networking/Daemons", group) + sub(/^Development\/Docs$/, "Documentation", group) + sub(/^Development\/Documentation$/, "Documentation", group) + sub(/^System Environment\/Kernel$/, "Base/Kernel", group) + sub(/^Development\/Libraries\/Java$/, "Development/Languages/Java", group) + sub(/^Development\/Java/, "Development/Languages/Java", group) + sub(/^Development\/Testing$/, "Development", group) + sub(/^Text Processing\/Markup\/HTML$/, "Applications/Text", group) + sub(/^Text Processing\/Markup\/XML$/, "Applications/Text", group) + sub(/^Web\/Database$/, "Applications/WWW", group) + sub(/^System Environment\/Base$/, "Base", group) + + $0 = "Group:\t\t" group + + if (group ~ /^X11/ && x11 == 0) # Is it X11 application? + x11 = 1 + + byl_plik_z_groupmi = 0 byl_opis_grupy = 0 while ((getline linia_grup < groups_file) > 0) { - byl_plik_z_grupami = 1 - if (linia_grup == Grupa) { + byl_plik_z_groupmi = 1 + if (linia_grup == group) { byl_opis_grupy = 1 break } } - if (!byl_plik_z_grupami) + if (!byl_plik_z_groupmi) print "######\t\t" groups_file ": no such file" else if (!byl_opis_grupy) print "######\t\t" "Unknown group!" - + close(groups_file) - next + did_groups = 1 } - - if (field ~ /packager:|distribution:|docdir:|prefix:/) + + if (field ~ /prereq:/) { + sub(/Pre[Rr]eq:/, "Requires:", $1); + } + + # split (build)requires, obsoletes on commas + if (field ~ /(obsoletes|requires|provides|conflicts):/ && NF > 2) { + value = substr($0, index($0, $2)); + $0 = format_requires($1, value); + } + + # BR: tar (and others) is to common (rpm-build requires it) + if (field ~ /^buildrequires:/) { + l = substr($0, index($0, $2)); + if (l == "awk" || + l == "binutils" || + l == "bzip2" || + l == "cpio" || + l == "diffutils" || + l == "elfutils" || + l == "fileutils" || + l == "findutils" || + l == "glibc-devel" || + l == "grep" || + l == "gzip" || + l == "make" || + l == "patch" || + l == "sed" || + l == "sh-utils" || + l == "tar" || + l == "textutils") { + next + } + + # perhaps we have common known name? + + # jpackages + sub(/^java-devel$/, "jdk", $2); + sub(/^log4j$/, "jakarta-log4j", $2); + sub(/^oro$/, "jakarta-oro", $2); + sub(/^xerces-j2$/, "xerces-j", $2); + sub(/^ant-junit$/, "jakarta-ant", $2); + sub(/^ldapjdk$/, "ldapsdk", $2); + sub(/^saxon-scripts$/, "saxon", $2); + + replace_php_virtual_deps(); + } + + if (field ~ /^requires:/) { + replace_php_virtual_deps(); + } + + + # obsolete/unwanted tags + if (field ~ /vendor:|packager:|distribution:|docdir:|prefix:|icon:|author:|author-email:|metadata-version:/) { next - - if (field ~ /buildroot:/) + } + + if (field ~ /buildroot:/) { $0 = $1 "%{tmpdir}/%{name}-%{version}-root-%(id -u -n)" + did_build_root = 1 + } # Use "License" instead of "Copyright" if it is (L)GPL or BSD - if (field ~ /copyright:/ && $2 ~ /GPL|BSD/) + if (field ~ /copyright:/ && $2 ~ /GPL|BSD/) { $1 = "License:" - - if (field ~ /name:/) + } + + if (field ~ /license:/) { + l = substr($0, index($0, $2)); + if (l == "Python Software Foundation License") { + l = "PSF" + } + $0 = "License:\t" l; + } + + + if (field ~ /name:/) { + if ($2 == "%{name}" && name) { + $2 = name + } name = $2 + name_seen = 1; + } - if (field ~ /version:/) + if (field ~ /version:/) { + if ($2 == "%{version}" && version) { + $2 = version + } version = $2 + version_seen = 1; + } + + if (field ~ /release:/) { + if ($2 == "%{release}" && release) { + $2 = release + } + sub(/%atrelease /, "0.", $0) + release = $2 + release_seen = 1; + } + if (field ~ /serial:/) $1 = "Epoch:" + if (field ~ /home-page:/) + $1 = "URL:" + + # proper caps + if (field ~ /^url:$/) + $1 = "URL:" + + if (field ~ /^description:$/) + $1 = "\n%description\n" + # Use %{name} and %{version} in the filenames in "Source:" if (field ~ /^source/ || field ~ /patch/) { n = split($2, url, /\//) @@ -430,65 +851,159 @@ preamble == 1 { sub(/\.pamd$/,"",url[n]) } + # allow %{name} only in last url component + s = "" + for (i = 1; i <= n; i++) { + url[i] = fixedsub("%{name}", name, url[i]) + if (s) { + s = s "/" url[i] + } else { + s = url[i] + } + } + $2 = s url[n+1] + filename = url[n] - url[n] = fixedsub(name, "%{name}", url[n]) - if (field ~ /source/) - url[n] = fixedsub(version, "%{version}", url[n]) + if (name) { + url[n] = fixedsub(name, "%{name}", url[n]) + } + if (field ~ /source/) { + if (version) { + url[n] = fixedsub(version, "%{version}", url[n]) + } + if (_beta) { + url[n] = fixedsub(_beta, "%{_beta}", url[n]) + } + if (_rc) { + url[n] = fixedsub(_rc, "%{_rc}", url[n]) + } + if (_pre) { + url[n] = fixedsub(_pre, "%{_pre}", url[n]) + } + if (_snap) { + url[n] = fixedsub(_snap, "%{_snap}", url[n]) + } + } + # assigning to $2 kills preamble formatting $2 = fixedsub(filename, url[n], $2) + + # sourceforge urls + sub("[?&]big_mirror=.*$", "", $2); + sub("[?&]modtime=.*$", "", $2); + + sub("[?]use_mirror=.*$", "", $2); + sub("[?]download$", "", $2); + + sub("^http://prdownloads\.sourceforge\.net/", "http://dl.sourceforge.net/", $2) + sub("^http://download\.sf\.net/", "http://dl.sourceforge.net/", $2) + sub("^http://downloads\.sourceforge\.net/", "http://dl.sourceforge.net/", $2) + + sub("^http://.*\.dl\.sourceforge\.net/", "http://dl.sourceforge.net/", $2) + sub("^http://dl\.sourceforge\.net/sourceforge/", "http://dl.sourceforge.net/", $2) + sub("^http://dl\.sf\.net/", "http://dl.sourceforge.net/", $2) } + if (field ~ /^source:/) - $1 = "Source0:" + $1 = "Source0:" - if (field ~ /patch:/) + if (field ~ /^patch:/) $1 = "Patch0:" - + + kill_preamble_macros(); format_preamble() - - if ($1 ~ /%define/) { - # Do not add %define of _prefix if it already is. - if ($2 ~ /^_prefix/) { - sub("^"prefix, $3, bindir) - sub("^"prefix, $3, sbindir) - sub("^"prefix, $3, libdir) - sub("^"prefix, $3, datadir) - sub("^"prefix, $3, includedir) - prefix = $3 - x11 = 2 - } - if ($2 ~ /_bindir/ && !/_sbindir/) - bindir = $3 - if ($2 ~ /_sbindir/) - sbindir = $3 - if ($2 ~ /_libdir/) - libdir = $3 - if ($2 ~ /_sysconfdir/) - sysconfdir = $3 - if ($2 ~ /_datadir/) - datadir = $3 - if ($2 ~ /_includedir/) - includedir = $3 - if ($2 ~ /_mandir/) - mandir = $3 - if ($2 ~ /_infodir/) - infodir = $3 + + if (field ~ /requires/) { + # atrpms + $0 = fixedsub("%{eversion}", "%{epoch}:%{version}-%{release}", $0); } } +/^%bcond_/ { + # do nothing + print + next +} + +# sort BR/R! +# +# NOTES: +# - mixing BR/R and anything else confuses this (all will be sorted together) +# so don't do that. +# - comments leading the BR/R can not be associated, +# so don't adapterize when the BR/R are mixed with comments +ENVIRON["SKIP_SORTBR"] != 1 && preamble == 1 && $0 ~ PREAMBLE_TAGS, $0 ~ PREAMBLE_TAGS { + if ($1 ~ /Pre[Rr]eq:/) { + sub(/Pre[Rr]eq:/, "Requires:", $1); + } + format_preamble() +# kill_preamble_macros(); # breaks tabbing + + b_idx++; + l = substr($0, index($0, $2)); + b_ktmp = b_makekey($1, l); + b_key[b_idx] = b_ktmp; + b_val[b_ktmp] = $0; -# main() ;-) + next; +} + +preamble == 1 { + if (b_idx > 0) { + isort(b_key, b_idx); + for (i = 1; i <= b_idx; i++) { + v = b_val[b_key[i]]; + sub(/[ \t]+$/, "", v); + print "" v; + } + b_idx = 0 + } +} + +# main() ;-) { preamble = 1 - + sub(/[ \t]+$/, "") print + + if (name_seen == 0 && name) { + print "Name:\t\t" name + name_seen = 1 + } + + if (version_seen == 0 && version) { + print "Version:\t" version + version_seen = 1 + } + + if (release_seen == 0 && release) { + print "Release:\t" release + release_seen = 1 + } + + if (did_build_root == 0) { +# print "BuildRoot:\t%{tmpdir}/%{name}-%{version}-root-%(id -u -n)" + did_build_root = 1 + } + if (did_groups == 0) { +# print "Group:\t\tunknown" + did_groups = 1 + } } END { if (do_not_touch_anything) exit 0 - + + # TODO: need to output these in proper place + if (BR_count > 0) { + for (i = 0; i <= BR_count; i++) { + print BR[i]; + } + } + close(changelog_file) while ((getline < changelog_file) > 0) print @@ -504,30 +1019,36 @@ END { print "" print "%define date\t%(echo `LC_ALL=\"C\" date +\"%a %b %d %Y\"`)" } - - if (has_changelog == 0) + + if (has_changelog == 0) { print "%changelog" + } - if (boc > 2) + if (boc > 2) { print "* %{date} PLD Team " + } if (boc > 1) { printf "All persons listed below can be reached at " print "@pld-linux.org\n" } - if (boc > 0) + if (boc > 0) { print "$" "Log:$" + } } -function fixedsub(s1,s2,t, ind) { +function fixedsub(s1,s2,t, ind) { # substitutes fixed strings (not regexps) - if (ind = index(t,s1)) - t = substr(t, 1, ind-1) s2 substr(t, ind+length(s1)) - return t + if (ind = index(t,s1)) + t = substr(t, 1, ind-1) s2 substr(t, ind+length(s1)) + return t } # There should be one or two tabs after the colon. function format_preamble() { + if (/^#/ || /^%bcond_with/) { + return; + } sub(/:[ \t]*/, ":") if (match($0, /[A-Za-z0-9(),#_ \t]+[ \t]*:[ \t]*/) == 1) { if (RLENGTH < 8) @@ -540,31 +1061,83 @@ function format_preamble() # Replace directly specified directories with macros function use_macros() { + # -m, --skip-macros, --no-macros -- skip macros subst + if (ENVIRON["SKIP_MACROS"]) { + return + } + + # leave inline sed lines alone + if (/(%{__sed}|sed) -i -e/) { + return; + } + + sub("%{_defaultdocdir}", "%{_docdir}"); + sub("%{_bindir}/perl", "%{__perl}"); + sub("%{_bindir}/python", "%{__python}"); + + gsub(infodir, "%{_infodir}") + + gsub(perl_sitearch, "%{perl_sitearch}") + gsub(perl_archlib, "%{perl_archlib}") + gsub(perl_privlib, "%{perl_privlib}") + gsub(perl_vendorlib, "%{perl_vendorlib}") + gsub(perl_vendorarch, "%{perl_vendorarch}") + gsub(perl_sitelib, "%{perl_sitelib}") + + gsub(py_sitescriptdir, "%{py_sitescriptdir}") + gsub(py_sitedir, "%{py_sitedir}") + gsub(py_scriptdir, "%{py_scriptdir}") + gsub("%{_libdir}/python2.4/site-packages", "%{py_sitedir}") + gsub("%{python_sitelib}", "%{py_sitedir}") + + gsub(ruby_archdir, "%{ruby_archdir}") + gsub(ruby_ridir, "%{ruby_ridir}") + gsub(ruby_rubylibdir, "%{ruby_rubylibdir}") + gsub(ruby_sitearchdir, "%{ruby_sitearchdir}") + gsub(ruby_sitelibdir, "%{ruby_sitelibdir}") + + gsub("%{_datadir}/applications", "%{_desktopdir}") + gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}") + gsub(bindir, "%{_bindir}") gsub("%{prefix}/bin", "%{_bindir}") - if(prefix"/bin" == bindir) + if (prefix"/bin" == bindir) gsub("%{_prefix}/bin", "%{_bindir}") for (c = 1; c <= NF; c++) { if ($c ~ sbindir "/fix-info-dir") continue; + if ($c ~ sbindir "/webapp") + continue; + if ($c ~ sbindir "/ldconfig") + continue; + if ($c ~ sbindir "/chsh") + continue; + if ($c ~ sbindir "/usermod") + continue; + if ($c ~ sbindir "/chkconfig") + continue; + if ($c ~ sbindir "/installzope(product|3package)") + continue; gsub(sbindir, "%{_sbindir}", $c) } gsub("%{prefix}/sbin", "%{_sbindir}") - if(prefix"/sbin" == sbindir) + if (prefix"/sbin" == sbindir) { gsub("%{_prefix}/sbin", "%{_sbindir}") - -# gsub(libdir, "%{_libdir}") -# gsub("%{prefix}/lib", "%{_libdir}") -# if(prefix"/lib" == libdir) -# gsub("%{_prefix}/lib", "%{_libdir}") + } for (c = 1; c <= NF; c++) { if ($c ~ sysconfdir "/{?cron.") continue; if ($c ~ sysconfdir "/{?crontab.d") continue; + if ($c ~ sysconfdir "/{?env.d") + continue; + if ($c ~ sysconfdir "/{?modprobe.(d|conf)") + continue; + if ($c ~ sysconfdir "/{?udev/rules.d") + continue; if ($c ~ sysconfdir "/{?logrotate.d") continue; if ($c ~ sysconfdir "/{?pam.d") @@ -579,22 +1152,56 @@ function use_macros() continue; if ($c ~ sysconfdir "/{?sysconfig") continue; + if ($c ~ sysconfdir "/{?shrc.d") + continue; + if ($c ~ sysconfdir "/{?certs") + continue; + if ($c ~ sysconfdir "/{?X11") + continue; + if ($c ~ sysconfdir "/{?ld.so.conf.d") + continue; + if ($c ~ sysconfdir "/{?rpm") + continue; + if ($c ~ sysconfdir "/{?bash_completion.d") + continue; + if ($c ~ sysconfdir "/{?samba") + continue; + if ($c ~ sysconfdir "/shells") + continue; gsub(sysconfdir, "%{_sysconfdir}", $c) } - gsub(datadir, "%{_datadir}") + gsub(docdir, "%{_docdir}") + gsub(php_pear_dir, "%{php_pear_dir}") + + for (c = 1; c <= NF; c++) { + if ($c ~ datadir "/automake") + continue; + if ($c ~ datadir "/unsermake") + continue; + if ($c ~ datadir "/file/magic.mime") + continue; + gsub(datadir, "%{_datadir}", $c) + } + gsub("%{prefix}/share", "%{_datadir}") - if(prefix"/share" == datadir) + if (prefix"/share" == datadir) gsub("%{_prefix}/share", "%{_datadir}") - gsub(includedir, "%{_includedir}") + # CFLAGS="-I/usr/include/ncurses is usually correct. + if (!/-I\/usr\/include/) { + gsub(includedir, "%{_includedir}") + } + gsub("%{prefix}/include", "%{_includedir}") - if(prefix"/include" == includedir) + if (prefix"/include" == includedir) { gsub("%{_prefix}/include", "%{_includedir}") + } gsub(mandir, "%{_mandir}") - if ($0 !~ "%{_datadir}/manual") + if ($0 !~ "%{_datadir}/manual") { gsub("%{_datadir}/man", "%{_mandir}") + } gsub("%{_prefix}/share/man", "%{_mandir}") gsub("%{prefix}/share/man", "%{_mandir}") gsub("%{prefix}/man", "%{_mandir}") @@ -608,35 +1215,266 @@ function use_macros() gsub("%{_datadir}/aclocal", "%{_aclocaldir}") } + gsub(examplesdir, "%{_examplesdir}") + if (prefix != "/") { - for (c = 1; c <= NF; c++) { - if ($c ~ prefix "/sbin/fix-info-dir") - continue; - gsub(prefix, "%{_prefix}", $c) + # leave --with-foo=/usr alone + if ($0 !~ "--with.*=.*" prefix) { + for (c = 1; c <= NF; c++) { + if ($c ~ prefix "/sbin/fix-info-dir") + continue; + if ($c ~ prefix "/sbin/webapp") + continue; + if ($c ~ prefix "/sbin/chsh") + continue; + if ($c ~ prefix "/sbin/usermod") + continue; + if ($c ~ prefix "/sbin/installzope(product|3package)") + continue; + if ($c ~ prefix "/share/automake") + continue; + if ($c ~ prefix "/share/unsermake") + continue; + if ($c ~ prefix "/lib/sendmail") + continue; + if ($c ~ prefix "/lib/pkgconfig") + continue; + + # CFLAGS="-I/usr..." is usually correct. + if (/-I\/usr/) + continue; + # same for LDFLAGS="-L/usr..." + if (/-L\/usr/) + continue; + + gsub(prefix, "%{_prefix}", $c) + } } gsub("%{prefix}", "%{_prefix}") } + # replace back + gsub("%{_includedir}/ncurses", "/usr/include/ncurses") + gsub("%{_includedir}/freetype", "/usr/include/freetype") + gsub("%{PACKAGE_VERSION}", "%{version}") gsub("%{PACKAGE_NAME}", "%{name}") - # we can move files between tge dirs below - if ($0 !~ "%{_applnkdir}") { - gsub("%{_datadir}/gnome/apps", "%{_applnkdir}") - gsub("%{_datadir}/applnk", "%{_applnkdir}") - } - gsub("^make$", "%{__make}") gsub("^make ", "%{__make} ") + gsub("^gcc ", "%{__cc} ") + + # mandrake specs + gsub("^%make$", "%{__make}") + gsub("^%make ", "%{__make} ") + gsub("^%makeinstall_std", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") + gsub("^%{makeinstall}", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") + gsub("^%makeinstall", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") + gsub("^%{__rm} -rf %{buildroot}", "rm -rf $RPM_BUILD_ROOT") + gsub("^%{__install}", "install") + gsub("^%{__rm}", "rm") + gsub("%optflags", "%{rpmcflags}") + gsub("%{compat_perl_vendorarch}", "%{perl_vendorarch}") + + gsub("^%{__make} install DESTDIR=\$RPM_BUILD_ROOT", "%{__make} install \\\n\tDESTDIR=$RPM_BUILD_ROOT") + gsub("^fix-info-dir$", "[ ! -x /usr/sbin/fix-info-dir ] || /usr/sbin/fix-info-dir -c %{_infodir} >/dev/null 2>\&1") + $0 = fixedsub("%buildroot", "$RPM_BUILD_ROOT", $0) + $0 = fixedsub("%{buildroot}", "$RPM_BUILD_ROOT", $0) + $0 = fixedsub("CXXFLAGS=%{rpmcflags} %configure", "CXXFLAGS=%{rpmcflags}\n%configure", $0); + + # split configure line to multiple lines + if (/%configure / && !/\\$/) { + $0 = format_configure($0); + } + + gsub("%_bindir", "%{_bindir}") + gsub("%_datadir", "%{_datadir}") + gsub("%_iconsdir", "%{_iconsdir}") + gsub("%_sbindir", "%{_sbindir}") + gsub("%_mandir", "%{_mandir}") + gsub("%name", "%{name}") + gsub(/%__rm/, "rm"); + gsub(/%__mkdir_p/, "install -d"); + gsub(/%__cp/, "cp"); + gsub(/%__ln_s/, "ln -s"); + gsub(/%__sed/, "%{__sed}"); + gsub(/%__cat/, "cat"); + gsub(/%__chmod/, "chmod"); gsub("/usr/src/linux", "%{_kernelsrcdir}") gsub("%{_prefix}/src/linux", "%{_kernelsrcdir}") + + if (/^ant /) { + sub(/^ant/, "%ant") + add_br("BuildRequires: jpackage-utils"); + add_br("BuildRequires: rpmbuild(macros) >= 1.294"); + } + } - -function use_files_macros() + +function format_configure(line, n, a, s) { + n = split(line, a, / /); + s = a[1] " \\\n"; + for (i = 2; i <= n; i++) { + s = s "\t" a[i] " \\\n" + } + return s +} + + +# insertion sort of A[1..n] +# copied from mawk manual +function isort(A,n, i,j,hold) { + for (i = 2; i <= n; i++) { + hold = A[j = i] + while (A[j-1] > hold) { + j-- ; A[j+1] = A[j] + } + A[j] = hold + } + # sentinel A[0] = "" will be created if needed +} + + +function use_files_macros( i, n, t, a) { + use_macros() + + # skip comments + if (/^#/) { + return; + } + + sub("^%doc %{_mandir}", "%{_mandir}") + gsub("^%{_sbindir}", "%attr(755,root,root) %{_sbindir}") gsub("^%{_bindir}", "%attr(755,root,root) %{_bindir}") + + # uid/gid nobody is not valid in %files + if (/%attr([^)]*nobody[^)]*)/ && !/FIXME/) { + $0 = $0 " # FIXME nobody user/group can't own files! -adapter.awk" + } + + # s[gu]id programs with globs are evil + if (/%attr\([246]...,.*\*/ && !/FIXME/) { + $0 = $0 " # FIXME no globs for suid/sgid files" + } + + # replace back + gsub("%{_sysconfdir}/cron\.d", "/etc/cron.d") + gsub("%{_sysconfdir}/crontab\.d", "/etc/crontab.d") + gsub("%{_sysconfdir}/logrotate\.d", "/etc/logrotate.d") + gsub("%{_sysconfdir}/pam\.d", "/etc/pam.d") + gsub("%{_sysconfdir}/profile\.d", "/etc/profile.d") + gsub("%{_sysconfdir}/rc\.d", "/etc/rc.d") + gsub("%{_sysconfdir}/security", "/etc/security") + gsub("%{_sysconfdir}/skel", "/etc/skel") + gsub("%{_sysconfdir}/sysconfig", "/etc/sysconfig") + gsub("%{_sysconfdir}/certs", "/etc/certs") + gsub("%{_sysconfdir}/init.d", "/etc/init.d") + + # /etc/init.d -> /etc/rc.d/init.d + if (!/^\/etc\/init\.d$/) { + gsub("/etc/init.d", "/etc/rc.d/init.d") + } + + if (/\/etc\/rc\.d\/init\.d\// && !/functions/) { + if (!/%attr.*\/etc\/rc\.d\/init\.d/) { + $0 = "%attr(754,root,root) " $0 + } + if (/^%attr.*\/etc\/rc\.d\/init\.d/ && !/^%attr\(754 *,/) { + gsub("^%attr\\(... *,", "%attr(754,"); + } + } + + if (/lib.+\.so/ && !/\.so$/ && !/^%attr.*/ && !/%exclude/) { + $0 = "%attr(755,root,root) " $0 + } + + if (/%{perl_vendorarch}.*\.so$/ && !/^%attr.*/) { + $0 = "%attr(755,root,root) " $0 + } + + # /etc/sysconfig files + # %attr(640,root,root) %config(noreplace) %verify(not size mtime md5) /etc/sysconfig/* + # attr not required, allow default 644 attr + if (!/network-scripts/ && !/%dir/ && !/\.d$/ && !/functions/ && !/\/etc\/sysconfig\/wmstyle/) { + if (/\/etc\/sysconfig\// && /%config/ && !/%config\(noreplace/) { + gsub("%config", "%config(noreplace)") + } + + if (/\/etc\/sysconfig\// && !/%config\(noreplace/) { + $NF = "%config(noreplace) " $NF + } + + if (/\/etc\/sysconfig\// && /%attr\(755/) { + gsub("^%attr\\(... *,", "%attr(640,"); + } + + if (/\/etc\/sysconfig\// && !/%verify/) { + gsub("/etc/sysconfig", "%verify(not size mtime md5) /etc/sysconfig"); + } + } + + # kill leading zeros + if (/%attr\(0[1-9]/) { + gsub("%attr\\(0", "%attr(") + } + + # kill default attrs + gsub(/%dir %attr\(755,root,root\)/, "%dir"); + if (!/%dir/) { + gsub(/%attr\(644,root,root\) /, ""); + } + + # sort %verify attrs + if (match($0, /%verify\(not([^)]+)\)/)) { + t = substr($0, RSTART, RLENGTH) + # kill commas: %verify(not,md5,size,mtime) + gsub(/,/, " ", t); + + gsub(/^%verify\(not |\)$/, "", t) + n = split(t, a, / /) + isort(a, n) + + s = "%verify(not" + for (i = 1 ; i <= n; i++) { + s = s " " a[i] + } + s = s ")" + + gsub(/%verify\(not[^)]+\)/, s) + } + + if (/%{_mandir}/) { + gsub("\.gz$", "*") + } + + # locale dir and no %lang -> bad + if (/%{_datadir}\/locale\/.*\// && !/%(dir|lang)/) { + $(NF + 1) = "# FIXME consider using %find_lang" + } + + # atrpms + $0 = fixedsub("%{perl_man1dir}", "%{_mandir}/man1", $0); + $0 = fixedsub("%{perl_man3dir}", "%{_mandir}/man3", $0); + $0 = fixedsub("%{perl_bin}", "%{_bindir}", $0); + + gsub(libdir "/pkgconfig", "%{_pkgconfigdir}"); + gsub("%{_libdir}/pkgconfig", "%{_pkgconfigdir}"); + gsub("%{_prefix}/lib/pkgconfig", "%{_pkgconfigdir}"); + + gsub("%{_datadir}/applications", "%{_desktopdir}"); + gsub("%{_datadir}/icons", "%{_iconsdir}"); + gsub("%{_datadir}/pixmaps", "%{_pixmapsdir}"); +} + +function use_script_macros() +{ + if (gsub("/sbin/service", "%service")) { + sub(" >/dev/null 2>&1 \|\|:", ""); + sub(" 2> /dev/null \|\| :", ""); + } } function fill(ch, n, i) { @@ -646,7 +1484,7 @@ function fill(ch, n, i) { function format_flush(line, indent, newline, word, first_word) { first_word = 1 - if (format_indent == -1) + if (format_indent == -1) newline = "" else newline = fill(" ", format_indent) "- " @@ -655,7 +1493,7 @@ function format_flush(line, indent, newline, word, first_word) { word = substr(line, RSTART, RLENGTH) if (length(newline) + length(word) + 1 > tw) { print newline - + if (format_indent == -1) newline = "" else @@ -668,7 +1506,7 @@ function format_flush(line, indent, newline, word, first_word) { first_word = 0 } else newline = newline " " word - + line = substr(line, RSTART + RLENGTH) } if (newline ~ /[^\t ]/) { @@ -682,9 +1520,127 @@ function cflags(var) removed[var] = 1 return 0 } - + if (!/!\?debug/) sub("\$RPM_OPT_FLAGS", "%{rpmcflags}") return 1 } +function demacroize(str) +{ + if (mod_name) { + sub("%{mod_name}", mod_name, str); + } + if (name) { + sub("%{name}", name, str); + } + if (version) { + sub("%{version}", version, str); + } + if (_beta) { + sub("%{_beta}", _beta, str); + } + if (_rc) { + sub("%{_rc}", _rc, str); + } + if (_pre) { + sub("%{_pre}", _pre, str); + } + if (_snap) { + sub("%{_snap}", _snap, str); + } + return str; +} + +function kill_preamble_macros() +{ + if ($1 ~ /^URL:/ || $1 ~ /^Obsoletes:/) { + # NB! assigning $2 a value breaks tabbing + $2 = demacroize($2); + # unify sourceforge url + sub("\.sf\.net/$", ".sourceforge.net/", $2); + } +} + +function get_epoch(pkg, ver, epoch) +{ + return +# should parse the BR lines more adequately: +# freetype = 2.0.0 -> correct +# freetype = 2.1.9 -> with epoch 1, as epoch 1 was added in 2.1.7 + + shell = "grep -o '^" pkg ":[^:]\+' ../PLD-doc/BuildRequires.txt | awk '{print $NF}'"; + shell | getline epoch; + return epoch; +} + +function format_requires(tag, value, n, p, i, deps, ndeps) { + # skip any formatting for commented out items or some weird macros + if (/^#/ || /%\(/) { + return tag "\t" value + } + n = split(value, p, / *,? */); + for (i = 1; i <= n; i++) { + if (p[i+1] ~ /[<=>]/) { + # add epoch if the version doesn't have it but BuildRequires.txt has + if (p[i] ~ /^[a-z]/ && p[i+2] !~ /^[0-9]+:/) { + epoch = get_epoch(p[i], p[i+2]) + if (epoch) { + p[i+2] = epoch ":" p[i+2]; + } + } + deps[ndeps++] = p[i] " " p[i+1] " " p[i+2]; + i += 2; + } else { + deps[ndeps++] = p[i]; + } + } + s = "" + for (i in deps) { + s = s sprintf("%s\t%s\n", tag, deps[i]); + } + return substr(s, 1, length(s)-1); +} + +function use_tabs() +{ + # reverse vim: ts=4 sw=4 et + gsub(/ /, "\t"); +} + +function add_br(br) +{ + BR[BR_count++] = br +} + +# php virtual deps as discussed in devel-en +function replace_php_virtual_deps() +{ + pkg = $2 +# if (pkg == "php-program") { +# $0 = $1 "\t/usr/bin/php" +# return +# } + + if (pkg ~ /^php-/ && pkg !~ /^php-(pear|common|cli|devel|fcgi|cgi|dirs|program|ZendOptimizer|pecl-)/) { + sub(/^php-/, "php(", pkg); + sub(/$/, ")", pkg); + $2 = pkg + } + + if (pkg ~/^php$/) { + $2 = "webserver(php)"; + if ($4 ~ /^[0-9]:/) { + $4 = substr($4, 3); + } + } + + if (pkg ~/^php4$/) { + $2 = "webserver(php)"; + if ($4 ~ /^[0-9]:/) { + $4 = substr($4, 3); + } + } +} + +# vim:ts=4:sw=4:et