]> TLD Linux GIT Repositories - packages/rpm-tld-macros.git/commitdiff
- rpm macros for TLD Linux, based on PLD rpm macros
authorMarcin Krol <hawk@tld-linux.org>
Wed, 29 Apr 2020 15:13:12 +0000 (17:13 +0200)
committerMarcin Krol <hawk@tld-linux.org>
Wed, 29 Apr 2020 15:13:12 +0000 (17:13 +0200)
39 files changed:
attr.java [new file with mode: 0644]
attr.kernel [new file with mode: 0644]
attr.php [new file with mode: 0644]
attr.ruby [new file with mode: 0644]
dokuwiki-find-lang.sh [new file with mode: 0755]
eclipse-feature.xslt [new file with mode: 0644]
find-lang.sh [new file with mode: 0755]
gem_helper.rb [new file with mode: 0755]
macros.browser-plugins [new file with mode: 0644]
macros.cacti [new file with mode: 0644]
macros.emacs [new file with mode: 0644]
macros.ghc [new file with mode: 0644]
macros.java [new file with mode: 0644]
macros.kernel [new file with mode: 0644]
macros.mimetype [new file with mode: 0644]
macros.nagios [new file with mode: 0644]
macros.openldap [new file with mode: 0644]
macros.perl [new file with mode: 0644]
macros.php [new file with mode: 0644]
macros.python [new file with mode: 0644]
macros.ruby [new file with mode: 0644]
macros.systemd [new file with mode: 0644]
macros.tcl [new file with mode: 0644]
macros.tld [new file with mode: 0644]
macros.upstart [new file with mode: 0644]
macros.webapp [new file with mode: 0644]
macros.xmms [new file with mode: 0644]
macros.xorg [new file with mode: 0644]
pydebuginfo.patch [new file with mode: 0644]
rpm-compress-doc [new file with mode: 0644]
rpm-find-spec-bcond [new file with mode: 0644]
rpm-java-requires [new file with mode: 0755]
rpm-mimetypedeps [new file with mode: 0644]
rpm-php-provides [new file with mode: 0644]
rpm-php-requires [new file with mode: 0644]
rpm-php-requires.php [new file with mode: 0644]
rpm-tld-macros.spec [new file with mode: 0644]
rubygems.rb [new file with mode: 0755]
service_generator.sh [new file with mode: 0755]

diff --git a/attr.java b/attr.java
new file mode 100644 (file)
index 0000000..a3d1191
--- /dev/null
+++ b/attr.java
@@ -0,0 +1,3 @@
+%__java_requires       env RPM_BUILD_ROOT=%{buildroot} MIN_CLASSDATAVERSION=%{?java_min_classdataversion} %{_rpmhome}/java-find-requires
+%__java_magic          ^Java .*
+%__java_path           \\.(jar|class)$
diff --git a/attr.kernel b/attr.kernel
new file mode 100644 (file)
index 0000000..1ff88f8
--- /dev/null
@@ -0,0 +1,3 @@
+%__kernel_provides     %{_rpmhome}/kmod-deps.sh --provides --modinfo %__modinfo
+#__kernel_requires     %{_rpmhome}/kmod-deps.sh --requires --modinfo %__modinfo
+%__kernel_path         ^.*/lib/modules/.*\.ko(\.gz|\.xz)?$
diff --git a/attr.php b/attr.php
new file mode 100644 (file)
index 0000000..2b739e4
--- /dev/null
+++ b/attr.php
@@ -0,0 +1,5 @@
+%__php_provides                %{_rpmhome}/php.prov
+# define 'php_req_new' in ~/.rpmmacros to use php version of req finder
+%__php_requires                env PHP_MIN_VERSION=%{?php_min_version} %{_rpmhome}/php.req%{?php_req_new:.php}
+%__php_magic           ^PHP script.*
+%__php_path            \\.php$
diff --git a/attr.ruby b/attr.ruby
new file mode 100644 (file)
index 0000000..f43d2ff
--- /dev/null
+++ b/attr.ruby
@@ -0,0 +1,4 @@
+%__ruby_provides       %{_rpmhome}/rubygems.rb --provides
+%__ruby_requires       %{_rpmhome}/rubygems.rb --requires
+%__ruby_magic          ^[rR]uby script text.*
+%__ruby_path           ^/usr/(share|lib|lib64|libx32)/(ruby|gems/specifications)/.*
diff --git a/dokuwiki-find-lang.sh b/dokuwiki-find-lang.sh
new file mode 100755 (executable)
index 0000000..8965583
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh
+PROG=${0##*/}
+if [ $# = 2 ]; then
+       # for using same syntax as rpm own find-lang
+       RPM_BUILD_ROOT=$1
+       shift
+fi
+dir=$RPM_BUILD_ROOT/usr/share/dokuwiki
+langfile=$1
+tmp=$(mktemp) || exit 1
+rc=0
+
+find $dir -type d -name lang > $tmp
+
+echo '%defattr(644,root,root,755)' > $langfile
+while read dir; do
+       echo "%dir ${dir#$RPM_BUILD_ROOT}" >> $langfile
+       for dir in $dir/*; do
+               lang=${dir##*/}
+               dir=${dir#$RPM_BUILD_ROOT}
+               case "$lang" in
+               zh-tw)
+                       lang=zh_TW
+               ;;
+               pt-br)
+                       lang=pt_BR
+               ;;
+               sl-si)
+                       lang=sl
+               ;;
+               id-ni)
+                       lang=id_NI
+               ;;
+               ca-valencia)
+                       lang=ca@valencia
+               ;;
+               hu-formal)
+                       lang=hu
+               ;;
+               de-informal)
+                       lang=de
+               ;;
+               zh-cn)
+                       lang=zh_CN
+               ;;
+               *-*)
+                       echo >&2 "ERROR: Need mapping for $lang!"
+                       rc=1
+               ;;
+               esac
+               if [ "$lang" = "en" ]; then
+                       echo "${dir#$RPM_BUILD_ROOT}" >> $langfile
+               else
+                       echo "%lang($lang) ${dir#$RPM_BUILD_ROOT}" >> $langfile
+               fi
+       done
+done < $tmp
+
+if [ "$(grep -Ev '(^%defattr|^$)' $langfile | wc -l)" -le 0 ]; then
+       echo >&2 "$PROG: Error: international files not found!"
+       rc=1
+fi
+
+rm -f $tmp
+exit $rc
diff --git a/eclipse-feature.xslt b/eclipse-feature.xslt
new file mode 100644 (file)
index 0000000..d48df03
--- /dev/null
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="text"/>
+
+<!-- we match from root, not to left anything to default template -->
+<xsl:template match="/">
+       <xsl:apply-templates select="feature"/>
+</xsl:template>
+
+<xsl:template match="feature">
+       <!-- process provides -->
+       <xsl:if test="$mode = 'provides'">
+               <!-- include root tag of feature -->
+               <xsl:text>eclipse(</xsl:text>
+                       <xsl:value-of select="@id"/>
+                       <xsl:text>) = </xsl:text>
+                       <xsl:value-of select="@version"/>
+               <xsl:text>&#10;</xsl:text>
+
+               <!-- is feature and plugin any way different? -->
+               <!-- process feature/plugin -->
+               <xsl:for-each select="plugin">
+                       <xsl:text>eclipse(</xsl:text>
+                               <xsl:value-of select="@id"/>
+                               <xsl:text>) = </xsl:text>
+                               <xsl:value-of select="@version"/>
+                       <xsl:text>&#10;</xsl:text>
+               </xsl:for-each>
+               <!-- process feature/includes -->
+               <xsl:for-each select="includes">
+                       <xsl:text>eclipse(</xsl:text>
+                               <xsl:value-of select="@id"/>
+                               <xsl:text>) = </xsl:text>
+                               <xsl:value-of select="@version"/>
+                       <xsl:text>&#10;</xsl:text>
+               </xsl:for-each>
+       </xsl:if>
+
+       <!-- process requires -->
+       <xsl:if test="$mode = 'requires'">
+               <xsl:for-each select="requires/import">
+                       <xsl:text>eclipse(</xsl:text>
+                               <!-- match plugin or feature -->
+                               <xsl:if test="@plugin != ''">
+                                       <xsl:value-of select="@plugin"/>
+                               </xsl:if>
+                               <xsl:if test="@feature != ''">
+                                       <xsl:value-of select="@feature"/>
+                               </xsl:if>
+                       <xsl:text>)</xsl:text>
+
+                       <!-- handle match="perfect" (probably means: same version as us) -->
+                               <xsl:if test="@match = 'perfect'">
+                                       <xsl:text> = </xsl:text>
+                                       <xsl:value-of select="//feature/@version"/>
+                               </xsl:if>
+
+                               <xsl:if test="@match = 'compatible'">
+                                       <xsl:text> >= </xsl:text>
+                                       <xsl:value-of select="@version"/>
+                               </xsl:if>
+
+                               <!-- apparently: base ver or greater -->
+                               <xsl:if test="@match = 'equivalent'">
+                                       <xsl:text> >= </xsl:text>
+                                       <xsl:value-of select="@version"/>
+                               </xsl:if>
+
+                               <!-- no qualifier, assume any? -->
+                               <xsl:if test="@match = ''">
+                                       <xsl:text> >= </xsl:text>
+                                       <xsl:value-of select="@version"/>
+                               </xsl:if>
+
+                       <xsl:text>&#10;</xsl:text>
+               </xsl:for-each>
+       </xsl:if>
+
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/find-lang.sh b/find-lang.sh
new file mode 100755 (executable)
index 0000000..3e13e14
--- /dev/null
@@ -0,0 +1,319 @@
+#!/bin/sh
+
+# find-lang - automagically generate list of language specific files
+# for inclusion in an rpm spec file.
+# This does assume that the *.mo files are under .../share/locale/...
+# Run with no arguments gets a usage message.
+
+# findlang is copyright (c) 1998 by W. L. Estes <wlestes@uncg.edu>
+
+# Redistribution and use of this software are hereby permitted for any
+# purpose as long as this notice and the above copyright notice remain
+# in tact and are included with any redistribution of this file or any
+# work based on this file.
+
+# Changes:
+#
+# 2012-12-22 Elan Ruusamäe <glen@pld-linux.org>
+#   * added --with-mate
+# 2006-08-28 Elan Ruusamäe <glen@pld-linux.org>
+#   * fixed --all-name which got broken with last change.
+# 2006-08-09 Elan Ruusamäe <glen@pld-linux.org>
+#   * huge performance boost for packages calling %find_lang multiple times (kde*i18n)
+# 2001-01-08 Michał Kochanowicz <mkochano@pld.org.pl>
+#   * --all-name support for KDE.
+# 2000-11-28 Rafał Cygnarowski <pascalek@pld.org.pl>
+#   * next simple rule for KDE
+# 2000-11-12 Rafał Cygnarowski <pascalek@pld.org.pl>
+#   * simple rules for KDE help files
+# 2000-06-05 Michał Kochanowicz <mkochano@pld.org.pl>
+#   * exact, not substring matching $NAME, i.e. find-lang top_dir NAME will
+#     no longer find /usr/share/locale/pl/LC_MESSAGES/<anything>NAME.mo.
+# 2000-04-17 Arkadiusz Miśkiewicz <misiek@pld.org.pl>
+#   * exit 1 when no files found
+# 1999-10-19 Artur Frysiak <wiget@pld.org.pl>
+#   * added support for GNOME help files
+#   * start support for KDE help files
+
+PROG=${0##*/}
+VERSION=1.40
+
+usage () {
+cat <<EOF
+Usage: $PROG TOP_DIR PACKAGE_NAME [prefix]
+
+where TOP_DIR is
+the top of the tree containing the files to be processed--should be
+\$RPM_BUILD_ROOT usually. TOP_DIR gets sed'd out of the output list.
+PACKAGE_NAME is the %{name} of the package. This should also be
+the basename of the .mo files.  the output is written to
+PACKAGE_NAME.lang unless \$3 is given in which case output is written
+to \$3.
+Additional options:
+  --with-gnome         find GNOME help files
+  --with-mate          find MATE help files
+  --with-kde           find KDE help files
+  --with-omf           find OMF files
+  --with-qm                    find QT .qm files
+  --with-django                find translations in Django project
+  --all-name           match all package/domain names
+  --without-mo         skip *.mo locale files
+  -o NAME                      output will be saved to NAME
+  -a NAME                      output will be appended to NAME
+EOF
+exit 1
+}
+
+if [ -z "$1" ]; then
+       usage
+elif [ $1 = / ]; then
+       echo >&2 "$PROG: expects non-/ argument for '$1'"
+       exit 1
+elif [ ! -d $1 ]; then
+       echo >&2 "$PROG: $1: No such directory"
+       exit 1
+else
+       TOP_DIR="${1%/}"
+fi
+shift
+
+if [ -z "$1" ]; then
+       usage
+else
+       NAME=$1
+fi
+shift
+
+GNOME='#'
+MATE='#'
+KDE='#'
+OMF='#'
+QM='#'
+DJANGO='#'
+MO=''
+OUTPUT=$NAME.lang
+ALL_NAME='#'
+NO_ALL_NAME=''
+APPEND=''
+while test $# -gt 0; do
+    case "$1" in
+       --with-gnome)
+               GNOME=''
+               echo >&2 "$PROG: Enabling with GNOME"
+               shift
+               ;;
+       --with-mate)
+               MATE=''
+               echo >&2 "$PROG: Enabling with MATE"
+               shift
+               ;;
+       --with-kde)
+               echo >&2 "$PROG: Enabling with KDE"
+               KDE=''
+               shift
+               ;;
+       --with-omf)
+               echo >&2 "$PROG: Enabling with OMF"
+               OMF=''
+               shift
+               ;;
+       --with-qm)
+               echo >&2 "$PROG: Enabling with Qt QM"
+               QM=''
+               shift
+               ;;
+       --with-django)
+               echo >&2 "$PROG: Enabling with Django"
+               DJANGO=''
+               shift
+               ;;
+       --without-mo)
+               echo >&2 "$PROG: Disabling .mo files"
+               MO='#'
+               shift
+               ;;
+       --all-name)
+               echo >&2 "$PROG: Enabling with all names"
+               ALL_NAME=''
+               NO_ALL_NAME='#'
+               shift
+               ;;
+       -o)
+               shift
+               OUTPUT=$1
+               shift
+               ;;
+       -a)
+               shift
+               OUTPUT=$1
+               APPEND='>'
+               shift
+               ;;
+       *)
+               OUTPUT=$1
+               shift
+               ;;
+    esac
+done
+
+echo >&2 "$PROG/$VERSION: find-lang '$NAME' $APPEND> $OUTPUT"
+
+MO_NAME=.$OUTPUT.tmp~
+echo '%defattr(644,root,root,755)' > $MO_NAME
+
+# .mo
+if [ ! -f __find.files ] || [ "$TOP_DIR" -nt __find.files ]; then
+       find $TOP_DIR -xtype f -name '*.mo' | xargs -r file -L | \
+       sed -e '
+               /, 1 message/d
+               s/:.*//
+               s:'"$TOP_DIR"'::' > __find.files
+else
+       echo >&2 "$PROG: Using cached __find.files"
+fi
+
+# .omf
+if [ ! -f __omf.files ] || [ "$TOP_DIR" -nt __omf.files ]; then
+       find $TOP_DIR -type f -name '*.omf' | \
+       sed -e '
+               s:'"$TOP_DIR"'::' > __omf.files
+else
+       echo >&2 "$PROG: Using cached __omf.files"
+fi
+
+# .qm
+if [ ! -f __qm.files ] || [ "$TOP_DIR" -nt __qm.files ]; then
+       find $TOP_DIR -type f -name '*.qm' | \
+       sed -e '
+               s:'"$TOP_DIR"'::' > __qm.files
+else
+       echo >&2 "$PROG: Using cached __qm.files"
+fi
+
+# .mo
+(
+       if [ "$ALL_NAME" ]; then
+               grep -F $NAME __find.files
+       else
+               cat __find.files
+       fi
+) | sed '
+'"$ALL_NAME$MO"'s:\(.*/share/locale/\)\([^/@]\+\)\(@quot\|@boldquot\)\?\(@[^/]*\)\?\(/.*\.mo$\):%lang(\2\4) \1\2\3\4\5:
+'"$NO_ALL_NAME$MO"'s:\(.*/share/locale/\)\([^/@]\+\)\(@quot\|@boldquot\)\?\(@[^/]*\)\?\(/.*/'"$NAME"'\.mo$\):%lang(\2\4) \1\2\3\4\5:
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+# .omf
+(
+       if [ "$ALL_NAME" ]; then
+               grep -F $NAME __omf.files
+       else
+               cat __omf.files
+       fi
+) | sed '
+'"$ALL_NAME$OMF"'s:\(.*/share/omf/[^/]\+/\)\(.*-\)\([^-]*\)\(\.omf\):%lang(\3) \1\2\3\4:
+'"$NO_ALL_NAME$OMF"'s:\(.*/share/omf/'"$NAME"'/\)\(.*-\)\([^-]*\)\(\.omf\):%lang(\3) \1\2\3\4:
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+# .qm
+(
+       if [ "$ALL_NAME" ]; then
+               grep -F $NAME __qm.files
+       else
+               cat __qm.files
+       fi
+) | sed '
+'"$NO_ALL_NAME$QM"'s:\(.*/'"$NAME"'_\([a-zA-Z]\{2\}\([_@].*\)\?\)\.qm$\):%lang(\2) \1:
+'"$NO_ALL_NAME$QM"'s:\(.*/share/locale/\)\([^/@]\+\)\(@quot\|@boldquot\)\?\(@[^/]*\)\?\(/.*/'"$NAME"'\.qm$\):%lang(\2\4) \1\2\3\4\5:
+'"$ALL_NAME$QM"'s:\(.*/[^/_]\+_\([a-zA-Z]\{2\}[_@].*\)\.qm$\):%lang(\2) \1:
+'"$ALL_NAME$QM"'s:\(.*/[^/_]\+_\([a-zA-Z]\{2\}\)\.qm$\):%lang(\2) \1:
+'"$ALL_NAME$QM"'s:^\([^%].*/[^/]\+_\([a-zA-Z]\{2\}[_@].*\)\.qm$\):%lang(\2) \1:
+'"$ALL_NAME$QM"'s:^\([^%].*/[^/]\+_\([a-zA-Z]\{2\}\)\.qm$\):%lang(\2) \1:
+s:^[^%].*::
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+if [ ! -f __find.dirs ] || [ "$TOP_DIR" -nt __find.dirs ]; then
+       find $TOP_DIR -mindepth 1 -type d | sed 's:'"$TOP_DIR"'::' > __find.dirs
+else
+       echo >&2 "$PROG: Using cached __find.dirs"
+fi
+
+# gnome
+(
+       if [ "$ALL_NAME" ]; then
+               grep -F $NAME __find.dirs
+       else
+               cat __find.dirs
+       fi
+) | sed '
+'"$NO_ALL_NAME$GNOME"'s:\(.*/share/help/\)\([^/]\+\)\(/'"$NAME"'\)$:%lang(\2) \1\2\3:
+'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'$\):%dir \1:
+'"$NO_ALL_NAME$GNOME"'s:\(.*/gnome/help/'"$NAME"'/\)\([^/]\+\)$:%lang(\2) \1\2:
+'"$ALL_NAME$GNOME"'s:\(.*/share/help/\)\([^/]\+\)\(/[^/]\+\)$:%lang(\2) \1\2\3:
+'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[^/]\+$\):%dir \1:
+'"$ALL_NAME$GNOME"'s:\(.*/gnome/help/[^/]\+/\)\([^/]\+\)$:%lang(\2) \1\2:
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+# mate
+(
+       if [ "$ALL_NAME" ]; then
+               grep -F $NAME __find.dirs
+       else
+               cat __find.dirs
+       fi
+) | sed '
+'"$NO_ALL_NAME$MATE"'s:\(.*/share/help/\)\([^/]\+\)\(/'"$NAME"'\)$:%lang(\2) \1\2\3:
+'"$NO_ALL_NAME$MATE"'s:\(.*/mate/help/'"$NAME"'$\):%dir \1:
+'"$NO_ALL_NAME$MATE"'s:\(.*/mate/help/'"$NAME"'/\)\([^/]\+\)$:%lang(\2) \1\2:
+'"$ALL_NAME$MATE"'s:\(.*/share/help/\)\([^/]\+\)\(/[^/]\+\)$:%lang(\2) \1\2\3:
+'"$ALL_NAME$MATE"'s:\(.*/mate/help/[^/]\+$\):%dir \1:
+'"$ALL_NAME$MATE"'s:\(.*/mate/help/[^/]\+/\)\([^/]\+\)$:%lang(\2) \1\2:
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+# kde
+(
+       if [ "$ALL_NAME" ]; then
+               grep -F $NAME __find.dirs
+       else
+               cat __find.dirs
+       fi
+) | sed '
+'"$NO_ALL_NAME$KDE"'s:\(.*/doc/kde/HTML/\)\([^/]\+\)\(/'"$NAME"'\)$:%lang(\2) \1\2\3:
+'"$ALL_NAME$KDE"'s:\(.*/doc/kde/HTML/\)\([^/]\+\)\(/[^/]\+\)$:%lang(\2) \1\2\3:
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+# OMF
+(
+       if [ "$ALL_NAME" ]; then
+               grep -F $NAME __find.dirs
+       else
+               cat __find.dirs
+       fi
+) | sed '
+'"$NO_ALL_NAME$OMF"'s:\(.*/share/omf/'"$NAME"'$\):%dir \1:
+'"$ALL_NAME$OMF"'s:\(.*/share/omf/[^/]\+$\):%dir \1:
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+# Django
+cat __find.dirs | sed -r -e '
+'"$DJANGO"'s:(.+/share/python.+/locale/)([^/@]+)(@quot|@boldquot)?(@[^/]*)?$:%lang(\2\4) \1\2\3\4:
+/^[^%]/d
+s:%lang(C) ::' >> $MO_NAME
+
+if [ "$(grep -Ev '(^%defattr|^$)' $MO_NAME | wc -l)" -le 0 ]; then
+       echo >&2 "$PROG: Error: international files not found for '$NAME'!"
+       exit 1
+fi
+
+if [ "$APPEND" ]; then
+       cat $MO_NAME >> $OUTPUT
+       rm -f $MO_NAME
+else
+       mv -f $MO_NAME $OUTPUT
+fi
diff --git a/gem_helper.rb b/gem_helper.rb
new file mode 100755 (executable)
index 0000000..6457a7a
--- /dev/null
@@ -0,0 +1,197 @@
+#!/usr/bin/ruby
+#--
+# Copyright 2010 Per Øyvind Karlsen <peroyvind@mandriva.org>
+# This program is free software. It may be redistributed and/or modified under
+# the terms of the LGPL version 2.1 (or later).
+#++
+
+require 'optparse'
+require 'rubygems'
+
+# Write the .gemspec specification (in Ruby)
+def writespec(spec)
+       file_name = spec.full_name.untaint + '.gemspec'
+       File.open(file_name, "w") do |file|
+               file.puts spec.to_ruby_for_cache
+       end
+       print "Wrote: %s\n" % file_name
+end
+
+# make gemspec self-contained
+if ARGV[0] == "spec-dump"
+       spec = eval(File.read(ARGV[1]))
+       writespec(spec)
+       exit(0)
+end
+
+if ARGV[0] == "build" or ARGV[0] == "install" or ARGV[0] == "spec"
+  require 'yaml'
+  require 'zlib'
+
+  filter = nil
+  opts = nil
+  keepcache = false
+  fixperms = false
+  gemdir = nil
+  dry_run = false
+  files = []
+  argv = ARGV[1..-1]
+  # Push this into some environment variables as the modified classes doesn't
+  # seem to be able to access our global variables.. </lameworkaround>
+  ENV['GEM_MODE'] = ARGV[0]
+  if ARGV[0] == "build"
+    opts = OptionParser.new("#{$0} <--filter PATTERN>")
+    opts.on("-f", "--filter PATTERN", "Filter pattern to use for gem files") do |val|
+      filter = val
+    end
+    opts.on("-j", "--jobs JOBS", "Number  of  jobs to run simultaneously.") do |val|
+      ENV['jobs'] = "-j"+val
+    end
+    opts.on("--dry-run", "Only show the files the gem will include") do
+      ARGV.delete("--dry-run")
+      dry_run = true
+    end
+  elsif ARGV[0] == "install"
+    opts = OptionParser.new("#{$0} <--keep-cache>")
+    opts.on("--keep-cache", "Don't delete gem copy from cache") do
+      ARGV.delete("--keep-cache")
+      keepcache = true
+    end
+    opts.on("--fix-permissions", "Force standard permissions for files installed") do
+      ARGV.delete("--fix-permissions")
+      fixperms = true
+    end    
+    opts.on("-i", "--install-dir GEMDIR", "Gem repository directory") do |val|
+      gemdir = val
+    end
+  end
+  while argv.length > 0
+    begin
+      opts.parse!(argv)
+    rescue OptionParser::InvalidOption => e
+      e.recover(argv)
+    end
+    argv.delete_at(0)
+  end
+
+  file_data = Zlib::GzipReader.open("metadata.gz") {|io| io.read}
+  header = YAML::load(file_data)
+  body = {}
+  # I don't know any better.. :/
+  header.instance_variables.each do |iv|
+         body[iv.to_s.sub(/^@/,'')] = header.instance_variable_get(iv)
+  end
+
+  spec = Gem::Specification.from_yaml(YAML.dump(header))
+
+  if ARGV[0] == "spec"
+    writespec(spec)
+    exit(0)
+  end
+
+  if ARGV[0] == "install"
+    system("gem %s %s.gem" % [ARGV.join(' '), spec.full_name])
+    if !keepcache
+      require 'fileutils'
+      FileUtils.rm_rf("%s/cache" % gemdir)
+    end
+    if fixperms
+      chmod = "chmod u+r,u+w,g-w,g+r,o+r -R %s" % gemdir
+      print "\nFixing permissions:\n\n%s\n" % chmod
+      system("%s" % chmod)
+      print "\n"
+    end
+  end
+
+  if body['extensions'].size > 0
+    require 'rubygems/ext'
+    module Gem::Ext
+      class Builder
+       def self.make(dest_path, results)
+         make_program = ENV['make']
+         unless make_program then
+           make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
+         end
+         cmd = make_program
+         if ENV['GEM_MODE'] == "build"
+           cmd += " %s" % ENV['jobs']
+         elsif ENV['GEM_MODE'] == "install"
+           cmd += " DESTDIR='%s' install" % ENV['DESTDIR']
+         end
+         results << cmd
+         results << `#{cmd} #{redirector}`
+
+         raise Gem::ExtensionBuildError, "make failed:\n\n#{results}" unless
+         $?.success?
+       end
+      end
+    end
+
+    require 'rubygems/installer'
+    module Gem
+      class Installer
+       def initialize(spec, options={})
+         @gem_dir = Dir.pwd
+         @spec = spec
+       end
+      end
+      class ConfigFile
+       def really_verbose
+         true
+       end
+      end
+    end
+
+    unless dry_run
+      Gem::Installer.new(spec).build_extensions
+    else
+      for ext in body['extensions']
+       files.push(ext[0..ext.rindex("/")-1]+".so")
+      end
+    end
+
+    body['extensions'].clear()
+  end
+  if ARGV[0] == "build"
+    body['test_files'].clear()
+
+    # We don't want ext/ in require_paths, it will only contain content for
+    # building extensions which needs to be installed in sitearchdir anyways..
+    idx = 0
+    for i in 0..body['require_paths'].size()-1
+      if body['require_paths'][idx].match("^ext(/|$)")
+       body['require_paths'].delete_at(idx)
+      else
+       idx += 1
+      end
+    end
+
+    # We'll get rid of all the files we don't really need to install
+    idx = 0
+    for i in 0..body['files'].size()-1
+      if filter and body['files'][idx].match(filter)
+       match = true
+      else
+       match = false
+       for path in body['require_paths']
+         if body['files'][idx].match("^%s/" % path)
+           match = true
+         end
+       end
+      end
+      if !match
+       body['files'].delete_at(idx)
+      else
+       idx += 1
+      end
+    end
+
+    spec = Gem::Specification.from_yaml(YAML.dump(header))
+    unless dry_run
+      Gem::Builder.new(spec).build
+    else
+      files.concat(spec.files)
+      print "%s\n" % files.join("\n")
+    end
+  end
+end
diff --git a/macros.browser-plugins b/macros.browser-plugins
new file mode 100644 (file)
index 0000000..b059f58
--- /dev/null
@@ -0,0 +1,26 @@
+# browser plugins v2
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#      %browser_plugins_add_browser <name> -p <plugindir>
+#
+#  <name> (required) -- name of the browser. usually %{name}.
+#  -p <plugindir> (required) -- in what directory browser searches for its plugins.
+#  -b -- default blacklists
+#  -a <arch> override arch
+#
+# Example:
+#   %browser_plugins_add_browser %{name} -p %{_firefoxdir}/plugins
+
+%_browserpluginsconfdir                /etc/browser-plugins
+%_browserpluginsdir            %{_libdir}/browser-plugins
+%update_browser_plugins                /usr/sbin/update-browser-plugins || :
+
+%browser_plugins_add_browser(p:b:a:) \
+       browser=%1.%{!-a:%{_target_base_arch}}%{-a*} \
+       install -d $RPM_BUILD_ROOT%{_browserpluginsconfdir}/{blacklist,browsers}.d \
+       ln -s %{-p*} $RPM_BUILD_ROOT%{_browserpluginsconfdir}/browsers.d/$browser \
+       blacklist_file=$RPM_BUILD_ROOT%{_browserpluginsconfdir}/blacklist.d/$browser.blacklist \
+       echo '# This file format is shell globs at base dir of plugindir' > $blacklist_file \
+       %{-b:cat >> $blacklist_file %{-b*}} \
+%{nil}
diff --git a/macros.cacti b/macros.cacti
new file mode 100644 (file)
index 0000000..d0592c6
--- /dev/null
@@ -0,0 +1,23 @@
+# Import or update Cacti template.
+#
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+# %cacti_import_template XMLFILE
+#  XMLFILE -- XML template to import
+#
+# Sample:
+# %post
+# %cacti_import_template %{resourcedir}/cacti_host_template_varnish.xml
+#
+# Requires:            cacti >= 0.8.7e-8
+# BuildRequires:       rpmbuild(macros) >= 1.630
+# Note: 1.1 (cacti-0.8.7h) adds requirement for --with-template-rras or --with-user-rras option
+
+%cacti_import_template() {\
+v=$(%{__sed} -rne 's/.+Add Graphs Script ([0-9\.]+).+/\1/p' /usr/share/cacti/cli/import_template.php); \
+if [ "$v" != "1.0" ]; then \
+       rra="--with-template-rras"; \
+fi; \
+/usr/share/cacti/cli/import_template.php --filename=%1 $rra || :; \
+}%{nil}
diff --git a/macros.emacs b/macros.emacs
new file mode 100644 (file)
index 0000000..bfd2f63
--- /dev/null
@@ -0,0 +1,4 @@
+# (X)emacs support
+%___emacs_lispdir_helper -batch -q -eval '(while load-path (princ (concat (car load-path) "\\n")) (setq load-path (cdr load-path)))' 2> /dev/null|sed -n '/\\(.*\\/x\\?emacs\\/site-lisp\\)\\/\\?$/{s,,\\1,p;q;}'
+%_emacs_lispdir %{expand:%%global _emacs_lispdir %(Z=$(emacs %___emacs_lispdir_helper); echo ${Z:-ERROR})}%_emacs_lispdir
+%_xemacs_lispdir %{expand:%%global _xemacs_lispdir %(Z=$(xemacs %___emacs_lispdir_helper); echo ${Z:-ERROR})}%_xemacs_lispdir
diff --git a/macros.ghc b/macros.ghc
new file mode 100644 (file)
index 0000000..5842cf8
--- /dev/null
@@ -0,0 +1,13 @@
+# Haskell Macros
+# BuildRequires:       rpmbuild(macros) >= 1.608
+%ghcdir                ghc-%(/usr/bin/ghc --numeric-version 2>/dev/null || echo ERROR)
+
+# update /usr/lib*/ghc-*/package.conf.d/package.cache
+# Requires: ghc
+# BuildRequires:       rpmbuild(macros) >= 1.607
+#
+%ghc_pkg_recache() {{ \
+       umask 022; \
+       [ ! -x /usr/bin/ghc-pkg ] || /usr/bin/ghc-pkg recache; \
+};} \
+%{nil}
diff --git a/macros.java b/macros.java
new file mode 100644 (file)
index 0000000..ee32a92
--- /dev/null
@@ -0,0 +1,165 @@
+# vim:ts=4 sw=4 noet ft=spec
+#
+# Java macros. based on jpackage macros.java
+#
+# Import packaging conventions from jpackage.org (prefixed with _
+# to avoid name collisions).
+#
+%_javadir              %{_datadir}/java
+%_javadocdir           %{_datadir}/javadoc
+
+# Root directory where all Java VMs/SDK/JREs are installed.
+%_jvmdir               %{_libdir}/jvm
+
+# Root directory where all Java VMs/SDK/JREs expose their jars
+%_jvmjardir            %{_libdir}/jvm-exports
+
+# Root directory for all Java VM/SDK/JRE's private things.
+%_jvmprivdir           %{_libdir}/jvm-private
+
+# Root directory for all architecture dependent parts of Java VM/SDK/JRE's
+%_jvmlibdir            %{_libdir}/jvm
+
+# Root directory for all architecture independent parts of Java VM/SDK/JRE's
+%_jvmdatadir           %{_datadir}/jvm
+
+# Root directory for all configurations parts of Java VM/SDK/JRE's
+%_jvmsysconfdir                %{_sysconfdir}/jvm
+
+# Root directory for all common architecture dependent parts of Java VM/SDK/JRE's
+%_jvmcommonlibdir      %{_libdir}/jvm-common
+
+# Root directory for all common architecture independent parts of Java VM/SDK/JRE's
+%_jvmcommondatadir     %{_datadir}/jvm-common
+
+# Root directory for all common configurations parts of Java VM/SDK/JRE's
+%_jvmcommonsysconfdir  %{_sysconfdir}/jvm-common
+
+# Directory where arch-specific (JNI) version-independent jars are installed.
+%_jnidir               %{_libdir}/java
+
+
+# JDK selection. Set this to name of the JDK implementation to use
+# insead of the system default
+#%use_jdk              icedtea6
+
+# expands to the value with right jdk for BuildRequires header
+# 'jdk' if %%use_jdk is not defined,  jdk(%%use_jdk) otherwise
+# The requirement will not replace current 'default' JDK
+%required_jdk  jdk%{?use_jdk:(%{use_jdk})}
+
+%buildrequires_jdk BuildRequires: %required_jdk
+
+%java_home     %{expand:%%global java_home %([ -f %{_javadir}-utils/java-functions ] || { echo ERROR; exit 0; }; %{!?use_jdk:unset JAVA_HOME; . %{_javadir}-utils/java-functions; set_jvm}%{?use_jdk:JAVA_HOME=%{_jvmdir}/%{use_jdk}}; echo ${JAVA_HOME:-ERROR})}%java_home
+
+%_javasrcdir   %{_usrsrc}/java
+
+%ant           JAVA_HOME=%{java_home} CLASSPATH=$CLASSPATH ant
+%jar           %{java_home}/bin/jar
+%java          %{expand:%%global java %([ -f %{_javadir}-utils/java-functions ] || { echo ERROR; exit 0; }; %{!?use_jdk:unset JAVACMD; . %{_javadir}-utils/java-functions; set_javacmd}%{?use_jdk:JAVACMD=%{java_home}/bin/java}; echo $JAVACMD)}%java
+%javac         %{java_home}/bin/javac
+%javadoc       %{java_home}/bin/javadoc
+
+%add_jvm_extension     JAVA_LIBDIR=%{buildroot}/%{_javadir}    %{_bindir}/jvmjar -l
+
+%jpackage_script() \
+install -d $RPM_BUILD_ROOT%{_bindir}\
+cat > $RPM_BUILD_ROOT%{_bindir}/%5 << 'EOF' \
+#!/bin/sh\
+#\
+# %{name} script\
+# JPackage Project <http://www.jpackage.org/>\
+\
+# Source functions library\
+. %{_javadir}-utils/java-functions\
+\
+# Source system prefs\
+if [ -f %{_sysconfdir}/java/%{name}.conf ]; then\
+      . %{_sysconfdir}/java/%{name}.conf\
+fi\
+\
+# Source user prefs\
+if [ -f $HOME/.%{name}rc ]; then\
+      . $HOME/.%{name}rc\
+fi\
+\
+# Configuration\
+MAIN_CLASS=%1\
+BASE_FLAGS=%2\
+BASE_OPTIONS=%3\
+BASE_JARS="%(echo %4 | tr ':' ' ')"\
+\
+# Set parameters\
+set_jvm\
+set_classpath $BASE_JARS\
+set_flags $BASE_FLAGS\
+set_options $BASE_OPTIONS\
+\
+# Let's start\
+run "$@"\
+EOF
+
+# jpackage 1.7
+# Directory for maven depmaps
+#
+%_mavendepmapdir /etc/maven
+%_mavendepmapfragdir /etc/maven/fragments
+
+#
+# add_to_depmap adds an entry to the depmap. The arguments are:
+#
+# %1 the original groupid
+# %2 the original artifact id
+# %3 the version
+# %4 the new groupid
+# %5 the new artifactid
+#
+
+%add_to_maven_depmap() \
+install -dm 755 $RPM_BUILD_ROOT/%{_mavendepmapfragdir}\
+cat >>$RPM_BUILD_ROOT/%{_mavendepmapfragdir}/%{name}<< EOF\
+<dependency>\
+    <maven>\
+        <groupId>%1</groupId>\
+        <artifactId>%2</artifactId>\
+        <version>%3</version>\
+    </maven>\
+    <jpp>\
+        <groupId>%4</groupId>\
+        <artifactId>%5</artifactId>\
+        <version>%3</version>\
+    </jpp>\
+</dependency>\
+\
+EOF\
+%{nil}
+
+#==============================================================================
+#
+# update_maven_depmap updates the main maven depmap
+#
+%update_maven_depmap() \
+echo -e "<dependencies>\\n" > %{_mavendepmapdir}/maven2-depmap.xml\
+if [ -d %{_mavendepmapfragdir} ] && [ -n "`find %{_mavendepmapfragdir} -type f`" ]; then\
+cat %{_mavendepmapfragdir}/* >> %{_mavendepmapdir}/maven2-depmap.xml\
+fi\
+echo -e "</dependencies>\\n" >> %{_mavendepmapdir}/maven2-depmap.xml
+
+# JAVA macros specific for TLD
+
+# Directory for tomcat context configuration files
+%_tomcatconfdir        /etc/tomcat/Catalina/localhost
+
+# Tomcat cache path
+%_tomcatcachedir %{_sharedstatedir}/tomcat/work/Catalina/localhost
+
+# Clear tomcat cache
+# Author: Paweł Zuzelski <pawelz@pld-linux.org>
+#
+# Usage:
+# %%tomcat_clear_cache appname
+#
+# Call this script in %postun scriptlet. It will remove compiled jsps related to
+# given app.
+#
+%tomcat_clear_cache() %{!?1:ERROR}%{?2:ERROR} %{__rm} -rf %{_tomcatcachedir}/%1
diff --git a/macros.kernel b/macros.kernel
new file mode 100644 (file)
index 0000000..84d96b0
--- /dev/null
@@ -0,0 +1,350 @@
+# vim:ts=4 sw=4 noet ft=spec
+# Kernel specific macro definitions.
+# To make use of these macros insert the following line into your spec file:
+# %{load:%{_usrlibrpm}/macros.d/kernel}
+
+%__modinfo             /sbin/modinfo
+
+# Alternative kernel type/version
+%_alt_kernel   %{nil}%{?alt_kernel:-%{?alt_kernel}}
+%_build_kernels        %{nil}%{?build_kernels:%{?build_kernels}}%{!?build_kernels:%{?alt_kernel}}
+
+# Macros for building kernel packages for multiple kernels from same spec
+# Usage:
+#
+# %{expand:%buildrequires_kernel kernel%%{_alt_kernel}-module-build >= 3:2.6.20.2}}
+# %{expand:%create_kernel_packages}
+# %{expand:%build_kernel_packages}
+# %{expand:%install_kernel_packages}
+#
+%buildrequires_kernel()        %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
+echo %%undefine alt_kernel \
+[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
+echo "BuildRequires:   %{*}" \
+done)
+
+%create_kernel_packages        %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
+echo %%undefine alt_kernel \
+[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
+echo %%kernel_pkg \
+done)
+
+%build_kernel_packages %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
+echo %%undefine alt_kernel \
+[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
+echo %%build_kernel_pkg \
+done)
+
+%install_kernel_packages       %(echo %{_build_kernels} | tr , '\\n' | while read n ; do \
+echo %%undefine alt_kernel \
+[ -z "$n" -o "$n" = "head" ] || echo %%define alt_kernel $n \
+echo %%install_kernel_pkg \
+done)
+
+# The directory holding Linux kernel sources
+%_kernelsrcdir /usr/src/linux%{_alt_kernel}
+
+# rpm -qf on kernel version.h file
+%__kernel_qf()         %(R=$(cd %{_kernelsrcdir} 2>/dev/null && LC_ALL=C rpm -q --qf '%*' -f include/linux/version.h 2>/dev/null | grep -v 'is not'); echo ${R:-ERROR})
+
+# kernel %{name} and kernel %{epoch}:%{version}-%{release} macro respecing alt_kernel
+%kernel_name   %(N=%{__kernel_qf %{N}}; echo ${N%%-headers})
+%kernel_version        %{__kernel_qf %|E?{%{E}:}|%{V}-%{R}}
+
+# -n drm to generate kernel%{_alt_kernel}-drm dependency
+%releq_kernel(n:)              %{kernel_name}%{?-n:-%{-n*}} = %{kernel_version}
+%releq_kernel_up(n:)   %{kernel_name}-up%{?-n:-%{-n*}} = %{kernel_version}
+%releq_kernel_smp(n:)  %{kernel_name}-smp%{?-n:-%{-n*}} = %{kernel_version}
+
+# -s post to generate Requires(post) dependency
+%requires_releq_kernel(s:n:)           Requires%{-s:(%{-s*})}: %releq_kernel
+%requires_releq_kernel_up(s:n:)                Requires%{-s:(%{-s*})}: %releq_kernel_up
+%requires_releq_kernel_smp(s:n:)       Requires%{-s:(%{-s*})}: %releq_kernel_smp
+
+# kernel version-release handling, `uname -r` used for building/installing kernel modules
+%_kernel_ver    %( \\
+       Z=$([ -f '%{_kernelsrcdir}/include/generated/utsrelease.h' ] && \\
+               awk -F'"' '/UTS_RELEASE/{print $2}' %{_kernelsrcdir}/include/{linux/version,generated/utsrelease}.h 2>/dev/null || \\
+               awk -F'"' '/UTS_RELEASE/{print $2}' %{_kernelsrcdir}/include/linux/{version,utsrelease}.h 2>/dev/null); \\
+       Z=${Z:-$(awk -F' = ' '/^VERSION/{v=$2} /^PATCHLEVEL/{p=$2} /^SUBLEVEL/{s=$2} /^EXTRAVERSION/{e=$2} END {printf("%d.%d.%d%s", v, p, s, e)}' \\
+               %{_kernelsrcdir}/Makefile 2>/dev/null)}; \\
+       echo ${Z:-ERROR}; \\
+)
+# left for compatibility
+%__kernel_ver          %{_kernel_ver}
+
+# package version to be used in @release field
+%_kernel_ver_str        %( \\
+       Z=$([ -f '%{_kernelsrcdir}/include/generated/utsrelease.h' ] && \\
+               awk -F'"' '/UTS_RELEASE/{gsub(/-/,"_",$2); print $2}' %{_kernelsrcdir}/include/{linux/version,generated/utsrelease}.h 2>/dev/null || \\
+               awk -F'"' '/UTS_RELEASE/{gsub(/-/,"_",$2); print $2}' %{_kernelsrcdir}/include/linux/{version,utsrelease}.h 2>/dev/null); \\
+       Z=${Z:-$(awk -F' = ' '/^VERSION/{v=$2} /^PATCHLEVEL/{p=$2} /^SUBLEVEL/{s=$2} /^EXTRAVERSION/{e=$2} END {z=sprintf("%d.%d.%d%s", v, p, s, e); gsub(/-/,"_",z); print z}' \\
+               %{_kernelsrcdir}/Makefile 2>/dev/null)}; \\
+       echo ${Z:-ERROR}; \\
+)
+
+%_kernel_version_code   %( \\
+       Z=$(awk '/LINUX_VERSION_CODE/{print $3}' %{_kernelsrcdir}/include/linux/version.h 2>/dev/null); \\
+       echo ${Z:-ERROR}; \\
+)
+
+%_kernel_version_magic()        %(echo $((%{1} * 65536 + %{2} * 256 + %{3})))
+
+%_host_base_arch       %{expand:%%global _host_base_arch %(echo %{_host_cpu} | sed 's/i.86/i386/;s/athlon/i386/;s/pentium./i386/;s/amd64/x86_64/;s/ia32e/x86_64/;s/x32/x86_64/;s/sparcv./sparc/;s/arm.*/arm/')}%_host_base_arch
+%_target_base_arch     %{expand:%%global _target_base_arch %(echo %{_target_cpu} | sed 's/i.86/i386/;s/athlon/i386/;s/pentium./i386/;s/amd64/x86_64/;s/ia32e/x86_64/;s/x32/x86_64/;s/sparcv./sparc/;s/arm.*/arm/')}%_target_base_arch
+
+# Compression used for %__spec_install_post_compress_modules
+# Supported values:
+# - "gzip -9nf" (module-init-tools and kmod)
+# - "xz" (kmod)
+# - "xz -9e" (kmod), however size difference with "xz" default options is very minimal
+# @since 1.707
+%kmod_compress_cmd %{__gzip} -9nf
+
+#-----------------------------------------------------------------
+# Find and compress all kernel modules
+#
+# Requires: find
+# Depends: kmod_compress_cmd
+#
+#%no_install_post_compress_modules     1
+%__spec_install_post_compress_modules { \
+%{!?no_install_post_compress_modules: __spec_install_post_compress_modules() { \
+%{!?debug:set +x;} \
+       if [ -d $RPM_BUILD_ROOT/lib/modules ]; then \
+               tool=$(%{kmod_compress_cmd} --version | head -n1); \
+               case "$tool" in gzip*) ext=gz;; xz*) ext=xz;; esac; \
+               q=$(find $RPM_BUILD_ROOT/lib/modules -name '*o' -type f -print); \
+               if [ "$q" ]; then \
+                       printf "Compress %d kernel modules..." $(echo "$q" | wc -l); \
+                       echo "$q" | xargs -r %{kmod_compress_cmd}; \
+                       echo "DONE"; \
+                       find $RPM_BUILD_ROOT/lib/modules -name '*o' -type l -printf "%p %l\n" | \
+                       while read a b; do ln -sf $b.$ext $a.$ext; rm -f $a; done; \
+               fi; \
+       fi; \
+}; __spec_install_post_compress_modules } }
+
+# Build modules for kernels 2.6
+# Author: Przemyslaw Iskra <sparky@pld-linux.org>
+#
+# Usage:
+#      %build_kernel_modules -m <modules> -C <directory>
+#
+#  remember that proper Makefile is still required
+# Options:
+#  -m <modules> (required) -- comma-separated list of modules to save,
+#              without .ko extension, may be placed in subdirectory
+#  -C <directory> -- change to <directory> before doing anything
+#  -p <arg>, -P <arg> -- arguments passeed to make scripts
+#  -c -- do not execute make clean
+#  <additional arguments> -- all additional arguments will be passed to
+#              make modules
+#
+# Additional patching supported via here document. Try:
+#      %build_kernel_modules -m module <<'EOF'
+#      your patch script here
+#      EOF
+# Don't use it unless patching depends on config options.
+
+# Developer note: don't touch it unless you know how to handle '\'.
+# - \ in script expands to nothing
+# - \\\ in script expands to \
+# - \\\ inside definition expands to nothing
+# - \\\\\\\ inside definition expands to \
+# - in last line \ has to touch arguments so arguments passing
+#   in new lines (using \) will be supported
+
+%build_kernel_modules(p:P:m:C:c)                                                                       \
+%{!?-m:%{error:%{0}: Required module name/list missing} exit 1}                \
+                                                                                                                                       \
+%define Opts                                                                                                           \\\\\\\
+%if "%{_target_base_arch}" != "%{_host_base_arch}"                                     \\\
+       %if "%{_host_base_arch}" == "x86_64" && "%{_target_base_arch}" == "i386" \\\
+       CC="%{__cc}" ARCH=%{_target_base_arch}                                                  \\\
+       %else                                                                                                                   \\\
+       ARCH=%{_target_base_arch} CROSS_COMPILE=%{_target_cpu}-pld-linux- \\\
+       %endif                                                                                                                  \\\
+%else                                                                                                                          \\\
+       CC="%{__cc}"                                                                                                    \\\
+%endif                                                                                                                         \
+%define        MakeOpts HOSTCC="%{__cc}" SYSSRC=%{_kernelsrcdir} SYSOUT=$PWD/o \\\\\\\
+               %{?with_verbose:V=1} %{Opts}                                            \
+                                                                                                                                       \
+%{?-C:cd %{-C*}}                                                                                                       \
+compile() {                                                                                                                    \
+       local L="<" PATCH_SH;                                                                                   \
+       [[ '%{*}' != *$L$L* ]] || PATCH_SH="set -x -e;$(cat)"                   \
+       set -e -x                                                                                                               \
+                                                                                                                                       \
+       [ -r "%{_kernelsrcdir}/.config" ] || exit 1                                             \
+       rm -rf o                                                                                                                \
+       install -d o/include/linux o/include/generated o/arch/x86/include o/arch/powerpc/lib    \
+       ln -sf %{_kernelsrcdir}/.config o/.config                                               \
+       ln -sf %{_kernelsrcdir}/Module.symvers o/Module.symvers                 \
+       if [ -f %{_kernelsrcdir}/include/generated/autoconf.h ]; then   \
+               ln -sf %{_kernelsrcdir}/include/generated/autoconf.h o/include/generated/autoconf.h \
+               ln -s ../generated/autoconf.h o/include/linux/autoconf.h        \
+       else                                                                                                                    \
+               ln -sf %{_kernelsrcdir}/include/linux/autoconf.h o/include/linux/autoconf.h \
+       fi                                                                                                                              \
+       if [ -d %{_kernelsrcdir}/arch/x86/include/generated ]; then             \
+               ln -s %{_kernelsrcdir}/arch/x86/include/generated o/arch/x86/include    \
+       fi                                                                                                                              \
+                                                                                                                                       \
+       set +x                                                                                                                  \
+       [ -z "$PATCH_SH" ] || echo "$PATCH_SH" | %__spec_build_shell    \
+       set -x                                                                                                                  \
+                                                                                                                                       \
+       install -d o/include/config                                                                             \
+       touch o/include/config/MARKER                                                                   \
+       ln -sf %{_kernelsrcdir}/include/config/auto.conf o/include/config/auto.conf     \
+       ln -sf %{_kernelsrcdir}/scripts o/scripts                                               \
+                                                                                                                                       \
+       %{!?-c:%{__make} -C %{_kernelsrcdir} clean                                              \\\
+               RCS_FIND_IGNORE="-name '*.[ks]o' -o"                                            \\\
+               ${1+"$@"}                                                                                                       \\\
+               M=$PWD %{MakeOpts}}                                                                                     \
+                                                                                                                                       \
+       %{__make} -C %{_kernelsrcdir} modules                                                   \\\
+               ${1+"$@"}                                                                                                       \\\
+               M=$PWD CONSTIFY_PLUGIN="" %{MakeOpts}                                           \
+%{?-C:cd -}                                                                                                                    \
+}                                                                                                                                      \
+compile %{*}                                                                                                           \
+%{nil}
+
+%build_kernel_modules_compat(p:P:m:C:c)                                                                \
+%{!?-m:%{error:%{0}: Required module name/list missing} exit 1}                \
+                                                                                                                                       \
+%define Opts                                                                                                           \\\\\\\
+%if "%{_target_base_arch}" != "%{_host_base_arch}"                                     \\\
+       %if "%{_host_base_arch}" == "x86_64" && "%{_target_base_arch}" == "i386" \\\
+       CC="%{__cc}" ARCH=%{_target_base_arch}                                                  \\\
+       %else                                                                                                                   \\\
+       ARCH=%{_target_base_arch} CROSS_COMPILE=%{_target_cpu}-pld-linux- \\\
+       %endif                                                                                                                  \\\
+%else                                                                                                                          \\\
+       CC="%{__cc}"                                                                                                    \\\
+%endif                                                                                                                         \
+%define        MakeOpts HOSTCC="%{__cc}" SYSSRC=%{_kernelsrcdir} SYSOUT=$PWD/o \\\\\\\
+               %{?with_verbose:V=1} %{Opts}                                            \
+                                                                                                                                       \
+%{?-C:cd %{-C*}}                                                                                                       \
+compile() {                                                                                                                    \
+       local L="<" PATCH_SH;                                                                                   \
+       [[ '%{*}' != *$L$L* ]] || PATCH_SH="set -x -e;$(cat)"                   \
+       set -e -x                                                                                                               \
+       local cfgs='%{?with_dist_kernel:%{?with_smp: smp}%{?with_up: up}}%{!?with_dist_kernel: nondist}' \
+                                                                                                                                       \
+for cfg in ${cfgs:-dist}; do                                        \
+       [ -r "%{_kernelsrcdir}/config-$cfg" ] || exit 1                                 \
+                                                                                                                                       \
+       rm -rf o                                                                                                                \
+       install -d o/include/linux o/include/generated o/arch/powerpc/lib       \
+       ln -sf %{_kernelsrcdir}/config-$cfg o/.config                                   \
+       ln -sf %{_kernelsrcdir}/Module.symvers-$cfg o/Module.symvers    \
+       if [ -f %{_kernelsrcdir}/include/generated/autoconf-$cfg.h ]; then      \
+               ln -sf %{_kernelsrcdir}/include/generated/autoconf-$cfg.h o/include/generated/autoconf.h \
+               ln -s ../generated/autoconf.h o/include/linux/autoconf.h        \
+       else                                                                                                                    \
+               ln -sf %{_kernelsrcdir}/include/linux/autoconf-$cfg.h o/include/linux/autoconf.h \
+       fi                                                                                                                              \
+                                                                                                                                       \
+       set +x                                                                                                                  \
+       [ -z "$PATCH_SH" ] || echo "$PATCH_SH" | %__spec_build_shell    \
+       set -x                                                                                                                  \
+                                                                                                                                       \
+       %if %{with dist_kernel} || %(test -f %{_kernelsrcdir}/scripts/bin2c ; echo $?)  \
+               %{__make} -j1 -C %{_kernelsrcdir} prepare scripts                       \\\
+                       %{-p*} %{-P*}                                                                                   \\\
+                       %{MakeOpts}                                                                                             \
+       %else                                                                                                                   \
+               install -d o/include/config                                                                     \
+               touch o/include/config/MARKER                                                           \
+               ln -sf %{_kernelsrcdir}/include/config/auto-$cfg.conf o/include/config/auto.conf        \
+               ln -sf %{_kernelsrcdir}/scripts o/scripts                                       \
+       %endif                                                                                                                  \
+                                                                                                                                       \
+       %{!?-c:%{__make} -C %{_kernelsrcdir} clean                                              \\\
+               RCS_FIND_IGNORE="-name '*.[ks]o' -o"                                            \\\
+               ${1+"$@"}                                                                                                       \\\
+               M=$PWD %{MakeOpts}}                                                                                     \
+                                                                                                                                       \
+       %{__make} -C %{_kernelsrcdir} modules                                                   \\\
+               ${1+"$@"}                                                                                                       \\\
+               M=$PWD CONSTIFY_PLUGIN="" %{MakeOpts}                                           \
+                                                                                                                                       \
+       for MODULE in {%{-m*},}; do                                                                             \
+               [ -z "${MODULE}" ] || mv ${MODULE}{,-$cfg}.ko                           \
+       done                                                                                                                    \
+done                                                                                                                           \
+%{?-C:cd -}                                                                                                                    \
+}                                                                                                                                      \
+compile %{*}                                                                                                           \
+%{nil}
+
+
+# Install kernel modules built by %build_kernel_modules
+# Author: Przemyslaw Iskra <sparky@pld-linux.org>
+#
+# Usage:
+#      %install_kernel_modules -m <modules> -d <directory>
+#
+# Options:
+#  -m <modules> (required) -- comma-separated list of modules to install,
+#              without .ko extension, may be placed in subdirectory
+#  -d <directory> (required) -- in what subdirectory modules should be
+#              installed (eg. misc, kernel/drivers/net)
+#  -s <suffix> -- suffix to use when installing modules, useful when module
+#              with same name exists in kernel already
+#  -n <file> -- name of modprobe config file to use (without .conf extension)
+#              for defining aliases, only useful with -s
+#  -D <directory> -- DESTDIR, base directory for installed files,
+#              defaults to RPM_BUILD_ROOT
+
+%install_kernel_modules(m:d:s:n:D:)                                                                    \
+%{!?-m:%{error:%{0}: Required module name (-m) missing}exit 1}         \
+%{!?-d:%{error:%{0}: Required module directory missing}exit 1}         \
+%{?-n:%{!?-s:%{error:%{0}: Modprobe .conf file requires module suffix}exit 1}} \
+                                                                                                                                       \
+INSTALLROOT=%{-D*}                                                                                                     \
+[ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT                           \
+                                                                                                                                       \
+%{!?debug:set +x;}                                                                                                     \
+                                                                                                                                       \
+for MODULE in {%{-m*},}; do                                                                                    \
+       [ -n "${MODULE}" ] || continue                                                                  \
+       MNAME=${MODULE##*/}                                                                                             \
+       install -m 644 -D ${MODULE}.ko $INSTALLROOT/lib/modules/%{_kernel_ver}/%{-d*}/${MNAME}%{-s:-%{-s*}}.ko  \
+       %{?-s:install -d $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver}                                                                   \
+               echo "alias ${MNAME} ${MNAME}-%{-s*}" >> $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver}/%{-n*}.conf}      \
+done                                                                                                                           \
+unset INSTALLROOT                                                                                                      \
+%{nil}
+
+%install_kernel_modules_compat(m:d:s:n:D:)                                                     \
+%{!?-m:%{error:%{0}: Required module name (-m) missing}exit 1}         \
+%{!?-d:%{error:%{0}: Required module directory missing}exit 1}         \
+%{?-n:%{!?-s:%{error:%{0}: Modprobe .conf file requires module suffix}exit 1}} \
+                                                                                                                                       \
+INSTALLROOT=%{-D*}                                                                                                     \
+[ -n "$INSTALLROOT" ] || INSTALLROOT=$RPM_BUILD_ROOT                           \
+                                                                                                                                       \
+%{!?debug:set +x;}                                                                                                     \
+local cfgs='%{?with_dist_kernel:%{?with_smp: smp}%{?with_up: up}}%{!?with_dist_kernel: nondist}' \
+                                                                                                                                       \
+for MODULE in {%{-m*},}; do                                                                                    \
+       [ -n "${MODULE}" ] || continue                                                                  \
+       for cfg in ${cfgs:-dist}; do                                    \
+               [ "$cfg" = smp ] && suf=smp || suf=                                                     \
+               MNAME=${MODULE##*/}                                                                                     \
+               install -m 644 -D ${MODULE}-$cfg.ko                                                     \\\
+                       $INSTALLROOT/lib/modules/%{_kernel_ver}$suf/%{-d*}/${MNAME}%{-s:-%{-s*}}.ko                     \
+               %{?-s:install -d $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver}$suf                                                       \
+                       echo "alias ${MNAME} ${MNAME}-%{-s*}"                                   \\\
+                       >> $INSTALLROOT%{_sysconfdir}/modprobe.d/%{_kernel_ver} $suf/%{-n*}.conf}                                               \
+       done                                                                                                                    \
+done                                                                                                                           \
+unset INSTALLROOT                                                                                                      \
+%{nil}
diff --git a/macros.mimetype b/macros.mimetype
new file mode 100644 (file)
index 0000000..5f67ab5
--- /dev/null
@@ -0,0 +1,7 @@
+#------------------------------------------------------------------------
+# mimetype(...) configuration.
+#
+# Path to script to autogenerate mimetype(foo) provides, based on MimeType
+# key from desktop files.
+#
+%__mimetype_provides %{_usrlibrpm}/mimetypedeps.sh --provides
diff --git a/macros.nagios b/macros.nagios
new file mode 100644 (file)
index 0000000..24e312d
--- /dev/null
@@ -0,0 +1,41 @@
+# Hook to register nagios object based plugins in Nagios NRPE daemon config.
+#
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#  -a NAME  -- add command named NAME
+#  -d NAME  -- remove command named NAME
+#  -f FILE  -- specify plugin configuration FILE to extract command definition from
+#
+# Sample:
+# %triggerin -- nagios-nrpe
+# %nagios_nrpe -a %{plugin} -f %{_sysconfdir}/%{plugin}.cfg
+#
+# %triggerun -- nagios-nrpe
+# %nagios_nrpe -d %{plugin} -f %{_sysconfdir}/%{plugin}.cfg
+#
+# Requirements:
+# Requires:                    grep
+# Requires:                    sed >= 4.0
+# BuildRequires:       rpmbuild(macros) >= 1.685
+%nagios_nrpe(a:d:c:f:) {\
+       if %{__grep} -q '^include_dir=/etc/nagios/nrpe.d' /etc/nagios/nrpe.cfg && [ -d /etc/nagios/nrpe.d ]; then \
+               file=/etc/nagios/nrpe.d/%{-a*}%{-d*}.cfg; \
+       else \
+               file=/etc/nagios/nrpe.cfg; \
+       fi; \
+       m=$(test -f $file && md5sum < $file); \
+       %{-a:# on -a and config exists \
+       if [ -f /etc/nagios/nrpe.cfg ]; then \
+               if [ ! -f $file ] || ! %{__grep} -q '^command\[%{-a*}\]' $file; then \
+                       %{__sed} -ne 's/^[ \t]*command_line[ \t]\+\(.\+\)/command[%{-a*}]=\1/p' %{-f*} >> $file; \
+               fi; \
+       fi;} \
+       %{-d:# on package remove, -d and config exists \
+       if [ "$1" = "0" -a -f $file ]; then \
+               %{__sed} -i -e '/^[ \t]*command\[%{-d*}\]/d' $file; \
+       fi;} \
+       if [ "$m" != "$(md5sum < $file)" ]; then \
+               %service -q nrpe restart; \
+       fi; \
+}%{nil}
diff --git a/macros.openldap b/macros.openldap
new file mode 100644 (file)
index 0000000..44207de
--- /dev/null
@@ -0,0 +1,44 @@
+# Register OpenLDAP schema.
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#   %%openldap_schema_register [-d core,nis] %{schemadir}/horde.schema
+#
+#  -d specify dependant schemas, separated by comma
+#
+%openldap_schema_register(d:) \
+for schema in %*; do \
+       if ! grep -q "$schema" /etc/openldap/slapd.conf; then \
+               %{__sed} -i -e " \
+                       /^include.*local.schema/{ \
+                               iinclude\\t     $schema\
+                       } \
+               " /etc/openldap/slapd.conf \
+       fi \
+done \
+# enable dependant schemas \
+if [ "%{-d*}" ]; then \
+       %{__sed} -i -e ' \
+       /^#include.*\\(%(echo '%{-d*}' | %{__sed} -e 's/,/\\\\|/g')\\)\\.schema/{ \
+               s/^#// \
+       }' /etc/openldap/slapd.conf \
+fi \
+%{nil}
+
+# Unregister OpenLDAP schema.
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#   %%openldap_schema_unregister %{schemadir}/horde.schema
+#
+%openldap_schema_unregister() \
+for schema in %*; do \
+       if grep -q "$schema" /etc/openldap/slapd.conf; then \
+               %{__sed} -i -e " \
+               /^include.*$(echo "$schema" | %{__sed} -e 's,/,\\\\/,g')/d \
+               # for symmetry it would be nice if we disable enabled schemas in post, \
+               # but we really can not do that, it would break something else. \
+               " /etc/openldap/slapd.conf \
+       fi \
+done \
+%{nil}
diff --git a/macros.perl b/macros.perl
new file mode 100644 (file)
index 0000000..dc61310
--- /dev/null
@@ -0,0 +1,10 @@
+# Perl specific macro definitions.
+
+%__perl                        /usr/bin/perl
+
+%perl_privlib          %{expand:%%global perl_privlib %(eval $(%{__perl} -V:installprivlib 2>/dev/null); echo ${installprivlib:-ERROR})}%perl_privlib
+%perl_archlib          %{expand:%%global perl_archlib %(eval $(%{__perl} -V:installarchlib 2>/dev/null); echo ${installarchlib:-ERROR})}%perl_archlib
+%perl_vendorlib                %{expand:%%global perl_vendorlib %(eval $(%{__perl} -V:installvendorlib 2>/dev/null); echo ${installvendorlib:-ERROR})}%perl_vendorlib
+%perl_vendorarch       %{expand:%%global perl_vendorarch %(eval $(%{__perl} -V:installvendorarch 2>/dev/null); echo ${installvendorarch:-ERROR})}%perl_vendorarch
+%perl_sitelib          %{expand:%%global perl_sitelib %(eval $(%{__perl} -V:installsitelib 2>/dev/null); echo ${installsitelib:-ERROR})}%perl_sitelib
+%perl_sitearch         %{expand:%%global perl_sitearch %(eval $(%{__perl} -V:installsitearch 2>/dev/null); echo ${installsitearch:-ERROR})}%perl_sitearch
diff --git a/macros.php b/macros.php
new file mode 100644 (file)
index 0000000..f2a83a3
--- /dev/null
@@ -0,0 +1,193 @@
+# PHP specific macro definitions.
+
+# name of php package
+%php_name              php%{?php_suffix}
+
+# use rpmbuild -D 'php_suffix 54' to build php extension for php 5.4
+# NOTE: error output must be empty. otherwise can't build pecl packages if no php*-devel is installed
+%php_suffix            %{expand:%%global php_suffix %(c=$(php-config --sysconfdir 2>/dev/null) || echo '' && echo ${c#/etc/php})%%{nil}}%php_suffix
+
+# phpXY, version always present for using current php version (in regards of php*-devel package)
+%php_versuffix         %{expand:%%global php_versuffix %((IFS=.; set -- $(php-config --version); echo $1$2))%%{nil}}%php_versuffix
+
+# php cli. version that php headers are installed for
+%__php                 /usr/bin/php%{php_versuffix}
+
+%php_pear_dir          /usr/share/pear
+%php_data_dir          /usr/share/php
+%php_extensiondir      %{expand:%%global php_extensiondir %(php-config --extension-dir 2>/dev/null || echo ERROR)}%php_extensiondir
+%php_sysconfdir                %{expand:%%global php_sysconfdir %(php-config --sysconfdir 2>/dev/null || echo ERROR)}%php_sysconfdir
+%php_includedir                %{expand:%%global php_includedir %(php-config --include-dir 2>/dev/null || echo ERROR)}%php_includedir
+
+# extract php/zend api versions
+%php_major_version     %{expand:%%global php_major_version %(awk '/#define PHP_MAJOR_VERSION/{print $3}' %{php_includedir}/main/php_version.h 2>/dev/null || echo ERROR)}%php_major_version
+%php_minor_version     %{expand:%%global php_minor_version %(awk '/#define PHP_MINOR_VERSION/{print $3}' %{php_includedir}/main/php_version.h 2>/dev/null || echo ERROR)}%php_minor_version
+%php_api_version       %{expand:%%global php_api_version %(awk '/#define PHP_API_VERSION/{print $3}' %{php_includedir}/main/php.h 2>/dev/null || echo ERROR)}%php_api_version
+%php_pdo_api_version   %{expand:%%global php_pdo_api_version %(awk '/#define PDO_DRIVER_API/{print $3}' %{php_includedir}/ext/pdo/php_pdo_driver.h 2>/dev/null || echo ERROR)}%php_pdo_api_version
+%php_debug             %{expand:%%global php_debug %(awk '/#define ZEND_DEBUG/{print $3}' %{php_includedir}/main/php_config.h 2>/dev/null || echo ERROR)}%php_debug
+%zend_module_api       %{expand:%%global zend_module_api %(awk '/#define ZEND_MODULE_API_NO/{print $3}' %{php_includedir}/Zend/zend_modules.h 2>/dev/null || echo ERROR)}%zend_module_api
+%zend_extension_api    %{expand:%%global zend_extension_api %(awk '/#define ZEND_EXTENSION_API_NO/{print $3}' %{php_includedir}/Zend/zend_extensions.h 2>/dev/null || echo ERROR)}%zend_extension_api
+%_zend_zts             %{expand:%%global _zend_zts %(Z=$(grep -sc '^#define ZTS 1' %{php_includedir}/main/php_config.h); echo ${Z:-ERROR})}%_zend_zts
+# "_ts" if ZTS enabled, empty otherwise
+%zend_zts              %{expand:%%global _zend_zts_%{?_zend_zts} 1}%{?_zend_zts_1:_ts}
+
+# helper macro
+%__php_api_requires() Requires: %{php_name}(%{expand:%1}) = %{expand:%{%{!?2:%{1}}%{?2}}}
+
+# macros for public use
+# for php extensions (php-pecl)
+%requires_php_extension %{__php_api_requires modules_api php_api_version} \
+%{__php_api_requires zend_module_api} \
+%{__php_api_requires debug php_debug} \
+%{__php_api_requires thread-safety _zend_zts}
+
+# for zend extensions
+%requires_zend_extension %{__php_api_requires zend_module_api} \
+%{__php_api_requires zend_extension_api} \
+%{__php_api_requires debug php_debug} \
+%{__php_api_requires thread-safety _zend_zts}
+
+# for php pdo modules (php-pecl-PDO_*)
+%requires_php_pdo_module %{__php_api_requires PDO_API php_pdo_api_version}
+
+# for using PHP post scripts. for PHP >= 5.0
+%php_webserver_restart \
+[ ! -f /etc/apache/conf.d/??_mod_php.conf ] || %service -q apache restart \
+[ ! -f /etc/httpd/conf.d/??_mod_php.conf ] || %service -q httpd restart \
+if [ -x /etc/rc.d/init.d/php-fcgi ]; then \
+       PHP_FCGI_BINARY=; . /etc/sysconfig/php-fcgi 2>/dev/null \
+       if [[ ${PHP_FCGI_BINARY:-php.fcgi} = *php.fcgi* ]]; then \
+               %service -q php-fcgi restart \
+       fi \
+fi \
+if [ -x /etc/rc.d/init.d/%{php_name}-fpm ]; then \
+       %service -q %{php_name}-fpm restart \
+fi \
+%{nil}
+
+# for using php post scripts. for PHP >= 4.0 && PHP < 5.0
+%php4_webserver_restart \
+[ ! -f /etc/apache/conf.d/??_mod_php4.conf ] || %service -q apache restart \
+[ ! -f /etc/httpd/conf.d/??_mod_php4.conf ] || %service -q httpd restart \
+if [ -x /etc/rc.d/init.d/php-fcgi ]; then \
+       PHP_FCGI_BINARY=; . /etc/sysconfig/php-fcgi 2>/dev/null \
+       if [[ ${PHP_FCGI_BINARY:-php.fcgi} = *php4.fcgi* ]]; then \
+               %service -q php-fcgi restart \
+       fi \
+fi \
+%{nil}
+
+# PEAR install macros
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#      %%pear_package_setup ...
+#
+# -a #   - also unpack SOURCE#. for PEAR bootstrapping
+# -n FMT - create builddir with FMT, instead of default %%{pearname}-%%{version}
+# -z     - unpack pear package and let pear use package.xml (not tarball) for install. for PEAR bootstrapping
+# -D     - pass -D to %setup (so the build dir is not removed)
+# -c     - register channel from local channel.xml file
+# -d     - pass -d arg to pearcmd
+#
+# unpack PEAR package to %%{_builddir}/FMT. package is extracted with already
+# destination hierarchy. you should copy the tree to buildroot after
+# patching/reorganizing with %%pear_package_install.
+#
+# additionally BUILDROOT is stripped from files and files are converted to UNIX
+# line endings.
+#
+# the pear install process output is recorded to install.log, you should put it
+# to %%doc for later debug or just for information.
+#
+# additionally additional-packages.txt is produced if it was detected that the
+# package has optional dependencies. the file format is suitable of displaying
+# in %%post of a package. you should put this file to %%doc. noautocompressdoc is
+# automatically added for this file.
+
+
+# records install.log and transforms PEAR names to TLD Linux rpm package names.
+%__pear_install_log \
+tee install.log \
+# make post message of optional packages \
+grep -E 'can optionally use|Optional feature' install.log | sed -e 's,package "pear/,package "php-pear-,g;s,^pear/,php-pear-,;s,^pear/,php-pear-,' > optional-packages.txt \
+if [ -s optional-packages.txt ]; then \
+       awk -F'"' '/use package/{print $2}' optional-packages.txt | sed -e "s,_,/,g;s,php-pear-, 'pear(,;s,$,.*)'," | tr -d '\\\n' > _noautoreq \
+else \
+       rm -f optional-packages.txt \
+fi \
+%{nil}
+
+# Command invoking PEAR CLI
+# Same as /usr/bin/pear, except we force GMT timezone
+%__pear        %__php -doutput_buffering=1 -dopen_basedir="" -dmemory_limit=-1 -ddate.timezone=GMT /usr/share/pear/pearcmd.php
+
+%pear_install(a:d:n:zD) \
+%__pear \\\
+       -c %{builddir}/pearrc \\\
+       -d doc_dir=/docs \\\
+       -d temp_dir=/tmp \\\
+       -d php_dir=%{-c:%{builddir}/}%{php_pear_dir} \\\
+       -d bin_dir=%{_bindir} \\\
+       -d data_dir=%{php_pear_dir}/data \\\
+       -d test_dir=%{php_pear_dir}/tests \\\
+       %{-d:%(echo "%{-d*}" | awk 'BEGIN{RS=","}{printf("-d %%s \\\\\\n\\t", $1)}')} \\\
+       install \\\
+       --packagingroot=%{builddir} \\\
+       --offline \\\
+       --nodeps \\\
+       %{-f:--force} \\\
+       %{!-z:%{S:%{-a*}%{!-a:0}}}%{-z:$_P} > .install.log || { c=$?; cat .install.log; exit $c; }; \
+       %{-c:cp -a %{builddir}/%{builddir}/%{php_pear_dir} %{builddir}/%(dirname %{php_pear_dir}); rm -rf %{builddir}/%{builddir}; } \
+%{nil}
+
+# The main macro.
+# using this macro will append optional-packages.txt to the nocompressdoc list
+# as it's displayed to user after package install. and adding additional gzip
+# dep is just waste ;)
+%pear_package_setup(a:d:n:zDc:) \
+%define srcdir %{-n*}%{!-n:%{?_pearname}%{!?_pearname:%{pearname}}-%{version}} \
+%define builddir %{_builddir}/%{srcdir} \
+%setup -q -c -T %{-D:-D} -n %{srcdir} \
+%{-z:%{__tar} zxf %{S:0}; %{-a:%{__tar} zxf %{S:%{-a*}}}} \
+%{-z:_P=package2.xml; [ -f $_P ] || _P=package.xml; _N=%{srcdir}; mv $_P $_N; cd $_N} \
+%{-c:%{__pear} -c pearrc config-set php_dir %{builddir}/%{php_pear_dir}; %__pear -c %{builddir}/pearrc channel-add %{-c*}} \
+%pear_install \
+%{-z:cd ..} \
+%{__tar} --wildcards -zvxf %{S:0} package*.xml \
+cat %{-z:$_N/}.install.log | %__pear_install_log \
+%undos -f php,html,js,xml \
+%{!?_noautocompressdoc:%global _noautocompressdoc %{nil}}%{expand:%%global _noautocompressdoc %{_noautocompressdoc} optional-packages.txt} \
+%{!?_noautoprov:%global _noautoprov %{nil}}%{expand:%%global _noautoprov %{_noautoprov} 'pear(tests/.*)'} \
+%{nil}
+
+# Copies extracted PEAR package structure and PEAR registry to buildroot.
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+%pear_package_install() \
+cp -a ./%{php_pear_dir}/{.registry,*} $RPM_BUILD_ROOT%{php_pear_dir} \
+# tests should not be packaged \
+%{__rm} -rf $RPM_BUILD_ROOT%{php_pear_dir}/tests \
+# cleanup backups \
+find $RPM_BUILD_ROOT%{php_pear_dir} '(' -name '*~' -o -name '*.orig' ')' | xargs -r rm -v \
+# help the developer out a little: \
+if [ -f _noautoreq ]; then \
+       echo "AutoReqdep detected:" \
+       echo "_noautoreq $(cat _noautoreq)" \
+fi \
+%{nil}
+
+# Print optional package info for pear packages
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+# Usage:
+#   %post -p <lua>
+#      %%pear_package_print_optionalpackages
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.571
+%pear_package_print_optionalpackages \
+f = io.open("%{_docdir}/%{name}-%{version}/optional-packages.txt", "r") \
+if f then \
+       for l in f:lines() do print(l); end \
+       f:close() \
+end \
+%{nil}
diff --git a/macros.python b/macros.python
new file mode 100644 (file)
index 0000000..7b67e8d
--- /dev/null
@@ -0,0 +1,185 @@
+# Python specific macro definitions.
+
+%__python              /usr/bin/python2
+
+# python main version
+%py_ver                        %{expand:%%global py_ver %(%{__python} -c "import sys; print sys.version[:3]" 2>/dev/null || echo ERROR)}%py_ver
+
+# directories
+%py_prefix             %{expand:%%global py_prefix %(%{__python} -c "import sys; print sys.prefix" 2>/dev/null || echo ERROR)}%py_prefix
+%py_libdir             %{py_prefix}/%{_lib}/python%{py_ver}
+%py_scriptdir          %{py_prefix}/share/python%{py_ver}
+%py_incdir             /usr/include/python%{py_ver}
+%py_sitedir            %{py_libdir}/site-packages
+%py_sitescriptdir      %{py_scriptdir}/site-packages
+%py_dyndir             %{py_libdir}/lib-dynload
+
+# pure python modules compilation
+%py_comp               python -c "import compileall; import sys; compileall.compile_dir(sys.argv[1], ddir=sys.argv[1][len('$RPM_BUILD_ROOT'):])"
+
+%py_ocomp              python -O -c "import compileall; import sys; compileall.compile_dir(sys.argv[1], ddir=sys.argv[1][len('$RPM_BUILD_ROOT'):])"
+
+# Software written in Python language require Python with main version
+%pyrequires_eq() Requires:     %1
+
+# Python 3.x
+# python main version
+%__python3             /usr/bin/python3
+%py3_ver               %{expand:%%global py3_ver %(%{__python3} -c "import sys; print(sys.version[:3])" 2>/dev/null || echo ERROR)}%py3_ver
+
+# directories
+%py3_prefix            %{expand:%%global py3_prefix %(%{__python3} -c "import sys; print(sys.prefix)" 2>/dev/null || echo ERROR)}%py3_prefix
+%py3_incdir            %{expand:%%global py3_incdir %(%{__python3} -c "import sysconfig; print(sysconfig.get_path('include'))" 2>/dev/null || echo ERROR)}%py3_incdir
+%py3_libdir            %{py3_prefix}/%{_lib}/python%{py3_ver}
+%py3_sitedir           %{py3_libdir}/site-packages
+%py3_sitescriptdir     %{py3_prefix}/share/python%{py3_ver}/site-packages
+%py3_dyndir            %{py3_libdir}/lib-dynload
+
+# pure python modules compilation
+%py3_comp              %{__python3} -c "import compileall; import sys; compileall.compile_dir(sys.argv[1], ddir=sys.argv[1][len('$RPM_BUILD_ROOT'):])"
+
+%py3_ocomp             %{__python3} -O -c "import compileall; import sys; compileall.compile_dir(sys.argv[1], ddir=sys.argv[1][len('$RPM_BUILD_ROOT'):])"
+
+%py_build { \
+       LDFLAGS="${LDFLAGS:-%rpmldflags}"; export LDFLAGS; \
+       CFLAGS="${CFLAGS:-%rpmcppflags %rpmcflags}"; export CFLAGS; \
+       CXXFLAGS="${CXXFLAGS:-%rpmcppflags %rpmcxxflags}"; export CXXFLAGS; \
+       %{?__cc:CC="%{__cc}"; export CC;} \
+       %{?__cxx:CXX="%{__cxx}"; export CXX;} \
+       %{__python} setup.py \
+       build --build-base=build-2 \
+}
+
+# "shrink" filter to keep this macro without newlines,
+# so it could be used as make arguments
+%py_install_opts() %{shrink: \
+       --prefix=%{_prefix} \
+       --install-purelib=%{py_sitescriptdir} \
+       --install-platlib=%{py_sitedir} \
+       --optimize=2 \
+}
+
+%py_install { \
+       LDFLAGS="${LDFLAGS:-%rpmldflags}"; export LDFLAGS; \
+       CFLAGS="${CFLAGS:-%rpmcppflags %rpmcflags}"; export CFLAGS; \
+       CXXFLAGS="${CXXFLAGS:-%rpmcppflags %rpmcxxflags}"; export CXXFLAGS; \
+       %{?__cc:CC="%{__cc}"; export CC;} \
+       %{?__cxx:CXX="%{__cxx}"; export CXX;} \
+       %{__python} setup.py \
+       build --build-base=build-2 \
+       install --skip-build \
+       %{py_install_opts} \
+       --root=$RPM_BUILD_ROOT \
+}
+
+%py3_build { \
+       LDFLAGS="${LDFLAGS:-%rpmldflags}"; export LDFLAGS; \
+       CFLAGS="${CFLAGS:-%rpmcppflags %rpmcflags}"; export CFLAGS; \
+       CXXFLAGS="${CXXFLAGS:-%rpmcppflags %rpmcxxflags}"; export CXXFLAGS; \
+       %{?__cc:CC="%{__cc}"; export CC;} \
+       %{?__cxx:CXX="%{__cxx}"; export CXX;} \
+       %{__python3} setup.py build --build-base=build-3 \
+}
+
+# "shrink" filter to keep this macro without newlines,
+# so it could be used as make arguments
+%py3_install_opts() %{shrink: \
+       --prefix=%{_prefix} \
+       --install-purelib=%{py3_sitescriptdir} \
+       --install-platlib=%{py3_sitedir} \
+       --optimize=2 \
+}
+
+%py3_install { \
+       LDFLAGS="${LDFLAGS:-%rpmldflags}"; export LDFLAGS; \
+       CFLAGS="${CFLAGS:-%rpmcppflags %rpmcflags}"; export CFLAGS; \
+       CXXFLAGS="${CXXFLAGS:-%rpmcppflags %rpmcxxflags}"; export CXXFLAGS; \
+       %{?__cc:CC="%{__cc}"; export CC;} \
+       %{?__cxx:CXX="%{__cxx}"; export CXX;} \
+       %{__python3} setup.py \
+       build --build-base=build-3 \
+       install --skip-build \
+       %{py3_install_opts} \
+       --root=$RPM_BUILD_ROOT \
+}
+
+# Hardlink binary identical .pyc and .pyo files
+%__spec_install_post_py_hardlink {\
+%{!?no_install_post_py_hardlink: __spec_install_post_py_hardlink() { \
+%{!?debug:set +x;} \
+local a b c=0 t=0 pyc=%{tmpdir}/%{name}-%{version}-%{release}__rpm_pyc; \
+if [ -d "$RPM_BUILD_ROOT" ]; then \
+       find "$RPM_BUILD_ROOT" -name '*.pyc' > $pyc; \
+       while read a; do \
+               b="${a%.pyc}.pyo"; \
+               if cmp -s "$a" "$b"; then \
+                       ln -f "$a" "$b"; \
+                       c=$((c + 1)); \
+               fi; \
+               t=$((t + 1)); \
+       done < $pyc; \
+       [ $t -gt 0 ] && printf "Hardlink Python files: %d/%d files hardlinked\n" $c $t; \
+       rm -f $pyc; \
+fi; \
+}; __spec_install_post_py_hardlink } }
+
+# Remove Python 2.x sources,
+# TLD Linux policy is to package only compiled .py[co] for Python 2.x libraries.
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+# %py_postclean /usr/share/extra -x keepme.py,keeptoo.py
+# Options:
+# -x - comma separated of file basenames to preserve (rpmbuild(macros) >= 1.658)
+# ARGS - extra directories to clean for .py sources
+#
+# BuildRequires:       rpmbuild(macros) >= 1.189
+#
+%py_postclean(x:) \
+for d in %{py_sitescriptdir} %{py_sitedir} %*; do \
+       [ ! -d "$RPM_BUILD_ROOT$d" ] || find "$RPM_BUILD_ROOT$d" -name '*.py' -print0 %{-x:| grep -ZzvE '/(%(echo '%{-x*}' | tr ',' '|'))$'} | xargs -0r -l512 rm;\
+done \
+%{nil}
+
+# Check syntax for Python files
+#
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+# Author: Arkadiusz Miśkiewicz <arekm@pld-linux.org>
+#
+# Usage:
+#   %py_lint src
+#
+# Requirements:
+# BuildRequires:       python
+# BuildRequires:       rpmbuild(macros) >= 1.602
+
+%py_lint() \
+__py_lint() { \
+%{!?debug:set +x;} \
+find "$@" -type f -name '*.py' | python -c ' \
+import sys \
+import compiler \
+\
+found = err = 0\
+for f in sys.stdin: \
+       fd = open(f.rstrip()) \
+       c = fd.read() \
+       fd.close() \
+       found = found + 1 \
+       try: \
+               compiler.parse(c) \
+       except SyntaxError, e: \
+               print "py_lint: %s: %s" % (f.rstrip(), e) \
+               err = err + 1\
+\
+if not found:\
+       print >> sys.stderr, "\\npy_lint: ERROR: No files processed.\\n" \
+       sys.exit(1) \
+elif err: \
+       print >> sys.stderr, "\\npy_lint: ERROR: Syntax errors in %d files.\\n" % err \
+       sys.exit(1) \
+else: \
+       print >> sys.stderr,  "py_lint: %d files scanned, found no syntax errors." % found \
+' \
+}; __py_lint %* \
+%{nil}
diff --git a/macros.ruby b/macros.ruby
new file mode 100644 (file)
index 0000000..e0d309a
--- /dev/null
@@ -0,0 +1,46 @@
+# Ruby specific macro definitions.
+
+%__ruby                        /usr/bin/ruby
+
+# Ruby ABI version
+# NOTE: %ruby_version may be empty, depending how Ruby was built
+%ruby_abi              %{expand:%%global ruby_abi %(%{__ruby} -r rbconfig -e 'print [RbConfig::CONFIG["MAJOR"], RbConfig::CONFIG["MINOR"]].join(".")' 2>/dev/null || echo ERROR)}%ruby_abi
+
+# get rbconfig parameter
+%__ruby_rbconfig()     %(%{__ruby} -r rbconfig -e 'print RbConfig::CONFIG["%1"]' 2>/dev/null || echo ERROR)
+%__ruby_rbconfig_path()        %(%{__ruby} -r rbconfig -r pathname -e 'print Pathname(RbConfig::CONFIG["%1"]).cleanpath' 2>/dev/null || echo ERROR)
+
+%ruby_archdir          %{expand:%%global ruby_archdir %{__ruby_rbconfig_path archdir}}%ruby_archdir
+%ruby_libdir           %{expand:%%global ruby_libdir %{__ruby_rbconfig rubylibdir}}%ruby_libdir
+%ruby_ridir            %{expand:%%global ruby_ridir %(%{__ruby} -r rbconfig -e 'print File.join(RbConfig::CONFIG["datadir"], "ri", "system")' 2>/dev/null || echo ERROR)}%ruby_ridir
+%ruby_rubylibdir       %{expand:%%global ruby_rubylibdir %{__ruby_rbconfig_path rubylibdir}}%ruby_rubylibdir
+%ruby_vendorarchdir    %{expand:%%global ruby_vendorarchdir %{__ruby_rbconfig vendorarchdir}}%ruby_vendorarchdir
+%ruby_vendorlibdir     %{expand:%%global ruby_vendorlibdir %{__ruby_rbconfig_path vendorlibdir}}%ruby_vendorlibdir
+%ruby_sitearchdir      %{expand:%%global ruby_sitearchdir %{__ruby_rbconfig sitearchdir}}%ruby_sitearchdir
+%ruby_sitedir          %{expand:%%global ruby_sitedir %{__ruby_rbconfig sitedir}}%ruby_sitedir
+%ruby_sitelibdir       %{expand:%%global ruby_sitelibdir %{__ruby_rbconfig_path sitelibdir}}%ruby_sitelibdir
+%ruby_rdocdir          /usr/share/rdoc
+%ruby_vendordir                %{expand:%%global ruby_vendordir %{__ruby_rbconfig vendordir}}%ruby_vendordir
+%ruby_version          %{expand:%%global ruby_version %(r=%{__ruby_rbconfig ruby_version}; echo ${r:-%%nil})}%ruby_version
+
+%ruby_gemdir           %{expand:%%global ruby_gemdir %(%{__ruby} -r rubygems -e 'puts Gem.respond_to?(:default_dirs) ? Gem.default_dirs[:system][:gem_dir] : Gem.path.first' 2>/dev/null || echo ERROR)}%{ruby_gemdir}
+%ruby_specdir          %{ruby_gemdir}/specifications
+
+# deprecated, ruby 2.0 noarch packages are versionless and extension dependency is generated by rpm5
+%ruby_ver_requires_eq          %{nil}
+%ruby_mod_ver_requires_eq      %{nil}
+
+%__gem_helper %{_usrlibrpm}/gem_helper.rb
+
+%gem_build(f:j:) \
+       %__gem_helper build \\\
+       %{-f:-f%{-f*}} \\\
+       %{!-j:%{_smp_mflags}}%{-j:-j%{-j*}}
+
+%gem_install(i:n:C) \
+       DESTDIR=${DESTDIR:-%{buildroot}} \\\
+       %__gem_helper install \\\
+       --env-shebang --rdoc --ri --force --ignore-dependencies \\\
+       %{!-i:--install-dir %{buildroot}%{ruby_gemdir}}%{-i:--install-dir %{-i*}} \\\
+       %{!-n:--bindir %{buildroot}%{_bindir}}%{-n:--bindir%{-n*}} \\\
+       %{!-C:--fix-permissions}
diff --git a/macros.systemd b/macros.systemd
new file mode 100644 (file)
index 0000000..8eb65cf
--- /dev/null
@@ -0,0 +1,17 @@
+# Disable all systemd related macros
+
+%systemd_reload %{nil}
+%systemd_service_enable %{nil}
+%systemd_service_disable %{nil}
+%systemd_service %{nil}
+%systemd_service_start %{nil}
+%systemd_service_stop %{nil}
+%systemd_service_restart %{nil}
+%systemd_service_reload %{nil}
+%systemd_trigger %{nil}
+%systemd_post %{nil}
+%systemd_preun %{nil}
+%systemdunitdir %{nil}
+%systemduserunitdir %{nil}
+%systemdtmpfilesdir %{nil}
+%journal_catalog_update %{nil}
diff --git a/macros.tcl b/macros.tcl
new file mode 100644 (file)
index 0000000..5f784d1
--- /dev/null
@@ -0,0 +1,7 @@
+# TCL specific macro definitions.
+
+%__tclsh       /usr/bin/tclsh
+
+%tcl_version   %{expand:%%global tcl_version %(echo 'puts $tcl_version' | %{__tclsh})}%tcl_version
+%tcl_sitearch  %{_libdir}/tcl%{tcl_version}
+%tcl_sitelib   %{_datadir}/tcl%{tcl_version}
diff --git a/macros.tld b/macros.tld
new file mode 100644 (file)
index 0000000..5f218ad
--- /dev/null
@@ -0,0 +1,1415 @@
+# vim:ts=4 sw=4 noet ft=spec
+#
+# TLD Linux rpm macros.
+# <https://www.tld-linux.org/>
+
+# can be used by builder script to check for version
+%rpm_build_macros      {Revision}
+
+%epoch         0
+%x8664         x86_64 amd64 ia32e
+
+# compiler version
+%cc_version    %{expand:%%global cc_version %(%{__cc} -dumpversion 2>/dev/null || echo 0.0)}%cc_version
+%cxx_version   %{expand:%%global cxx_version %(%{__cxx} -dumpversion 2>/dev/null || echo 0.0)}%cxx_version
+
+%__rm          /bin/rm --interactive=never
+
+# Build system path macros.
+%__autoconf    autoconf %{?debug:-Wall}
+%__automake    automake -a -c -f --foreign
+%__autopoint   autopoint --force
+
+# add parallel build flags: -jN
+# jobs macro is available since 1.657
+#
+# if you want to disable parallel build do:
+# echo '%__jobs %{nil}' >> ~/.rpmmacros
+%__jobs                %{expand:%%global __jobs %(_NCPUS=$(/usr/bin/getconf _NPROCESSORS_ONLN); [ "$_NCPUS" -gt 3 ] && echo $(($_NCPUS / 2)))%%{nil}}%__jobs
+
+# expands to -jN if %__jobs has a value
+%_smp_mflags   %{expand:%%global _smp_mflags %(jobs=%{__jobs}; echo ${jobs:+-j$jobs}%%{nil})}%_smp_mflags
+
+%__make                /usr/bin/make %{?_make_opts} %{?_smp_mflags}
+%__scons       /usr/bin/scons %{?_smp_mflags}
+%__waf         /usr/bin/waf %{?_smp_mflags}
+%__cmake       /usr/bin/cmake -Wno-dev
+%__meson       /usr/bin/meson
+%__meson_wrap_mode     nodownload
+%__ninja       /usr/bin/ninja
+%__ninja_common_opts   -v %{?_smp_mflags}
+
+%__gettextize { \
+       gettextize --copy --force --no-changelog; \
+       if [ ! -f po/Makevars ]; then \
+               cp -f po/Makevars{.template,}; \
+       fi; \
+}
+
+%__glib_gettextize     glib-gettextize --copy --force
+%__gnome_doc_common    gnome-doc-common --copy
+%__gnome_doc_prepare   gnome-doc-prepare --copy --force
+%__gtkdocize           gtkdocize --copy
+%__intltoolize         intltoolize --copy --force
+%__libtoolize          libtoolize --copy --force --install
+
+# topdir is where builder script lives,
+# fallback to old style if SPECS/SOURCES dirs were found.
+%_topdir    %{expand:%%global _topdir %(
+       if [ -d SPECS -a -d SOURCES ]; then
+               # old style rpmdir: in topdir
+               pwd
+       elif [ -d ../SPECS -a -d ../SOURCES ]; then
+               # old style rpmdir: in subdir
+               cd ..; pwd
+       elif [ -d $HOME/rpm/SPECS -a -d $HOME/rpm/SOURCES ]; then \
+               # if old style rpm dir exist, go with it
+               echo $HOME/rpm; \
+       elif [ -x ../builder -a ! -d ../builder ]; then
+               # relative new style rpmdir: in package dir
+               cd ..; pwd
+       elif [ -x builder -a ! -d builder ]; then
+               # relative new style rpmdir: in packages
+               pwd
+       elif [ -x packages/builder -a ! -d packages/builder ]; then
+               # relative new style rpmdir: packages dir in current dir
+               cd packages; pwd
+       else
+               # fallback to new style rpmdir
+               echo $HOME/rpm/packages
+       fi; \
+)}%_topdir
+
+# if %{_topdir}/SPECS exists, it's old style structure
+%_specdir              %{expand:%%global _specdir %([ ! -d %{_topdir}/SPECS ] && echo %{_topdir}/%{name} || echo %{_topdir}/SPECS)}%_specdir
+%_sourcedir            %{expand:%%global _sourcedir %([ ! -d %{_topdir}/SOURCES ] && echo %{_specdir} || echo %{_topdir}/SOURCES)}%_sourcedir
+
+# BUILD/RPMS/SRPMS are on same level by default as packages dir, if these exist
+# if they don't exist assume we are having custom topdir (which is not named as
+# "packages", i.e ~/rpm/kde/{kdelibs,BUILD/RPMS/SRPMS})
+# NOTE: readlink fails if some parent dir is not readable (/home/services/builder for example can't read /home/services), therefore the extra echo
+%_builddir             %{expand:%%global _builddir %(if [ -d %{_topdir}/BUILD ]; then echo %{_topdir}/BUILD; else readlink -m %{_topdir}/../BUILD || echo %{_topdir}/../BUILD; fi)}%_builddir
+%_rpmdir               %{expand:%%global _rpmdir %(if [ -d %{_topdir}/RPMS ]; then echo %{_topdir}/RPMS; else readlink -m %{_topdir}/../RPMS || echo readlink -m %{_topdir}/../RPMS; fi)}%_rpmdir
+%_srcrpmdir            %{expand:%%global _srcrpmdir %(if [ -d %{_topdir}/SRPMS ]; then echo %{_topdir}/SRPMS; else readlink -m %{_topdir}/../SRPMS || echo readlink -m %{_topdir}/../SRPMS; fi)}%_srcrpmdir
+
+#      The number of cvs changelog entries kept when building package.
+%_buildchangelogtruncate 20
+
+%dependencytracking    %{nil}
+
+#      Relations between package names that cause dependency loops
+#      with legacy packages that cannot be fixed. Relations are
+#      specified as
+#              p>q
+#      where package p has a Requires: on something that package q Provides:
+#
+# XXX  Note: that there cannot be any whitespace within the string "p>q",
+#      and that both p and q are package names (i.e. no version/release).
+%_dependency_whiteout  %{nil}
+
+#-----------------------------------------------------------------
+#
+# (re)definition of %{rpm*flags} with %filterout_* support
+# BuildRequires:       awk
+# BuildRequires:       rpmbuild(macros) >= 1.315
+#
+# Flags specified in %filterout_* are removed from %rpm*flags, exactly:
+# %rpmcflags    = %optflags - %filterout - %filterout_c   - %filterout_ld
+# %rpmcxxflags  = %optflags - %filterout - %filterout_cxx - %filterout_ld
+# %rpmcppflags  = %optcppflags - %filterout - %filterout_cpp - %filterout_ld
+# %rpmldflags   = %optldflags - %filterout_ld
+#
+# Regular expressions are supported, but to avoid some character be treated
+# as regular expression it must be escaped twice.
+
+%filter_out                                                    \
+       for (i = 1; i in I; i++) { A=0; \
+               for (f in F) {                          \
+                       if (I[i] ~ "^" F[f] "$") A=1;   \
+               };                                                      \
+               if (!A) printf(I[i] FS);        \
+       }
+
+%rpmcflags %(awk 'BEGIN {
+       split("%{?debug:%debugcflags}%{!?debug:%optflags}%{?debuginfocflags}",I);
+       split("%{?filterout} %{?filterout_c} %{?filterout_ld}",F);
+       %{filter_out}
+}')
+
+%rpmcxxflags %(awk 'BEGIN {
+       split("%{?debug:%debugcflags}%{!?debug:%optflags}%{?debuginfocflags}",I);
+       split("%{?filterout} %{?filterout_cxx} %{?filterout_ld}",F);
+       %{filter_out}
+}')
+
+%rpmcppflags %(awk 'BEGIN {
+       split("%{?debug:%debugcppflags}%{!?debug:%optcppflags}%{?debuginfocppflags}",I);
+       split("%{?filterout} %{?filterout_cpp} %{?filterout_cpp}",F);
+       %{filter_out}
+}')
+
+%rpmldflags %(awk 'BEGIN {
+       split("%{?optldflags}",I);
+       split("%{?filterout_ld}",F)
+       %{filter_out}
+}')
+
+# rpmldflags with stripped -Wl, -- in the form flags have to be passed to 'ld'
+# but, don't use it, better use gcc as linker
+%ld_rpmldflags %(awk 'BEGIN {
+        split("%{rpmldflags}",F);
+        for (f in F) {
+                s = F[f];
+                if (s ~ /^-Wl,/) {
+                        s = substr(s,5);
+                        gsub(/,/," ",s);
+                };
+                printf(s FS);
+        };
+}')
+
+#-----------------------------------------------------------------
+#
+#  Generate a command which cleans environment, leaving only the
+# most important variables.
+#  If any spec requires any additional environment it should
+# redefine %_preserve_env in following manner:
+#
+#      # ADDITIONAL_VAR is required because [a good reason here]
+#      %define _preserve_env ADDITIONAL_VAR
+
+%_preserve_env_base    PATH HOME TMP TMPDIR SSH_AUTH_SOCK
+
+# "env -i" must end in first line of expaned macros because it's used as first line of shell script (#! env...)
+%_clean_env env -i %(awk -vq="'" -vqq="\\"'\\"" -vq2q="'\\"'" 'BEGIN {
+       split("%{?_preserve_env:%_preserve_env %_preserve_env_base}%{!?_preserve_env:%_preserve_env_base}", P);
+       for (i in P) {
+               p = P[i];
+               if (!ENVIRON[p] || d[p]) {
+                       continue;
+               }
+               d[p] = 1;
+               split(ENVIRON[p], V, "");
+               val = p "=";
+               for (j = 1; j in V; j++) {
+                       v = V[j];
+                       if (v == q)
+                               v = qq;
+                       else if (v == "\\"")
+                               v = q2q;
+                       else if (v == "\\\\")
+                               v = "\\\\\\\\";
+                       else
+                               gsub("[^a-zA-Z0-9/:._-]", "\\"&\\"", v);
+                       val = val "" v;
+               }
+               printf(val " ");
+       }
+}')
+
+# override %__spec_build_pre and %__spec_install_pre from macros.rpmbuild
+# adding %{_clean_env}
+%__spec_build_pre      %{_clean_env}\
+%{___build_pre}\
+%{nil}
+%__spec_install_pre    %{_clean_env}\
+%{___build_pre}\
+%{?buildroot:%{__rm} -rf '%{buildroot}'; %{__mkdir_p} '%{buildroot}'}\
+%{nil}
+
+#-----------------------------------------------------------------
+%configure2_13 { \
+ if [ -n "$LINGUAS" ]; then unset LINGUAS; fi; \
+ LDFLAGS="${LDFLAGS:-%rpmldflags}" ; export LDFLAGS ; \
+ CFLAGS="${CFLAGS:-%rpmcflags}" ; export CFLAGS ; \
+ CXXFLAGS="${CXXFLAGS:-%rpmcxxflags}" ; export CXXFLAGS ; \
+ FFLAGS="${FFLAGS:-%rpmcflags}" ; export FFLAGS ; \
+ FCFLAGS="${FCFLAGS:-%rpmcflags}" ; export FCFLAGS ; \
+ CPPFLAGS="${CPPFLAGS:-%rpmcppflags}" ; export CPPFLAGS ; \
+ %{?__cc:CC="%{__cc}" ; export CC ; } \
+ %{?__cxx:CXX="%{__cxx}" ; export CXX ; } \
+ %{?configuredir:%{configuredir}}%{!?configuredir:.}/configure \
+       --host=%{_target_platform} \
+       --prefix=%{_prefix} \
+       --exec-prefix=%{_exec_prefix} \
+       --bindir=%{_bindir} \
+       --sbindir=%{_sbindir} \
+       --sysconfdir=%{_sysconfdir} \
+       --datadir=%{_datadir} \
+       --includedir=%{_includedir} \
+       --libdir=%{_libdir} \
+       --libexecdir=%{_libexecdir} \
+       --localstatedir=%{_localstatedir} \
+       --sharedstatedir=%{_sharedstatedir} \
+       --mandir=%{_mandir} \
+       --infodir=%{_infodir} \
+       --x-libraries=%{?_x_libraries}%{!?_x_libraries:%{_libdir}} \
+       %{dependencytracking} \
+}
+
+# Note: pass only standard cmake macros here.
+# The only exception is SYSCONF_INSTALL_DIR, used commonly in KDE packages,
+# where the default (${CMAKE_INSTALL_PREFIX}/etc) is not FHS-compliant and
+# absolute path MUST be used to comply with FHS.
+# The other non-standard cmake macros used commonly in KDE
+# (INCLUDE_INSTALL_DIR, LIB_INSTALL_DIR, SHARE_INSTALL_PREFIX)
+# have sane default values in KDE, and some packages use these names
+# in different way (e.g. expect them to be always relative or always
+# absolute).
+%cmake \
+%{?__cc:CC="${CC:-%{__cc}}"} \\\
+%{?__cxx:CXX="${CXX:-%{__cxx}}"} \\\
+CPPFLAGS="${CPPFLAGS:-%{rpmcppflags}}" \\\
+%{__cmake} \\\
+       -DCMAKE_VERBOSE_MAKEFILE=ON \\\
+       -DCMAKE_BUILD_TYPE=%{!?debug:TLD}%{?debug:Debug} \\\
+       -DCMAKE_INSTALL_BINDIR:PATH=%{_bindir} \\\
+       -DCMAKE_INSTALL_SBINDIR:PATH=%{_sbindir} \\\
+       -DCMAKE_INSTALL_LIBEXECDIR:PATH=%{_libexecdir} \\\
+       -DCMAKE_INSTALL_SYSCONFDIR:PATH=%{_sysconfdir} \\\
+       -DCMAKE_INSTALL_SHAREDSTATEDIRPATH:PATH=%{_sharedstatedir} \\\
+       -DCMAKE_INSTALL_LOCALSTATEDIRPATH:PATH=%{_localstatedir} \\\
+       -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} \\\
+       -DCMAKE_INSTALL_INCLUDEDIR:PATH=%{_includedir} \\\
+       -DCMAKE_INSTALL_OLDINCLUDEDIR:PATH=%{_includedir} \\\
+       -DCMAKE_INSTALL_DATAROOTDIR:PATH=%{_datadir} \\\
+       -DCMAKE_INSTALL_DATADIR:PATH=%{_datadir} \\\
+       -DCMAKE_INSTALL_INFODIR:PATH=%{_infodir} \\\
+       -DCMAKE_INSTALL_LOCALEDIR:PATH=%{_localedir} \\\
+       -DCMAKE_INSTALL_MANDIR:PATH=%{_mandir} \\\
+       -DCMAKE_INSTALL_DOCDIR:PATH=%{_docdir} \\\
+       -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \\\
+       -DSYSCONF_INSTALL_DIR:PATH=%{_sysconfdir} \\\
+       -DCMAKE_CXX_FLAGS_TLD="${CXXFLAGS:-%{rpmcxxflags} -DNDEBUG -DQT_NO_DEBUG}" \\\
+       -DCMAKE_C_FLAGS_TLD="${CFLAGS:-%{rpmcflags} -DNDEBUG -DQT_NO_DEBUG}" \\\
+       -DCMAKE_Fortran_FLAGS_TLD="${CFLAGS:-%{rpmcflags} -DNDEBUG -DQT_NO_DEBUG}" \\\
+       -DCMAKE_EXE_LINKER_FLAGS_TLD="${LDFLAGS:-%{rpmldflags}}" \\\
+       -DCMAKE_SHARED_LINKER_FLAGS_TLD="${LDFLAGS:-%{rpmldflags}}" \\\
+       -DCMAKE_MODULE_LINKER_FLAGS_TLD="${LDFLAGS:-%{rpmldflags}}" \\\
+%if "%{_lib}" == "lib64" \
+       -DLIB_SUFFIX=64 \\\
+%endif \
+%if "%{_lib}" == "libx32" \
+       -DLIB_SUFFIX=x32 \\\
+%endif \
+       -DBUILD_SHARED_LIBS:BOOL=ON \\\
+%{nil}
+
+%scons { \
+%{__scons} \
+       LDFLAGS="${LDFLAGS:-%rpmldflags}" \
+       CFLAGS="${CFLAGS:-%rpmcflags}" \
+       CXXFLAGS="${CXXFLAGS:-%rpmcxxflags}" \
+       FFLAGS="${FFLAGS:-%rpmcflags}" \
+       CPPFLAGS="${CPPFLAGS:-%rpmcppflags}" \
+       %{?__cc:CC="%{__cc}"} \
+       %{?__cxx:CXX="%{__cxx}"} \
+       libsuffix=%{_lib} \
+       prefix=%{_prefix} \
+}
+
+# waf. see waf.spec
+%waf { \
+CC="%{__cc}" \
+CXX="%{__cxx}" \
+CPP="%{__cpp}" \
+CFLAGS="%{rpmcflags}" \
+CXXFLAGS="%{rpmcxxflags}" \
+LINKFLAGS="%{rpmldflags}" \
+%{__waf} \
+}
+
+# meson
+%meson { \
+%{?__cc:CC="${CC:-%{__cc}}"} \
+%{?__cxx:CXX="${CXX:-%{__cxx}}"} \
+CFLAGS="${CFLAGS:-%{rpmcflags}}" \
+CPPFLAGS="${CPPFLAGS:-%{rpmcppflags}}" \
+CXXFLAGS="${CXXFLAGS:-%{rpmcxxflags}}" \
+LDFLAGS="${LDFLAGS:-%{rpmldflags}}" \
+LC_ALL=C.UTF-8 %{__meson} \
+       --buildtype=plain \
+       --bindir=%{_bindir} \
+       --datadir=%{_datadir} \
+       --includedir=%{_includedir} \
+       --infodir=%{_infodir} \
+       --libdir=%{_libdir} \
+       --libexecdir=%{_libexecdir} \
+       --localedir=%{_localedir} \
+       --localstatedir=%{_localstatedir} \
+       --mandir=%{_mandir} \
+       --prefix=%{_prefix} \
+       --sbindir=%{_sbindir} \
+       --sharedstatedir=%{_sharedstatedir} \
+       --sysconfdir=%{_sysconfdir} \
+       --wrap-mode=%{__meson_wrap_mode} \
+       --default-library='both' \
+}
+
+%___meson_deprecate() {echo >&2 "DEPRECATED: %%%1 must be replaced with %%%2"; %{expand:%%%2} }
+%meson_build %___meson_deprecate meson_build ninja_build
+%meson_install %___meson_deprecate meson_install ninja_install
+%meson_test %___meson_deprecate meson_test ninja_test
+
+# ninja
+%ninja_build LC_ALL=C.UTF-8 %{__ninja} %{__ninja_common_opts}
+%ninja_install LC_ALL=C.UTF-8 DESTDIR=%{buildroot} %{__ninja} install %{__ninja_common_opts}
+%ninja_test LC_ALL=C.UTF-8 %{__ninja} test %{__ninja_common_opts}
+
+#----------------------------------------------------------------
+#%configure_cache 0
+%configure_cache_file  %{buildroot}.configure.cache
+
+%configure {./configure \
+       LDFLAGS="${LDFLAGS:-%rpmldflags}" \
+       CFLAGS="${CFLAGS:-%rpmcflags}" \
+       CXXFLAGS="${CXXFLAGS:-%rpmcxxflags}" \
+       FFLAGS="${FFLAGS:-%rpmcflags}" \
+       FCFLAGS="${FCFLAGS:-%rpmcflags}" \
+       CPPFLAGS="${CPPFLAGS:-%rpmcppflags}" \
+       %{?__cc:CC="%{__cc}"} \
+       %{?__cxx:CXX="%{__cxx}"} \
+       --host=%{_target_platform} \
+       --build=%{_target_platform} \
+       --prefix=%{_prefix} \
+       --exec-prefix=%{_exec_prefix} \
+       --bindir=%{_bindir} \
+       --sbindir=%{_sbindir} \
+       --sysconfdir=%{_sysconfdir} \
+       --datadir=%{_datadir} \
+       --includedir=%{_includedir} \
+       --libdir=%{_libdir} \
+       --libexecdir=%{_libexecdir} \
+       --localstatedir=%{_localstatedir} \
+       --sharedstatedir=%{_sharedstatedir} \
+       --mandir=%{_mandir} \
+       --infodir=%{_infodir} \
+       --x-libraries=%{?_x_libraries}%{!?_x_libraries:%{_libdir}} \
+       %{dependencytracking} \
+       %{?configure_cache:--cache-file=%{configure_cache_file}} \
+}
+
+# Simple macros to simplify adding bconded options to configure scripts.
+#   Each macro requires bcond name and accepts optional option name, if option
+# isn't specified bcond name is used as option name. Options returning
+# --with and --enable also allow third argument which will be added as value
+# ( --with-option=value or --enable-option=value ) in case or positive
+# condition, but won't be added otherwise ( nothing or just --disable-option ).
+
+# Requirements:
+# BuildRequires: rpmbuild(macros) >= 1.527
+
+# Usage example:
+# %{__enable bcond} - returns --enable-bcond iff build condition is set
+# %{__disable bcond option} - returns --enable-option iff bcond is not set
+# %{__enable_disable bcond option value} - returns --enable-option=value if
+#    bcond is set, returns --disable-option otherwise
+
+# expand bconds to --enable-something and --disable-something
+%__enable() %{expand:%%{?with_%{1}:--enable-%{?2}%{!?2:%{1}}%{?3:=%{3}}}}
+%__disable() %{expand:%%{!?with_%{1}:--disable-%{?2}%{!?2:%{1}}}}
+%__enable_disable() %{expand:%%{?with_%{1}:--enable-%{?2}%{!?2:%{1}}%{?3:=%{3}}}%%{!?with_%{1}:--disable-%{?2}%{!?2:%{1}}}}
+
+# same as above, but condition inverted
+%__enable_unless() %{expand:%%{!?with_%{1}:--enable-%{?2}%{!?2:%{1}}%{?3:=%{3}}}}
+%__disable_if() %{expand:%%{?with_%{1}:--disable-%{?2}%{!?2:%{1}}}}
+%__enable_disable_not() %{expand:%%{!?with_%{1}:--enable-%{?2}%{!?2:%{1}}%{?3:=%{3}}}%%{?with_%{1}:--disable-%{?2}%{!?2:%{1}}}}
+
+# expand bconds to --with-something and --without-something
+%__with() %{expand:%%{?with_%{1}:--with-%{?2}%{!?2:%{1}}%{?3:=%{3}}}}
+%__without() %{expand:%%{!?with_%{1}:--without-%{?2}%{!?2:%{1}}}}
+%__with_without() %{expand:%%{?with_%{1}:--with-%{?2}%{!?2:%{1}}%{?3:=%{3}}}%%{!?with_%{1}:--without-%{?2}%{!?2:%{1}}}}
+
+# same as above, but condition inverted
+%__with_unless() %{expand:%%{!?with_%{1}:--with-%{?2}%{!?2:%{1}}%{?3:=%{3}}}}
+%__without_if() %{expand:%%{?with_%{1}:--without-%{?2}%{!?2:%{1}}}}
+%__with_without_not() %{expand:%%{!?with_%{1}:--with-%{?2}%{!?2:%{1}}%{?3:=%{3}}}%%{?with_%{1}:--without-%{?2}%{!?2:%{1}}}}
+
+# expands to true or false based on bcond; for use with meson or cmake
+%__true_false() %{expand:%%{?with_%{1}:true}%%{!?with_%{1}:false}}
+%__true_false_not() %{expand:%%{?with_%{1}:false}%%{!?with_%{1}:true}}
+
+# for use with cmake:
+# Usage: cmake_on_off BCOND_NAME [OPTION_NAME]
+# BuildRequires: rpmbuild(macros) >= 1.742
+%cmake_on_off() -D%{?2}%{!?2:%{1}}:BOOL=%{expand:%%{?with_%{1}:ON}%%{!?with_%{1}:OFF}}
+
+#-----------------------------------------------------------------
+
+# overload to insert debuginfo package
+%prep \
+%if 0%{?_enable_debug_packages}\
+%{debug_package}\
+%endif\
+%%prep\
+%{nil}
+
+# Location of autoconf macros
+%_aclocaldir   %{expand:%%global _aclocaldir %(aclocal --print-ac-dir 2>/dev/null || echo ERROR)}%_aclocaldir
+
+# Location of omf files
+%_omf_dest_dir %{expand:%%global _omf_dest_dir %(scrollkeeper-config --omfdir || echo ERROR)}%_omf_dest_dir
+
+# Location of pkgconfig files
+%_pkgconfigdir /usr/%{_lib}/pkgconfig
+# noarch pkgconfig files
+%_npkgconfigdir        /usr/share/pkgconfig
+
+# Location of desktop files
+%_desktopdir   /usr/share/applications
+%_applnkdir    ERROR:_applnkdir_is_obsolete_use_desktopdir_instead
+
+# Location of pixmaps for applnk/desktop files
+%_pixmapsdir   /usr/share/pixmaps
+
+# Location of themable icons for applnk/desktop files
+%_iconsdir     /usr/share/icons
+
+# Location of fonts directories
+%_fontsdir     /usr/share/fonts
+
+# Location of Gtk and associated libraries documentation
+%_gtkdocdir    %{_defaultdocdir}/gtk-doc/html
+
+# Location of KDE documentation
+%_kdedocdir    %{_defaultdocdir}/kde/HTML
+
+# unsermake script
+%__unsermake /usr/share/unsermake/unsermake
+
+# Current date
+%date          %(LC_ALL=C date +"%a %b %d %Y")
+
+# Example files, programs, scripts...
+%_examplesdir  /usr/src/examples
+
+# SysV-style initscripts dir
+%_initddir             /etc/rc.d/init.d
+
+# If non-empty "debug" macro defined, add "dbg" suffix to release number
+%_rpmfilename          %%{NAME}-%%{VERSION}-%%{RELEASE}%{?debug:dbg}.%%{ARCH}.rpm
+
+# Bootstrap release macros.
+# Usage:
+#      %bcond_with     bootstrap
+#      Release:        %{bootstrap_release 1}
+#
+# Package will have release 1 if built normally,
+# and release 0.zzz.bootstrap if built with bootstrap
+%bootstrap_release() %{!?with_bootstrap:%{1}%{?2:.%{2}}}%{?with_bootstrap:%{!?2:%(expr %{1} - 1)}%{?2:%{1}.%(expr %{2} - 1)}.zzz.bootstrap}
+
+# Requires name = version-release
+%requires_releq()      %{!?1:ERROR}%{?2:ERROR}%{?1:%{!?2:%{expand:%%requires_eq_to -r %1 %1}}}
+# Requires: name = version
+%requires_eq()         %{!?1:ERROR}%{?2:ERROR}%{?1:%{!?2:%{expand:%%requires_eq_to %1 %1}}}
+# Requires: name = version (version based on querying package %2)
+%requires_eq_to(r)     %{!?2:ERROR}%{?3:ERROR}%{?2:%{!?3:%(if ! LC_ALL=C rpm -q --qf 'Requires: %1 = %|E?{%{E}:}|%{V}%{?-r:-%{R}}\\n' %2 | grep '^Requires:'; then echo "BuildRequires: %2"; fi)}}
+
+# Requires: name >= version
+%requires_ge()         %{!?1:ERROR}%{?2:ERROR}%{?1:%{!?2:%{expand:%%requires_ge_to %1 %1}}}
+# Requires: name >= version (version based on querying package %2)
+%requires_ge_to(r)     %{!?2:ERROR}%{?3:ERROR}%{?2:%{!?3:%(if ! LC_ALL=C rpm -q --qf 'Requires: %1 >= %|E?{%{E}:}|%{V}%{?-r:-%{R}}\\n' %2 | grep '^Requires:'; then echo "BuildRequires: %2"; fi)}}
+
+# helper for renaming packages
+# %rename old-package
+%rename() \
+Obsoletes: %{1} < %{?epoch:%{epoch}:}%{?version:%{version}}%{?release:-%{release}} \
+Provides: %{1} = %{?epoch:%{epoch}:}%{?version:%{version}}%{?release:-%{release}}
+
+%apache_modules_api %{expand:%%global apache_modules_api %(awk '/#define MODULE_MAGIC_NUMBER_MAJOR/ {print $3}' /usr/include/apache/ap_mmn.h 2>/dev/null || echo ERROR)}%apache_modules_api
+
+# sgml macros
+%xmlcat_add()          /usr/bin/xmlcatalog --noout --add nextCatalog \"\" %1 /etc/xml/catalog ;
+%xmlcat_del()          /usr/bin/xmlcatalog --noout --del %1 /etc/xml/catalog ;
+%xmlcat_add_rewrite    /usr/bin/xmlcatalog --noout --add rewriteSystem
+%xmlcat_create()       /usr/bin/xmlcatalog --noout --create %1 ;
+%sgmlcat_add()         /usr/bin/install-catalog --add %1 %2 > /dev/null ;
+%sgmlcat_del()         /usr/bin/install-catalog --remove %1 %2 > /dev/null ;
+%docbook_sgmlcat_fix() { for l in \
+'' \
+'  -- default decl --' \
+'DTDDECL "-//OASIS//DTD DocBook XML V%2//EN" "../../xml.dcl"' \
+'  -- hacks for opensp --' \
+'SYSTEM "file://%{_datadir}/sgml/docbook/xml-dtd-%2/docbookx.dtd" "%{_datadir}/sgml/docbook/xml-dtd-%2/docbookx.dtd"' \
+'SYSTEM   "http://www.oasis-open.org/docbook/xml/%2/docbookx.dtd" "%{_datadir}/sgml/docbook/xml-dtd-%2/docbookx.dtd"' \
+'' \
+; do echo $l; done >> %1 \
+}
+
+# vim - "
+
+# minimum file size needed for compressed documents.
+# just smaller files than this get larger when compressed.
+# some stats:
+# - 0 byte file compressed was 25 bytes .gz
+# - 39 byte file was compressed as 57
+# - with test/test.spec@man 158 byte file was compressed also 158
+%_min_compress_bytes   159
+
+#-----------------------------------------------------------------
+# find and gzip all files in %{_mandir} and %{infodir}
+#
+# Requires: xargs, find
+#
+#%no_install_post_compress_docs        1
+%__spec_install_post_compress_docs { \
+%{!?no_install_post_compress_docs:__spec_install_post_compress_docs() { \
+       %{!?debug:set +x;} \
+       for i in /usr/share/man /usr/X11R6/man; do \
+               if [ -d "$RPM_BUILD_ROOT$i" ]; then \
+                       echo "Compress man pages: $i"; \
+                       find "$RPM_BUILD_ROOT$i" -name '*.bz2' -print0 | xargs -0 -r %{__bzip2} -df; \
+                       find "$RPM_BUILD_ROOT$i" -name '*.gz' -print0 | xargs -0 -r %{__gzip} -dnf; \
+                       find $RPM_BUILD_ROOT$i -type l | while read a; do \
+                               m=$(readlink "$a"); \
+                               if [[ "$m" = */* ]]; then \
+                                       # handle links to different man section \
+                                       l=$(readlink -f "$a"); \
+                                       # full/relative paths that resolve symlink \
+                                       l=${l#$RPM_BUILD_ROOT/usr/share/man/}; \
+                                       l=${l#$RPM_BUILD_ROOT/usr/X11R6/man/}; \
+                                       # full paths that do not resolve symlink \
+                                       l=${l#/usr/share/man/}; \
+                                       l=${l#/usr/X11R6/man/}; \
+                               else \
+                                       l=${a#$RPM_BUILD_ROOT$i/}; \
+                                       l=${l%/*}; \
+                                       l="$l/$m"; \
+                               fi; \
+                               rm -f $a; \
+                               echo ".so $l" > $a; \
+                               echo >&2 "Converted ${a#$RPM_BUILD_ROOT} from symlink to man link: $l"; \
+                       done; \
+                       # verify that .so links point to existing files (not allowed to point to "other package") \
+                       # TODO: iterate over all man dirs, but in Th there is only one true man dir \
+                       err=$(grep -rl '^\.so ' "$RPM_BUILD_ROOT$i" | while read doc; do \
+                               l=$(grep -r '^\.so ' "$doc"); \
+                               l=${l#.so }; \
+                               d=$(dirname $doc); \
+                               test -e $RPM_BUILD_ROOT$i/$l || test -e $d/$(basename $l) || echo "  ${doc#$RPM_BUILD_ROOT} points to inexistent manpage: $l"; \
+                       done); \
+                       test "$err" != "" && { echo >&2 "Man page link errors:"; echo >&2 "$err"; exit 1; }; \
+                       find "$RPM_BUILD_ROOT$i" -type f -size +%{_min_compress_bytes}c -print0 | xargs -0 -r %{__gzip} -9nf; \
+               fi; \
+       done; \
+       if [ -d "$RPM_BUILD_ROOT%{_infodir}" ]; then \
+               echo "Compress info pages: %{_infodir}"; \
+               find "$RPM_BUILD_ROOT%{_infodir}" -name '*.bz2' -print0 | xargs -0 -r %{__bzip2} -df; \
+               find "$RPM_BUILD_ROOT%{_infodir}" -name '*.gz' -print0 | xargs -0 -r %{__gzip} -dnf; \
+               find "$RPM_BUILD_ROOT%{_infodir}" -name '*.info*' -type f -size +%{_min_compress_bytes}c -print0 | xargs -0 -r %{__gzip} -9nf; \
+       fi; \
+}; __spec_install_post_compress_docs } }
+
+#-----------------------------------------------------------------
+# Strip executable binaries and shared object files
+#
+# Requires: find, awk, strip, cut, xargs
+#
+# Special macros which affect this process:
+#%no_install_post_strip        1               # disable stripping at all
+#%_noautostrip                 regexp  # exclude files matching (anchored!) regex from stripping
+#%_autostripall                        regexp  # strip files matching (anchored!) regex using plain strip
+#%_autostripunneeded   regexp  # strip files matching (anchored!) regex using strip --strip-unneeded
+#%_autostripdebug              regexp  # strip files matching (anchored!) regex using strip --strip-debug
+#
+%__spec_install_post_strip {%{!?debug: \
+%{!?no_install_post_strip:__spec_install_post_strip() { \
+%{!?debug:set +x;} \
+if [ -d "$RPM_BUILD_ROOT" ]; then \
+       if [ -d $RPM_BUILD_ROOT/lib/modules ]; then \
+               modulelist=$(find $RPM_BUILD_ROOT/lib/modules \( -name '*.o' -o -name '*.ko' \) -type f -print); \
+               if [ "$modulelist" ]; then \
+                       modulecount=$(echo "$modulelist" | wc -l); \
+                       printf "Stripping %d kernel modules..." $modulecount; \
+                       echo "$modulelist" | xargs -l512 chmod u+w; \
+                       echo "$modulelist" | xargs -l512 %{__strip} -g --remove-section=.comment --remove-section=.note.GNU-stack; \
+                       echo "DONE"; \
+               fi; \
+       fi; \
+       filelist=$(find $RPM_BUILD_ROOT -type f ! -regex ".*/usr/lib[x0-9]*/debug/.*\.debug" ! -regex ".*/usr/lib[x0-9]*.*/guile/.*\.go" ! -regex ".*/lib/modules/.*" ! -regex ".*%{_docdir}/.*" ! -regex ".*%{_includedir}/.*" %{?_noautostrip:! -regex "%{_noautostrip}"} %{?_autostripall:! -regex "%{_autostripall}"} %{?_autostripunneeded:! -regex "%{_autostripunneeded}"} %{?_autostripdebug:! -regex "%{_autostripdebug}"}); \
+       if [ -n "$filelist" ]; then \
+               filetypes=`echo "$filelist" | xargs -r -d'\\n' file`; \
+               elfexelist=`echo "$filetypes" | awk -F: '/ELF.*executable/ {print $1}'`; \
+               elfsharedlist=`echo "$filetypes" | awk -F: '/LF.*shared object/ {print $1}'`; \
+               archiveslist=`echo "$filetypes" | awk -F: '/current ar archive/ {print $1}'`; \
+               if [ -n "$elfexelist" ]; then \
+                       printf "Stripping %d ELF executables..." $(echo "$elfexelist" | wc -l); \
+                       echo "$elfexelist" | xargs -r -d'\n' chmod u+w; \
+                       echo "$elfexelist" | xargs -r -d'\n' %{__strip} --remove-section=.note --remove-section=.comment; \
+                       echo "DONE"; \
+               fi; \
+               if [ -n "$elfsharedlist" ]; then \
+                       printf "Stripping %d ELF shared libraries..." $(echo "$elfsharedlist" | wc -l); \
+                       echo "$elfsharedlist" | xargs -r -d'\n' chmod u+w; \
+                       echo "$elfsharedlist" | xargs -r -d'\n' %{__strip} --strip-unneeded --remove-section=.note --remove-section=.comment; \
+                       echo "DONE"; \
+               fi; \
+               if [ -n "$archiveslist" ]; then \
+                       printf "Stripping %d ar archives..." $(echo "$archiveslist" | wc -l); \
+                       echo "$archiveslist" | xargs -r -d'\n' chmod u+w; \
+                       echo "$archiveslist" | xargs -r -d'\n' %{__strip} --strip-debug --remove-section=.note --remove-section=.comment; \
+                       echo "DONE"; \
+               fi; \
+       fi; \
+    filelist_all=%{?_autostripall:$(find $RPM_BUILD_ROOT -type f -regex "%{_autostripall}")}; \
+    filelist_unneeded=%{?_autostripunneeded:$(find $RPM_BUILD_ROOT -type f -regex "%{_autostripunneeded}")}; \
+    filelist_debug=%{?_autostripdebug:$(find $RPM_BUILD_ROOT -type f -regex "%{_autostripdebug}")}; \
+       if [ -n "$filelist_all" ]; then \
+               printf "Stripping everything from %d additional files..." $(echo "$filelist_all" | wc -l); \
+               chmod u+w $filelist_all; \
+               %{__strip} --remove-section=.note --remove-section=.comment $filelist_all; \
+               echo "DONE"; \
+       fi; \
+       if [ -n "$filelist_unneeded" ]; then \
+               printf "Stripping unneeded from %d additional files..." $(echo "$filelist_unneeded" | wc -l); \
+               chmod u+w $filelist_unneeded; \
+               %{__strip} --strip-unneeded --remove-section=.note --remove-section=.comment $filelist_unneeded; \
+               echo "DONE"; \
+       fi; \
+       if [ -n "$filelist_debug" ]; then \
+               printf "Stripping debuginfo from %d additional files..." $(echo "$filelist_debug" | wc -l); \
+               chmod u+w $filelist_debug; \
+               %{__strip} --strip-debug --remove-section=.note --remove-section=.comment $filelist_debug; \
+               echo "DONE"; \
+       fi; \
+fi; }; __spec_install_post_strip } } }
+
+#-----------------------------------------------------------------
+# remove all RPATH/RUNPATH from executable binaries and shared object files
+#
+# Requires: find, awk, cut, xargs, chrpath, uname
+#
+# Special macros which affect this process
+#%no_install_post_chrpath      1       # disable chrpath at all
+#%_noautochrpath       regex           # exclude files matching (anchored!) regex from chrpath
+#
+%__spec_install_post_chrpath {%{!?debug: \
+%{!?no_install_post_chrpath: __spec_install_post_chrpath() { \
+%{!?debug:set +x;} \
+if [ -d "$RPM_BUILD_ROOT" ]; then \
+       files=`find $RPM_BUILD_ROOT -type f ! -regex ".*ld-[0-9.]*so.*" ! -regex ".*/usr/lib[0-9]*/debug/.*" ! -regex ".*/lib/modules/.*" ! -regex ".*%{_docdir}/.*" ! -regex ".*%{_includedir}/.*" %{?_noautochrpath:! -regex "%{_noautochrpath}"}`; \
+       if [ -n "$files" ]; then \
+               objs=`echo "$files" | xargs -r -d'\\n' file | awk -F: '/ELF.*(executable.*dynamically linked|shared object)/ {print $1}'`; \
+       fi; \
+       if [ -n "$objs" ]; then \
+               printf "Remove RPATH/RUNPATH from %d executable binaries and shared object files.\n" $(echo "$objs" | wc -l); \
+               echo "$objs" | \
+               while read file; do \
+                       rpath= ; \
+                       chmod u+w "$file"; \
+                       for dir in $(chrpath -l "$file" | awk '/(R|RUN)PATH=/ { gsub(/.*RPATH=/,""); gsub(/.*RUNPATH=/,""); gsub(/:/," "); print $0 }'); do \
+                                       case $dir in \
+                                       '$ORIGIN' ) \
+                                               if [ "$rpath" = "" ] ; then rpath="$dir" ; \
+                                               else rpath="$rpath:$dir" ; fi ; \
+                                               continue ; \
+                                               ;; \
+                                       esac ; \
+                                       newdir=$(readlink -m "$dir"); \
+                                       [ ${#newdir} -le ${#dir} ] && dir=$newdir; \
+                                       case $dir in \
+                                       /home/* | /tmp/* | /usr/lib | /usr/lib64 | /lib | /lib64 | /usr/local/lib | /usr/local/lib64 | /usr/X11R6/lib | /usr/X11R6/lib64 ) \
+                                               echo "remove-rpath: $dir in $file"; \
+                                               ;; \
+                                       * ) \
+                                               if [ "$rpath" = "" ] ; then rpath="$dir" ; \
+                                               else rpath="$rpath:$dir" ; fi ; \
+                                               ;; \
+                                       esac ; \
+                       done ; \
+                       if [ "$rpath" = "" ] ; then chrpath -d "$file" > /dev/null ; \
+                       else chrpath -r "$rpath" "$file" > /dev/null ; fi ; \
+               done; \
+       fi; \
+fi; }; __spec_install_post_chrpath } } }
+
+# vim: "
+
+#-----------------------------------------------------------------
+# Find all shared object files with unresolved symbols. Warn
+# and terminate if any found (termination can be turned off by define).
+#%no_install_post_check_so 1
+#%skip_post_check_so libwithunresolvedok.so.*
+#
+# NOTE: define skip_post_check_so only if such library really requires
+#       unresolved symbols and always leave a comment why it is required:
+#      # executable provides symbols foo, bar for those libraries:
+#      %define skip_post_check_so libwithoutfoo.so.* libwithoutbar.so.*
+#
+%__spec_install_post_check_so { \
+__spec_install_post_check_so() { \
+%{!?debug:set +x;} \
+       fail=0; \
+       printf "Searching for shared objects with unresolved symbols..."; \
+       for f in $(find $RPM_BUILD_ROOT -type f -name '*.so.*' -print); do \
+               LC_ALL=C objdump -T $f 2> /dev/null | LC_ALL=C awk -v "file=$f" 'BEGIN { found=0; skip["program_name"]=1; skip["_ZSt15__once_callable"]=1; skip["_ZSt11__once_call"]=1; symbols = "" } /^[0-9a-z]+ +D +\*UND\*/ { if ($NF in skip) { next; }; found = 1; symbols = symbols "\n\t" $NF } END { if (found) { print "\nUnresolved symbols found in: " file symbols; %{?skip_post_check_so:split("%{skip_post_check_so}", R); for (i=1; i in R; i++) { if (file ~ "(^|/)" R[i] "$") { print "Library marked with skip_post_check_so, ignoring errors.\n"; exit(0); } } } exit(1); } } ' || fail=1 ; \
+       done ; \
+       echo " DONE"; \
+       %{!?no_install_post_check_so:return $fail;} \
+}; __spec_install_post_check_so }}
+
+#-----------------------------------------------------------------
+# Find all ELF files with executable stac. Warn and terminate if any found
+# (termination can be turned off by define).
+# Details: https://wiki.gentoo.org/wiki/Hardened/GNU_stack_quickstart
+#%no_install_post_check_stackexec 1
+#%skip_post_check_stackexec libwithexecstackok.so.*
+#
+# NOTE: define skip_post_check_stackexec only if such program or library
+#       really requires executable stack and always leave a comment why
+#       it is required:
+#      # Programs full of nested functions that cannot be fixed
+#      %define skip_post_check_execstack /bin/foo libwithexecstack.so.*
+#
+%__spec_install_post_check_execstack { \
+__spec_install_post_check_execstack() { \
+%{!?debug:set +x;} \
+       fail=0; \
+       printf "Searching for ELF programs with executable stack..."; \
+       for f in $(find $RPM_BUILD_ROOT -type f -print) ; do \
+               LC_ALL=C readelf -lW $f 2>/dev/null | \
+               LC_ALL=C awk -v "file=$f" 'BEGIN { found=0; } /GNU_STACK/ { if ($7 ~ "E") { found=1 } } END { if (found) { print "\nExecutable stack found in: " file; %{?skip_post_check_execstack:split("%{skip_post_check_execstack}", R); for (i=1; i in R; i++) { if (file ~ "(^|/)" R[i] "$") { print "File marked with skip_post_check_execstack, ignoring errors.\n"; exit(0); } } } exit(1); } }' || fail=1 ; \
+       done ; \
+       echo " DONE"; \
+       %{!?no_install_post_check_execstack:return $fail;} \
+}; __spec_install_post_check_execstack }}
+
+#-----------------------------------------------------------------
+# Verify that for each directory under /var/run package contains
+# tmpfiles.d configuration. Warn and terminate build if config is
+# missing.
+#
+#%no_install_post_check_tmpfiles 1
+#
+%__spec_install_post_check_tmpfiles { \
+__spec_install_post_check_tmpfiles() { \
+%{!?debug:set +x;} \
+       fail=0; \
+       echo "Checking /var/run <-> tmpfiles.d completeness..."; \
+       for d in $RPM_BUILD_ROOT/var/run/*; do \
+               [ -d "$d" ] || continue; \
+               d=${d##$RPM_BUILD_ROOT}; \
+               if ! grep -qsF "$d" $RPM_BUILD_ROOT/usr/lib/tmpfiles.d/*.conf $RPM_BUILD_ROOT/etc/tmpfiles.d/*.conf; then\
+                       echo "No tmpfiles configuration for '$d'";\
+                       fail=1 ; \
+               fi \
+       done ; \
+       echo " DONE"; \
+       %{!?no_install_post_check_tmpfiles:return $fail;} \
+}; __spec_install_post_check_tmpfiles }}
+
+#-----------------------------------------------------------------
+# Verify that scripts have reasonable shebangs
+# Test spec: see "test/spec_install_post_check_shebangs" branch on packages/test.spec
+#
+#%no_install_post_check_shebangs 1
+#
+%__spec_install_post_check_shebangs { \
+__spec_install_post_check_shebangs() { \
+%{!?debug:set +x;} \
+       echo "Checking script shebangs..."; \
+       fail=` \
+       find $RPM_BUILD_ROOT -type f -perm -500 -print | { fail=0; while IFS= read -r f; do \
+               shebang="$(sed -e'1s/#! *\(.*\)/\1/;t;d;q' "$f")" ; \
+               f="${f##$RPM_BUILD_ROOT}"; \
+               case "$shebang" in \
+                       "%{__python}"|"%{__python3}"|"%{__python} "*|"%{__python3} "* \
+                       |"/usr/bin/python%{py_ver}"|"/usr/bin/python%{py_ver} "* \
+                       |"/usr/bin/python%{py3_ver}"|"/usr/bin/python%{py3_ver} "*) \
+                               ;; \
+                       "/usr/bin/env python"*|"/usr/bin/python"|"/usr/bin/python "*) \
+                               echo "$f starts with '#!$shebang', should be '#!%{__python}' or '#!%{__python3}'" >&2;\
+                               fail=1 ; \
+                               ;; \
+                       "/usr/bin/env "*) \
+                               echo "$f starts with '#!$shebang', should be explicit interpreter path" >&2;\
+                               fail=1 ; \
+                               ;; \
+                       *) ;;\
+               esac ; \
+       done ; \
+       echo "$fail" ; \
+       }`; \
+       echo " DONE" ; \
+        %{!?no_install_post_check_shebangs:return $fail;} \
+}; __spec_install_post_check_shebangs }}
+
+# Remove common Perl files we don't package
+%__spec_install_post_perl_clean {\
+%{!?no_install_post_perl_clean: \
+%{?pdir:rm -f $RPM_BUILD_ROOT{%{perl_archlib}/perllocal.pod,%{perl_vendorarch}/auto/%{pdir}%{?pnam:/%(echo %{pnam} | tr - /)}/.packlist}} \
+} }
+
+# Helpers to specify SONAME depdendencies, e.g.:
+#   Requires: %{_soname_prov libfoo.so.1}
+#   Requires: %{_soname_prov libfoo.so.1(SOME_SYMVER)}
+#
+# BuildRequires:       rpmbuild(macros) >= 1.721
+#
+%_soname_tag %(echo %{_lib} | sed -e 's/^lib//' -e 's/^\\(.\\+\\)$/(\\1bit)/')
+%_soname_prov() %(echo "%{1}()%{_soname_tag}" | sed -e 's/^\\([^(]*([^)]\\+)\\)()%{_soname_tag}$/\\1%{_soname_tag}/;s/()$//')
+
+#-----------------------------------------------------------------
+# Update GConf2 schemas
+#
+# Requires: GConf2
+#
+%gconf_schema_install() \
+       umask 022; \
+       GCONF_CONFIG_SOURCE="xml:readwrite:/etc/gconf/gconf.xml.defaults" \\\
+       /usr/bin/gconftool-2 --makefile-install-rule /etc/gconf/schemas/%{?1}%{!?1:*.schemas} > /dev/null; \
+%{nil}
+
+%gconf_schema_uninstall() \
+if [ $1 = 0 -a -x /usr/bin/gconftool-2 ]; then \
+       umask 022; \
+       GCONF_CONFIG_SOURCE="xml:readwrite:/etc/gconf/gconf.xml.defaults" \\\
+       /usr/bin/gconftool-2 --makefile-uninstall-rule /etc/gconf/schemas/%{?1} > /dev/null \
+fi; \
+%{nil}
+
+#-----------------------------------------------------------------
+# Update desktop MIME database
+# requires: desktop-file-utils
+%update_desktop_database() {{ \
+       umask 022; \
+       /usr/bin/update-desktop-database -q; \
+};} \
+%{nil}
+
+%update_desktop_database_post %update_desktop_database
+
+%update_desktop_database_postun() {{ \
+if [ "$1" = "0" ]; then \
+       %update_desktop_database \
+fi; \
+};} \
+%{nil}
+
+#-----------------------------------------------------------------
+# Update shared MIME info database
+# requires: shared-mime-info
+# Note:        https://bugs.freedesktop.org/show_bug.cgi?id=70366#c19
+#      https://bugzilla.redhat.com/show_bug.cgi?id=1052173
+# TODO:        if you want this running with fdatasync(), make sure it's:
+#      1. announcing ~minute delay by echoing appropriate message,
+#      2. running only once after rpm transaction.
+#
+%update_mime_database() {{ \
+       umask 022; \
+       PKGSYSTEM_ENABLE_FSYNC=0 \
+       /usr/bin/update-mime-database %{_datadir}/mime; \
+};} \
+%{nil}
+
+#-----------------------------------------------------------------
+# Update icon cache
+# BuildRequires:       rpmbuild(macros) >= 1.596
+# Requires:            hicolor-icon-theme
+#
+%update_icon_cache() {{ \
+       %{!?1:%{error:%{0}: Required theme name missing}} \
+       if [ -x /usr/bin/gtk-update-icon-cache ]; then \
+               umask 022; \
+               touch --no-create %{_iconsdir}/%1; \
+               /usr/bin/gtk-update-icon-cache -qf %{_iconsdir}/%1; \
+       fi; \
+};} \
+%{nil}
+
+#-----------------------------------------------------------------
+# Update scrollkeeper database
+# requires: scrollkeeper
+#
+%scrollkeeper_update_post() \
+       /usr/bin/scrollkeeper-update -q; \
+%{nil}
+
+%scrollkeeper_update_postun() \
+if [ "$1" = "0" ]; then \
+       /usr/bin/scrollkeeper-update -q; \
+fi; \
+%{nil}
+
+#-----------------------------------------------------------------
+# Compile GSettings schemas
+# requires: glib2 >= 1:2.26.0
+#
+%glib_compile_schemas() {{ \
+       umask 022; \
+       /usr/bin/glib-compile-schemas %{_datadir}/glib-2.0/schemas; \
+};} \
+%{nil}
+
+#-----------------------------------------------------------------
+# post %install sequence:
+# - autodeps exceptions
+# - compress all man and info pages,
+# - strip all ELF executables and ELF shared objects if not %debug.
+# - compress kernel modules if any
+
+###################################################################
+# Requires/Provides automation
+# exceptions system by Jacek Konieczny <jajcus@pld-linux.org>
+#
+%__noautoreqfiles      %(sed -e s'/#.*//' /etc/rpm/noautoreqfiles)%{?_noautoreqfiles: %{_noautoreqfiles}}
+%__noautoprovfiles     %(sed -e s'/#.*//' /etc/rpm/noautoprovfiles)%{?_noautoprovfiles: %{_noautoprovfiles}}
+%__noautoreqdep                %(sed -e s'/#.*//' /etc/rpm/noautoreqdep)%{?_noautoreqdep: %{_noautoreqdep}}
+%__noautoprov          %(sed -e s'/#.*//' /etc/rpm/noautoprov) \
+       %{?_noautoprov: %{_noautoprov}} \
+       %{?_noautoprov_java: %{__noauto_regexp_helper -p java %{_noautoprov_java}}} \
+       %{?_noautoprov_mono: %{__noauto_regexp_helper -p mono %{_noautoprov_mono}}} \
+       %{?_noautoprov_pear: %{__noauto_regexp_helper -p pear %{_noautoprov_pear}}} \
+       %{?_noautoprov_perl: %{__noauto_regexp_helper -p perl %{_noautoprov_perl}}} \
+       %{?_noautoprov_pyegg: %{__noauto_regexp_helper -p pythonegg %{_noautoprov_pyegg}}} \
+       %{?_noautoprov_py3egg: %{__noauto_regexp_helper -p python3egg %{_noautoprov_py3egg}}} \
+       %{nil}
+%__noautoreq           %(sed -e s'/#.*//' /etc/rpm/noautoreq) \
+       %{?_noautoreq: %{_noautoreq}} \
+       %{?_noautoreq_java: %{__noauto_regexp_helper -p java %{_noautoreq_java}}} \
+       %{?_noautoreq_mono: %{__noauto_regexp_helper -p mono %{_noautoreq_mono}}} \
+       %{?_noautoreq_pear: %{__noauto_regexp_helper -p pear %{_noautoreq_pear}}} \
+       %{?_noautoreq_perl: %{__noauto_regexp_helper -p perl %{_noautoreq_perl}}} \
+       %{?_noautoreq_pyegg: %{__noauto_regexp_helper -p pythonegg %{_noautoreq_pyegg}}} \
+       %{?_noautoreq_py3egg: %{__noauto_regexp_helper -p python3egg %{_noautoreq_py3egg}}} \
+       %{nil}
+
+# helper for wrapping _noautoreq between perl() or pear()
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+# Usage:
+# BuildRequires:       rpmbuild(macros) >= 1.654
+# %define _noautoreq_pear Excluded.php PEAR/Something.php
+# %define _noautoreq_perl Apache::.*
+# BuildRequires:       rpmbuild(macros) >= 1.672
+# %define _noautoreq_java ClassDataVersion
+# BuildRequires:       rpmbuild(macros) >= 1.709
+# %define _noautoreq_pyegg argparse
+# %define _noautoreq_py3egg backports.ssl-match-hostname ipaddress
+# BuildRequires:       rpmbuild(macros) >= 1.730
+# %define _noautoreq_mono Gendarme.Framework
+# BuildRequires:       rpmbuild(macros) >= 1.737
+# %define _noautoprov_java Class
+# %define _noautoprov_mono Excluded.Provide
+# %define _noautoprov_pear Excluded.php
+# %define _noautoprov_perl Excluded::Module
+# %define _noautoprov_pyegg excluded
+# %define _noautoprov_py3egg excluded3
+#
+%__noauto_regexp_helper(p:) %(echo "%*" | awk 'BEGIN{RS=" "}{printf("%{-p*}%{__qchar}(%%s%{__qchar}) ", $1)}')
+# detect quote character runtime
+%__qchar_4 \\\\%{nil}
+%__qchar_5 \\\\\\%{nil}
+%__qchar %{expand:%%global __qchar %%__qchar_%(echo %{_rpmversion} | cut -c1)}%__qchar
+
+#%_noautocompressdoc   %{nil}
+#
+%_missing_doc_files_terminate_build    1%{nil}
+%_unpackaged_files_terminate_build     %{nil}
+
+# node.js libdir
+# Requirements:
+# BuildRequires: rpmbuild(macros) >= 1.634
+%nodejs_libdir         /usr/lib/node_modules
+
+# bash-completion 2.0 completions dir
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.673
+# Requires:    bash-completion >= 2.0
+%bash_compdir          /usr/share/bash-completion/completions
+
+# fish completions dir
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.720
+%fish_compdir          /usr/share/fish/vendor_completions.d
+
+# zsh completions dir
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.719
+%zsh_compdir           /usr/share/zsh/site-functions
+
+# depmod macro
+%depmod() { \
+umask 022; \
+if [ -e /boot/System.map-%1 ]; then \
+       /sbin/depmod -a -F /boot/System.map-%1 %1; \
+else \
+       if [ -e /boot/System.map ]; then \
+               /sbin/depmod -a -F /boot/System.map %1; \
+       else \
+               /sbin/depmod -a %1; \
+       fi \
+fi; \
+}
+
+# user/group checking macros
+#
+# Usage:
+#      %userremove myuser
+#
+%userremove    /usr/lib/rpm/user_group.sh user del
+%groupremove   /usr/lib/rpm/user_group.sh group del
+#
+# Usage:
+#      if %usertestrm myuser; then
+#              /usr/sbin/userdel -r myuser
+# Note:
+#      use these macros only if you need to call userdel/groupdel with
+#      a non-standard option or take an extra action; otherwise use the
+#      %userremove/%groupremove macros
+#
+%usertestrm    /usr/lib/rpm/user_group.sh user testrm
+%grouptestrm   /usr/lib/rpm/user_group.sh group testrm
+# user group membership management macros
+#
+# Usage:
+#      %addusertogroup [-q] myuser agroup
+#
+#  -q if user or group don't exist, don't make big noise of it (MISSINGOK behaviour)
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.515
+%addusertogroup(q)     quiet=%{-q:1} /usr/lib/rpm/user_group.sh user addtogroup %*; \
+%{nil}
+
+# banner support (useful in {pre,post}{,un} and triggers)
+#
+# Usage:
+#      %banner name [-a] [-e] [-n] [-tn] [-o] <<EOF
+# the banner text, the banner text
+# the banner text, and following line
+#EOF
+# You can use any form of here-document, <<'EOF' <<-EOT will do.
+# NOTE: if your use "<<-EOF", then You can actually indent inside here-document.
+#
+# -a   - append to the banner
+# -e   - send to stderr instead of stdout
+# -n   - don't show banner (overrides -t)
+# -t   - show only, if RPM_SCRIPTVERBOSITY >= n; default n=5
+# -o   - show only once, i.e when package is installed for the first time
+#
+# Tests:
+# (rpm -E '%banner -e banner <<EOF'; echo -e 'hi\nEOF') > m; sh -x m
+# (rpm -E '%banner -o -e banner <<EOF'; echo -e 'hi\nEOF') > m; sh -x m
+# (rpm -E '%banner -o -e banner <<EOF'; echo -e 'hi\nEOF') > m; sh -x m 1
+# rpm -E 'date | %banner -e banner' > m; sh -x m
+# rpm -E 'date | %banner -o -e banner' > m; sh -x m
+#
+%banner(aenot:) %{-o:([ "$1" != 1 ] ||} ( \
+RPM_SCRIPTVERBOSITY=5 \
+[ -r /etc/sysconfig/rpm ] && . /etc/sysconfig/rpm \
+if [ -x /usr/bin/banner.sh ]; then \
+       CMD="/usr/bin/banner.sh %{-e:--stderr} %{!-n:$([ $RPM_SCRIPTVERBOSITY -ge %{-t:%{-t*}}%{!-t:5} ] && echo -s)} %{!-a:-m}%{-a:-M} %1" \
+else \
+       CMD="cat%{-e: >&2}" \
+fi \
+eval $CMD %{?2:%2}%{?3: %3})%{-o:)} \
+%{nil}
+
+# useradd/groupadd macros
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#   %useradd [-P package] [-u uid] [-d home_dir] [-s shell] [-c comment]
+#   [-g initial_group] [-G group[,...]] login
+#
+#  -u uid. REQUIRED
+#  -g gid/group. REQUIRED
+#  -s defaults to /bin/false
+#  -d defaults to /usr/share/empty
+#  -c No default
+#  -r is accepted but ignored (it's always set)
+#  -k skeleton dir. defaults to /usr/share/empty
+# rpm specific flags
+#  -P package name. defaults to %{name}
+#
+%useradd(c:d:e:f:g:G:Mmk:op:s:u:rP:) \
+%{!-u:%{error:useradd: Required argument -u missing}} \
+%{!-g:%{error:useradd: Required argument -g missing}} \
+%{!?1:%{error:useradd: Required parameter login missing}} \
+if [ -n "`/bin/id -u %{expand:%{%{#}}} 2>/dev/null`" ]; then \
+       if [ "`/bin/id -u %{expand:%{%{#}}}`" != "%{-u*}" ]; then \
+               echo "Error: user %{expand:%{%{#}}} doesn't have uid=%{-u*}. Correct this before installing %{-P*}%{!?-P:%{name}}." 1>&2 \
+               exit 1 \
+       fi \
+else \
+       echo "Adding user %{expand:%{%{#}}} UID=%{-u*}." \
+       /usr/sbin/useradd \\\
+               %{-m:-m -k %{-k*}%{!-k:/usr/share/empty}} \\\
+               -u %{-u*} \\\
+               -r \\\
+               -d %{-d*}%{!-d:/usr/share/empty} \\\
+               -s %{-s*}%{!-s:/bin/false} \\\
+               %{-c:-c "%(set -- %{-c*} %{*}; echo $1)"}\\\
+               -g %{-g*} \\\
+               %{-M} \\\
+               %{-G:-G %{-G*}} \\\
+               %{expand:%{%{#}}} 1>&2 || exit $? \
+       [ ! -x /usr/sbin/nscd ] || /usr/sbin/nscd -i passwd || : \
+fi;
+# vim: "
+
+# Usage:
+#   %groupadd [-P package] [-g gid] group
+#
+# -g gid. REQUIRED
+#
+# Sample:
+#   %groupadd -P %{name}-base -g %{gid} %{name}
+
+%groupadd(g:P:rfo)     \
+%{!-g:%{error:groupadd: Required argument -g missing}} \
+%{!?1:%{error:groupadd: Required parameter group missing}} \
+if /usr/bin/getgid %{1} > /dev/null 2>&1; then \
+       if [ "`/usr/bin/getgid %{1}`" != "%{-g*}" ]; then \
+               echo "Error: group %{1} doesn't have gid=%{-g*}. Correct this before installing %{-P*}%{!?-P:%{name}}." 1>&2 \
+               exit 1 \
+       fi \
+else \
+       echo "Adding group %{1} GID=%{-g*}." \
+       /usr/sbin/groupadd -g %{-g*} -r %{1} 1>&2 || exit $? \
+       [ ! -x /usr/sbin/nscd ] || /usr/sbin/nscd -i group || : \
+fi;
+
+# service macro.
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# calls usual service restart on package %post, but skips the restart if
+# administrator has disabled automatic service restarts in either global
+# /etc/sysconfig/rpm or per service /etc/sysconfig/SERVICE file.
+# NOTE: systemd_booted machines do not print
+#              Run "{command}" to restart {service}.
+# message for packages without native systemd unit (not here, no %systemd_post).
+#
+# Usage:
+#   %service [-q] [-n] SERVICE ACTION ["SERVICE NICE DESCRIPTION"]
+#
+#  -q be silent when service isn't started (for scriplets restaring other package's services)
+#  -n NOOP mode, do not actually restart service
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.268
+# Requires:    rc-scripts
+# -n option:
+# BuildRequires:       rpmbuild(macros) >= 1.450
+%service(qn) {{%(export noop=%{-n:1} quiet=%{-q:1} RPM_BUILD_ROOT=%{buildroot}; /usr/lib/rpm/service_generator.sh %{*}) };}
+
+%env_update [ ! -x /sbin/env-update ] || /sbin/env-update -u || :
+
+# patchset macros
+# generate SourceX urls from range START STOP
+# Format can be SINGLE format char of %e, %f, %g, see seq(1)
+# The sources start from 10000
+#
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#   %patchset_source -f <seq(1) format> <start> [<end>]
+#   %patchset_patch <start> [<end>]
+# If <end> is omited, it is assumed to be <start>.
+#
+# For example in preamble:
+#  %patchset_source -f ftp://ftp.vim.org/pub/editors/vim/patches/7.0/7.0.%03g 33 44
+# and in %prep:
+#  %patchset_patch 33 44
+#
+# Using sources list:
+#   BuildRequires:     rpmbuild(macros) >= 1.426
+#   %patchset_source -f <url> -s <filelist>
+#   %patchset_patch -s <filelist>
+# For example (ncurses):
+#   BuildRequires:     rpmbuild(macros) >= 1.683
+#   %patchset_source -f ftp://dickey.his.com/ncurses/%{basever}/ -s sources
+#   %patchset_patch -s sources -p1
+#
+
+%patchset_source(f:b:s:) %(
+       base=%{-b*}%{!-b*:10000}
+%{-s:
+       baseurl='%{-f*}'
+       filelist='%{-s*}'
+       i=$base
+       while read checksum file; do
+               printf "Patch%d: %s%s\\n" $i "$baseurl" "$file"
+               i=$((i+1))
+       done < $filelist
+}
+%{!-s:
+       start=$(expr $base + %1);
+       end=$(expr $base + %{?2}%{!?2:%{1}});
+       # we need to call seq twice as it doesn't allow two formats
+       seq -f 'Patch%g:' $start $end > %{tmpdir}/__ps1;
+       seq -f '%{-f*}' %1 %{?2}%{!?2:%{1}} > %{tmpdir}/__ps2;
+       paste %{tmpdir}/__ps{1,2};
+       rm -f %{tmpdir}/__ps{1,2};
+}
+) \
+%{nil}
+
+# apply sources from %patchset_source
+# -p specify -pX for %patch line
+# -b base offset: defaults to 10000
+# -s filelist to read files from
+%patchset_patch(f:p:b:s:) %(
+       base=%{-b*}%{!-b*:10000}
+       patchlevel=%{-p*:-p%{-p*}}
+%{-s:
+       filelist='%{-s*}'
+       i=$base
+       while read checksum file; do
+               printf "patch%d %s\\n" $i "$patchlevel" | sed -e s,^,%%,
+               i=$((i+1))
+       done < $filelist
+}
+%{!-s:
+       start=$(expr $base + %1);
+       end=$(expr $base + %{?2}%{!?2:%{1}});
+       echo ": patchset_patch %1%{?2: to %2}";
+       seq -f "patch%g $patchlevel" $start $end | sed -e s,^,%%,;
+}
+) \
+%{nil}
+
+# return EXPANDED source url N from current spec
+%sourceurl(n:) %(test "$IN_RPM" = 1 && exit 1; export IN_RPM=1; rpmbuild --nodigest --nosignature --nobuild -D "prep %%dump" %{_specdir}/%{name}.spec 2>&1 | awk '$2 ~ /^SOURCEURL%{-n*}/ {print $3}')
+
+# Helper for LUA.
+# split string separated by space into quoted list
+#
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# %__lua_split /bin/sh /bin/pdksh -> "/bin/sh", "/bin/pdksh"
+%__lua_split() %(echo "%*" | awk '{for (i=1;i<=NF;i++) printf("\\"%%s\\"%%s", $i, i == NF ? "" : ", ")}')
+
+# adjust /etc/shells by adding and removing shells from there
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#   %post      -p <lua>
+#   %lua_add_etc_shells /bin/sh /bin/pdksh
+#
+#   %preun     -p <lua>
+#   if arg[2] == 0 then
+#       %lua_remove_etc_shells /bin/bash /bin/rbash
+#   end
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.462
+#
+
+%lua_add_etc_shells() \
+t = {}\
+f = io.open("/etc/shells", "r")\
+if f then\
+       for l in f:lines() do t[l]=l; end\
+       f:close()\
+end\
+for _, s in ipairs({%{expand:%%__lua_split %*}}) do\
+       if not t[s] then\
+               print("Adding "..s.." to /etc/shells")\
+               f = io.open("/etc/shells", "a")\
+               if f then\
+                       f:write(s.."\\n")\
+                       f:close()\
+               end\
+       end\
+end\
+%{nil}
+
+%lua_remove_etc_shells() \
+t = {}\
+f = io.open("/etc/shells", "r")\
+if f then\
+       for l in f:lines() do t[l]=l; end\
+       f:close()\
+end\
+for _, l in pairs({%{expand:%%__lua_split %*}}) do\
+       print("Removing "..l.." from /etc/shells")\
+       t[l] = nil\
+end\
+s=""\
+for _, l in pairs(t) do\
+       s=s..l.."\\n"\
+end\
+f = io.open("/etc/shells", "w")\
+if f then\
+       f:write(s)\
+       f:close()\
+end\
+%{nil}
+
+# Backwards compat. Use of %lua_ prefixed macros is preferred as these are cleaner to read.
+#
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#   %post      -p %add_etc_shells -p /bin/sh /bin/pdksh
+#   %preun     -p %remove_etc_shells -p /bin/sh /bin/pdksh
+#
+#  -p (optional) -- specifies that result is embeded %post script (prepends <lua> as first line)
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.429
+#
+%add_etc_shells(p) %{-p:<lua>}\
+%{expand:%%lua_add_etc_shells %*}\
+%{nil}
+
+%remove_etc_shells(p) %{-p:<lua>}\
+%{-p:if arg[2] == 0 then}\
+%{expand:%%lua_remove_etc_shells %*}\
+%{-p:end} \
+%{nil}
+
+# Undos files
+#
+# Author: Paweł Zuzelski <pawelz@pld-linux.org>
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#   %undos list_of_files
+#   %undos -f EXT[,EXT]
+#   %undos -i -f EXT[,EXT]
+#
+#  -f EXT[,EXT] - find(1) files by extensions
+#  -i - case insensitive file search
+#
+# Example:
+#   Un-DOS all *.js, *.css files
+#   %undos -f js,css
+#   Un-DOS all *.js, *.JS files
+#   %undos -f js -i
+#   undos all Makefiles
+#   %{__find} -name Makefile | xargs %undos
+#
+# Requirements:
+# BuildRequires:       sed >= 4.0
+# BuildRequires:       rpmbuild(macros) >= 1.674
+
+# NB: make sure this macro stays on one line
+# NB: make sure it includes newline escape
+%undos(f:i)    %{-f:%{__find} -type f -regextype posix-extended -%{-i:i}regex '^.+\\.(%(echo %{-f*} | tr ',' '|'))$' -print0 | xargs -0} %{__sed} -i -e 's,\\r$,,' %* \
+%{nil}
+
+#-----------------------------------------------------------------
+# Update hardware database index
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.691
+# Requires:            udev-core >= 1:196
+
+%udev_hwdb_update() \
+/sbin/udevadm hwdb --update >/dev/null 2>&1 || : \
+%{nil}
+
+# Generate vim help tags file
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.718
+# Requires(post,postun):       /usr/bin/vim
+# Requires(post,postun):       vim-rt >= 4:7.4.2054-2
+%vim_doc_helptags() \
+umask 022; \
+/usr/bin/vim -c ':helptags /usr/share/vim/doc' -c ':q' 2>/dev/null \
+%{nil}
+
+# EOF
diff --git a/macros.upstart b/macros.upstart
new file mode 100644 (file)
index 0000000..0979386
--- /dev/null
@@ -0,0 +1,37 @@
+# pre/post script for -upstart subpackages
+#
+# Author: Jacek Konieczny <jajcus@jajcus.net>
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# Usage:
+#      %upstart_post service_name
+#      %upstart_postun service_name
+#
+# Sample:
+# %post upstart
+# %upstart_post %{name}
+#
+# %postun upstart
+# %upstart_postun %{name}
+#
+# Requirements:
+# BuildRequires:       rpmbuild(macros) >= 1.690
+# Requires:                    rc-scripts >= 0.4.3
+
+# migrate from init script to upstart job
+%upstart_post() \
+       if [ -x /sbin/initctl ] && [ -f /var/lock/subsys/%1 ]; then \
+               /sbin/service --no-upstart %1 stop \
+               /sbin/service %1 start \
+       fi \
+%{nil}
+
+# restart the job after upgrade or migrate to init script on removal
+# cannot be stopped with 'service' as /etc/init/$name.conf may be missing
+# at this point
+%upstart_postun() \
+       if [ -x /sbin/initctl ] && /sbin/initctl status %1 2>/dev/null | grep -q 'running' ; then \
+               /sbin/initctl stop %1 >/dev/null 2>&1 \
+               [ -f /etc/rc.d/init.d/%1 -o -f /etc/init/%1.conf ] && { echo -n "Re-"; /sbin/service %1 start; }; \
+       fi \
+%{nil}
diff --git a/macros.webapp b/macros.webapp
new file mode 100644 (file)
index 0000000..30f21b2
--- /dev/null
@@ -0,0 +1,37 @@
+# webapp macros
+# Author: Elan Ruusamäe <glen@pld-linux.org>
+#
+# The config is installed/removed inside trigger, this means that you can any
+# time install apache1/apache/lighttpd package and the configuration file is
+# updated. if you don't need the config for various reason for specific
+# webserver, just remove the symlink from config directory using webapp
+# program. the trigger will not recreate the symlink on upgrades. In other
+# words the config is linked to webserver config directory on first install of
+# PACKAGE or WEBSERVER.
+#
+# Add package's webserver config to webserver webapps dir.
+# Usage:
+#   %webapp_register [-f] WEBSERVER WEBAPP
+#
+%webapp_register(f) \
+%{?debug:set -x; echo "webapp_register: %{name}-%{version}-%{release} 1:[$1]; 2:[$2]"} \
+if [ -n "%{-f:1}" ] || [ "$1" = "1" ] && [ "$2" = "1" ]; then\
+       /usr/sbin/webapp register %1 %2\
+fi\
+# reload webserver if the config symlink is there and skip reload if webserver is upgraded\
+if [ -L /etc/%1/webapps.d/%(echo "%2" | tr '/' '-').conf ] && [ "$2" -lt "2" ]; then\
+       %{expand:%service -q %%1 reload}\
+fi\
+%{nil}
+
+# Remove package's config from webserver webapps dir.
+# Usage:
+#   %webapp_register [-f] WEBSERVER WEBAPP
+%webapp_unregister(f) \
+%{?debug:set -x; echo "webapp_unregister: %{name}-%{version}-%{release}: 1:[$1]; 2:[$2]"} \
+# remove link if either of the packages are gone \
+if [ -n "%{-f:1}" ] || [ "$1" = "0" ] || [ "$2" = "0" ] && [ -L /etc/%1/webapps.d/%(echo "%2" | tr '/' '-').conf ]; then \
+       /usr/sbin/webapp unregister %1 %2\
+       %{expand:%service -q %%1 reload}\
+fi \
+%{nil}
diff --git a/macros.xmms b/macros.xmms
new file mode 100644 (file)
index 0000000..e5c2066
--- /dev/null
@@ -0,0 +1,11 @@
+# XMMS specific macros
+%xmms_prefix                   %{expand:%%global xmms_prefix %(xmms-config --prefix 2>/dev/null || echo ERROR)}%xmms_prefix
+%xmms_exec_prefix              %{expand:%%global xmms_exec_prefix %(xmms-config --exec-prefix 2>/dev/null || echo ERROR)}%xmms_exec_prefix
+%xmms_version                  %{expand:%%global xmms_version %(xmms-config --version 2>/dev/null || echo ERROR)}%xmms_version
+%xmms_datadir                  %{expand:%%global xmms_datadir %(xmms-config --data-dir 2>/dev/null || echo ERROR)}%xmms_datadir
+%xmms_plugindir                        %{expand:%%global xmms_plugindir %(xmms-config --plugin-dir 2>/dev/null || echo ERROR)}%xmms_plugindir
+%xmms_visualization_plugindir  %{expand:%%global xmms_visualization_plugindir %(xmms-config --visualization-plugin-dir 2>/dev/null || echo ERROR)}%xmms_visualization_plugindir
+%xmms_input_plugindir          %{expand:%%global xmms_input_plugindir %(xmms-config --input-plugin-dir 2>/dev/null || echo ERROR)}%xmms_input_plugindir
+%xmms_output_plugindir         %{expand:%%global xmms_output_plugindir %(xmms-config --output-plugin-dir 2>/dev/null || echo ERROR)}%xmms_output_plugindir
+%xmms_effect_plugindir         %{expand:%%global xmms_effect_plugindir %(xmms-config --effect-plugin-dir 2>/dev/null || echo ERROR)}%xmms_effect_plugindir
+%xmms_general_plugindir                %{expand:%%global xmms_general_plugindir %(xmms-config --general-plugin-dir 2>/dev/null || echo ERROR)}%xmms_general_plugindir
diff --git a/macros.xorg b/macros.xorg
new file mode 100644 (file)
index 0000000..f07d665
--- /dev/null
@@ -0,0 +1,38 @@
+# X.org helper macros
+%__xorg_abi_requires_ge() Requires: xorg-xserver-server(%{expand:%1}-abi) >= %{expand:%{%2}}
+%__xorg_abi_requires_lt() Requires: xorg-xserver-server(%{expand:%1}-abi) < %(awk -vv=%{expand:%{%2}} 'BEGIN{split(v, a, "."); printf("%s.0", a[1] + 1); exit}')
+
+%xorg_xserver_ansic_abi                %{expand:%%global xorg_xserver_ansic_abi %(awk '/#define ABI_ANSIC_VERSION/ { split($0,A,/[(,)]/); printf("%d.%d",A[2], A[3]); }' /usr/include/xorg/xf86Module.h 2> /dev/null || echo ERROR)}%xorg_xserver_ansic_abi
+%xorg_xserver_extension_abi    %{expand:%%global xorg_xserver_extension_abi %(awk '/#define ABI_EXTENSION_VERSION/ { split($0,A,/[(,)]/); printf("%d.%d",A[2], A[3]); }' /usr/include/xorg/xf86Module.h 2> /dev/null || echo ERROR)}%xorg_xserver_extension_abi
+%xorg_xserver_font_abi         %{expand:%%global xorg_xserver_font_abi %(awk '/#define ABI_FONT_VERSION/ { split($0,A,/[(,)]/); printf("%d.%d",A[2], A[3]); }' /usr/include/xorg/xf86Module.h 2> /dev/null | echo ERROR)}%xorg_xserver_font_abi
+%xorg_xserver_videodrv_abi     %{expand:%%global xorg_xserver_videodrv_abi %(awk '/#define ABI_VIDEODRV_VERSION/ { split($0,A,/[(,)]/); printf("%d.%d",A[2], A[3]); }' /usr/include/xorg/xf86Module.h 2> /dev/null || echo ERROR)}%xorg_xserver_videodrv_abi
+%xorg_xserver_xinput_abi       %{expand:%%global xorg_xserver_xinput_abi %(awk '/#define ABI_XINPUT_VERSION/ { split($0,A,/[(,)]/); printf("%d.%d",A[2], A[3]); }' /usr/include/xorg/xf86Module.h 2> /dev/null || echo ERROR)}%xorg_xserver_xinput_abi
+# vim: '
+
+%requires_xorg_xserver_extension \
+%{__xorg_abi_requires_ge ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_lt ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_ge extension xorg_xserver_extension_abi} \
+%{__xorg_abi_requires_lt extension xorg_xserver_extension_abi} \
+%{nil}
+
+%requires_xorg_xserver_xinput \
+%{__xorg_abi_requires_ge ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_lt ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_ge xinput xorg_xserver_xinput_abi} \
+%{__xorg_abi_requires_lt xinput xorg_xserver_xinput_abi} \
+%{nil}
+
+%requires_xorg_xserver_font \
+%{__xorg_abi_requires_ge ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_lt ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_ge font xorg_xserver_font_abi} \
+%{__xorg_abi_requires_lt font xorg_xserver_font_abi} \
+%{nil}
+
+%requires_xorg_xserver_videodrv \
+%{__xorg_abi_requires_ge ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_lt ansic xorg_xserver_ansic_abi} \
+%{__xorg_abi_requires_ge videodrv xorg_xserver_videodrv_abi} \
+%{__xorg_abi_requires_lt videodrv xorg_xserver_videodrv_abi} \
+%{nil}
diff --git a/pydebuginfo.patch b/pydebuginfo.patch
new file mode 100644 (file)
index 0000000..644e08a
--- /dev/null
@@ -0,0 +1,18 @@
+--- ./rpm.macros~      2008-08-12 20:54:19.000000000 +0300
++++ ./rpm.macros       2008-08-18 22:58:42.471609996 +0300
+@@ -764,9 +764,14 @@
+ # remove python sources, so that check-files won't complain
+ # (idea by glen <at> pld-linux <dot> org)
+ %py_postclean() \
++%{expand:%%define __sip_%{?_enable_debug_packages} 1} \
++%{?__sip_1:> debugfiles-add.list;}\
+ for d in %{py_sitescriptdir} %{py_sitedir} %*; do \
+- [ ! -d "$RPM_BUILD_ROOT$d" ] || find "$RPM_BUILD_ROOT$d" -name '*.py' -print0 | xargs -0r -l512 rm;\
++      [ ! -d "$RPM_BUILD_ROOT$d" ] || find "$RPM_BUILD_ROOT$d" -name '*.py' \\\
++      %{?__sip_1:>> debugfiles-add.list;}\
++      %{!?__sip_1:-print0 | xargs -0r %{__rm} -f;}\
+ done \
++%{expand:%%undefine __sip_%{?_enable_debug_packages}}\
+ %{nil}
+ # depmod macro
diff --git a/rpm-compress-doc b/rpm-compress-doc
new file mode 100644 (file)
index 0000000..3c5ff93
--- /dev/null
@@ -0,0 +1,85 @@
+#!/bin/sh
+#
+# Compress documentation files found in $DOCDIR. Omit some files we don't
+# want to get compressed.
+#
+# /etc/rpm/noautocompressdoc and --noautocompressdoc= option can contain
+# whitespace delimated list of patters to omit.
+#
+
+#set -x
+
+COMPRESS_CMD="gzip -9nf"
+EXCLUDE_SUFFIXES="htm html jpg jpeg png gif pdf css dia js abw HTM JPG PNG GIF PDF CSS JS"
+EXCLUDE_MASKS=
+RECOMPRESS_BZIP2=yes
+
+nocompressdoc=''
+while [ $# -gt 0 ]; do
+       case "$1" in
+         --noautocompressdoc=*)
+               EXCLUDE_MASKS=`echo "${1#--noautocompressdoc=}" | sed -e 's/^ *//;s/ *$//;s/ \+/|/g'`
+       esac
+       shift
+done
+
+if [ -r /etc/rpm/noautocompressdoc ]; then
+       exclude=$(cat /etc/rpm/noautocompressdoc | grep -v '^#' | xargs echo | sed -e 's/^ *//;s/ *$//;s/ \+/|/g')
+       if [ -n "${exclude}" ]; then
+               if [ -n "${EXCLUDE_MASKS}" ]; then
+                       EXCLUDE_MASKS="${EXCLUDE_MASKS}|${exclude}"
+               else
+                       EXCLUDE_MASKS="${exclude}"
+               fi
+       fi
+fi
+
+if [ "$DOCDIR" = "" ] ; then
+       echo '$DOCDIR not set; exiting.'
+       exit 1
+fi
+
+cd $DOCDIR
+
+echo "Compressing documentation in $DOCDIR..."
+
+if test "$EXCLUDE_MASKS" ; then
+       echo "Excluding pattern '$EXCLUDE_MASKS'"
+fi
+
+FIND_CMD="find . -type f "
+for SUF in $EXCLUDE_SUFFIXES ; do
+       FIND_CMD="$FIND_CMD -a -not -name '*.$SUF'"
+done
+
+eval $FIND_CMD | while read FILENAME ; do
+       if test -n "$EXCLUDE_MASKS" ; then
+               if eval "case \$(basename \"$FILENAME\") in
+                        $EXCLUDE_MASKS ) true ;;
+                        * ) false ;;
+                        esac" ; then
+                       continue
+               fi
+       fi
+       case "$FILENAME" in
+       *.gz | *.Z)
+               gzip -d "$FILENAME"
+               FILENAME=$(echo "$FILENAME" | sed -e 's/\.gz$//; s/\.Z$//')
+               ;;
+       *.bz2)
+               if [ "$RECOMPRESS_BZIP2" = yes ] ; then
+                       bzip2 -d "$FILENAME"
+                       FILENAME=$(echo "$FILENAME" | sed -e 's/\.bz2$//')
+               else
+                       continue
+               fi
+               ;;
+       esac
+
+       $COMPRESS_CMD "$FILENAME"
+
+       echo -n "$FILENAME "
+done
+
+echo
+echo "Documentation compressed."
diff --git a/rpm-find-spec-bcond b/rpm-find-spec-bcond
new file mode 100644 (file)
index 0000000..a11dece
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/sh
+# Display bcond (_with_*, _without_*) macros from given spec 
+# $Id$
+
+if [ "$#" = 0 ]; then
+    echo "Usage: $0 SPEC"
+    exit 1
+fi
+
+SPEC=$1
+if [ $SPEC = "--" ]; then
+    if [ "$#" -lt 2 ]; then
+       echo "Usage: rpmbuild --bcond SPEC"
+       exit 1
+    fi
+    SPEC=$2
+fi
+
+if [ ! -f $SPEC ]; then
+    echo "rpmbuild: $SPEC: no such file"
+    exit 1
+fi
+
+bconds=`awk -F"\n" 'BEGIN { chlog=0 }
+               /^%changelog/ { chlog=1 }
+               /_with(out)?_[_a-zA-Z0-9]+/ && chlog == 0 {
+                       match($0, /_with(out)?_[_a-zA-Z0-9]+/);
+                       print substr($0, RSTART, RLENGTH)                       
+               }
+               /^%bcond_with/ && chlog == 0 {
+                       match($0, /bcond_with(out)?[ \t]+[_a-zA-Z0-9]+/);
+                                bcond = substr($0, RSTART +5 , RLENGTH -5);
+                                gsub(/[ \t]+/,"_",bcond);
+                                print bcond
+                       }' $SPEC | sort -u`
+
+for c in $bconds; do
+    echo -n "$c"
+
+    if ! echo `rpm --eval "%$c"` | grep $c >/dev/null; then
+       echo " (on)"
+    else 
+       echo ""
+    fi
+done
+
+
+for bcond in $bconds; do
+    isset=`awk -F"\n" "BEGIN { val=0 }
+                   /^%define[\t ]+$bcond/ {
+                     if (match(\\$0, /$bcond[\t ]+0[\t ]*$/)) {
+                        val = 0
+                     } else if (match(\\$0, /$bcond[\t ]+1[\t ]*$/)) {
+                        val = 1
+                     } else {
+                        print \"couldn't determine $bcond value from \", \\$0
+                     }
+                  } END { print val }" $SPEC`;
+
+    if [ x"$isset" = x"1" ]; then
+       echo "WARN: $bcond defined in spec";
+    fi
+done
+        
diff --git a/rpm-java-requires b/rpm-java-requires
new file mode 100755 (executable)
index 0000000..8bbac6f
--- /dev/null
@@ -0,0 +1,137 @@
+#!/bin/sh
+# This script reads filenames from STDIN and outputs any relevant requires
+# information that needs to be included in the package.
+#
+# Based on rpm-4.4.2/scripts/find-req.pl
+# Authors: Elan Ruusamäe <glen@pld-linux.org>
+
+export PATH="/sbin:/usr/sbin:/bin:/usr/bin"
+
+# Set the prefix, unless it is overriden
+: ${RPM_LIBDIR=/usr/lib/rpm}
+
+# Enable debug: JAVADEPS_DEBUG=true
+: ${JAVADEPS_DEBUG=false}
+
+# xsltproc for eclipse feature.xml
+: ${xsltproc=/usr/bin/xsltproc}
+
+# "%define java_min_classdataversion 51.0" in spec to minimum version to be 51.0
+: ${MIN_CLASSDATAVERSION=}
+
+# save $- state, to enable in functions
+debug=$-
+
+javaclassversionfilter() {
+       if [ "$MIN_CLASSDATAVERSION" ]; then
+               set -- $* "$MIN_CLASSDATAVERSION"
+       fi
+
+       local v
+       for v in $*; do
+               echo "java(ClassDataVersion) >= $v"
+       done | sort -V | tail -n 1
+}
+
+javaclassversion() {
+       set -$debug
+       local mode=$1; shift
+       [ $# -gt 0 ] || return 1
+       $JAVADEPS_DEBUG && echo >&2 ">> javaclassversion($mode): $*"
+
+       # process only requires
+       [ "$mode" = requires ] || return $ret
+
+       local classver=$(echo "$@" | xargs -r file | grep -o 'compiled Java class data, version [0-9.]*' | awk '{print $NF}' | sort -u)
+       if [ -z "$classver" ]; then
+               return 1
+       fi
+
+       javaclassversionfilter $classver
+       return 0
+}
+
+javajarversion() {
+       set -$debug
+       local mode=$1; shift
+       local jar=$1
+       local tmp ret=0
+       $JAVADEPS_DEBUG && echo >&2 ">> javajarversion($mode): $jar"
+
+       # check only files, symlinks could point outside buildroot
+       [ -f "$jar" -a ! -L "$jar" ] || return $ret
+
+       tmp=$(mktemp -d)
+       unzip -q -d $tmp $jar >&2
+       # workaround for .jar files with stupid permissions
+       chmod -R u+rwX $tmp
+
+       # find .jar and .class files
+       find_javadeps $mode $(find $tmp -type f -regextype posix-extended  -regex '^.+\.(class|jar)$') || ret=1
+       rm -rf $tmp
+       return $ret
+}
+
+eclipse_feature() {
+       set -$debug
+       local mode=$1; shift
+       local file=$1
+       local ret=0
+
+       $JAVADEPS_DEBUG && echo >&2 ">> eclipse_feature($mode): $file"
+
+       if [ ! -x $xsltproc ]; then
+               return 0
+       fi
+
+       $xsltproc --stringparam mode $mode ${RPM_LIBDIR}/eclipse-feature.xslt $file
+}
+
+find_javadeps() {
+       set -$debug
+       local mode=$1; shift
+       local ret=0
+
+       $JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): $*"
+       for file in $@; do
+               case $file in
+               *.jar)
+                       javajarversion $mode "$file" || ret=1
+               ;;
+               *.class)
+                       javaclassversion $mode "$file" || {
+                               echo >&2 "ERROR: Class version could not be extracted from $file"
+                               ret=1
+                       }
+               ;;
+               */feature.xml)
+                       eclipse_feature $mode "$file" || ret=1
+               ;;
+               *)
+                       $JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): no handle: $file"
+               ;;
+               esac
+       done
+       return $ret
+}
+
+ret=0
+# default mode to requires for backward compat
+mode=requires
+case $1 in
+-P|--provides)
+       mode=provides
+       shift
+       ;;
+-R|--requires)
+       mode=requires
+       shift
+       ;;
+esac
+
+t=$(mktemp)
+find_javadeps $mode $(cat -) > $t || ret=1
+sort -u $t
+rm -f $t
+
+exit $ret
diff --git a/rpm-mimetypedeps b/rpm-mimetypedeps
new file mode 100644 (file)
index 0000000..6c0176d
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+case $1 in
+-P|--provides)
+       while read filename; do
+       case "$filename" in
+       *.desktop)
+               mime=$(awk -F= '/^MimeType=/{print $2}' "$filename")
+               IFS=';'
+               for type in $mime; do
+                       if [ -n "$type" ]; then
+                               echo "mimetype($type)"
+                       fi
+               done
+               ;;
+       esac
+       done
+       ;;
+esac
+
+exit 0
diff --git a/rpm-php-provides b/rpm-php-provides
new file mode 100644 (file)
index 0000000..a094cba
--- /dev/null
@@ -0,0 +1,20 @@
+#!/usr/bin/perl
+#####################################################################
+#                                                                   #
+# Check system dependences between php-pear modules                 #
+#                                                                   #
+# Pawe³ Go³aszewski <blues@ds.pg.gda.pl>                            #
+# Micha³ Moskal <malekith@pld-linux.org>                            #
+# ------------------------------------------------------------------#
+# TODO:                                                             #
+#####################################################################
+
+$pear = "/usr/share/pear";
+
+foreach (@ARGV ? @ARGV : <>) {
+       chomp;
+       $f = $_;
+       next unless ($f =~ /$pear.*\.php$/);
+       $f =~ s/.*$pear\///;
+       print "pear($f)\n";
+}
diff --git a/rpm-php-requires b/rpm-php-requires
new file mode 100644 (file)
index 0000000..2a3fb60
--- /dev/null
@@ -0,0 +1,82 @@
+#!/usr/bin/perl
+#####################################################################
+#                                                                   #
+# Check system dependences between php-pear modules                 #
+#                                                                   #
+# Pawe³ Go³aszewski <blues@ds.pg.gda.pl>                            #
+# Micha³ Moskal <malekith@pld-linux.org>                            #
+# ------------------------------------------------------------------#
+# TODO:                                                             #
+# - extension_loaded - dependencies.                                #
+# - some clean-up...                                                #
+#####################################################################
+
+$pear = "/usr/share/pear";
+
+@files = ();
+%req = ();
+
+foreach (@ARGV ? $ARGV : <> ) {
+       chomp;
+       $f = $_;
+       push @files, $f;
+       # skip non-php files
+       next unless ($f =~ /\.php$/);
+       open(F, "< $f") or die;
+
+       if ($f =~ /$pear/) {
+               $file_dir = $f;
+               $file_dir =~ s|.*$pear/||;
+               $file_dir =~ s|/[^/]*$||;
+       } else {
+               $file_dir = undef;
+       }
+
+       while (<F>) {
+               # skip comments
+               next if (/^\s*(#|\/\/|\*|\/\*)/);
+
+               while (/(\W|^)(require|include)(_once)?
+                         \s* \(? \s* ("([^"]*)"|'([^']*)') 
+                         \s* \)? \s* ;/xg) {
+                       if ($5 ne "") {
+                               $x = $5;
+                       } elsif ($6 ne "") {
+                               $x = $6;
+                       } else {
+                               next;
+                       }
+
+                       next if ($x =~ m|^\./| or $x =~ /\$/);
+                       next unless ($x =~ /\.php$/);
+                       $req{$x} = 1;
+               }
+
+               next unless (defined $file_dir);
+
+               while (/(\W|^)(require|include)(_once)?
+                         \s* \(? \s* dirname \s* \( \s* __FILE__ \s* \) \s* \. \s*
+                         ("([^"]*)"|'([^']*)') 
+                         \s* \)? \s* ;/xg) {
+                       if ($5 ne "") {
+                               $x = $5;
+                       } elsif ($6 ne "") {
+                               $x = $6;
+                       } else {
+                               next;
+                       }
+
+                       next if ($x =~ /\$/);
+                       next unless ($x =~ /\.php$/);
+
+                       $x = "$file_dir/$x";
+                       $x =~ s|/+|/|g;
+                       $req{$x} = 1;
+               }
+       }
+}
+
+f: for $f (keys %req) {
+       for $g (@files) { next f if ($g =~ /\Q$f\E$/); }
+       print "pear($f)\n";
+}
diff --git a/rpm-php-requires.php b/rpm-php-requires.php
new file mode 100644 (file)
index 0000000..b398029
--- /dev/null
@@ -0,0 +1,174 @@
+#!/usr/bin/php
+<?php
+/*
+ * minify.spec does not see these: pear(HTTP/ConditionalGet.php) pear(HTTP/Encoder.php)
+ * perl version does
+ */
+/**
+ *
+ * Check system dependences between php-pear modules.
+ *
+ * Paweł Gołaszewski <blues@pld-linux.org> (Perl version)
+ * Michał Moskal <malekith@pld-linux.org> (Perl version)
+ * Elan Ruusamäe <glen@pld-linux.org>
+ *
+ * URL: <http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/rpm/rpm-php-requires.php>
+ *
+ * Requires: php-pear-PHP_CompatInfo
+ * Requires: php-pcre
+ */
+
+/**
+ * Produce pear(Path/To/File.php) deps
+ * Ported to PHP from Perl version of rpm-php-requires.
+ *
+ * @TODO: use tokenizer to parse php files.
+ */
+function peardeps($files) {
+       // files inside php_pear_dir have this prefix
+       $prefix = RPM_BUILD_ROOT. PHP_PEAR_DIR . DIRECTORY_SEPARATOR;
+       $length = strlen($prefix);
+
+       $req = array();
+       foreach ($files as $f) {
+               // skip non-php files
+               if (substr($f, -4) != '.php') {
+                       continue;
+               }
+
+               // subdir inside php_pear_dir
+               if (substr($f, 0, $length) == $prefix) {
+                       $file_dir = dirname(substr($f, $length));
+               } else {
+                       $file_dir = null;
+               }
+
+               foreach (file($f) as $line) {
+                       // skip comments -- not perfect, matches "*" at start of line (very rare altho)
+                       if (preg_match('/^\s*(#|\/\/|\*|\/\*)/', $line)) {
+                               continue;
+                       }
+
+                       if (preg_match("/(\W|^)(require|include)(_once)?
+                                       \s* \(? \s*
+                                       (\"([^\"]*)\"|'([^']*)')
+                                       \s* \)? \s* ;/x", $line, $m)) {
+
+                               if ($m[5]) {
+                                       $x = $m[5];
+                               } else if ($m[6]) {
+                                       $x = $m[6];
+                               } else {
+                                       continue 2;
+                               }
+
+                               if (substr($x, 0, 2) == './' || substr($x, -1) == '$') {  # XXX must be: CONTAINS DOLLAR
+                                       continue 2;
+                               }
+
+                               if (substr($x, -4) != '.php') {
+                                       continue 2;
+                               }
+                               $req[$x] = 1;
+                               continue 2;
+                       }
+
+                       if (is_null($file_dir)) {
+                               continue;
+                       }
+
+                       if (preg_match("/(\W|^)(require|include)(_once)?
+                                       \s* \(? \s* dirname \s* \( \s* __FILE__ \s* \) \s* \. \s*
+                                       (\"([^\"]*)\"|'([^']*)')
+                                       \s* \)? \s* ;/x", $line, $m)) {
+
+                               if ($m[5]) {
+                                       $x = $m[5];
+                               } else if ($m[6]) {
+                                       $x = $m[6];
+                               } else {
+                                       continue 2;
+                               }
+
+                               if (substr($x, -1) == '$') { # XXX must be: CONTAINS DOLLAR
+                                       continue 2;
+                               }
+                               if (substr($x, -4) != '.php') {
+                                       continue 2;
+                               }
+
+                               $x = "$file_dir/$x";
+                               // remove double slashes
+                               // TODO: resolve simpletest/test/../socket.php -> simpletest/socket.php
+                               $x = str_replace("//", "/", $x);
+                               $req[$x] = 1;
+                               continue;
+                       }
+               }
+       }
+
+       foreach (array_keys($req) as $f) {
+               // skip self deps
+               if (array_key_exists($f, $files)) {
+                       continue;
+               }
+               echo "pear($f)\n";
+       }
+}
+
+/**
+ * Produce dependencies for extensions using PEAR PHP_CompatInfo package.
+ */
+function extdeps($files) {
+       require_once 'PHP/CompatInfo.php';
+
+       $info = new PHP_CompatInfo('null');
+       $res = $info->parseData($files);
+
+       // minimum php version we accept
+       // "%define php_min_version 5.1.2" in spec to minimum version to be 5.1.2
+       $version = max(PHP_MIN_VERSION, $res['version']);
+
+       if (version_compare($version, '5.0.0', 'ge')) {
+               # force php-<name> only deps when php5
+               # XXX what about php-pecl-<name> virtual provides?
+               $fmt = 'php-%s';
+               $epoch = 4;
+       } else {
+               $fmt = 'php(%s)';
+               $epoch = 3;
+       }
+       echo "php-common >= ", $epoch, ":", $version, "\n";
+
+       // process extensions
+       foreach ($res['extensions'] as $ext) {
+               // bz2 ext is in php-bzip2 package
+               if ($ext == 'bz2') {
+                       $ext = 'bzip2';
+               }
+               // libxml ext is in php-xml package
+               if ($ext == 'libxml') {
+                       $ext = 'xml';
+               }
+
+               // these need to be lowercased
+               if (in_array($ext, array('SPL', 'PDO', 'SQLite', 'Reflection', 'SimpleXML'))) {
+                       $ext = strtolower($ext);
+               }
+
+               printf("$fmt\n", $ext);
+       }
+}
+
+define('RPM_BUILD_ROOT', getenv('RPM_BUILD_ROOT'));
+define('PHP_PEAR_DIR', '/usr/share/pear');
+define('PHP_MIN_VERSION', getenv('PHP_MIN_VERSION'));
+
+if ($argc > 1) {
+       $files = array_splice($argv, 1);
+} else {
+       $files = explode(PHP_EOL, trim(file_get_contents('php://stdin')));
+}
+
+peardeps($files);
+extdeps($files);
diff --git a/rpm-tld-macros.spec b/rpm-tld-macros.spec
new file mode 100644 (file)
index 0000000..0ee9bfd
--- /dev/null
@@ -0,0 +1,268 @@
+%define                rpm_macros_rev  1.747
+%define                find_lang_rev   1.40
+# split into individual X_prov_ver if there is a reason to desync
+%define                prov_ver        4.15
+Summary:       TLD Linux RPM macros
+Summary(pl.UTF-8):     Makra RPM dla Linuksa TLD
+Name:          rpm-tld-macros
+Version:       %{rpm_macros_rev}
+Release:       1
+License:       GPL v2+
+Group:         Development/Building
+Source0:       macros.tld
+Source1:       service_generator.sh
+Source3:       find-lang.sh
+Source4:       dokuwiki-find-lang.sh
+Source5:       macros.kernel
+Source6:       attr.kernel
+Source8:       rpm-compress-doc
+Source9:       rpm-find-spec-bcond
+
+Source10:      attr.ruby
+Source11:      macros.ruby
+Source12:      rubygems.rb
+Source13:      gem_helper.rb
+
+Source20:      attr.java
+Source21:      macros.java
+Source22:      rpm-java-requires
+Source23:      eclipse-feature.xslt
+
+Source30:      attr.php
+Source31:      macros.php
+Source32:      rpm-php-provides
+Source33:      rpm-php-requires
+Source34:      rpm-php-requires.php
+
+Source40:      macros.browser-plugins
+Source41:      macros.cacti
+Source42:      macros.emacs
+Source43:      macros.ghc
+Source44:      macros.nagios
+Source45:      macros.openldap
+Source46:      macros.perl
+Source47:      macros.python
+Source48:      macros.systemd
+Source49:      macros.tcl
+Source50:      macros.upstart
+Source51:      macros.webapp
+Source52:      macros.xmms
+Source53:      macros.xorg
+
+Source60:      rpm-mimetypedeps
+Source61:      macros.mimetype
+
+BuildRequires: rpm >= 4.4.9-56
+BuildRequires: sed >= 4.0
+BuildArch:     noarch
+BuildRoot:     %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
+
+# redefine to bootstrap
+%define                _usrlibrpm %{_prefix}/lib/rpm
+
+%description
+This package contains rpm macros for TLD Linux.
+
+%description -l pl.UTF-8
+Ten pakiet zawiera makra rpm-a dla Linuksa TLD.
+
+%package build
+Summary:       TLD Linux RPM build macros
+Summary(pl.UTF-8):     Makra do budowania pakietów RPM dla Linuksa TLD
+Group:         Development/Building
+Requires:      findutils >= 1:4.2.26
+Provides:      rpmbuild(find_lang) = %{find_lang_rev}
+Provides:      rpmbuild(macros) = %{rpm_macros_rev}
+Obsoletes:     rpm-build-macros
+Obsoletes:     rpm-macros
+# rm: option `--interactive' doesn't allow an argument
+Conflicts:     coreutils < 6.9
+Conflicts:     gettext-devel < 0.11
+# tmpdir/_tmppath macros problems; optcppflags missing
+Conflicts:     rpm < 4.4.9-72
+# macros.d/*
+Conflicts:     rpm-build < 4.5-90
+# php-config --sysconfdir
+Conflicts:     php-devel < 4:5.2.0-3
+Conflicts:     php4-devel < 3:4.4.4-10
+# sysconfig module with proper 'purelib' path
+Conflicts:     python3 < 1:3.2.1-3
+# libtool --install
+Conflicts:     libtool < 2:2.2
+
+%description build
+This package contains rpm build macros for TLD Linux.
+
+%description build -l pl.UTF-8
+Ten pakiet zawiera makra rpm-a do budowania pakietów dla Linuksa TLD.
+
+%package rubyprov
+Summary:       Ruby tools, which simplify creation of RPM packages with Ruby software
+Summary(pl.UTF-8):     Makra ułatwiające tworzenie pakietów RPM z programami napisanymi w Ruby
+Group:         Applications/File
+Requires:      %{name}-build = %{version}-%{release}
+Requires:      ruby
+Requires:      ruby-modules
+Requires:      ruby-rubygems
+Provides:      rpm-rubyprov = %{prov_ver}
+Obsoletes:     rpm-rubyprov
+
+%description rubyprov
+Ruby tools, which simplifies creation of RPM packages with Ruby
+software.
+
+%description rubyprov -l pl.UTF-8
+Makra ułatwiające tworzenie pakietów RPM z programami napisanymi w
+Ruby.
+
+%package javaprov
+Summary:       Additional utilities for checking Java provides/requires in RPM packages
+Summary(pl.UTF-8):     Dodatkowe narzędzia do sprawdzania zależności kodu w Javie w pakietach RPM
+Group:         Applications/File
+Requires:      %{name}-build = %{version}-%{release}
+Requires:      jar
+Requires:      jre
+Requires:      file
+Requires:      findutils >= 1:4.2.26
+Requires:      mktemp
+Requires:      unzip
+Provides:      rpm-javaprov = %{prov_ver}
+Obsoletes:     rpm-javaprov
+
+%description javaprov
+Additional utilities for checking Java provides/requires in RPM
+packages.
+
+%description javaprov -l pl.UTF-8
+Dodatkowe narzędzia do sprawdzania zależności kodu w Javie w pakietach
+RPM.
+
+%package php-pearprov
+Summary:       Additional utilities for checking PHP PEAR provides/requires in RPM packages
+Summary(pl.UTF-8):     Dodatkowe narzędzia do sprawdzania zależności skryptów php w RPM
+Group:         Applications/File
+Requires:      %{name}-build = %{version}-%{release}
+Requires:      sed >= 4.0
+Suggests:      php-pear-PHP_CompatInfo
+Provides:      rpm-php-pearprov = %{prov_ver}
+Obsoletes:     rpm-php-pearprov
+
+%description php-pearprov
+Additional utilities for checking PHP PEAR provides/requires in RPM
+packages.
+
+%description php-pearprov -l pl.UTF-8
+Dodatkowe narzędzia do sprawdzenia zależności skryptów PHP PEAR w
+pakietach RPM.
+
+%prep
+%setup -qcT
+cp -p %{SOURCE0} .
+cp -p %{SOURCE1} .
+
+%build
+%{__sed} -i -e 's,{Revision},%{rpm_macros_rev},' macros.tld
+
+rev=$(awk '/^%%rpm_build_macros/{print $2}' macros.tld)
+if [ "$rev" != "%rpm_macros_rev" ]; then
+       : Update rpm_macros_rev define to $rev, and retry
+       exit 1
+fi
+rev=$(awk -F= '/^VERSION/{print $2}' %{SOURCE3})
+if [ "$rev" != "%find_lang_rev" ]; then
+       : Update find_lang_rev define to $rev, and retry
+       exit 1
+fi
+
+%install
+rm -rf $RPM_BUILD_ROOT
+install -d $RPM_BUILD_ROOT%{_usrlibrpm}/{macros.d,tld}
+
+cp -p macros.tld $RPM_BUILD_ROOT%{_usrlibrpm}/macros.build
+cp -p %{SOURCE8} $RPM_BUILD_ROOT%{_usrlibrpm}/compress-doc
+cp -p %{SOURCE9} $RPM_BUILD_ROOT%{_usrlibrpm}/find-spec-bcond
+
+cat %{SOURCE5} %{SOURCE6} >$RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.kernel
+
+install -p service_generator.sh $RPM_BUILD_ROOT%{_usrlibrpm}
+install -p %{SOURCE3} $RPM_BUILD_ROOT%{_usrlibrpm}/find-lang.sh
+install -p %{SOURCE4} $RPM_BUILD_ROOT%{_usrlibrpm}/dokuwiki-find-lang.sh
+
+cat %{SOURCE11} %{SOURCE10} >$RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.ruby
+install -p %{SOURCE12} $RPM_BUILD_ROOT%{_usrlibrpm}/rubygems.rb
+install -p %{SOURCE13} $RPM_BUILD_ROOT%{_usrlibrpm}/gem_helper.rb
+
+cat %{SOURCE21} %{SOURCE20} >$RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.java
+install %{SOURCE22} $RPM_BUILD_ROOT%{_usrlibrpm}/java-find-requires
+install %{SOURCE23} $RPM_BUILD_ROOT%{_usrlibrpm}/eclipse-feature.xslt
+
+cat %{SOURCE31} %{SOURCE30} >$RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.php
+cp -p %{SOURCE32} $RPM_BUILD_ROOT%{_usrlibrpm}/php.prov
+cp -p %{SOURCE33} $RPM_BUILD_ROOT%{_usrlibrpm}/php.req
+cp -p %{SOURCE34} $RPM_BUILD_ROOT%{_usrlibrpm}/php.req.php
+
+cp -p %{SOURCE40} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.browser-plugins
+cp -p %{SOURCE41} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.cacti
+cp -p %{SOURCE42} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.emacs
+cp -p %{SOURCE43} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.ghc
+cp -p %{SOURCE44} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.nagios
+cp -p %{SOURCE45} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.openldap
+cp -p %{SOURCE46} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.perl
+cp -p %{SOURCE47} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.python
+cp -p %{SOURCE48} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.systemd
+cp -p %{SOURCE49} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.tcl
+cp -p %{SOURCE50} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.upstart
+cp -p %{SOURCE51} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.webapp
+cp -p %{SOURCE52} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.xmms
+cp -p %{SOURCE53} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.xorg
+
+cp -p %{SOURCE60} $RPM_BUILD_ROOT%{_usrlibrpm}/mimetypedeps.sh
+cp -p %{SOURCE61} $RPM_BUILD_ROOT%{_usrlibrpm}/macros.d/macros.mimetype
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files build
+%defattr(644,root,root,755)
+%{_usrlibrpm}/macros.build
+%{_usrlibrpm}/macros.d/macros.browser-plugins
+%{_usrlibrpm}/macros.d/macros.cacti
+%{_usrlibrpm}/macros.d/macros.emacs
+%{_usrlibrpm}/macros.d/macros.ghc
+%{_usrlibrpm}/macros.d/macros.java
+%{_usrlibrpm}/macros.d/macros.kernel
+%{_usrlibrpm}/macros.d/macros.mimetype
+%{_usrlibrpm}/macros.d/macros.nagios
+%{_usrlibrpm}/macros.d/macros.openldap
+%{_usrlibrpm}/macros.d/macros.perl
+%{_usrlibrpm}/macros.d/macros.php
+%{_usrlibrpm}/macros.d/macros.python
+%{_usrlibrpm}/macros.d/macros.ruby
+%{_usrlibrpm}/macros.d/macros.systemd
+%{_usrlibrpm}/macros.d/macros.tcl
+%{_usrlibrpm}/macros.d/macros.upstart
+%{_usrlibrpm}/macros.d/macros.webapp
+%{_usrlibrpm}/macros.d/macros.xmms
+%{_usrlibrpm}/macros.d/macros.xorg
+%attr(755,root,root) %{_usrlibrpm}/service_generator.sh
+%attr(755,root,root) %{_usrlibrpm}/find-lang.sh
+%attr(755,root,root) %{_usrlibrpm}/dokuwiki-find-lang.sh
+%attr(755,root,root) %{_usrlibrpm}/compress-doc
+%attr(755,root,root) %{_usrlibrpm}/find-spec-bcond
+%attr(755,root,root) %{_usrlibrpm}/mimetypedeps.sh
+
+%files rubyprov
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_usrlibrpm}/gem_helper.rb
+%attr(755,root,root) %{_usrlibrpm}/rubygems.rb
+
+%files javaprov
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_usrlibrpm}/java-find-requires
+%{_usrlibrpm}/eclipse-feature.xslt
+
+%files php-pearprov
+%defattr(644,root,root,755)
+%attr(755,root,root) %{_usrlibrpm}/php.prov
+%attr(755,root,root) %{_usrlibrpm}/php.req
+%attr(755,root,root) %{_usrlibrpm}/php.req.php
diff --git a/rubygems.rb b/rubygems.rb
new file mode 100755 (executable)
index 0000000..faeeae0
--- /dev/null
@@ -0,0 +1,128 @@
+#!/usr/bin/ruby
+#--
+# Copyright 2010 Per Øyvind Karlsen <peroyvind@mandriva.org>
+# This program is free software. It may be redistributed and/or modified under
+# the terms of the LGPL version 2.1 (or later).
+#
+# FIXME: Someone with actual ruby skills should really clean up and sanitize
+#       this! fugliness obvious...
+#++
+
+require 'optparse'
+require 'rbconfig'
+
+provides = false
+requires = false
+
+opts = OptionParser.new("#{$0} <--provides|--requires>")
+opts.on("-P", "--provides", "Print provides") do |val|
+  provides = true
+end
+opts.on("-R", "--requires", "Print requires") do |val|
+  requires= true
+end
+
+rest = opts.permute(ARGV)
+
+if rest.size != 0 or (!provides and !requires) or (provides and requires)
+  $stderr.puts "Use either --provides OR --requires"
+  $stderr.puts opts
+  exit(1)
+end
+
+require 'rubygems'
+gem_dir = Gem.respond_to?(:default_dirs) ? Gem.default_dirs[:system][:gem_dir] : Gem.path.first
+specpatt = "#{gem_dir}/specifications/.*\.gemspec$"
+gems = []
+ruby_versioned = false
+abi_provide = false
+# as ruby_version may be empty, take version from basename of archdir
+ruby_version = RbConfig::CONFIG["ruby_version"].empty? ? File.basename(RbConfig::CONFIG["archdir"]) : RbConfig::CONFIG["ruby_version"]
+
+for path in $stdin.readlines
+  # way fugly, but we make the assumption that if the package has
+  # this file, the package is the current ruby version, and should
+  # therefore provide ruby(abi) = version
+  if provides and path.match(RbConfig::CONFIG["archdir"] + "/rbconfig.rb")
+     abi_provide = true
+     ruby_versioned = true
+  elsif path.match(specpatt)
+    gems.push(path.chomp)
+  # this is quite ugly and lame, but the assumption made is that if any files
+  # found in any of these directories specific to this ruby version, the
+  # package is dependent on this specific version.
+  # FIXME: only supports current ruby version
+  elsif not ruby_versioned
+    if path.match(RbConfig::CONFIG["rubylibdir"])
+      ruby_versioned = true
+    elsif path.match(RbConfig::CONFIG["archdir"])
+      ruby_versioned = true
+    elsif path.match(RbConfig::CONFIG["sitelibdir"])
+      ruby_versioned = !RbConfig::CONFIG["ruby_version"].empty?
+    elsif path.match(RbConfig::CONFIG["sitearchdir"])
+      ruby_versioned = true
+    elsif path.match(RbConfig::CONFIG["vendorlibdir"])
+      ruby_versioned = !RbConfig::CONFIG["ruby_version"].empty?
+    elsif path.match(RbConfig::CONFIG["vendorarchdir"])
+      ruby_versioned = true
+    end
+  end
+end
+
+if requires or abi_provide
+  abidep = "ruby(abi)"
+  if ruby_versioned
+    abidep += " = %s" % ruby_version
+  end
+  print abidep + "\n"
+end
+
+if gems.length > 0
+  require 'rubygems'
+
+  if requires
+
+    module Gem
+      class Requirement
+        def rpm_dependency_transform(name, version)
+          pessimistic = ""
+          if version == "> 0.0.0" or version == ">= 0"
+            version = ""
+          else
+            if version[0..1] == "~>"
+              pessimistic = "rubygem(%s) < %s\n" % [name, Gem::Version.create(version[3..-1]).bump]
+              version = version.gsub(/\~>/, '=>')
+            end
+            if version[0..1] == "!="
+              version = version.gsub(/\!=/, '>')
+            end
+            version = version.sub(/^/, ' ')
+          end
+          version = "rubygem(%s)%s\n%s" % [name, version, pessimistic]
+        end
+
+        def to_rpm(name)
+          result = as_list
+          return result.map { |version| rpm_dependency_transform(name, version) }
+        end
+
+      end
+    end
+  end
+
+  for gem in gems
+    data = File.read(gem)
+    spec = eval(data)
+    if provides
+      print "rubygem(%s) = %s\n" % [spec.name, spec.version]
+    end
+    if requires
+      for d in spec.dependencies
+        print d.requirement.to_rpm(d.name)[0] unless d.type != :runtime
+      end
+      for d in spec.required_rubygems_version.to_rpm("rubygems")
+        print d.gsub(/(rubygem\()|(\))/, "")
+      end
+    end
+  end
+end
diff --git a/service_generator.sh b/service_generator.sh
new file mode 100755 (executable)
index 0000000..b4f60d4
--- /dev/null
@@ -0,0 +1,87 @@
+#!/bin/sh
+# init vars
+service="$1"
+action="$2"
+desc="$3"
+quiet=$quiet
+noop=$noop
+if [ -z "$desc" ]; then
+       desc="$1 service"
+fi
+
+# action stop implies quiet mode and check disabling
+if [ "$action" = "stop" ]; then
+       quiet=1
+else
+       check=1
+fi
+
+# common part
+service_body() {
+       cat <<-EOF
+               if [ -f /var/lock/subsys/$service ]; then
+       EOF
+       if [ "$noop" = 1 ]; then
+               echo :
+       else
+               cat <<-EOF
+                       /sbin/service $service $action 1>&2 || :;
+               EOF
+       fi
+
+       if [ "$quiet" != 1 ]; then
+               cat <<-EOF
+               else
+                       echo 'Run "/sbin/service $service start" to start $desc.'
+               EOF
+       fi
+       cat <<-EOF
+               fi
+       EOF
+}
+
+# include check function
+skip_auto_restart_body() {
+       cat <<-EOF
+               skip_auto_restart() {
+                       [ -f /etc/sysconfig/rpm ] && . /etc/sysconfig/rpm
+                       [ -f /etc/sysconfig/$service ] && . /etc/sysconfig/$service
+                       echo \${RPM_SKIP_AUTO_RESTART:-no}
+               };
+       EOF
+}
+
+echo ''
+if [ "$check" = 1 ]; then
+       skip_auto_restart_body
+       echo 'if [ $(skip_auto_restart) = no ]; then'
+               service_body
+       echo 'else'
+               # service restart was disabled, tell them to restart it
+       cat <<-EOF
+               if [ -f /var/lock/subsys/$service ]; then
+                       echo 'Run "/sbin/service $service restart" to restart $desc.'
+               fi
+       EOF
+       echo 'fi'
+else
+       service_body
+fi
+
+exit 0
+
+# for testing - no syntax errors allowed
+rpm -E '%service monit restart' | sh
+rpm -E '%service monit restart -q' | sh
+rpm -E '%service monit stop' | sh
+rpm -E '%service monit stop -q' | sh
+rpm -E '%service monit stop "Monit Daemon"' | sh
+rpm -E '%service monit stop "Monit Daemon" -q' | sh
+rpm -E '%service monit restart "Monit Daemon"' | sh
+rpm -E '%service monit restart -q "Monit Daemon"' | sh
+rpm -E '%service monit reload "Monit Daemon"' | sh
+rpm -E '%service monit reload -q "Monit Daemon"' | sh
+rpm -E '%{service monit reload "Monit Daemon"} date' | sh
+rpm -E '%{service monit reload "Monit Daemon" -q} date' | sh
+rpm -E '%{service -n monit restart "Monit Daemon" } date' | sh
+