From: Marcin Krol Date: Wed, 29 Apr 2020 15:13:12 +0000 (+0200) Subject: - rpm macros for TLD Linux, based on PLD rpm macros X-Git-Url: https://git.tld-linux.org/?p=packages%2Frpm-tld-macros.git;a=commitdiff_plain;h=b5115bb76a6795a89fadf5f4e7161f26203c7678 - rpm macros for TLD Linux, based on PLD rpm macros --- b5115bb76a6795a89fadf5f4e7161f26203c7678 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 +