diff --git a/unmaintained/spec-create-old.in b/unmaintained/spec-create-old.in new file mode 100644 index 0000000..33ab289 --- /dev/null +++ b/unmaintained/spec-create-old.in @@ -0,0 +1,1507 @@ +#!/bin/bash +# pck-create -- plugin for @package@ +# Copyright (C) 2004-2010 Davide Madrisan + +[ -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 " +} + +# $1: optional exit code (default is '1') +function usage() { + version + echo "\ +"$"Try to create a specfile for the specified "". + +"$"Usage"": + @frontend@ -s [-n ] [-v ] [-t ] [-o ] + +"$"where the above options mean"": + -s, --source "$"Try to create a specfile for the specified "" + -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 "" + +"$"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 ." + + 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\" == " + 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 : , -1, -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 : , -1, -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} # - + /[^-\.][0-9]\./{s/\(.*[^-\.]\)[0-9]\..*/\1/p;q} # + # (no version, but 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} # - + /[^-\.][0-9]\./{s/.*[^-\.]\([0-9]\..*\)/\1/p;q} # + # (no version, but 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"