autospec/plugins/spec-create-old.in
2011-04-26 21:39:44 +02:00

1508 lines
53 KiB
Bash

#!/bin/bash
# pck-create -- plugin for @package@
# Copyright (C) 2004-2010 Davide Madrisan <davide.madrisan@gmail.com>
[ -z "$BASH" ] || [ ${BASH_VERSION:0:1} -lt 3 ] &&
{ echo $"this script requires bash version 3 or better" >&2 && exit 1; }
me=(${0##*/} "@version@" "@date@")
[ -r @libdir@/libmsgmng.lib ] ||
{ echo "$me: "$"library not found"": @libdir@/libmsgmng.lib" 1>&2
exit 1; }
. @libdir@/libmsgmng.lib
[ -r @libdir@/libnetwork.lib ] ||
{ echo "$me: "$"library not found"": @libdir@/libnetwork.lib" 1>&2
exit 1; }
. @libdir@/libnetwork.lib
# default values:
# colorized output (disabled by default)
let "colorize = 0"
# output verbosity
let "verbose = 1"
# Display all the man pages in the autogenerated specfile ("0")
# One entry per man page section ("1")
# Only one entry for all the man pages ("2")
let "man_condensed_list = 0"
# Display all the info pages in the autogenerated specfile ("0") (default)
# Only one entry for all the info pages ("1")
let "info_condensed_list = 0"
# do not use rpm variables for unix tools
let "format_unix_tools = 0"
spec_type="standard"
# load the configuration file(s)
[ -r @libdir@/libcfg.lib ] ||
{ echo "$me: "$"library not found"": @libdir@/libcfg.lib" 1>&2
exit 1; }
. @libdir@/libcfg.lib
if [[ -z "$LANG" && -r /etc/sysconfig/i18n ]]; then
. /etc/sysconfig/i18n
[ "$LANG" ] && export LANG
fi
TEXTDOMAIN="${me[0]}"; export TEXTDOMAIN
function copying() {
echo "\
"$"This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License version 2 as published by the
Free Software Foundation. There is NO warranty; not even for MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE."
}
function version() {
echo "\
${me[0]} ${me[1]}
Copyright (C) 2004-2010 Davide Madrisan <davide.madrisan@gmail.com>"
}
# $1: optional exit code (default is '1')
function usage() {
version
echo "\
"$"Try to create a specfile for the specified <tarball>"".
"$"Usage"":
@frontend@ -s <tarball> [-n <name>] [-v <ver>] [-t <type>] [-o <outfile>]
"$"where the above options mean"":
-s, --source "$"Try to create a specfile for the specified <tarball>""
-n, --pck-name "$"Name of the package (default: taken from tarball name)""
-v, --pck-version "$"Version of the package (default: taken from tarball name)""
-t, --type "$"Typology of the specfile to be created""
standard : "$"standard specfile (default)""
gnome : "$"specfile for gnome packages""
kde3 : "$"specfile for kde3 packages""
kde4 : "$"specfile for kde4 packages""
library : "$"specfile for common library packages""
librarytools: "$"specfile for library packages with tools""
perl : "$"specfile for single-package perl modules""
python : "$"specfile for python modules""
-o, --output "$"Redirect the output to the file <outfile>""
"$"Operation modes"":
-h, --help "$"Print this help, then exit""
-V, --version "$"Print version number, then exit""
-q, --quiet "$"Run in quiet mode""
-r, --colorize "$"Enable the colorized output""
-D, --debug "$"Run in debugging mode (very verbose output)""
"$"Samples"":
@frontend@ -s ~/software/@package@-@version@.tar.bz2 -t standard -o @package@.spec
@frontend@ -s http://ftp.qilinux.it/devel/tools/@package@/@package@-@version@.tar.bz2
"$"Report bugs to <davide.madrisan@gmail.com>."
exit ${1:-1}
}
case $1 in
--autospec-args-file*)
if [[ "$1" =~ = ]]; then
argsfile=`echo $1 | sed 's/^--autospec-args-file=//'`
else
argsfile=$2
fi
[ -r "$argsfile" ] || notify.error $"cannot read"": \`$argsfile'"
. $argsfile && rm -f $argsfile
;;
esac
for arg in $@; do
case $arg in
-h|--help) usage 0 ;;
-V|--version) version; echo; copying; exit 0 ;;
esac
done
# the user configuration file for @package@ is required
config.check4user
exec_options=`LANG=C getopt \
-o s:n:v:t:o:DqrhV \
--long \
source:,pck-name:,pck-version:,type:,output:,\
debug,quiet,colorize,help,version,\
frontend_opts: \
-n "$me" -- "$@"`
[ $? = 0 ] || exit 1
notify.debug "[ ${0} ${exec_options} ]\n"
eval set -- "$exec_options"
while :; do
case $1 in
-s|--source)
[ "$2" = "--help" ] && usage 0
[ "$2" = "-h" ] && usage 0
pck_tarball=$2; shift
;;
-n|--pck-name)
pck_name=$2; shift ;;
-v|--pck-version)
shift; pck_version=$1 ;;
-t|--type)
spec_type=$2; shift ;;
-o|--output)
outfile=$2; shift ;;
-D|--debug)
let "verbose = 2" ;;
-q|--quiet)
let "verbose = 0" ;;
-r|--colorize)
let "colorize = 1" ;;
-h|--help)
usage 0 ;;
-V|--version)
version; echo; copying; exit 0 ;;
--) shift; break ;;
*) notify.error $"unrecognized option"" -- \`$1'" ;;
esac
shift
done
for arg in $@; do
notify.error $"unrecognized option"" -- \`$arg'"
done
[ "$colorize" = "1" ] && notify.enable_colors
[ "$perl_Makefile_generator" ] || perl_Makefile_generator="Makefile.PL"
# specfile.create()
# Parameters:
# $1 : try to create a specfile from this tarball
# $2 : package name
# $3 : package version
# $4 : package tipology (template)
# $5 : output file
# Description:
# Create an initial specfile to help packaging activities
#
function specfile.create() {
notify.debug "[ ${0}${exec_options} ]\n"
# check if all the needed tools are available
# note: uncompress has been removed from the mandatory list
for tool in \
chmod find fmt grep mktemp sed sort uniq \
bunzip2 gunzip unzip; do
[ "$(type -p $tool)" ] ||
notify.error $"utility not found"": \`$tool'"
done
# expand Makefile variables found in string '$1' looking in the
# makefile '$2' and in the main Makefile
# this function expand also configure variables (@var@)
function expand.variables() {
local str="$1"
local am_makefile="$2"
local token var expanded
notify.debug "str = \"$str\", am_makefile = \"$am_makefile\""
# expand the Makefile variables
OIFS="$IFS"; IFS='$'
for token in $str; do
[ "$token" ] || continue
var="`echo "$token" | sed 's,(,,;s,).*,,;s,{,,;s,}.*,,'`"
token="`echo "$token" | sed 's,(,,;s,).*,,;s,}.*,},'`"
unset expanded
[[ -n "$am_makefile" && -e "$am_makefile" ]] &&
expanded=`sed -n ":a
/\\\\$/N;s/\\\\\n//;ta
/^[ ]*${var//\//\\/}[ ]*=/{s,.*=[ ]*,,p}" $am_makefile`
if [ "$expanded" ]; then
str="`echo "$str" | \
sed "s,\\$($var),$expanded,g;
s,\\${$var},$expanded,g"`"
else
# try to find a value looking in the main Makefile
[[ -e $tmpdir/$pck_rootdir/Makefile.in ]] &&
expanded=`sed -n ":a
/\\\\$/N;s/\\\\\n//;ta
/^[ ]*${var//\//\\/}[ ]*=/{s,.*=[ ]*,,p}" \
$tmpdir/$pck_rootdir/Makefile.in`
[[ "$expanded" ]] && str="`echo "$str" | \
sed "s,\\$($var),$expanded,g;
s,\\${$var},$expanded,g"`"
fi
[[ "$expanded" ]] &&
notify.debug "\
\"$token\" == \"$expanded\" (${am_makefile:-Makefile.in})" ||
notify.debug " \"$token\" == <not found>"
notify.debug " --> str = \"$str\""
done
IFS="$OIFS"
# expand the configure variables
OIFS="$IFS"; IFS='@'
case "$str" in
*@*@*)
if [[ -x $tmpdir/$pck_rootdir/configure ]]; then
for token in ${str%@*}; do
[[ "$token" ]] || continue
notify.debug " token = \"$token\""
# note: if there are two or more matching lines,
# the first is choosen
local expanded=`sed -n "\
# concatenate lines with a trailing backslash
/^[ ]*${token//\//\\/}=[^ ]*[ ]*$/{
s,.*=\([^ ]*\).*,\1,;s,',,g;p;q}" ./configure`
notify.debug " \"$token\" == \"$expanded\""
# if @$token@ has been found in ./configure
if [[ -n "$expanded" ]]; then
str=`echo "${str/$/\\$}" | \
sed "s,@$token@,$expanded,"`
notify.debug " --> str = \"$str\""
fi
done
fi ;;
esac
IFS="$OIFS"
# try to adjust unresolved variables (best effort)
# i.e. "$(libdir)/pkgconfig" --> "%{_libdir}/pkgconfig"
str=`echo "$str" | sed 's,\${\([^_]\),%{_\1,g;s,\$(,%{_,g;s,),},g'`
notify.debug " --> str = \"$str\""
echo "$str"
}
# find informations about available info pages
function specfile.infopages() {
local automake_used=`
[[ ! -e $tmpdir/$pck_rootdir/Makefile.am ]]; echo $?`
cd $tmpdir/$pck_rootdir &&
case $1 in
--exist)
# If the package contains Texinfo source, it will be declared
# with the 'TEXINFOS' primary.
# Generally Texinfo files are converted into info, and thus the
# 'info_TEXINFOS' macro is most commonly used.
# Any Texinfo source file must end in the '.texi', '.txi', or
# '.texinfo' extension ('.texi' is recommended).
#
# e.g. info_TEXINFOS = texinfo.txi info-stnd.texi info.texi
[[ $automake_used -eq 1 ]] &&
[[ "\
`LANG=C find -name Makefile.am -exec grep "info_TEXINFOS[ ]*=" {} \;`" ]] ||
[[ "`LANG=C find -type f \
\( -name '*.texi' -or -name '*.txi' -or -name '*.texinfo' \)`" ]]
echo $((! $?)) ;;
--list)
if [[ $automake_used -eq 0 ]]; then
[[ `specfile.infopages --exist` = 1 ]] &&
echo "%{_infodir}/<"$"info-page"">"
else
LANG=C find -name Makefile.am -exec \
sed -n -e :a -e '
# if a line ends with a backslash, append...
/\\$/N;s/\\\n//;ta # ...the next line to it
/info_TEXINFOS[ ]*=/p' {} \; |
while read macro skip infopages_list; do
for f in ${infopages_list/\.*/}; do
LANG=C find -name $f\* \
-exec grep -H "produced by makeinfo" {} \; |
sed "s,.*/\(.*\):.*,%{_infodir}/\1$info_compress_ext,"
done
done
fi ;;
*) notify.error $"\
(bug)"" -- "$"illegal arg#1 for \`$FUNCNAME'" ;;
esac
}
# find informations about available man pages
function specfile.manpages() {
# find the list of the manpages when automake is used
# output like this:
# MANSRC = pkcs15-crypt.1 pkcs15-init.1 ...
function manpages.am_expand() {
local am_makefile
for am_makefile in `LANG=C find -name Makefile.am -exec \
grep -rl -m1 -e "MANS[ ]*=" {} \;`; do
sed -n -e :a -e '
# if a line ends with a backslash, append...
/\\$/N;s/\\\n//;ta # ...the next line to it
/MANS[ ]*=/p' $am_makefile | \
while read macro skip manpages_list; do
# `manpages_list' can contain Makefile variables
# i.e. man_MANS = $(MANSRC) pkcs15-profile.5
case "$manpages_list" in
*\$\(*\)*|*\${*}*)
# notify.debug "manpages_list ($am_makefile) = \"$manpages_list\""
for token in $manpages_list; do
case $token in
\$\(*\)|\${*}) # found variable `$token'
token=`echo $token | sed -n 's,^\$.,,;s,.$,,p'`
sed -n ":a
/\\\\$/N;s/\\\\\n//;ta
/$token[ ]*=/p" $am_makefile ;;
*) # 'plain' manpage (not a variable)
echo "$macro = $token" ;;
esac
done ;;
*) # no Makefile variables has been used
echo "$macro = $manpages_list" ;;
esac
done
done
}
local automake_used=`
[[ ! -e $tmpdir/$pck_rootdir/Makefile.am ]]; echo $?`
cd $tmpdir/$pck_rootdir &&
case $1 in
--exist)
[ "$automake_used" = 1 ] &&
[[ "`LANG=C find -name Makefile.am \
-exec grep "MANS[ ]*=" {} \;`" ]] ||
[[ "`LANG=C find -type f -name "*.[0-9]"`" ]]
echo $((! $?)) ;;
--groups)
if [ "$automake_used" = 0 ]; then
LANG=C find -type f -name "*.[0-9]" | sed 's,.*\(.\),\1,'
else
manpages.am_expand | \
while read macro equal manpages_list; do
case $macro in
man[0-9]_MANS)
for f in $manpages_list; do
case $f in
*.man) echo $macro | sed "s/man\(.\)_MANS/\1/" ;;
*) echo $f | sed "s/.*\.//" ;;
esac
done ;;
*) for f in $manpages_list; do
echo $f | sed "s/.*\(.\)/\1/"
done ;;
esac
done
fi | sort | uniq ;;
--list)
[[ "$2" ]] || notify.error $"\
(bug)"" -- "$"missing arg#2 in \`$FUNCNAME $1'"
# list of man pages in the section '$2'
local manpage
if [ "$automake_used" = 0 ]; then
# FIXME : if a manpage is compressed in the source tarball,
# a double `$man_compress_ext' will be appended
LANG=C find -type f -name "*.$2" \
-printf "%%{_mandir}/man$2/%f$man_compress_ext\n"
else
manpages.am_expand | \
while read macro equal manpages_list; do
case $macro in
# sometimes developers prefer to name a man page something
# like 'foo.man' in the source, and then rename it to have
# the correct suffix, e.g. 'foo.1', when installing the file.
# For instance, consider this example:
# man1_MANS = rename.man thesame.1 alsothesame.1c
# In this case, 'rename.man' will be renamed to 'rename.1'
# when installed, but the other files will keep their names.
man[0-9]_MANS)
man_section=`echo $macro | sed "s/man\(.\)_MANS/\1/"`
# only man pages in section '$2'
[[ $man_section = $2 ]] || continue
for f in $manpages_list; do
echo -n "%{_mandir}/man$man_section/"
case $f in
*.man) echo "\
${f/\.man/.$man_section}$man_compress_ext" ;;
*) echo "$f$man_compress_ext" ;;
esac
done ;;
# Man pages are declared using the 'MANS' primary (generally
# 'man_MANS'). Man pages are installed in the correct
# subdirectory of 'mandir', based on the file extension
# ('0' through '9', and 'l' and 'n').
*) for f in $manpages_list; do
man_section=`echo $f | sed "s/.*\(.\)/\1/"`
[[ $man_section = $2 ]] || continue
echo "%{_mandir}/man$man_section/$f$man_compress_ext"
done ;;
esac
done | sort | uniq
fi ;;
*) notify.error $"\
(bug)"" -- "$"illegal arg#1 for \`$FUNCNAME'" ;;
esac
}
# find informations about available i18n (gettext) files
function specfile.i18n_support() {
case $1 in
--exist)
# note: in the 'tar' tarball there is no 'intl' folder, so we use 'po'
[[ "`LANG=C find $tmpdir/$pck_rootdir/ -type d -name po`" ]]
echo $((! $?)) ;;
*) notify.error $"\
(bug)"" -- "$"illegal arg#1 for \`$FUNCNAME'" ;;
esac
}
# find informations about pkgconfig related stuff (*.pc files)
function specfile.pkgconfig() {
local automake_used=`
[[ ! -e $tmpdir/$pck_rootdir/Makefile.am ]]; echo $?`
cd $tmpdir/$pck_rootdir &&
case $1 in
--exist)
if [[ $automake_used -eq 1 ]]; then
[[ `LANG=C find -name Makefile.am \
-exec grep "pkgconfigdir[ ]*=" {} \;` ]]
echo $((! $?))
else
[[ `LANG=C find -name Makefile.in -exec grep "\.pc " {} \;` ]]
echo $((! $?))
fi ;;
--dir)
unset pkgconfigdir
if [[ $automake_used -eq 1 ]]; then
pkgconfigdir=`
LANG=C find -name Makefile.am \
-exec grep "pkgconfigdir[ ]*=" {} \; | \
sed 's,pkgconfigdir[ ]*=[ ]*,,' | sort | uniq`
notify.debug "pkgconfigdir = \"$pkgconfigdir\""
pkgconfigdir="`expand.variables "$pkgconfigdir"`/*.pc"
notify.debug " pkgconfigdir = \"$pkgconfigdir\""
else
# FIXME : add a check for real path
[[ `$FUNCNAME --exist` -eq 1 ]] &&
pkgconfigdir="%{_libdir}/pkgconfig/*.pc"
fi
echo "$pkgconfigdir" ;;
*) notify.error $"\
(bug)"" -- "$"illegal arg#1 for \`$FUNCNAME'" ;;
esac
}
# specfile.includedir()
# Parameters:
# $1 : --exist (optional)
# Description:
# Find information about installation directories of *.h files
#
function specfile.includedir() {
local headers include_headers \
include am_headers_path am_headers_paths \
automake_used=`
[[ ! -e $tmpdir/$pck_rootdir/Makefile.am ]]; echo $?`
if [[ $automake_used -eq 1 ]]; then
if [[ "$1" = "--exist" ]]; then
cd $tmpdir/$pck_rootdir &&
headers=`LANG=C find . -name Makefile.am -exec \
grep -rl -e ".*include_HEADERS[ ]*=" {} \;`
[[ -z "$headers" ]]; echo $?
exit
fi
cd $tmpdir/$pck_rootdir &&
case "$spec_type" in
standard | library)
am_headers_paths=()
# found for Makefiles that install header files
# note: ^[^ ]*includedir can be not present
for f in `LANG=C find . -name Makefile.am -exec \
grep -rl -e "^[^ ]*include_HEADERS[ ]*=" {} \;`; do
# some examples:
# [apt]
# includedir=${prefix}/include/apt-pkg
# include_HEADERS = ...
# --> ${prefix}/include/apt-pkg
# [avifile]
# mainincludedir = $(pkgincludedir)
# maininclude_HEADERS = ...
# --> $(pkgincludedir) --> $(includedir)/@PACKAGE@
# [a52dec]
# pkginclude_HEADERS = ...
# --> %{_includedir}
# [aspell]
# include_HEADERS = aspell.h
# pspell_includedir = ${includedir}/pspell
# pspell_include_HEADERS = pspell.h
# --> %{_includedir} %{_includedir}/pspell
# [pygtk-2.4.1]
# PLATFORM_VERSION = 2.0
# pkginclude_HEADERS = pygtk.h
# pkgincludedir = $(includedir)/pygtk-$(PLATFORM_VERSION)/pygtk
# --> %{_includedir}/pygtk-2.0/pygtk
for include_headers in `
sed -n 's/\(^[^ ]*include_HEADERS\)[ ]*=.*/\1/p' $f`; do
include=`echo $include_headers | \
sed -n 's/^\([^ ]*\)include_HEADERS[ ]*/\1/p'`
headers=`echo $include_headers | sed -n "\
s,^${include}includedir[ ]*=[ ]*\([^ ]*\),\1,p" $f`
notify.debug "include_headers ($f) = \"$include_headers\""
notify.debug " --> include = \"$include\""
notify.debug " --> headers = \"$headers\""
if [[ "$headers" ]]; then
local newheader=`echo $headers | sed -n '
s,\$[{(]includedir[)}],%{_includedir},
s,\$[{(]prefix[)}],%{_prefix},;p'`
# add `newheader' only if not yet in `am_headers_paths'
local alreadyin=0
for i in `seq 1 1 ${#am_headers_paths[*]}`; do
[[ "${am_headers_paths[$i-1]}" = "$newheader" ]] &&
let "alreadyin = 1" && break
done
newheader="`expand.variables $newheader $f`"
[[ $alreadyin -eq 0 ]] &&
am_headers_paths[${#am_headers_paths[*]}]=$newheader
else
am_headers_paths[${#am_headers_paths[*]}]="%{_includedir}" #"(needed by KDE editors)
fi
notify.debug " \
am_headers_paths = \"${am_headers_paths[*]}\""
done
done
for i in `seq 1 1 ${#am_headers_paths[*]}`; do
am_headers_path=${am_headers_paths[$i-1]}
notify.debug "am_headers_path[$i] = $am_headers_path"
# check if one or more configure variable are used
case "$am_headers_path" in
*@*@*)
if [[ -x ./configure ]]; then
OIFS="$IFS"; IFS='@'
for token in ${am_headers_path%@*}; do
[[ "$token" ]] || continue
# expand the variables looking into the
# ./configure file
local exp_token=`sed -n "\
/^[ ]*${token//\//\\/}=[^ ]*[ ]*$/{s,.*=\([^ ]*\).*,\1,;s,',,g;p}" ./configure`
notify.debug " \"$token\" == \"$exp_token\""
# if @$token@ has been found in ./configure
if [[ -n "$exp_token" ]]; then
am_headers_path=`echo "${am_headers_path/$/\\$}" | \
sed "s,@$token@,$exp_token,"`
notify.debug "\
--> am_headers_path[$i] = \"$am_headers_path\""
fi
done
IFS="$OIFS"
# at this point there should be no directory
# different to '$(includedir)' (hopefully)
am_headers_path=`echo $am_headers_path | \
sed 's,\${includedir},%{_includedir},
s,\$(includedir),%{_includedir},
s,\${prefix},%{_prefix},
s,\$(prefix),%{_prefix},'`
notify.debug "\
--> am_headers_path[$i] = \"$am_headers_path\""
fi
;;
esac
[[ "$am_headers_path" =~ / ]] &&
am_headers_path="$am_headers_path/*.h" ||
am_headers_path="\
%dir $am_headers_path\n$am_headers_path/*.h"
am_headers_paths[$i-1]="$am_headers_path"
done ;;
python)
: ;; # FIXME
esac
else
# no Makefile.am file found (check in Makefile[.in])
# FIXME: modify this brainless code
[[ "$spec_type" = "library" ]] &&
am_headers_paths=("%{_includedir}/*.h")
fi
# remove duplicate entries
for i in `seq 1 1 ${#am_headers_paths[*]}`; do
echo ${am_headers_paths[$i-1]}
done | sort | uniq
}
function specfile.devel_exist() {
[[ $(specfile.includedir --exist) -eq 1 ||
$(specfile.pkgconfig --exist) -eq 1 ]] && echo 1 || echo 0
}
# 1. specfile preamble
function specfile.write_preamble() {
# set package name and version to '%{name}' and '%{version}'
# local pck_tarball_4spec=`echo ${pck_tarball##*/} |
# sed "s,$pck_name,%{name},g;s,$pck_version,%{version},g"`
local pck_tarball_4spec=`echo "${pck_tarball##*/}" |
sed "s,$pck_version,%{version},g"`
# find for package license info
# FIXME: currently GNU GPL, LGPL, and W3C licenses are supported
local spec_license="$license_defvalue"
if [[ -e $tmpdir/$pck_rootdir/COPYING ]]; then
[[ `grep -c "[ ]*GNU GENERAL PUBLIC LICENSE[ ]*" \
$tmpdir/$pck_rootdir/COPYING` -eq 0 ]] || spec_license="GPL"
[[ `grep -c "[ ]*GNU LIBRARY GENERAL PUBLIC LICENSE[ ]*" \
$tmpdir/$pck_rootdir/COPYING` -eq 0 ]] || spec_license="LGPL"
[[ `grep -c "[ ]*GNU LESSER GENERAL PUBLIC LICENSE[ ]*" \
$tmpdir/$pck_rootdir/COPYING` -eq 0 ]] || spec_license="LGPL"
[[ `grep -c "Copyright .* World Wide Web Consortium" \
$tmpdir/$pck_rootdir/COPYING` -eq 0 ]] || spec_license="W3C"
fi
case $spec_type in
standard)
[ "$spec_source" ] || spec_source=".../$pck_tarball_4spec"
[ -e $tmpdir/$pck_rootdir/CMakeLists.txt ] && spec_buildrequires="cmake"
;;
library)
[ "$spec_source" ] || spec_source=".../$pck_tarball_4spec"
spec_group="$library_group"
[ -e $tmpdir/$pck_rootdir/CMakeLists.txt ] && spec_buildrequires="cmake"
;;
perl)
local perl_module_name
if [[ -e $tmpdir/$pck_rootdir/Build.PL ]]; then
notify.debug "$FUNCNAME: -e Build.PL"
# new building/installing technology
perl_module_name=$(
sed -n "/^[ \t]*module_name[ ]*/{
s,.*=>[ ]*['\"]\(.*\)['\"].*,\1,;p
}" $tmpdir/$pck_rootdir/Build.PL)
local Build_PL_license
Build_PL_license=$(
sed -n "/^[ \t]*license[ ]*/{
s,.*=>[ ]*['\"]\(.*\)['\"].*,\1,;p
}" $tmpdir/$pck_rootdir/Build.PL)
notify.debug "Build_PL_license = \"$Build_PL_license\""
# see manpage of "Module::Build"
case "$Build_PL_license" in
perl)
spec_license="GPL, Artistic" ;;
gpl)
spec_license="GPL" ;;
lgpl)
spec_license="LGPL" ;;
artistic)
spec_license="Artistic" ;;
bsd)
spec_license="BSD License" ;;
open_source)
spec_license="OSI Approved" ;;
unrestricted)
# The distribution is licensed under a license that is not
# approved by www.opensource.org but that allows distribution
# without restrictions
spec_license="no OSI Approved" ;;
restricted)
# The distribution may not be redistributed without special
# permission from the author and/or copyright holder
spec_license="no OSI Approved" ;;
*) spec_license="$perl_License_default" ;;
esac
elif [[ -e $tmpdir/$pck_rootdir/$perl_Makefile_generator ]]; then
notify.debug "$FUNCNAME: -e $perl_Makefile_generator"
# look in the Makefile.PL file for the variable `NAME' in the
# block 'WriteMakefile(' ... ')'
perl_module_name=$(
sed -n "/^WriteMakefile(/,/^)/{
/^[ \t]*NAME/{s,.*NAME.*=>[ ]*['\"]\(.*\)['\"]\,.*,\1,p
}}" $tmpdir/$pck_rootdir/$perl_Makefile_generator)
[ "$perl_module_name" ] || perl_module_name=$(
sed -n "\
/name/{s,^[ \t]*name[ \t]*['\"]*\([a-zA-Z]*\)['\"]*.*,\1,p}" \
$tmpdir/$pck_rootdir/$perl_Makefile_generator)
spec_license="$perl_License_default"
else
notify.error "\
neither \`$perl_Makefile_generator' nor \`Build.PL' file found"
fi
notify.debug "perl_module_name = \"$perl_module_name\""
[ -n "$perl_module_name" ] &&
spec_summary="$perl_module_name - $summary_defvalue" ||
spec_summary="... - $summary_defvalue"
notify.debug "spec_summary = \"$spec_summary\""
spec_group="$library_group_perl"
[ "$spec_source" ] ||
if [ "$perl_module_name" ]; then
spec_source="\
http://www.cpan.org/modules/by-module/${perl_module_name//::/\/}/$pck_tarball_4spec"
else
spec_source="\
http://www.cpan.org/modules/by-module/.../$pck_tarball_4spec"
fi
spec_url="http://www.cpan.org"
spec_buildrequires="perl-devel >= %perl_major_ver"
spec_requires='perl >= %perl_major_ver'
#spec_buildroot='%{_tmppath}/perl-root # fixed in perl-5.8.6-3qilnx
;;
python)
# check if `setup.py' exists
[[ -e $tmpdir/$pck_rootdir/setup.py ]] ||
notify.error "\`setup.py': "$"file not found"
spec_group="$python_modules_group"
spec_summary="$(\
cd $tmpdir/$pck_rootdir && python setup.py --description 2>/dev/null | \
sed 1q 2>/dev/null)"
spec_url="$(\
cd $tmpdir/$pck_rootdir && python setup.py --url 2>/dev/null | \
sed 1q 2>/dev/null)"
[ "$spec_source" ] || spec_source=".../$pck_tarball_4spec"
spec_license="$(\
cd $tmpdir/$pck_rootdir && python setup.py --license 2>/dev/null | \
sed 1q 2>/dev/null)"
[[ "$spec_license" = UNKNOWN ]] && spec_license="$license_defvalue"
spec_requires="python${rpm_macro_pyver:+ >= $rpm_macro_pyver}"
;;
esac
local spec_source_4spec=`echo "$spec_source" |
sed "s,$pck_version,%{version},g"`
[[ "$spec_type" = perl ]] && echo "\
%define perl_major_ver %(eval \`perl -V:version\`; echo \${version%*.[0-9]*}.0)
"
(echo "\
Name: $pck_name
Version: $pck_version
Release: 1$DISTRO_rpm
Summary: ${spec_summary:-$summary_defvalue}
Group: ${spec_group:-$group_defvalue}
Vendor: $VENDOR
Distribution: $DISTRO
Packager: $packager_fullname <$packager_email>
URL: ${spec_url:-$url_defvalue}
Source: ${spec_source_4spec:-$pck_tarball_4spec}
License: ${spec_license:-$license_defvalue}"
if [ "$(specfile.infopages --exist)" = 1 ]; then
[ "$rpm_macro_installinfo_binary" ] &&
echo "Requires(post): ${rpm_macro_installinfo_binary}" ||
echo "Requires(post): ${path_installinfo:-/sbin/install-info}"
fi
[ "$spec_requires" ] && echo Requires: $spec_requires
[ "$spec_buildrequires" ] && echo BuildRequires: $spec_buildrequires
echo "\
BuildRoot: ${spec_buildroot:-"$format_buildroot_value"}") | \
while read id value; do
printf "%-${format_preamble_tab:-14}s %s\n" "$id" "$value"
done
}
# 2. specfile package(s) description
function specfile.write_packages() {
case $spec_type in
python)
echo "
%description
${spec_summary:-$summary_defvalue}." ;;
*) echo "
%description
$description_defval" ;;
esac
case "$spec_type" in
standard)
[[ `specfile.includedir --exist` -eq 1 ||
`specfile.pkgconfig --exist` -eq 1 ]] &&
echo "
%package devel
Summary: Devel package for %{name}
Group: Development/Libraries
Requires: %{name} = %{?epoch:%epoch:}%{version}-%{release}
%description devel
$description_devel_defval
This package contains static libraries and header files need for development."
;;
library)
echo "
%package devel
Group: $library_group_devel
Summary: $library_summary
Requires: %{name} = %{?epoch:%epoch:}%{version}-%{release}
%description devel
$description_devel_defval
This package contains static libraries and header files need for development."
;;
python)
: # FIXME
;;
esac
}
# 3. %setup
function specfile.write_setup() {
echo "
%prep"
if [ "$pck_rootdir_4spec" = "%{name}-%{version}" ]; then
echo "%setup -q"
elif [ "$pck_rootdir_4spec" = "-c %{name}-%{version}" ]; then
echo "%setup -q $pck_rootdir_4spec"
else
echo "%setup -q -n $pck_rootdir_4spec"
fi
}
# 4. %build
function specfile.write_build() {
local pck_configure=`(\
cd $tmpdir/$pck_rootdir &&
{ [[ -x ./configure ]] && echo -n "./configure"
LANG=C find . -mindepth 2 -type f -perm +111 \
-name configure -printf "%p "; } )`
notify.debug "pck_configure = \"$pck_configure\""
local make_bin perl_bin
if [ "$format_unix_tools" = "1" ]; then
make_bin="%{__make}"; perl_bin="%{__perl}"
else
make_bin="make"; perl_bin="perl"
fi
echo "
%build"
case $spec_type in
standard | library)
# if `configure' exists, write the needed specfile commands
if [[ -n "$rpm_macro_configure" && \
"$pck_configure" = "./configure" ]]; then
echo "$rpm_macro_configure"
elif [[ "$pck_configure" ]]; then
# writes also the other `configure' executable scripts found
# in the source package as a comment
echo -n "${pck_configure/ */} \\"
[[ "$pck_configure" =~ ' ' ]] &&
echo -n " # -or- ${pck_configure#* }"
echo -n "
--prefix=%{_prefix}"
[[ `specfile.infopages --exist` = 1 ]] && echo -n "\
\\
--infodir=%{_infodir}"
[[ `specfile.manpages --exist` = 1 ]] && echo "\
\\
--mandir=%{_mandir}" || echo ""
echo ""
elif [ -e $tmpdir/$pck_rootdir/CMakeLists.txt ]; then
if [ "$rpm_macro_cmake" ]; then
echo "$rpm_macro_cmake"
else
echo "\
CFLAGS=\"${CFLAGS:-%optflags}\" ; export CFLAGS
CXXFLAGS=\"${CXXFLAGS:-%optflags}\" ; export CXXFLAGS
FFLAGS=\"${FFLAGS:-%optflags}\" ; export FFLAGS
mkdir -p build ; cd build
cmake \\
-DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \\
-DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} \\
-DINCLUDE_INSTALL_DIR:PATH=%{_includedir} \\
-DLIB_INSTALL_DIR:PATH=%{_libdir} \\
-DSYSCONF_INSTALL_DIR:PATH=%{_sysconfdir} \\
-DSHARE_INSTALL_PREFIX:PATH=%{_datadir} \\
%if "%{?_lib}" == \"lib64\"
-DLIB_SUFFIX=64 \\
%endif
-DBUILD_SHARED_LIBS:BOOL=ON ..
"
fi
[ -n "$rpm_macro_make" ] &&
echo "%make" || echo "$make_bin %{?_smp_mflags}"
fi
[[ "$makefile" ]] &&
{ [[ "$rpm_macro_make" ]] &&
echo "%make" || echo "$make_bin %{?_smp_mflags}"; }
;;
perl)
if [[ -e $tmpdir/$pck_rootdir/Build.PL ]]; then
echo "\
$perl_bin Build.PL installdirs=vendor
./Build
./Build test"
elif [[ -e $tmpdir/$pck_rootdir/$perl_Makefile_generator ]]; then
echo "\
$perl_bin $perl_Makefile_generator PREFIX=%{_prefix} INSTALLDIRS=vendor"
if [[ "$rpm_macro_make" ]]; then
echo "\
%make
%make test"
else
echo "\
$make_bin %{?_smp_mflags}
$make_bin test"
fi
fi
;;
python)
[[ "$(find $tmpdir/$pck_rootdir -type f -name *.c)" ]] &&
echo "CFLAGS=\"%{optflags}\" %{__python} setup.py build" ||
echo "%{__python} setup.py build" ;;
esac
}
# 5. %install
function specfile.write_install() {
local make_bin perl_bin
if [ "$format_unix_tools" = "1" ]; then
make_bin="%{__make}"; rm_bin="%{__rm}"
else
make_bin="make"; rm_bin="rm"
fi
# look at the prefix variable used in makefiles ('DESTDIR' or 'prefix')
local makeinstall_cmd
if [ -e $tmpdir/$pck_rootdir/CMakeLists.txt ]; then
[ -n "$rpm_macro_makeinstall_cmake" ] &&
makeinstall_cmd="$rpm_macro_makeinstall_cmake" ||
makeinstall_cmd="$make_bin install DESTDIR=\"%{buildroot}\" #-C build"
elif [ -n "$makefile" ]; then
if [[ "`grep -c "DESTDIR[ ]*=[ ]*" $makefile`" ]]; then
[[ "$rpm_macro_makeinstall" ]] &&
makeinstall_cmd="%makeinstall" ||
makeinstall_cmd="$make_bin install DESTDIR=\"%{buildroot}\""
elif [[ "`grep -c "prefix[ ]*=[ ]*" $makefile`" ]]; then
if [[ "$rpm_macro_makeoldinstall" ]]; then
makeinstall_cmd="%makeoldinstall"
elif [[ "$rpm_macro_makeinstall" ]]; then
makeinstall_cmd="%makeinstall"
else
makeinstall_cmd="$make_bin prefix=\"%{buildroot}\""
fi
else
notify.warning "neither \`DESTDIR' nor \`prefix' variables found"
fi
fi
echo "
%install
[ \"%{buildroot}\" != / ] && $rm_bin -rf \"%{buildroot}\""
case $spec_type in
standard | library)
[ "$makeinstall_cmd" ] && echo "$makeinstall_cmd"
[[ "$(specfile.i18n_support --exist)" = "1" ]] && echo "
%find_lang %{name}"
;;
perl)
if [ -e $tmpdir/$pck_rootdir/Build.PL ]; then
echo "\
./Build install \\
destdir=\"%{buildroot}\" \\
--install_path bindoc=\"%{_mandir}/man1\" \\
--install_path libdoc=\"%{_mandir}/man3\"
packlist=\`find %{buildroot} -name .packlist\`
[ -z \"\$packlist\" ] && exit 1 || cat \$packlist | \\
sed \"s,%buildroot,,g;s,.*/man/.*,&.gz,g\" | \\
sort -u > .packlist && rm \$packlist
find %{buildroot}%{perl_vendorlib} \\
-type d -depth -exec rmdir {} 2>/dev/null \\;
strid=\`echo \$packlist | sed 's,.*auto\(.*\)/.packlist,\1,'\`
for dir in \`find %{buildroot} -type d | grep \$strid\`; do
echo "%dir \${dir#%buildroot}" >> .packlist
done"
else
echo "\
%makeinstall_perl
packlist=\`find %{buildroot} -name .packlist\`
[ -z \"\$packlist\" ] && exit 1 || cat \$packlist | \\
sed \"s,%buildroot,,g;s,.*/man/.*,&.gz,g\" | \\
sort -u > .packlist && rm \$packlist
strid=\`echo \$packlist | sed 's,.*auto\(.*\)/.packlist,\1,'\`
for dir in \`find %{buildroot} -type d | grep \$strid\`; do
echo \"%dir \${dir#%buildroot}\" >> .packlist
done"
fi
;;
python)
echo "\
%{__python} setup.py install \\
-O1 --skip-build \\
--root=\"%{buildroot}\" \\
--install-headers=%{_includedir}/python \\
--install-lib=${python_install_lib_path:-%_libdir/site-python} \\
--single-version-externally-managed \\
--record=%{name}.filelist
sed -i \"\,\.egg-info/,d;s,.*/man/.*,&.gz,\" %{name}.filelist"
;;
esac
}
# 6. %clean
function specfile.write_clean() {
if [ "$format_unix_tools" = "1" ]; then
echo "
%clean
[ \"%{buildroot}\" != / ] && %{__rm} -rf \"%{buildroot}\""
else
echo "
%clean
[ \"%{buildroot}\" != / ] && rm -rf \"%{buildroot}\""
fi
if [ "$spec_type" = "perl" ]; then
[ "$format_unix_tools" = "1" ] &&
echo "%{__rm} -f .packlist" || echo "rm -f .packlist"
fi
}
# 7. specfile scripts
function specfile.write_scripts() {
if [[ $(specfile.infopages --exist) = 1 ]]; then
local infofile
echo "
%post"
# FIXME : <info>, <info>-1, <info>-2: install only the first one
for infofile in $(specfile.infopages --list); do
if [[ "$rpm_macro_installinfo" ]]; then
# %{_infodir}/foo.info.gz --> foo.info
infofile="$(\
echo "$infofile" | sed "s,.*/,,;s,$info_compress_ext\$,,")"
echo "$rpm_macro_installinfo $infofile"
else
echo "\
if [ \"\$1\" = \"0\" ]; then
${path_installinfo:-/sbin/install-info} $infofile %{_infodir}/dir
fi"
fi
done
[[ "$spec_type" = library ]] &&
echo "${path_ldconfig:-/sbin/ldconfig}"
echo "exit 0"
echo "
%preun"
# FIXME : <info>, <info>-1, <info>-2: install only the first one
for infofile in $(specfile.infopages --list); do
if [[ "$rpm_macro_uninstallinfo" ]]; then
infofile="$(\
echo "$infofile" | sed "s,.*/,,;s,$info_compress_ext\$,,")"
echo "$rpm_macro_uninstallinfo $infofile"
else
echo "\
${path_installinfo:-/sbin/install-info} --delete $infofile %{_infodir}/dir"
fi
done
[[ "$spec_type" = library ]] &&
echo "${path_ldconfig:-/sbin/ldconfig}"
echo "exit 0"
else
[[ "$spec_type" = library ]] && echo "
%post -p ${path_ldconfig:-/sbin/ldconfig}
%postun -p ${path_ldconfig:-/sbin/ldconfig}"
fi
}
# 8. %files
function specfile.write_files() {
# standard text documentation files (see 'automake --help')
# + some other documentation files found in some packages
# NOTE : the 'INSTALL' file may eventually be added
local docs std_docs='
AUTHORS
BACKLOG
BUGS
CHANGES
COPYING
COPYING.DOC
COPYING.LESSER
COPYING.LIB
CREDITS
ChangeLog*
LICENCE
LICENSE
MANUAL
NEWS
README*
THANKS
TODO
WHATSNEW
WHERE'
# do not add the generic GNU INSTALL in the list of docs
[ -f "$tmpdir/$pck_rootdir/INSTALL" ] &&
case $(sed 5q $tmpdir/$pck_rootdir/INSTALL) in
*"These are generic installation instructions."*)
std_docs=$(echo $std_docs | sed 's/INSTALL //') ;;
*) : ;;
esac
local docs_curr doc_curr
for std_doc in $std_docs; do
# `ls' if used to support strings like `ChangeLog*'
docs_curr=$(cd $tmpdir/$pck_rootdir && ls $std_doc 2>/dev/null)
for doc_curr in $docs_curr; do
# ignore empty documentation files
[[ -s $tmpdir/$pck_rootdir/$doc_curr ]] && docs="$docs $doc_curr"
done
done
# split the list of docs into multiple lines if necessary
[ "$docs" ] && docs=`echo $docs | fmt -u -w 77 | sed 's,.*,%doc &,'`
# info pages
infos=`
case $info_condensed_list in
0) specfile.infopages --list | sort ;;
1) echo "%{_infodir}/*" ;;
*) notify.error "\
"$"(bug)"" -- $FUNCNAME: "$"illegal value for"" 'info_condensed_list' \
($info_condensed_list)" ;;
esac`
# man pages
mans=`
case $man_condensed_list in
0) for man_group in $(specfile.manpages --groups); do
specfile.manpages --list $man_group | sort
done ;;
1) for man_group in $(specfile.manpages --groups); do
echo "%{_mandir}/man${man_group}/*"
done ;;
2) [[ $(specfile.manpages --exist) = 1 ]] &&
echo "%{_mandir}/man?/*" ;;
*) notify.error "\
"$"(bug)"" -- $FUNCNAME: "$"illegal value for"" 'man_condensed_list' \
($man_condensed_list)" ;;
esac`
case $spec_type in
standard)
[[ `specfile.i18n_support --exist` = 1 ]] &&
echo -e "\n%files -f %{name}.lang" || echo -e "\n%files"
echo "\
%defattr(-,root,root)"
# find for i18n files
#[[ "$i18n_found" ]] && echo "%{_datadir}/locale/*/LC_MESSAGES/*"
# package documentation
for doc in infos mans docs; do
[[ "${!doc}" ]] && echo -e "${!doc}"
done
if [[ `specfile.devel_exist` -eq 1 ]]; then
echo "
%files devel
%defattr(-,root,root)"
[[ `specfile.includedir --exist` -eq 1 ]] &&
echo -e "`specfile.includedir --dir`"
[[ `specfile.pkgconfig --exist` -eq 1 ]] &&
echo "`specfile.pkgconfig --dir`"
fi
;;
library)
[[ `specfile.i18n_support --exist` = 1 ]] &&
echo -e "\n%files -f %{name}.lang" || echo -e "\n%files"
echo "\
%defattr(-,root,root)
%{_libdir}/*.so.*"
# package documentation
for doc in infos mans docs; do
[[ "${!doc}" ]] && echo -e "${!doc}"
done
echo -e "
%files devel
%defattr(-,root,root)
$(specfile.includedir)
%{_libdir}/*.a
%{_libdir}/*.la
%{_libdir}/*.so"
[[ `specfile.pkgconfig --exist` = 1 ]] && echo "`specfile.pkgconfig --dir`"
;;
perl)
echo "
%files -f .packlist
%defattr(-,root,root)"
;;
python)
echo "
%files -f %{name}.filelist
%defattr(-,root,root)"
;;
esac
}
# 9. %changelog
function specfile.write_changelog() {
echo "
%changelog
* `LC_ALL="C" date "+%a %b %d %Y"` $packager_fullname <$packager_email> $pck_version-1$DISTRO_rpm
- package created by @package@"
}
function specfile.ckeck_defvalues() {
# $1: name of the specfile
local specfile="$1"
check_vals=(
"Summary" summary_defvalue
"Group" group_defvalue
"URL" url_defvalue
"License" license_defvalue
"%description" description_defval
"%description devel" description_devel_defval
"%changelog" changelog_samever_defvalue
)
for i in `seq 1 1 $(( ${#check_vals[@]} / 2 ))`; do
id="${check_vals[($i-1)*2]}"
value="${check_vals[($i-1)*2+1]}"
case "$id" in
# for the id starting by '%' we must consider the first two lines
# after its line number (three lines from the id and the first
# blank line found)
%*) sed -n "/^$id$/,/^$/p" $specfile | sed 3q | \
grep -q "${!value}" ;;
*) sed -n "/%description/q;{/^$id/p}" $specfile | \
grep -q "${!value}" ;;
esac
[ $? -eq 0 ] && notify.warning $"\
remember to modify the value for \`${NOTE}$id${NORM}'"
done
}
local spec_source \
spec_group \
spec_url \
spec_buildrequires \
spec_requires \
spec_buildroot
local spec_type="$1"
case $spec_type in
standard|library|perl|python) ;;
gnome|kde3|kde4|librarytools)
notify.error \
$"FIXME: sorry, not implemented yet..."" "$"(see $templatedir)" ;;
*) notify.error $"unknown specfile --type"" \`$spec_type'" ;;
esac
# collect informations from the tarball name and the source files
# 1. pck_tarball, pck_name , pck_version
# 2. pck_rootdir (where the package has been decompressed) --> pck_rootdir_4spec
# 3. specfile.write_preamble()
# spec_license (default:"$license_defvalue")
# spec_buildrequires
# perl_module_name
# spec_summary
# spec_group
# spec_source
# spec_url
# spec_buildrequires
# spec_requires
# 'pck_tarball' = absolute path of '$1'
local pck_tarball
case "$2" in
http://*|https://*|ftp://*)
pck_tarball="${2##*/}"
spec_source="$2"
curl.download \
--options "$curl_options" \
${proxy:+--proxy $proxy} ${proxy_user:+--proxy-user $proxy_user} \
--exit-on-err --destdir="$source_dir" "$spec_source"
pck_tarball=$source_dir/$pck_tarball
;;
*://*)
notify.error $"unsupported protocol"": \`${2//\:*}'"
;;
/*) pck_tarball="$2" ;;
*) pck_tarball="$(pwd)/$2" ;;
esac
notify.debug "pck_tarball = $pck_tarball"
notify.debug "spec_source = $spec_source"
[ "$pck_tarball" ] || notify.error $"missing tarball name"
[ -e $pck_tarball ] ||
notify.error $"cannot find the package $pck_tarball"
# get the package name from the tarball name
local pck_name=${3:-`echo $2 | sed -n "\
s/.*\/// # remove directory name, if any
s/\.[^0-9].*// # remove trailing stuff (.tar.gz, ...)
/-[0-9]*/{s/-[0-9].*//p;q} # <pck_name>-<pck_ver>
/[^-\.][0-9]\./{s/\(.*[^-\.]\)[0-9]\..*/\1/p;q} # <pck_name><pck_ver>
# <pck_name> (no version, but <pck_name> can end with numbers)
/^[^0-9]*[0-9]*$/p"`}
notify.debug "pck_name = \"$pck_name\""
[ "$pck_name" ] ||
notify.error $"cannot get the package name, use the \`-n' option"
[[ "${pck_newver//[0-9\.]/}" ]] &&
notify.error $"invalid version number"" -- \`$pck_newver'"
local pck_version=${4:-`echo $2 | sed -n "\
/[0-9]/!q # return nothing if no number is found in the package name
s,.*/,, # remove directory name, if any
s/\.[^0-9].*// # remove trailing stuff (.tar.gz, ...)
/-[0-9]*/{s/.*-\([0-9]*.*\)/\1/p;q} # <pck_name>-<pck_ver>
/[^-\.][0-9]\./{s/.*[^-\.]\([0-9]\..*\)/\1/p;q} # <pck_name><pck_ver>
# <pck_name> (no version, but <pck_name> can end with numbers)
/^[^0-9]*[0-9]*$/q"`}
notify.debug "pck_version = \"$pck_version\""
[ "$pck_version" ] ||
notify.error $"cannot get the package version, use the \`-v' option"
local outfile="$5"
if [ "$outfile" ]; then
notify.debug $"output file"": ${NOTE}$outfile${NORM}"
> $outfile || notify.error $"can't create output file"" $outfile"
# do not chmod a non-regular file (for instance /dev/null)
[ -f "$outfile" ] && chmod ${rpm_specfile_mode:-644} $outfile
fi
notify.note "${NOTE}"$"generating specfile""${NORM}""...""
* "$"source"": ${NOTE}$pck_tarball${NORM}""
* "$"mode"": ${NOTE}$spec_type${NORM}"
# check the name structure of the library and perl packages
case $spec_type in
library)
[[ "$pck_name" =~ $library_name_structure ]] || notify.error $"\
libraries must have this name structure (use \`-n'):"" \
\`$library_name_structure'"
;;
perl)
[[ "$pck_name" =~ $perl_module_name_structure ]] || notify.error $"\
perl modules must have this name structure (use \`-n'):"" \
\`$perl_module_name_structure'"
;;
python)
[[ "$pck_name" =~ $python_module_name_structure ]] || notify.error $"\
python modules must have this name structure (use \`-n'):"" \
\`$python_module_name_structure'"
;;
esac
# link fd#3 with stdout and redirect stdout to the log file
[ "$outfile" ] && { exec 3<&1; exec 1>>$outfile; }
local tmpdir=`mktemp -q -d -t $me.XXXXXXXX`
[ $? -eq 0 ] ||
notify.error $"can't create temporary directory"
# decompress the tarball in the 'tmpdir' directory
cp -f $pck_tarball $tmpdir
pushd $tmpdir >/dev/null
case $pck_tarball in
*.tar.gz|*.tgz)
gunzip -c $pck_tarball | tar xf - ;;
*.tar.bz2|*.tbz2)
bunzip2 -c $pck_tarball | tar xf - ;;
*.tar.Z)
[ "$(type -p uncompress)" ] ||
notify.error $"utility not found"": \`uncompress'"
uncompress -c $pck_tarball | tar xf - ;;
*.shar.gz)
gunzip -c $pck_tarball | unshar ;;
*.zip)
unzip -q $pck_tarball ;;
*.tar.xz|*.tar.lzma)
[ "$(type -p xz)" ] ||
notify.error $"utility not found"": \`xz'"
xz -d --stdout $pck_tarball | tar xf - ;;
*.tar.lz)
[ "$(type -p lzip)" ] ||
notify.error $"utility not found"": \`lzip'"
lzip -cd $pck_tarball | tar -xf - ;;
*.tar.7z)
[ "$(type -p 7za)" ] ||
notify.error $"utility not found"": \`7za'"
7za x -bd $pck_tarball >/dev/null | tar xf - ;;
*.7z)
[ "$(type -p 7za)" ] ||
notify.error $"utility not found"": \`7za'"
7za x -bd $pck_tarball >/dev/null ;;
*) notify.error $"unsupported package compression method" ;;
esac
popd >/dev/null
# find the root directory of the uncompressed tarball
local pck_rootdir=`\
LANG=C find $tmpdir -mindepth 1 -maxdepth 1 -type d -printf "%f"`
local pck_rootdir_4spec
# hack for packages without a root directory
notify.debug "pck_rootdir = \"$pck_rootdir\""
if [ ! -d "$tmpdir/$pck_rootdir" ]; then
pck_rootdir=""
pck_rootdir_4spec="-c %{name}-%{version}"
else
pck_rootdir_4spec=`echo $pck_rootdir | \
sed "s/$pck_name/%{name}/;s/$pck_version/%{version}/"`
fi
notify.debug "pck_rootdir = \"$pck_rootdir\""
notify.debug "pck_rootdir_4spec = \"$pck_rootdir_4spec\""
############ BEGIN FIXME: move code to a better place ############
# check if a makefile exists
local makefile
for f in $tmpdir/$pck_rootdir/{Makefile,Makefile.in}; do
[[ -e $f ]] && makefile=$f
done
case "$spec_type" in
# note: perl packages usually use the perl script Makefile.PL
# python modules don't use Makefiles at all
perl | python) : ;;
*) if [ -e $tmpdir/$pck_rootdir/CMakeLists.txt ]; then
:
elif [ -z "$makefile" ]; then
notify.warning $"\
neither \`Makefile' nor \`Makefile.in' has been found"
fi
[[ -e $tmpdir/$pck_rootdir/$perl_Makefile_generator ||
-e $tmpdir/$pck_rootdir/Build.PL ]] &&
notify.warning $"\
looks like a perl package (use \`-t perl' if this is true)"
[[ -e $tmpdir/$pck_rootdir/setup.py ]] &&
notify.warning $"\
looks like a python module (use \`-t python' if this is true)"
;;
esac
############ END FIXME: move code to a better place ##############
# write the resulting specfile
specfile.write_preamble
specfile.write_packages
specfile.write_setup
specfile.write_build
specfile.write_install
specfile.write_clean
specfile.write_scripts
specfile.write_files
specfile.write_changelog
[[ "$outfile" ]] && specfile.ckeck_defvalues "$outfile"
rm -fr $tmpdir
if [[ "$outfile" ]]; then
exec 1<&3 3<&- # restore stdout and close fd#3
[[ -f $outfile ]] &&
notify.note $"created specfile"": \`${NOTE}$outfile${NORM}'"
fi
}
specfile.create \
"$spec_type" "$pck_tarball" "$pck_name" "$pck_version" "$outfile"