#!/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"