From b5115bb76a6795a89fadf5f4e7161f26203c7678 Mon Sep 17 00:00:00 2001 From: Marcin Krol Date: Wed, 29 Apr 2020 17:13:12 +0200 Subject: [PATCH] - rpm macros for TLD Linux, based on PLD rpm macros --- attr.java | 3 + attr.kernel | 3 + attr.php | 5 + attr.ruby | 4 + dokuwiki-find-lang.sh | 65 ++ eclipse-feature.xslt | 81 +++ find-lang.sh | 319 +++++++++ gem_helper.rb | 197 ++++++ macros.browser-plugins | 26 + macros.cacti | 23 + macros.emacs | 4 + macros.ghc | 13 + macros.java | 165 +++++ macros.kernel | 350 ++++++++++ macros.mimetype | 7 + macros.nagios | 41 ++ macros.openldap | 44 ++ macros.perl | 10 + macros.php | 193 ++++++ macros.python | 185 ++++++ macros.ruby | 46 ++ macros.systemd | 17 + macros.tcl | 7 + macros.tld | 1415 ++++++++++++++++++++++++++++++++++++++++ macros.upstart | 37 ++ macros.webapp | 37 ++ macros.xmms | 11 + macros.xorg | 38 ++ pydebuginfo.patch | 18 + rpm-compress-doc | 85 +++ rpm-find-spec-bcond | 64 ++ rpm-java-requires | 137 ++++ rpm-mimetypedeps | 21 + rpm-php-provides | 20 + rpm-php-requires | 82 +++ rpm-php-requires.php | 174 +++++ rpm-tld-macros.spec | 268 ++++++++ rubygems.rb | 128 ++++ service_generator.sh | 87 +++ 39 files changed, 4430 insertions(+) create mode 100644 attr.java create mode 100644 attr.kernel create mode 100644 attr.php create mode 100644 attr.ruby create mode 100755 dokuwiki-find-lang.sh create mode 100644 eclipse-feature.xslt create mode 100755 find-lang.sh create mode 100755 gem_helper.rb create mode 100644 macros.browser-plugins create mode 100644 macros.cacti create mode 100644 macros.emacs create mode 100644 macros.ghc create mode 100644 macros.java create mode 100644 macros.kernel create mode 100644 macros.mimetype create mode 100644 macros.nagios create mode 100644 macros.openldap create mode 100644 macros.perl create mode 100644 macros.php create mode 100644 macros.python create mode 100644 macros.ruby create mode 100644 macros.systemd create mode 100644 macros.tcl create mode 100644 macros.tld create mode 100644 macros.upstart create mode 100644 macros.webapp create mode 100644 macros.xmms create mode 100644 macros.xorg create mode 100644 pydebuginfo.patch create mode 100644 rpm-compress-doc create mode 100644 rpm-find-spec-bcond create mode 100755 rpm-java-requires create mode 100644 rpm-mimetypedeps create mode 100644 rpm-php-provides create mode 100644 rpm-php-requires create mode 100644 rpm-php-requires.php create mode 100644 rpm-tld-macros.spec create mode 100755 rubygems.rb create mode 100755 service_generator.sh diff --git a/attr.java b/attr.java new file mode 100644 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 index 0000000..1ff88f8 --- /dev/null +++ b/attr.kernel @@ -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 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 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 index 0000000..8965583 --- /dev/null +++ b/dokuwiki-find-lang.sh @@ -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 index 0000000..d48df03 --- /dev/null +++ b/eclipse-feature.xslt @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + eclipse( + + ) = + + + + + + + eclipse( + + ) = + + + + + + eclipse( + + ) = + + + + + + + + + eclipse( + + + + + + + + ) + + + + = + + + + + >= + + + + + + >= + + + + + + >= + + + + + + + + + + diff --git a/find-lang.sh b/find-lang.sh new file mode 100755 index 0000000..3e13e14 --- /dev/null +++ b/find-lang.sh @@ -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 + +# 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 +# * added --with-mate +# 2006-08-28 Elan Ruusamäe +# * fixed --all-name which got broken with last change. +# 2006-08-09 Elan Ruusamäe +# * huge performance boost for packages calling %find_lang multiple times (kde*i18n) +# 2001-01-08 Michał Kochanowicz +# * --all-name support for KDE. +# 2000-11-28 Rafał Cygnarowski +# * next simple rule for KDE +# 2000-11-12 Rafał Cygnarowski +# * simple rules for KDE help files +# 2000-06-05 Michał Kochanowicz +# * exact, not substring matching $NAME, i.e. find-lang top_dir NAME will +# no longer find /usr/share/locale/pl/LC_MESSAGES/NAME.mo. +# 2000-04-17 Arkadiusz Miśkiewicz +# * exit 1 when no files found +# 1999-10-19 Artur Frysiak +# * added support for GNOME help files +# * start support for KDE help files + +PROG=${0##*/} +VERSION=1.40 + +usage () { +cat <&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 index 0000000..6457a7a --- /dev/null +++ b/gem_helper.rb @@ -0,0 +1,197 @@ +#!/usr/bin/ruby +#-- +# Copyright 2010 Per Øyvind Karlsen +# 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.. + 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 index 0000000..b059f58 --- /dev/null +++ b/macros.browser-plugins @@ -0,0 +1,26 @@ +# browser plugins v2 +# Author: Elan Ruusamäe +# +# Usage: +# %browser_plugins_add_browser -p +# +# (required) -- name of the browser. usually %{name}. +# -p (required) -- in what directory browser searches for its plugins. +# -b -- default blacklists +# -a 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 index 0000000..d0592c6 --- /dev/null +++ b/macros.cacti @@ -0,0 +1,23 @@ +# Import or update Cacti template. +# +# Author: Elan Ruusamäe +# +# 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 index 0000000..bfd2f63 --- /dev/null +++ b/macros.emacs @@ -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 index 0000000..5842cf8 --- /dev/null +++ b/macros.ghc @@ -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 index 0000000..ee32a92 --- /dev/null +++ b/macros.java @@ -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 \ +\ +# 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\ +\ + \ + %1\ + %2\ + %3\ + \ + \ + %4\ + %5\ + %3\ + \ +\ +\ +EOF\ +%{nil} + +#============================================================================== +# +# update_maven_depmap updates the main maven depmap +# +%update_maven_depmap() \ +echo -e "\\n" > %{_mavendepmapdir}/maven2-depmap.xml\ +if [ -d %{_mavendepmapfragdir} ] && [ -n "`find %{_mavendepmapfragdir} -type f`" ]; then\ +cat %{_mavendepmapfragdir}/* >> %{_mavendepmapdir}/maven2-depmap.xml\ +fi\ +echo -e "\\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 +# +# 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 index 0000000..84d96b0 --- /dev/null +++ b/macros.kernel @@ -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 +# +# Usage: +# %build_kernel_modules -m -C +# +# remember that proper Makefile is still required +# Options: +# -m (required) -- comma-separated list of modules to save, +# without .ko extension, may be placed in subdirectory +# -C -- change to before doing anything +# -p , -P -- arguments passeed to make scripts +# -c -- do not execute make clean +# -- 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 +# +# Usage: +# %install_kernel_modules -m -d +# +# Options: +# -m (required) -- comma-separated list of modules to install, +# without .ko extension, may be placed in subdirectory +# -d (required) -- in what subdirectory modules should be +# installed (eg. misc, kernel/drivers/net) +# -s -- suffix to use when installing modules, useful when module +# with same name exists in kernel already +# -n -- name of modprobe config file to use (without .conf extension) +# for defining aliases, only useful with -s +# -D -- 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 index 0000000..5f67ab5 --- /dev/null +++ b/macros.mimetype @@ -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 index 0000000..24e312d --- /dev/null +++ b/macros.nagios @@ -0,0 +1,41 @@ +# Hook to register nagios object based plugins in Nagios NRPE daemon config. +# +# Author: Elan Ruusamäe +# +# 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 index 0000000..44207de --- /dev/null +++ b/macros.openldap @@ -0,0 +1,44 @@ +# Register OpenLDAP schema. +# Author: Elan Ruusamäe +# +# 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 +# +# 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 index 0000000..dc61310 --- /dev/null +++ b/macros.perl @@ -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 index 0000000..f2a83a3 --- /dev/null +++ b/macros.php @@ -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 +# +# 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 +%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 +# Usage: +# %post -p +# %%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 index 0000000..7b67e8d --- /dev/null +++ b/macros.python @@ -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 +# +# 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 +# Author: Arkadiusz Miśkiewicz +# +# 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 index 0000000..e0d309a --- /dev/null +++ b/macros.ruby @@ -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 index 0000000..8eb65cf --- /dev/null +++ b/macros.systemd @@ -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 index 0000000..5f784d1 --- /dev/null +++ b/macros.tcl @@ -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 index 0000000..5f218ad --- /dev/null +++ b/macros.tld @@ -0,0 +1,1415 @@ +# vim:ts=4 sw=4 noet ft=spec +# +# TLD Linux rpm macros. +# + +# 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 +# +%__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 +# 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] <= n; default n=5 +# -o - show only once, i.e when package is installed for the first time +# +# Tests: +# (rpm -E '%banner -e banner < m; sh -x m +# (rpm -E '%banner -o -e banner < m; sh -x m +# (rpm -E '%banner -o -e banner < 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 +# +# 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 +# +# 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 +# +# Usage: +# %patchset_source -f [] +# %patchset_patch [] +# If is omited, it is assumed to be . +# +# 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 -s +# %patchset_patch -s +# 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 +# +# %__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 +# +# Usage: +# %post -p +# %lua_add_etc_shells /bin/sh /bin/pdksh +# +# %preun -p +# 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 +# +# 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 as first line) +# +# Requirements: +# BuildRequires: rpmbuild(macros) >= 1.429 +# +%add_etc_shells(p) %{-p:}\ +%{expand:%%lua_add_etc_shells %*}\ +%{nil} + +%remove_etc_shells(p) %{-p:}\ +%{-p:if arg[2] == 0 then}\ +%{expand:%%lua_remove_etc_shells %*}\ +%{-p:end} \ +%{nil} + +# Undos files +# +# Author: Paweł Zuzelski +# Author: Elan Ruusamäe +# +# 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 index 0000000..0979386 --- /dev/null +++ b/macros.upstart @@ -0,0 +1,37 @@ +# pre/post script for -upstart subpackages +# +# Author: Jacek Konieczny +# Author: Elan Ruusamäe +# +# 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 index 0000000..30f21b2 --- /dev/null +++ b/macros.webapp @@ -0,0 +1,37 @@ +# webapp macros +# Author: Elan Ruusamäe +# +# 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 index 0000000..e5c2066 --- /dev/null +++ b/macros.xmms @@ -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 index 0000000..f07d665 --- /dev/null +++ b/macros.xorg @@ -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 index 0000000..644e08a --- /dev/null +++ b/pydebuginfo.patch @@ -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 pld-linux 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 index 0000000..3c5ff93 --- /dev/null +++ b/rpm-compress-doc @@ -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 index 0000000..a11dece --- /dev/null +++ b/rpm-find-spec-bcond @@ -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 index 0000000..8bbac6f --- /dev/null +++ b/rpm-java-requires @@ -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 + +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 index 0000000..6c0176d --- /dev/null +++ b/rpm-mimetypedeps @@ -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 index 0000000..a094cba --- /dev/null +++ b/rpm-php-provides @@ -0,0 +1,20 @@ +#!/usr/bin/perl +##################################################################### +# # +# Check system dependences between php-pear modules # +# # +# Pawe³ Go³aszewski # +# Micha³ Moskal # +# ------------------------------------------------------------------# +# 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 index 0000000..2a3fb60 --- /dev/null +++ b/rpm-php-requires @@ -0,0 +1,82 @@ +#!/usr/bin/perl +##################################################################### +# # +# Check system dependences between php-pear modules # +# # +# Pawe³ Go³aszewski # +# Micha³ Moskal # +# ------------------------------------------------------------------# +# 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 () { + # 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 index 0000000..b398029 --- /dev/null +++ b/rpm-php-requires.php @@ -0,0 +1,174 @@ +#!/usr/bin/php + (Perl version) + * Michał Moskal (Perl version) + * Elan Ruusamäe + * + * URL: + * + * 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- only deps when php5 + # XXX what about php-pecl- 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 index 0000000..0ee9bfd --- /dev/null +++ b/rpm-tld-macros.spec @@ -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 index 0000000..faeeae0 --- /dev/null +++ b/rubygems.rb @@ -0,0 +1,128 @@ +#!/usr/bin/ruby +#-- +# Copyright 2010 Per Øyvind Karlsen +# 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 index 0000000..b4f60d4 --- /dev/null +++ b/service_generator.sh @@ -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 + -- 2.44.0