#!/bin/awk -f
#
# This is adapter v0.27. Adapter adapts .spec files for PLD Linux.
+# $Id$
#
-# Copyright (C) 1999-2005 PLD-Team <feedback@pld-linux.org>
+# Copyright (C) 1999-2006 PLD-Team <feedback@pld-linux.org>
# Authors:
# Micha³ Kuratczyk <kura@pld.org.pl>
# Sebastian Zagrodzki <s.zagrodzki@mimuw.edu.pl>
# - desc wrapping is totally fucked up on global.spec,1.25, dosemu.spec,1.115-
BEGIN {
- RPM_SECTIONS = "package|build|changelog|clean|description|install|post|posttrans|postun|pre|prep|pretrans|preun|triggerin|triggerpostun|triggerun"
+ 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|License|Group|URL|BuildArch|BuildRoot|Obsoletes|Conflicts|Provides|ExclusiveArch|ExcludeArch|PreReq|(Build)?Requires)"
+ 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
"rpm --eval %_sourcedir" | getline groups_file
groups_file = groups_file "/rpm.groups"
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"
"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_sitelib" | getline perl_sitelib
"rpm --eval %py_sitescriptdir" | getline py_sitescriptdir
+ "rpm --eval %py_sitedir" | getline py_sitedir
+ "rpm --eval %py_scriptdir " | getline py_scriptdir
+ "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.
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);
}
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.
bindir = $3
if ($2 ~ /_sbindir/)
sbindir = $3
- if ($2 ~ /_libdir/)
- libdir = $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 = $3
}
}
- if ($2 ~ /_datadir/)
- datadir = $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/)
_beta = $3
if ($2 ~ /^_rc$/)
_rc = $3
+ if ($2 ~ /^_pre$/)
+ _pre = $3
if ($2 ~ /^_snap$/)
_snap = $3
if ($2 ~ /^mod_name$/)
mod_name = $3
+ sub(/[ \t]+$/, "");
# do nothing further, otherwise adapter thinks we're at preamble
print
next
#########
/^%prep/, (!/^%prep/ && $0 ~ SECTIONS) {
preamble = 0
+ did_prep = 1
use_macros()
if (_rc) {
$0 = fixedsub(_rc, "%{_rc}", $0);
}
+ if (_pre) {
+ $0 = fixedsub(_pre, "%{_pre}", $0);
+ }
if (_snap) {
$0 = fixedsub(_snap, "%{_snap}", $0);
}
/^%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")
$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("libtoolize -c -f --automake", "%{__libtoolize}", $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}");
did_clean = 1
# prevent next section header like "%post -p /sbin/ldconfig" being adapterized
- if (!/^%/) {
+ if (!/^%post/) {
use_macros()
}
}
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
did_rmroot=1
}
+ if (tmpdir) {
+ buildroot = tmpdir "/" name "-" version "-root-" ENVIRON["USER"]
+ gsub(buildroot, "$RPM_BUILD_ROOT")
+ }
+
use_macros()
# 'install -d' instead 'mkdir -p'
if ($1 ~ /chmod/ && $2 ~ /644/)
next
- # foreign rpms
- $0 = fixedsub("%buildroot", "$RPM_BUILD_ROOT", $0)
- $0 = fixedsub("%{buildroot}", "$RPM_BUILD_ROOT", $0)
-
# atrpms
$0 = fixedsub("%perl_makeinstall", "%{__make} pure_install \\\n\tDESTDIR=$RPM_BUILD_ROOT", $0);
}
##########
/^%files/, (!/^%files/ && $0 ~ SECTIONS) {
preamble = 0
+ did_files = 1
if ($0 ~ /^%files/)
defattr = 1
/^%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/, (!/^%post/ && $0 ~ SECTIONS) {
}
/^%preun/, (!/^%preun/ && $0 ~ SECTIONS) {
preamble = 0
+ use_script_macros()
}
/^%postun/, (!/^%postun/ && $0 ~ SECTIONS) {
preamble = 0
+ use_script_macros()
}
/^%triggerin/, (!/^%triggerin/ && $0 ~ SECTIONS) {
preamble = 0
+ use_script_macros()
}
/^%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()
}
#############
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(/^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
print "######\t\t" "Unknown group!"
close(groups_file)
+ did_groups = 1
}
if (field ~ /prereq:/) {
- sub(/PreReq:/, "Requires:", $1);
+ sub(/Pre[Rr]eq:/, "Requires:", $1);
}
# split (build)requires, obsoletes on commas
- if (field ~ /(obsoletes|requires):/ && NF > 2) {
+ 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);
+ }
+
# obsolete/unwanted tags
- if (field ~ /packager:|distribution:|docdir:|prefix:|icon:/) {
+ 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 ~ /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) {
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, /\//)
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("[?]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://.*\.dl\.sourceforge\.net/", "http://dl.sourceforge.net/", $2)
sub("^http://dl\.sourceforge\.net/sourceforge/", "http://dl.sourceforge.net/", $2)
}
}
+/^%bcond_/ {
+ # do nothing
+ print
+ next
+}
# sort BR/R!
#
# - 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 ~ /PreReq:/) {
- sub(/PreReq:/, "Requires:", $1);
+ if ($1 ~ /Pre[Rr]eq:/) {
+ sub(/Pre[Rr]eq:/, "Requires:", $1);
}
format_preamble()
# kill_preamble_macros(); # breaks tabbing
next;
}
-/^%bcond_/ {
- # do nothing
- print
- next
-}
-
preamble == 1 {
if (b_idx > 0) {
isort(b_key, b_idx);
for (i = 1; i <= b_idx; i++) {
- print "" b_val[b_key[i]];
+ v = b_val[b_key[i]];
+ sub(/[ \t]+$/, "", v);
+ print "" v;
}
b_idx = 0
}
print
if (name_seen == 0 && name) {
- print "Name:\t" name
+ print "Name:\t\t" name
name_seen = 1
}
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
+ }
}
# 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)
return
}
+ # leave inline sed lines alone
+ if (/(%{__sed}|sed) -i -e/) {
+ return;
+ }
+
gsub(perl_sitearch, "%{perl_sitearch}")
gsub(perl_archlib, "%{perl_archlib}")
gsub(perl_privlib, "%{perl_privlib}")
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("%{_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++) {
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}")
+ }
for (c = 1; c <= NF; c++) {
if ($c ~ sysconfdir "/{?cron.")
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")
continue;
if ($c ~ sysconfdir "/{?rpm")
continue;
- if ($c ~ sysconfdir "/{?httpd") # temp
+ if ($c ~ sysconfdir "/{?bash_completion.d")
+ continue;
+ if ($c ~ sysconfdir "/{?samba")
+ continue;
+ if ($c ~ sysconfdir "/shells")
continue;
gsub(sysconfdir, "%{_sysconfdir}", $c)
}
gsub(docdir, "%{_docdir}")
+ gsub(php_pear_dir, "%{php_pear_dir}")
for (c = 1; c <= NF; c++) {
if ($c ~ datadir "/automake")
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")
gsub("%_sbindir", "%{_sbindir}")
gsub("%_mandir", "%{_mandir}")
gsub("%name", "%{name}")
+ gsub(/%ant/, "ant")
+ 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}")
return;
}
+ sub("^%doc %{_mandir}", "%{_mandir}")
+
gsub("^%{_sbindir}", "%attr(755,root,root) %{_sbindir}")
gsub("^%{_bindir}", "%attr(755,root,root) %{_bindir}")
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)
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) {
for (i = 0; i < n; i++)
printf("%c", ch)
if (_rc) {
sub("%{_rc}", _rc, str);
}
+ if (_pre) {
+ sub("%{_pre}", _pre, str);
+ }
if (_snap) {
sub("%{_snap}", _snap, str);
}
}
}
+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
- if (/^#/) {
+ # 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 {
}
return substr(s, 1, length(s)-1);
}
+
+function use_tabs()
+{
+ # reverse vim: ts=4 sw=4 et
+ gsub(/ /, "\t");
+}