add scripts for autogenerating CPAN dependencies.
authorjbj <devnull@localhost>
Tue, 15 Feb 2000 22:17:43 +0000 (22:17 +0000)
committerjbj <devnull@localhost>
Tue, 15 Feb 2000 22:17:43 +0000 (22:17 +0000)
CVS patchset: 3560
CVS date: 2000/02/15 22:17:43

CHANGES
rpm.spec
scripts/Makefile.am
scripts/Makefile.in
scripts/cpanflute [new file with mode: 0755]
scripts/find-provides.perl [new file with mode: 0755]
scripts/find-requires.perl [new file with mode: 0755]

diff --git a/CHANGES b/CHANGES
index 2558dfd..5043915 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -52,6 +52,7 @@
        - {Free,Open}BSD find-{provides,requires} (suzukis@file.phys.tohoku.ac.jp).
        - new rpm-build package to isolate rpm dependencies on perl/bash2.
        - always remove duplicate identical package entries on --rebuilddb.
+       - add scripts for autogenerating CPAN dependencies.
 
 3.0.2 -> 3.0.3
        - add --eval to find result of macro expansion.
index 6b551b4..4a2b2f8 100644 (file)
--- a/rpm.spec
+++ b/rpm.spec
@@ -2,7 +2,7 @@ Summary: The Red Hat package management system.
 Name: rpm
 %define version 3.0.4
 Version: %{version}
-Release: 0.39
+Release: 0.40
 Group: System Environment/Base
 Source: ftp://ftp.rpm.org/pub/rpm/dist/rpm-3.0.x/rpm-%{version}.tar.gz
 Copyright: GPL
@@ -171,9 +171,12 @@ fi
 %lang(pl) /usr/man/pl/man[18]/*.[18]*
 %lang(ru) /usr/man/ru/man[18]/*.[18]*
 
-%files -n build
+%files build
 %defattr(-,root,root)
 /usr/lib/rpm/check-prereqs
+/usr/lib/rpm/cpanflute
+/usr/lib/rpm/find-provides.perl
+/usr/lib/rpm/find-requires.perl
 /usr/lib/rpm/get_magic.pl
 /usr/lib/rpm/http.req
 /usr/lib/rpm/magic.prov
@@ -217,6 +220,7 @@ fi
 * Tue Feb 15 2000 Jeff Johnson <jbj@redhat.com>
 - new rpm-build package to isolate rpm dependencies on perl/bash2.
 - always remove duplicate identical package entries on --rebuilddb.
+- add scripts for autogenerating CPAN dependencies.
 
 * Wed Feb  9 2000 Jeff Johnson <jbj@redhat.com>
 - brp-compress deals with hard links correctly.
index 5da4602..e6f8555 100644 (file)
@@ -5,6 +5,7 @@ AUTOMAKE_OPTIONS = 1.4 foreign
 EXTRA_DIST = \
        brp-compress brp-strip brp-strip-comment-note \
        check-prereqs convertrpmrc.sh find-lang.sh find-prov.pl find-req.pl \
+       cpanflute find-provides.perl find-requires.perl \
        freshen.sh get_magic.pl getpo.sh http.req magic.prov magic.req \
        perl.prov perl.req rpmdiff rpmdiff.cgi u_pkg.sh \
        vpkg-provides.sh vpkg-provides2.sh
@@ -17,6 +18,7 @@ configdir = ${prefix}/lib/rpm
 config_SCRIPTS = \
        brp-compress brp-strip brp-strip-comment-note \
        check-prereqs convertrpmrc.sh find-lang.sh find-prov.pl find-req.pl \
+       cpanflute find-provides.perl find-requires.perl \
        freshen.sh get_magic.pl getpo.sh http.req magic.prov magic.req \
        perl.prov perl.req rpmdiff rpmdiff.cgi u_pkg.sh \
        vpkg-provides.sh vpkg-provides2.sh
index f400896..d07394c 100644 (file)
@@ -153,13 +153,13 @@ varprefix = @varprefix@
 
 AUTOMAKE_OPTIONS = 1.4 foreign
 
-EXTRA_DIST =   brp-compress brp-strip brp-strip-comment-note   check-prereqs convertrpmrc.sh find-lang.sh find-prov.pl find-req.pl     freshen.sh get_magic.pl getpo.sh http.req magic.prov magic.req  perl.prov perl.req rpmdiff rpmdiff.cgi u_pkg.sh         vpkg-provides.sh vpkg-provides2.sh
+EXTRA_DIST =   brp-compress brp-strip brp-strip-comment-note   check-prereqs convertrpmrc.sh find-lang.sh find-prov.pl find-req.pl     cpanflute find-provides.perl find-requires.perl         freshen.sh get_magic.pl getpo.sh http.req magic.prov magic.req  perl.prov perl.req rpmdiff rpmdiff.cgi u_pkg.sh         vpkg-provides.sh vpkg-provides2.sh
 
 
 installprefix = $(DESTDIR)
 
 configdir = ${prefix}/lib/rpm
-config_SCRIPTS =       brp-compress brp-strip brp-strip-comment-note   check-prereqs convertrpmrc.sh find-lang.sh find-prov.pl find-req.pl     freshen.sh get_magic.pl getpo.sh http.req magic.prov magic.req  perl.prov perl.req rpmdiff rpmdiff.cgi u_pkg.sh         vpkg-provides.sh vpkg-provides2.sh
+config_SCRIPTS =       brp-compress brp-strip brp-strip-comment-note   check-prereqs convertrpmrc.sh find-lang.sh find-prov.pl find-req.pl     cpanflute find-provides.perl find-requires.perl         freshen.sh get_magic.pl getpo.sh http.req magic.prov magic.req  perl.prov perl.req rpmdiff rpmdiff.cgi u_pkg.sh         vpkg-provides.sh vpkg-provides2.sh
 
 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
 CONFIG_HEADER = ../config.h
diff --git a/scripts/cpanflute b/scripts/cpanflute
new file mode 100755 (executable)
index 0000000..b3ae843
--- /dev/null
@@ -0,0 +1,167 @@
+#!/usr/bin/perl
+
+# need this for hostname()
+use File::Basename;
+use Sys::Hostname;
+use Getopt::Long;
+use strict;
+
+my $MainDir = '/tmp/cpan';
+
+# set default options, then get options
+my %options=();
+$options{'email'}=(getpwuid($<))[0] . "\@" . hostname();
+GetOptions(\%options, "email=s", "n=s", "create") || exit 1;
+
+my $InputFile = $ARGV[0];
+my $create = '';
+
+if ($options{'create'}) {
+  $create = '-c';
+}
+
+my $tarball = basename($InputFile);
+$tarball =~ /(\S+)\-(\S+)\.tar\.gz/;
+my $clm_name=$1;
+my $clm_version=$2;
+
+my $class = dirname($InputFile);
+$class =~ s/^\.\/[0-9][0-9]_//;
+if ($class ne '.') {
+  $class = "($class)";
+} else {
+  $class = "";
+}
+
+# Change ::'s to -'s
+$clm_name =~ s/::/-/g;
+
+my $clm_changelog = get_changelog();
+
+# complain if either parameter is missing
+($clm_name eq "") && die "Module name not specified\n";
+($clm_version eq "") && die "Module version not specified\n";
+
+# Create and Open file to create SPEC files.
+mkdir($MainDir, 0755);
+system("cp $InputFile $MainDir");
+my $filename = $clm_name . '.spec'; 
+open (FILE, "> $MainDir/$filename");
+
+# Print the spec file. Lots of substitutions here.
+print FILE "Summary: $clm_name module for perl $class
+Name: perl-$clm_name
+Version: $clm_version
+Release: 2
+Copyright: distributable
+Group: Applications/CPAN
+Source0: $clm_name-$clm_version.tar.gz
+Url: http://www.cpan.org
+BuildRoot: /var/tmp/perl-$clm_name-buildroot/
+BuildRequires: perl >= 5.00503
+Requires: perl >= 5.00503
+
+%description
+$clm_name module for perl
+
+# Provide perl-specific find-{provides,requires}.
+%define __find_provides /usr/lib/rpm/find-provides.perl
+%define __find_requires /usr/lib/rpm/find-requires.perl
+
+%prep
+%setup -q -n $clm_name-%{version} $create
+
+%build
+CFLAGS=\"\$RPM_OPT_FLAGS\" perl Makefile.PL
+make
+
+%clean 
+rm -rf \$RPM_BUILD_ROOT
+
+%install
+rm -rf \$RPM_BUILD_ROOT
+eval `perl '-V:installarchlib'`
+mkdir -p \$RPM_BUILD_ROOT/\$installarchlib
+make PREFIX=\$RPM_BUILD_ROOT/usr install
+find \$RPM_BUILD_ROOT/usr -type f -print | \
+       sed \"s\@^\$RPM_BUILD_ROOT\@\@g\" | \
+       grep -v perllocal.pod | \
+       grep -v \"\\.packlist\" > $clm_name-$clm_version-filelist
+if [ \"\$(cat $clm_name-$clm_version-filelist)X\" = \"X\" ] ; then
+    echo \"ERROR: EMPTY FILE LIST\"
+    exit -1
+fi
+
+%files -f $clm_name-$clm_version-filelist
+%defattr(-,root,root)
+
+%changelog
+* $clm_changelog
+- Spec file was autogenerated. 
+";
+close(FILE);
+
+# Now build the rpm
+create_rcfiles();
+
+open (LOG, "> $MainDir/LogFile");
+build_rpm();
+close LOG;
+
+sub cleanup {
+  unlink "$MainDir/$filename";
+  unlink "$MainDir/$tarball";
+}
+
+sub build_rpm {
+  my $retval;
+
+  # First, make sure it unpacks cleanely
+  system("rpm --rcfile $MainDir/rpmrc -bp $MainDir/$filename");
+  $retval = $? >> 8;
+  if ($retval != 0) {
+    print "RPM test unpacking failed!\n";
+    print LOG "PREP failed: $filename\n";
+    return;
+  }
+
+  system("rpm --rcfile $MainDir/rpmrc -bs --rmsource --rmspec --clean $MainDir/$filename");
+  $retval = $? >> 8;
+  if ($retval != 0) {
+    print "RPM building failed!\n";
+    print LOG "SOURCE failed: $filename\n";
+    return;
+  }
+  cleanup();
+}
+
+sub create_rcfiles {
+    open(MACROS, "> $MainDir/macros");
+    print MACROS qq{
+%_topdir        $MainDir
+%_builddir      %{_topdir}/junk
+%_rpmdir        %{_topdir}
+%_sourcedir     %{_topdir}
+%_specdir       %{_topdir}
+%_srcrpmdir     %{_topdir}/temp
+};
+    close(MACROS);
+  
+    open(RPMRC, "> $MainDir/rpmrc");
+    print RPMRC qq{
+include: /usr/lib/rpm/rpmrc
+macrofiles: /usr/lib/rpm/macros:$MainDir/macros
+};
+    close(RPMRC);
+}
+
+sub get_changelog {
+  # generate the changelog entry from available system info
+
+  return ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")[(localtime)[6]] . " " .
+    ("Jan", "Feb", "Mar", "Apr", "May", "Jun",
+     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")[(localtime)[4]] . " " .
+    (localtime)[3] . " " . (1900+(localtime)[5]) . " " .
+    (getpwuid($<))[6] . " <" . $options{'email'} . ">";
+}
+
diff --git a/scripts/find-provides.perl b/scripts/find-provides.perl
new file mode 100755 (executable)
index 0000000..d32ebfa
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+filelist=`sed "s/['\"]/\\\&/g"`
+
+{      echo $filelist | tr [:blank:] \\n | /usr/lib/rpm/find-provides
+#
+# Generate perl module dependencies, if any.
+    [ -x /usr/lib/rpm/perl.prov ] && \
+       echo $filelist | tr [:blank:] \\n | /usr/lib/rpm/perl.prov
+} | sort -u
diff --git a/scripts/find-requires.perl b/scripts/find-requires.perl
new file mode 100755 (executable)
index 0000000..a70281d
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh
+
+# note this works for both a.out and ELF executables
+# it also auto-generates requirment lines for shell scripts
+
+ulimit -c 0
+
+filelist=`sed "s/['\"]/\\\&/g"`
+exelist=`echo $filelist | xargs -r file | fgrep executable | cut -d: -f1 `
+scriptlist=`echo $filelist | xargs -r file | egrep ":.* (commands|script) " | cut -d: -f1 `
+liblist=`echo $filelist | xargs -r file | grep "shared object" | cut -d : -f1 `
+
+for f in $exelist; do
+    if [ -x $f ]; then
+       ldd $f | awk '/=>/ { print $1 }'
+    fi
+done | sort -u | sed "s/['\"]/\\\&/g" | xargs -r -n 1 basename | grep -v 'libNoVersion.so' | grep -v '4[um]lib.so' | sort -u
+
+for f in $liblist; do
+    ldd $f | awk '/=>/ { print $1 }'
+done | sort -u | sed "s/['\"]/\\\&/g" | xargs -r -n 1 basename | grep -v 'libNoVersion.so' | grep -v '4[um]lib.so' | sort -u
+
+perllist=
+for f in $scriptlist; do
+    [ -x $f ] || continue
+    interp=`head -1 $f | sed -e 's/^\#\![      ]*//' | cut -d" " -f1 `
+    case $interp in
+    */perl) perllist="$perllist $f" ;;
+    esac
+    echo $interp
+done | sort -u
+
+for f in $liblist $exelist ; do
+    objdump -p $f | awk '
+       BEGIN { START=0; LIBNAME=""; }
+       /Version References:/ { START=1; }
+       /required from/ && (START==1) {
+           sub(/:/, "", $3);
+           LIBNAME=$3;
+       }
+       (START==1) && (LIBNAME!="") && ($4!="") { print LIBNAME "(" $4 ")"; }
+       /^$/ { START=0; }
+    '
+done | sort -u
+
+#
+# Generate perl module dependencies, if any.
+set -x
+[ -x /usr/lib/rpm/perl.req -a -n "$perllist" ] && \
+       echo $perllist | tr [:blank:] \\n | /usr/lib/rpm/perl.req | sort -u